Merge branch 'dev_change_0814' into dev

# Conflicts:
#	web-domain/src/main/java/com/zcloud/basic/info/domain/model/UserE.java
dev
zhaokai 2026-08-17 14:07:20 +08:00
commit b468eaf7df
15 changed files with 156 additions and 9 deletions

View File

@ -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

View File

@ -103,4 +103,9 @@ public class ZcloudCorpFacadeImpl implements ZcloudCorpFacade {
return Response.buildSuccess();
}
@Override
public Response saveAdminCorp() {
return null;
}
}

View File

@ -104,6 +104,12 @@ public class DepartmentController {
return MultiResponse.of(departmentService.listAllTreeByCorpType(qry));
}
@ApiOperation("所有企业下部门树状所有数据根据企业类型和企业id集合")
@PostMapping("/listAllTreeByCorpTypeAndCorpIds")
public MultiResponse<DepartmentTreeInfoCO> listAllTreeByCorpTypeAndCorpIds(@RequestBody DepartmentTreeCorpQry qry) {
return MultiResponse.of(departmentService.listAllTreeByCorpTypeAndCorpIds(qry));
}
}

View File

@ -208,6 +208,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;
@ -259,7 +263,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();
@ -277,6 +281,7 @@ public class UserAddExe {
log.info("大华同步未返回dahuaId跳过写回操作, userId={}, dahuaCode={}", userE.getId(), syncResult.dahuaCode);
}
}
}
} catch (BizException e) {
log.error("新增用户业务异常: {}", e.getMessage(), e);
throw e;

View File

@ -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;
@ -412,6 +413,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);

View File

@ -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();
@ -902,8 +912,42 @@ public class UserUpdateExe {
private boolean updateDaHuaUserFace(UserDO userDO, Integer dahuaId, String userAvatarUrl) {
Map<String, Object> 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);
@ -914,6 +958,8 @@ public class UserUpdateExe {
(List<DaHuaPersonSyncCmd.PersonBiosignature>) biosignatures;
daHuaCmd.setPersonBiosignatures(faceList);
}
log.info("同步大华人脸更新参数已补全, userId={}, dahuaId={}, name={}, departmentId={}",
userDO.getId(), dahuaId, daHuaCmd.getName(), daHuaCmd.getDepartmentId());
try {
SingleResponse<Boolean> updateResponse = zcloudDaHuaFacade.updatePerson(daHuaCmd);

View File

@ -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;
@ -204,6 +205,30 @@ public class DepartmentQueryExe {
return result2;
}
public Collection<DepartmentTreeInfoCO> listAllTreeByCorpTypeAndCorpIds(DepartmentTreeCorpQry qry) {
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
List<Integer> enterpriseType = CorpTypeEnum.getCodesByEnterpriseType(qry.getEnterpriseType());
if (CollUtil.isNotEmpty(enterpriseType)) {
params.put("inType", enterpriseType);
}
if (CollUtil.isNotEmpty(qry.getCorpinfoIdList())) {
try {
List<Long> 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<DepartmentDO> pageResponse = departmentRepository.listAllTreeByCorpTypeAndCorpIds(params);
if (CollUtil.isEmpty(pageResponse)) {
return Collections.emptyList();
}
return getDepartmentAllTree(pageResponse);
}
public Collection<DepartmentTreeInfoCO> listTreeNopermission(DepartmentTreeQry departmentQry) {
if (Objects.isNull(departmentQry.getEqCorpinfoId())) {

View File

@ -95,6 +95,11 @@ public class DepartmentServiceImpl implements DepartmentServiceI {
}
@Override
public Collection<DepartmentTreeInfoCO> listAllTreeByCorpTypeAndCorpIds(DepartmentTreeCorpQry qry) {
return departmentQueryExe.listAllTreeByCorpTypeAndCorpIds(qry);
}
@Override
@Cacheable(value = "deptAllNameCache", key="'deptId:'+#deptId")
public String getFullNameForList(Long deptId, List<DepartmentCO> list) {

View File

@ -45,6 +45,8 @@ public interface DepartmentServiceI {
Collection<DepartmentTreeInfoCO> listAllTreeByCorpType(DepartmentTreeQry qry);
Collection<DepartmentTreeInfoCO> listAllTreeByCorpTypeAndCorpIds(DepartmentTreeCorpQry qry);
Long addHumanUserDept(DepartmentAddCmd cmd);
Collection<DepartmentTreeInfoCO> listTreeNopermission(DepartmentTreeQry qry);

View File

@ -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<String> corpinfoIdList;
}

View File

@ -5,8 +5,11 @@ import com.alibaba.cola.exception.BizException;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.jjb.saas.framework.domain.model.BaseE;
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;
import com.zcloud.gbscommon.utils.MD5;
@ -185,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);
}

View File

@ -29,5 +29,7 @@ public interface DepartmentMapper extends BaseMapper<DepartmentDO> {
IPage<DepartmentDO> selectDeptPage(IPage<DepartmentDO> iPage, @Param("ew") QueryWrapper<DepartmentDO> queryWrapper, String menuPerms);
List<DepartmentDO> listAllTreeByCorpType(Map<String, Object> parmas);
List<DepartmentDO> listAllTreeByCorpTypeAndCorpIds(Map<String, Object> params);
}

View File

@ -40,6 +40,8 @@ public interface DepartmentRepository extends BaseRepository<DepartmentDO> {
List<DepartmentDO> listAllTreeByCorpType(Map<String, Object> parmas);
List<DepartmentDO> listAllTreeByCorpTypeAndCorpIds(Map<String, Object> params);
void deleteByCorpInfoId(Long corpInfoId);
}

View File

@ -136,6 +136,11 @@ public class DepartmentRepositoryImpl extends BaseRepositoryImpl<DepartmentMappe
return departmentMapper.listAllTreeByCorpType(parmas);
}
@Override
public List<DepartmentDO> listAllTreeByCorpTypeAndCorpIds(Map<String, Object> params) {
return departmentMapper.listAllTreeByCorpTypeAndCorpIds(params);
}
@Override
public boolean existsByName(Long parentId,String name, Long id) {
QueryWrapper<DepartmentDO> queryWrapper = new QueryWrapper<>();

View File

@ -30,5 +30,26 @@
</if>
order by c.corp_order, c.create_time desc,d.dep_order, d.create_time desc
</select>
<select id="listAllTreeByCorpTypeAndCorpIds" resultType="com.zcloud.basic.info.persistence.dataobject.DepartmentDO">
select d.*
from department d
left join corp_info c on d.corpinfo_id = c.id
where d.delete_enum = 'FALSE'
and c.delete_enum = 'FALSE'
<if test="inType != null and inType.size() > 0">
and c.type in
<foreach collection="inType" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="corpinfoIdList != null and corpinfoIdList.size() > 0">
and c.id in
<foreach collection="corpinfoIdList" item="corpinfoId" open="(" close=")" separator=",">
#{corpinfoId}
</foreach>
</if>
order by c.corp_order, c.create_time desc,d.dep_order, d.create_time desc
</select>
</mapper>