From 961bf60ad6c24480ec92d32ba8eff575ae0e9af8 Mon Sep 17 00:00:00 2001 From: zhaokai Date: Mon, 17 Aug 2026 10:49:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(user):=20=E5=AE=8C=E5=96=84=E5=A4=A7?= =?UTF-8?q?=E5=8D=8E=E7=B3=BB=E7=BB=9F=E5=90=8C=E6=AD=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增用户时增加头像URL空值检查,避免无效同步 - 更新用户时支持从数据库获取头像URL进行同步 - 同步大华人脸时补充完整的个人信息字段 - 增加身份证号解析计算年龄和性别功能 - 添加民族编码转换异常处理机制 - 优化同步流程的日志记录和错误处理 --- .../zcloud/basic/info/command/UserAddExe.java | 9 +++- .../basic/info/command/UserUpdateExe.java | 54 +++++++++++++++++-- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java index 76bae264..02fb0a16 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/UserAddExe.java @@ -206,6 +206,10 @@ public class UserAddExe { } catch (Exception e) { log.error("用户变更记录保存失败(不影响用户主体), userId: {}, error: {}", userE.getId(), e.getMessage(), e); } + String userAvatarUrl = userE.getUserAvatarUrl(); + if (userAvatarUrl == null || userAvatarUrl.trim().isEmpty()) { + log.info("新增用户未传人脸URL,跳过大华同步, userId={}", userE.getId()); + } else { log.info("========== 新增用户-开始查询大华是否已存在该人员 =========="); Integer queryDahuaId = null; String queryDahuaCode = null; @@ -257,7 +261,7 @@ public class UserAddExe { } } else { log.info("大华未找到该人员,开始执行 syncDaHuaPerson 新增大华人员"); - DaHuaSyncResult syncResult = syncDaHuaPerson(userE); + DaHuaSyncResult syncResult = syncDaHuaPerson(userE, userAvatarUrl, true); if (syncResult.dahuaId != null) { try { UserE updateDahua = new UserE(); @@ -275,6 +279,7 @@ public class UserAddExe { log.info("大华同步未返回dahuaId,跳过写回操作, userId={}, dahuaCode={}", userE.getId(), syncResult.dahuaCode); } } + } } catch (BizException e) { log.error("新增用户业务异常: {}", e.getMessage(), e); throw e; @@ -1262,4 +1267,4 @@ public class UserAddExe { userChangeRecordE.initUserAdd(userE, corpName, departmentName); userChangeRecordGateway.add(userChangeRecordE); } -} \ No newline at end of file +} diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java index fb834a4a..ae691e0f 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/UserUpdateExe.java @@ -113,10 +113,20 @@ public class UserUpdateExe { log.info("【getInfoById查询结果】dahuaId={}, dahuaCode={}, name={}, userIdCard={}", userDO.getDahuaId(), userDO.getDahuaCode(), userDO.getName(), userDO.getUserIdCard()); - if (userUpdateCmd.getUserAvatarUrl() != null && !userUpdateCmd.getUserAvatarUrl().trim().isEmpty()) { - syncDaHuaInfo(userUpdateCmd, userDO, userE); + String requestUserAvatarUrl = userUpdateCmd.getUserAvatarUrl(); + String userAvatarUrl = requestUserAvatarUrl; + if (userAvatarUrl == null || userAvatarUrl.trim().isEmpty()) { + userAvatarUrl = userDO.getUserAvatarUrl(); + } + if (userAvatarUrl != null && !userAvatarUrl.trim().isEmpty()) { + userUpdateCmd.setUserAvatarUrl(userAvatarUrl); + try { + syncDaHuaInfo(userUpdateCmd, userDO, userE); + } finally { + userUpdateCmd.setUserAvatarUrl(requestUserAvatarUrl); + } } else { - log.info("userAvatarUrl为空,跳过大华信息同步, userId={}", userDO.getId()); + log.info("请求参数和数据库中的userAvatarUrl均为空,跳过大华信息同步, userId={}", userDO.getId()); } UserE oldUserE = new UserE(); @@ -892,8 +902,42 @@ public class UserUpdateExe { private boolean updateDaHuaUserFace(UserDO userDO, Integer dahuaId, String userAvatarUrl) { Map personMap = new HashMap<>(); + String plainIdCard = decodeUserIdCard(userDO.getUserIdCard()); + String dahuaCode = getDaHuaCodeForSave(userDO); + personMap.put("id", dahuaId); - personMap.put("departmentId", userDO.getCorpinfoId()); + personMap.put("name", userDO.getName()); + personMap.put("code", dahuaCode); + personMap.put("paperType", 111); + personMap.put("paperNumber", plainIdCard); + personMap.put("phone", userDO.getPhone()); + personMap.put("departmentId", userDO.getCorpinfoId() != null ? userDO.getCorpinfoId() : 1L); + personMap.put("nationName", userDO.getNationName() != null && !userDO.getNationName().trim().isEmpty() + ? userDO.getNationName() : "汉族"); + try { + personMap.put("nation", userDO.getNation() != null && !userDO.getNation().trim().isEmpty() + ? Integer.parseInt(userDO.getNation().trim()) : 1); + } catch (NumberFormatException e) { + log.warn("同步大华人脸时民族编码转换失败,使用默认值1, userId={}, nation={}", + userDO.getId(), userDO.getNation()); + personMap.put("nation", 1); + } + personMap.put("service", "evo-thirdParty"); + + Integer age = null; + Integer sex = null; + if (plainIdCard != null && plainIdCard.length() == 18) { + try { + LocalDate birthDate = LocalDate.parse(plainIdCard.substring(6, 14), + DateTimeFormatter.ofPattern("yyyyMMdd")); + age = Period.between(birthDate, LocalDate.now()).getYears(); + sex = Integer.parseInt(plainIdCard.substring(16, 17)) % 2 == 0 ? 2 : 1; + } catch (Exception e) { + log.warn("同步大华人脸时解析年龄和性别失败, userId={}", userDO.getId()); + } + } + personMap.put("age", age); + personMap.put("sex", sex); addDaHuaFace(personMap, userAvatarUrl); DaHuaPersonSyncCmd daHuaCmd = cn.hutool.core.bean.BeanUtil.toBean(personMap, DaHuaPersonSyncCmd.class); @@ -904,6 +948,8 @@ public class UserUpdateExe { (List) biosignatures; daHuaCmd.setPersonBiosignatures(faceList); } + log.info("同步大华人脸更新参数已补全, userId={}, dahuaId={}, name={}, departmentId={}", + userDO.getId(), dahuaId, daHuaCmd.getName(), daHuaCmd.getDepartmentId()); try { SingleResponse updateResponse = zcloudDaHuaFacade.updatePerson(daHuaCmd); From 16c316dc360b08076210fa02620ee9a4ffc8997a Mon Sep 17 00:00:00 2001 From: zhaokai Date: Mon, 17 Aug 2026 14:05:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(department):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BC=81=E4=B8=9A=E7=B1=BB=E5=9E=8B=E5=92=8C?= =?UTF-8?q?=E4=BC=81=E4=B8=9AID=E9=9B=86=E5=90=88=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E6=A0=91=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- start/src/main/resources/bootstrap.yml | 8 +++--- .../info/facade/ZcloudCorpFacadeImpl.java | 6 +++++ .../basic/info/web/DepartmentController.java | 6 +++++ .../basic/info/command/UserImportExe.java | 4 ++- .../command/query/DepartmentQueryExe.java | 25 +++++++++++++++++++ .../info/service/DepartmentServiceImpl.java | 5 ++++ .../basic/info/api/DepartmentServiceI.java | 2 ++ .../basic/info/dto/DepartmentTreeCorpQry.java | 15 +++++++++++ .../zcloud/basic/info/domain/model/UserE.java | 6 ++++- .../persistence/mapper/DepartmentMapper.java | 2 ++ .../repository/DepartmentRepository.java | 2 ++ .../impl/DepartmentRepositoryImpl.java | 5 ++++ .../resources/mapper/DepartmentMapper.xml | 21 ++++++++++++++++ 13 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 web-client/src/main/java/com/zcloud/basic/info/dto/DepartmentTreeCorpQry.java diff --git a/start/src/main/resources/bootstrap.yml b/start/src/main/resources/bootstrap.yml index ea7eb2ef..f467a2cb 100644 --- a/start/src/main/resources/bootstrap.yml +++ b/start/src/main/resources/bootstrap.yml @@ -3,8 +3,8 @@ spring: import: # - classpath:nacos.yml # - classpath:sdk.yml -# - classpath:nacos-prod.yml -# - classpath:sdk-prod.yml - - classpath:nacos-prod2.yml - - classpath:sdk-prod2.yml + - classpath:nacos-prod.yml + - classpath:sdk-prod.yml +# - classpath:nacos-prod2.yml +# - classpath:sdk-prod2.yml - classpath:swagger.yml diff --git a/web-adapter/src/main/java/com/zcloud/basic/info/facade/ZcloudCorpFacadeImpl.java b/web-adapter/src/main/java/com/zcloud/basic/info/facade/ZcloudCorpFacadeImpl.java index 3ff7eda8..dd75ebed 100644 --- a/web-adapter/src/main/java/com/zcloud/basic/info/facade/ZcloudCorpFacadeImpl.java +++ b/web-adapter/src/main/java/com/zcloud/basic/info/facade/ZcloudCorpFacadeImpl.java @@ -2,6 +2,7 @@ package com.zcloud.basic.info.facade; import com.alibaba.cola.dto.MultiResponse; import com.alibaba.cola.dto.PageResponse; +import com.alibaba.cola.dto.Response; import com.alibaba.cola.dto.SingleResponse; import com.zcloud.basic.info.api.CorpInfoServiceI; import com.zcloud.basic.info.command.convertor.CorpInfoCoConvertor; @@ -86,4 +87,9 @@ public class ZcloudCorpFacadeImpl implements ZcloudCorpFacade { return MultiResponse.of(CorpTypeEnum.getCodesByEnterpriseType(enterpriseType)); } + @Override + public Response saveAdminCorp() { + return null; + } + } diff --git a/web-adapter/src/main/java/com/zcloud/basic/info/web/DepartmentController.java b/web-adapter/src/main/java/com/zcloud/basic/info/web/DepartmentController.java index 33524ff4..4342070d 100644 --- a/web-adapter/src/main/java/com/zcloud/basic/info/web/DepartmentController.java +++ b/web-adapter/src/main/java/com/zcloud/basic/info/web/DepartmentController.java @@ -104,6 +104,12 @@ public class DepartmentController { return MultiResponse.of(departmentService.listAllTreeByCorpType(qry)); } + @ApiOperation("所有企业下部门树状所有数据根据企业类型和企业id集合") + @PostMapping("/listAllTreeByCorpTypeAndCorpIds") + public MultiResponse listAllTreeByCorpTypeAndCorpIds(@RequestBody DepartmentTreeCorpQry qry) { + return MultiResponse.of(departmentService.listAllTreeByCorpTypeAndCorpIds(qry)); + } + } diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/UserImportExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/UserImportExe.java index c1488097..99eb8470 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/UserImportExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/UserImportExe.java @@ -10,6 +10,7 @@ import com.jjb.saas.system.client.dept.facade.DeptFacade; import com.jjb.saas.system.client.role.facade.RoleFacade; import com.jjb.saas.system.client.role.response.RoleCO; import com.jjb.saas.system.client.user.facade.UserFacade; +import com.zcloud.basic.info.domain.enums.UserRZFlagEnum; import com.zcloud.basic.info.domain.gateway.DepartmentGateway; import com.zcloud.basic.info.domain.gateway.PostGateway; import com.zcloud.basic.info.domain.gateway.UserEmploymentLogGateway; @@ -410,6 +411,7 @@ public class UserImportExe { user.setPhone(importEntity.getUsername()); user.setUserType(corpFlag); user.setMainCorpFlag(0); + user.setRzFlag(UserRZFlagEnum.YES.getCode()); user.setRoleId(roleId); user.setDepartmentId(departmentId); user.setPostId(postId); @@ -444,4 +446,4 @@ public class UserImportExe { return userIdCard.trim(); } } -} \ No newline at end of file +} diff --git a/web-app/src/main/java/com/zcloud/basic/info/command/query/DepartmentQueryExe.java b/web-app/src/main/java/com/zcloud/basic/info/command/query/DepartmentQueryExe.java index b42cefa7..c212184c 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/command/query/DepartmentQueryExe.java +++ b/web-app/src/main/java/com/zcloud/basic/info/command/query/DepartmentQueryExe.java @@ -2,6 +2,7 @@ package com.zcloud.basic.info.command.query; import cn.hutool.core.collection.CollUtil; import com.alibaba.cola.dto.PageResponse; +import com.alibaba.cola.exception.BizException; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.jjb.saas.framework.auth.utils.AuthContext; import com.zcloud.basic.info.command.convertor.DepartmentCoConvertor; @@ -201,6 +202,30 @@ public class DepartmentQueryExe { return result2; } + public Collection listAllTreeByCorpTypeAndCorpIds(DepartmentTreeCorpQry qry) { + Map params = PageQueryHelper.toHashMap(qry); + List enterpriseType = CorpTypeEnum.getCodesByEnterpriseType(qry.getEnterpriseType()); + if (CollUtil.isNotEmpty(enterpriseType)) { + params.put("inType", enterpriseType); + } + if (CollUtil.isNotEmpty(qry.getCorpinfoIdList())) { + try { + List corpinfoIdList = qry.getCorpinfoIdList().stream() + .map(StringUtils::trim) + .map(Long::valueOf) + .collect(Collectors.toList()); + params.put("corpinfoIdList", corpinfoIdList); + } catch (NumberFormatException e) { + throw new BizException("企业id格式错误"); + } + } + List pageResponse = departmentRepository.listAllTreeByCorpTypeAndCorpIds(params); + if (CollUtil.isEmpty(pageResponse)) { + return Collections.emptyList(); + } + return getDepartmentAllTree(pageResponse); + } + public Collection listTreeNopermission(DepartmentTreeQry departmentQry) { if (Objects.isNull(departmentQry.getEqCorpinfoId())) { diff --git a/web-app/src/main/java/com/zcloud/basic/info/service/DepartmentServiceImpl.java b/web-app/src/main/java/com/zcloud/basic/info/service/DepartmentServiceImpl.java index cbc8cc1b..89108c9c 100644 --- a/web-app/src/main/java/com/zcloud/basic/info/service/DepartmentServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/basic/info/service/DepartmentServiceImpl.java @@ -95,6 +95,11 @@ public class DepartmentServiceImpl implements DepartmentServiceI { } + @Override + public Collection listAllTreeByCorpTypeAndCorpIds(DepartmentTreeCorpQry qry) { + return departmentQueryExe.listAllTreeByCorpTypeAndCorpIds(qry); + } + @Override @Cacheable(value = "deptAllNameCache", key="'deptId:'+#deptId") public String getFullNameForList(Long deptId, List list) { diff --git a/web-client/src/main/java/com/zcloud/basic/info/api/DepartmentServiceI.java b/web-client/src/main/java/com/zcloud/basic/info/api/DepartmentServiceI.java index 18a51a56..53b0c35e 100644 --- a/web-client/src/main/java/com/zcloud/basic/info/api/DepartmentServiceI.java +++ b/web-client/src/main/java/com/zcloud/basic/info/api/DepartmentServiceI.java @@ -45,6 +45,8 @@ public interface DepartmentServiceI { Collection listAllTreeByCorpType(DepartmentTreeQry qry); + Collection listAllTreeByCorpTypeAndCorpIds(DepartmentTreeCorpQry qry); + Long addHumanUserDept(DepartmentAddCmd cmd); Collection listTreeNopermission(DepartmentTreeQry qry); diff --git a/web-client/src/main/java/com/zcloud/basic/info/dto/DepartmentTreeCorpQry.java b/web-client/src/main/java/com/zcloud/basic/info/dto/DepartmentTreeCorpQry.java new file mode 100644 index 00000000..c1cc49a9 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/basic/info/dto/DepartmentTreeCorpQry.java @@ -0,0 +1,15 @@ +package com.zcloud.basic.info.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class DepartmentTreeCorpQry extends DepartmentTreeQry { + + @ApiModelProperty(value = "企业id集合", name = "corpinfoIdList") + private List corpinfoIdList; +} diff --git a/web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserE.java b/web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserE.java index e8193914..e60265b3 100644 --- a/web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserE.java +++ b/web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserE.java @@ -8,6 +8,7 @@ import com.jjb.saas.framework.utils.DataEncryptDecryptUtil; import com.zcloud.basic.info.domain.enums.CorpTypeEnum; import com.zcloud.basic.info.domain.enums.UserEmploymentFlagEnum; import com.zcloud.basic.info.domain.enums.UserFlowFlagEnum; +import com.zcloud.basic.info.domain.enums.UserRZFlagEnum; import com.zcloud.basic.info.domain.enums.UserTypeEnum; import com.zcloud.gbscommon.excelEntity.UserExcelExportEntity; import com.zcloud.gbscommon.utils.ExcelUtils; @@ -187,6 +188,9 @@ public class UserE extends BaseE { userE.setTenantId(!ObjectUtils.isEmpty(userE.getTenantId()) ? userE.getTenantId() : tenantId); userE.setCorpinfoId(!ObjectUtils.isEmpty(userE.getCorpinfoId()) ? userE.getCorpinfoId() : tenantId); userE.setEmploymentFlag(1); + if (userE.getRzFlag() == null) { + userE.setRzFlag(UserRZFlagEnum.NO.getCode()); + } userE.setPassword(defaultPassword); } @@ -423,4 +427,4 @@ public class UserE extends BaseE { } -} \ No newline at end of file +} diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/DepartmentMapper.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/DepartmentMapper.java index 3907b4da..71023138 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/DepartmentMapper.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/mapper/DepartmentMapper.java @@ -29,5 +29,7 @@ public interface DepartmentMapper extends BaseMapper { IPage selectDeptPage(IPage iPage, @Param("ew") QueryWrapper queryWrapper, String menuPerms); List listAllTreeByCorpType(Map parmas); + + List listAllTreeByCorpTypeAndCorpIds(Map params); } diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/DepartmentRepository.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/DepartmentRepository.java index bb3da4b4..bb9ef728 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/DepartmentRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/DepartmentRepository.java @@ -40,6 +40,8 @@ public interface DepartmentRepository extends BaseRepository { List listAllTreeByCorpType(Map parmas); + List listAllTreeByCorpTypeAndCorpIds(Map params); + void deleteByCorpInfoId(Long corpInfoId); } diff --git a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/DepartmentRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/DepartmentRepositoryImpl.java index 917e6638..60294e3e 100644 --- a/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/DepartmentRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/basic/info/persistence/repository/impl/DepartmentRepositoryImpl.java @@ -136,6 +136,11 @@ public class DepartmentRepositoryImpl extends BaseRepositoryImpl listAllTreeByCorpTypeAndCorpIds(Map params) { + return departmentMapper.listAllTreeByCorpTypeAndCorpIds(params); + } + @Override public boolean existsByName(Long parentId,String name, Long id) { QueryWrapper queryWrapper = new QueryWrapper<>(); diff --git a/web-infrastructure/src/main/resources/mapper/DepartmentMapper.xml b/web-infrastructure/src/main/resources/mapper/DepartmentMapper.xml index 46138c14..33f0b1b4 100644 --- a/web-infrastructure/src/main/resources/mapper/DepartmentMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/DepartmentMapper.xml @@ -30,5 +30,26 @@ order by c.corp_order, c.create_time desc,d.dep_order, d.create_time desc + +