dev:人资相关代码

main
SondonYong 2025-12-05 17:35:02 +08:00
parent bf55c68f13
commit ccb520416f
20 changed files with 290 additions and 30 deletions

View File

@ -9,12 +9,14 @@ import com.alibaba.cloud.commons.lang.StringUtils;
import com.jjb.saas.framework.job.Job;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.zcloud.basic.info.command.RzUserRecordAddExe;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.gbscommon.utils.UuidUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -27,6 +29,8 @@ public class DockingRZUserPlanJob implements Job {
private static final String BASE_URL = "http://192.168.10.56:8090";
@Resource
private final RzUserRecordAddExe rzUserRecordAddExe;
// @JobRegister(cron = "0 30 0 * * ?", jobDesc = "超期未检查记录",triggerStatus = 1)
// @XxlJob("com.zcloud.zcGbsServicer.plan.CheckRecordPlanJob")
@ -69,35 +73,13 @@ public class DockingRZUserPlanJob implements Job {
// @XxlJob("com.zcloud.zcGbsServicer.plan.CheckRecordPlanJob")
public ReturnT<String> executeChange(String param) {
System.out.println("开始执行计划任务");
XxlJobHelper.log( "============定时获取人资人员信息开始==========");
// 获取总页数
Integer userInfoCount = getUserInfoCount();
// 定义每页大小
int pageSize = 200;
// 计算总页数
int totalPages = (int) Math.ceil((double) userInfoCount / pageSize);
XxlJobHelper.log( "============定时获取人资变动信息开始==========");
for (int pageNum = 1; pageNum <= totalPages; pageNum++) {
try {
XxlJobHelper.log("正在获取第 " + pageNum + "/" + totalPages + " 页数据...");
JSONArray userChangeInfo = getUserChangeInfo();
// 处理数据
rzUserRecordAddExe.executeJsonArray(userChangeInfo);
// 调用接口
getUserInfo(pageNum, pageSize);
XxlJobHelper.log("第 " + pageNum + " 页数据获取成功");
// 可选:添加延时,避免请求过快
if (pageNum < totalPages) {
Thread.sleep(1000); // 1000毫秒间隔
}
} catch (Exception e) {
XxlJobHelper.log("第 " + pageNum + " 页获取失败: " + e.getMessage());
// 可以选择继续执行下一页,或者中断
// break; // 如果需要失败就停止
}
}
XxlJobHelper.log( "============定时获取人资人员信息结束==========");
XxlJobHelper.log( "============定时获取人资变动信息结束==========");
return ReturnT.SUCCESS;
}

View File

@ -1,7 +1,9 @@
package com.zcloud.basic.info.web;
import cn.hutool.json.JSONArray;
import com.zcloud.basic.info.api.RzUserRecordServiceI;
import com.zcloud.basic.info.command.RzUserRecordAddExe;
import com.zcloud.basic.info.dto.RzUserRecordAddCmd;
import com.zcloud.basic.info.dto.RzUserRecordPageQry;
import com.zcloud.basic.info.dto.RzUserRecordListQry;
@ -14,6 +16,7 @@ import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.basic.info.plan.DockingRZUserPlanJob;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
@ -34,6 +37,23 @@ import java.util.ArrayList;
@AllArgsConstructor
public class RzUserRecordController {
private final RzUserRecordServiceI rzUserRecordService;
private final RzUserRecordAddExe rzUserRecordAddExe;
private final DockingRZUserPlanJob dockingRZPlanJob;
@ApiOperation("手动调用获取人资变动信息定时")
@PostMapping("/dockingRZChange")
public Response dockingRZChange(){
dockingRZPlanJob.executeChange("");
return SingleResponse.buildSuccess();
}
@ApiOperation("手动模拟拉取人资变动信息定时")
@PostMapping("/getRZChange")
public Response getRZChange(@RequestBody JSONArray jsonArray){
rzUserRecordAddExe.executeJsonArray(jsonArray);
return SingleResponse.buildSuccess();
}
@ApiOperation("新增")
@PostMapping("/save")

View File

@ -1,14 +1,32 @@
package com.zcloud.basic.info.command;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.zcloud.basic.info.domain.enums.UserEmploymentFlagEnum;
import com.zcloud.basic.info.domain.enums.UserRZFlagEnum;
import com.zcloud.basic.info.domain.gateway.RzUserGateway;
import com.zcloud.basic.info.domain.gateway.RzUserRecordGateway;
import com.zcloud.basic.info.domain.gateway.UserChangeRecordGateway;
import com.zcloud.basic.info.domain.gateway.UserGateway;
import com.zcloud.basic.info.domain.model.RzUserE;
import com.zcloud.basic.info.domain.model.RzUserRecordE;
import com.zcloud.basic.info.domain.model.UserChangeRecordE;
import com.zcloud.basic.info.domain.model.UserE;
import com.zcloud.basic.info.dto.RzUserRecordAddCmd;
import com.alibaba.cola.exception.BizException;
import com.zcloud.basic.info.persistence.dataobject.*;
import com.zcloud.basic.info.persistence.repository.*;
import com.zcloud.gbscommon.utils.UuidUtil;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* web-app
@ -20,6 +38,15 @@ import org.springframework.transaction.annotation.Transactional;
@AllArgsConstructor
public class RzUserRecordAddExe {
private final RzUserRecordGateway rzUserRecordGateway;
private final RzUserRecordRepository rzUserRecordRepository;
private final RzUserRepository rzUserRepository;
private final RzUserGateway rzUserGateway;
private final UserRepository userRepository;
private final UserGateway userGateway;
private final CorpInfoRepository corpInfoRepository;
private final DepartmentRepository departmentRepository;
private final UserChangeRecordRepository userChangeRecordRepository;
private final UserChangeRecordGateway userChangeRecordGateway;
@Transactional(rollbackFor = Exception.class)
public boolean execute(RzUserRecordAddCmd cmd) {
@ -36,5 +63,98 @@ public class RzUserRecordAddExe {
}
return true;
}
@Transactional(rollbackFor = Exception.class)
public boolean executeJsonArray(JSONArray jsonArray) {
if(jsonArray == null){
return false;
}
List<RzUserRecordE> rzUserRecordEList = new ArrayList<>();
for (Object o : jsonArray) {
JSONObject json = new JSONObject(o);
RzUserRecordE rzUserRecordE = new RzUserRecordE();
rzUserRecordE.setEmployeeName(json.getStr("employee_name"));
rzUserRecordE.setEmployeeGender(json.getStr("employee_gender"));
rzUserRecordE.setEmployeeAge(json.getStr("employee_age"));
rzUserRecordE.setEntryTime(json.getStr("entry_time"));
rzUserRecordE.setEmployeeStatus(json.getStr("employee_status"));
rzUserRecordE.setJobName(json.getStr("job_name"));
rzUserRecordE.setJobLevel(json.getStr("job_level"));
rzUserRecordE.setDeptName(json.getStr("dept_name"));
rzUserRecordE.setDeptCode(json.getStr("dept_code"));
rzUserRecordE.setPhoneNumber(json.getStr("phone_number"));
rzUserRecordE.setIdCardNumber(json.getStr("id_card_number"));
rzUserRecordE.setEmployeeImagesCode(json.getStr("employee_images_code"));
rzUserRecordE.setCorporationCode(json.getStr("corporation_code"));
rzUserRecordE.setCorporationName(json.getStr("corporation_name"));
rzUserRecordEList.add(rzUserRecordE);
/**
* ,
* ,
* ,
*
* , , :
* 2-
* ,
*
*
*/
// 人资
RzUserDO rzUserDO = rzUserRepository.getByPhoneAndIdCardNumber(rzUserRecordE.getPhoneNumber(), rzUserRecordE.getIdCardNumber());
if(rzUserDO == null){
RzUserE rzUserE = new RzUserE();
rzUserE.initByRzUserRecord(rzUserRecordE);
rzUserGateway.add(rzUserE);
}else {
RzUserE rzUserE = new RzUserE();
rzUserE.initByRzUserRecord(rzUserRecordE);
rzUserE.setId(rzUserDO.getId());
rzUserGateway.update(rzUserE);
}
// 统一用户管理
UserDO userDO = userRepository.getByPhoneAndIdCard(rzUserRecordE.getPhoneNumber(), rzUserRecordE.getIdCardNumber());
if(userDO != null){
userDO.setRzFlag(UserRZFlagEnum.YES.getCode());
userDO.setEmploymentFlag(UserEmploymentFlagEnum.INFO_CHANGE.getCode());
UserE userE = new UserE();
BeanUtils.copyProperties(userDO, userE);
userGateway.update(userE);
// 查询企业名称和部门名称
CorpInfoDO corpInfoDO = corpInfoRepository.getById(userE.getCorpinfoId());
DepartmentDO departmentDO = departmentRepository.getById(userE.getDepartmentId());
// 变更记录表
UserChangeRecordE userChangeRecordE = new UserChangeRecordE();
userChangeRecordE.initUserAddFromRZ(userE, rzUserRecordE, userE.getId(), corpInfoDO.getCorpName(), departmentDO.getName());
userChangeRecordGateway.add(userChangeRecordE);
}else {
// todo 创建新用户
UserE userE = new UserE();
CorpInfoDO corpInfo = corpInfoRepository.getCorpInfoByCorpName("冬泳分公司账号");
userE.initFromRZ(corpInfo.getId(), rzUserRecordE);
userE.setUserId(UuidUtil.get32UUID());
userGateway.add(userE);
// 变更记录表
UserChangeRecordE userChangeRecordE = new UserChangeRecordE();
userChangeRecordE.initUserAddFromRZ(userE, rzUserRecordE, userE.getId(), null, null);
userChangeRecordGateway.add(userChangeRecordE);
}
}
if(CollUtil.isNotEmpty(rzUserRecordEList)){
rzUserRecordRepository.addBatch(BeanUtil.copyToList(rzUserRecordEList, RzUserRecordDO.class));
}
return true;
}
}

View File

@ -26,6 +26,10 @@ public class AppUserInfoCmd extends Command {
@NotNull(message = "主键id不能为空")
private Long id;
@ApiModelProperty(value = "业务主键id", name = "userId", required = true)
@NotNull(message = "业务主键id不能为空")
private String userId;
@ApiModelProperty(value = "人脸照片url", name = "userAvatarUrl", required = true)
@NotEmpty(message = "人脸照片url不能为空")
private String userAvatarUrl;

View File

@ -44,6 +44,9 @@ public class RzUserRecordCO extends ClientObject {
//工作级别
@ApiModelProperty(value = "工作级别")
private String jobLevel;
//工作级别
@ApiModelProperty(value = "职务")
private String jobName;
//部门名称
@ApiModelProperty(value = "部门名称")
private String deptName;

View File

@ -102,6 +102,9 @@ public class UserCO extends ClientObject {
//人员在部门中的排序
@ApiModelProperty(value = "人员在部门中的排序")
private Integer sort;
@ApiModelProperty(value = "是否存在人资系统, 1-存在, 0-不存在")
private Integer rzFlag;
//乐观锁
@ApiModelProperty(value = "乐观锁")
private Integer version;
@ -169,7 +172,7 @@ public class UserCO extends ClientObject {
private String mappingPostName;
private String mappingDeptName;
// 入职状态
@ApiModelProperty(value = "入职状态 1-在职 0-离职")
@ApiModelProperty(value = "入职状态 入职状态0-离职, 1-在职, 2-信息变更中, 3-未入职, 4-实习生, 5-实习结束, 6-退休, 7-劳务派遣, 8-劳务派遣结束, 11-入职待审核, 10-离职待审核")
private Integer employmentFlag;
// 入职状态
@ApiModelProperty(value = "是否流动人员1-流动0-固定人员")

View File

@ -15,6 +15,11 @@ public enum UserEmploymentFlagEnum {
ON(1, "在职"),
INFO_CHANGE(2, "信息变更中"),
NOT_ON(3, "未入职"),
INTERN(4, "实习生"),
INTERNSHIP_ENDED(5, "实习结束"),
RETIREMENT(6, "退休"),
LABOR_DISPATCH(7, "劳务派遣"),
END_OF_LABOR_DISPATCH(8, "劳务派遣结束"),
ENTRY_AUDIT(11, "入职待审核"),
RESIGNATION_AUDIT(10, "离职待审核"),
// REJECT(12, "驳回"),
@ -35,4 +40,14 @@ public enum UserEmploymentFlagEnum {
}
return null;
}
//根据枚举获取code
public static UserEmploymentFlagEnum getByDesc(String desc) {
for (UserEmploymentFlagEnum item : values()) {
if (item.getDesc().equals(desc)) {
return item;
}
}
return null;
}
}

View File

@ -0,0 +1,23 @@
package com.zcloud.basic.info.domain.enums;
import lombok.Getter;
/**
* , 1-, 0-
*/
@Getter
public enum UserRZFlagEnum {
/**
*
*/
NO(0, "否"),
YES(1, "是"),
;
private final Integer code;
private final String desc;
UserRZFlagEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
}

View File

@ -53,5 +53,21 @@ public class RzUserE extends BaseE {
private String isConfirm;
//确认状态(0未确认1自动确认2用户手动确认)
private String confirmStatus;
public void initByRzUserRecord(RzUserRecordE rzUserRecordE){
this.setEmployeeName(rzUserRecordE.getEmployeeName());
this.setEmployeeGender(rzUserRecordE.getEmployeeGender());
this.setEmployeeAge(Integer.valueOf(rzUserRecordE.getEmployeeAge()));
this.setEntryTime(rzUserRecordE.getEntryTime());
this.setEmployeeStatus(rzUserRecordE.getEmployeeStatus());
this.setJobName(rzUserRecordE.getJobName());
this.setJobLevel(rzUserRecordE.getJobLevel());
this.setDeptName(rzUserRecordE.getDeptName());
this.setDeptCode(rzUserRecordE.getDeptCode());
this.setPhoneNumber(rzUserRecordE.getPhoneNumber());
this.setIdCardNumber(rzUserRecordE.getIdCardNumber());
this.setCorporationName(rzUserRecordE.getCorporationName());
this.setCorporationCode(rzUserRecordE.getCorporationCode());
}
}

View File

@ -1,6 +1,7 @@
package com.zcloud.basic.info.domain.model;
import com.jjb.saas.framework.domain.model.BaseE;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@ -26,11 +27,12 @@ public class RzUserRecordE extends BaseE {
//年龄
private String employeeAge;
//入职时间
private Date entryTime;
private String entryTime;
//人员状态
private String employeeStatus;
//工作级别
private String jobLevel;
private String jobName;
//部门名称
private String deptName;
//部门编码

View File

@ -83,6 +83,35 @@ public class UserChangeRecordE extends BaseE {
this.setStatus(UserChangeRecordStatusEnum.PENDING.getCode());
}
public void initUserAddFromRZ(UserE userE, RzUserRecordE rzUserRecordE, Long userId, String corpinfoName, String departmentName) {
this.setUserId(userId);
this.setChangeTime(new Date());
this.setCorpinfoIdBefore(null);
this.setCorpinfoNameBefore(corpinfoName);
this.setDepartmentIdBefore(null);
this.setDepartmentNameBefore(departmentName);
this.setPostIdBefore(null);
this.setPostNameBefore(null);
// corpinfoName == null是新增的时候, != null是修改
if(corpinfoName == null){
this.setUserStatusBefore(null);
}else {
this.setUserStatusBefore(userE.getEmploymentFlag());
}
this.setCorpinfoIdAfter(null);
this.setCorpinfoNameAfter(rzUserRecordE.getCorporationName());
this.setDepartmentIdAfter(null);
this.setDepartmentNameAfter(rzUserRecordE.getDeptName());
this.setPostIdAfter(null);
this.setPostNameAfter(null);
this.setUserStatusAfter(UserEmploymentFlagEnum.getByDesc(rzUserRecordE.getEmployeeStatus()).getCode());
this.setStatus(UserChangeRecordStatusEnum.APPROVED.getCode());
}
public void initUserUpdate(UserE userE, UserE oldUserE, String corpName, String name) {
this.setUserId(userE.getId());
this.setChangeTime(new Date());

View File

@ -138,6 +138,7 @@ public class UserE extends BaseE {
private Integer employmentFlag;
// 入职状态
private Integer flowFlag;
private Integer rzFlag;
// 父级租户id
private final Long parentTenantId = 1989259383784415232L;
// 默认密码
@ -165,6 +166,16 @@ public class UserE extends BaseE {
userE.setPassword(defaultPassword);
}
public void initFromRZ(Long corpinfoId, RzUserRecordE rzUserRecordE){
this.setCorpinfoId(corpinfoId);
this.setDepartmentId(corpinfoId);
this.setName(rzUserRecordE.getEmployeeName());
this.setPhone(rzUserRecordE.getPhoneNumber());
this.setUsername(rzUserRecordE.getPhoneNumber());
this.setRoleId(1994326788804837377L);
this.setUserIdCard(rzUserRecordE.getIdCardNumber());
}
/**
* ,
*/

View File

@ -37,13 +37,15 @@ public class RzUserRecordDO extends BaseDO {
private String employeeAge;
//入职时间
@ApiModelProperty(value = "入职时间")
private Date entryTime;
private String entryTime;
//人员状态
@ApiModelProperty(value = "人员状态")
private String employeeStatus;
//工作级别
@ApiModelProperty(value = "工作级别")
private String jobLevel;
@ApiModelProperty(value = "职务")
private String jobName;
//部门名称
@ApiModelProperty(value = "部门名称")
private String deptName;

View File

@ -125,6 +125,8 @@ public class UserDO extends BaseDO {
// 入职状态
@ApiModelProperty(value = "是否流动人员1-流动0-固定人员")
private Integer flowFlag;
@ApiModelProperty(value = "是否存在人资系统, 1-存在, 0-不存在")
private Integer rzFlag;
//用户所属企业id
@TableField(exist = false)
private String userCorpId;

View File

@ -21,5 +21,7 @@ public interface RzUserRecordRepository extends BaseRepository<RzUserRecordDO> {
List<RzUserRecordDO> list(Map<String, Object> params);
SingleResponse<RzUserRecordDO> getInfoById(Long id);
void addBatch(List<RzUserRecordDO> rzUserRecordDOList);
}

View File

@ -21,5 +21,8 @@ public interface RzUserRepository extends BaseRepository<RzUserDO> {
List<RzUserDO> list(Map<String, Object> params);
SingleResponse<RzUserDO> getInfoById(Long id);
RzUserDO getByPhoneAndIdCardNumber(String phone, String idCardNumber);
}

View File

@ -78,5 +78,7 @@ public interface UserRepository extends BaseRepository<UserDO> {
UserDO getByPhone(String phone);
UserDO getByPhoneAndIdCard(String phone, String idCardNumber);
}

View File

@ -51,5 +51,10 @@ public class RzUserRecordRepositoryImpl extends BaseRepositoryImpl<RzUserRecordM
public SingleResponse<RzUserRecordDO> getInfoById(Long id) {
return SingleResponse.of(rzUserRecordMapper.selectById(id));
}
@Override
public void addBatch(List<RzUserRecordDO> rzUserRecordDOList) {
this.saveBatch(rzUserRecordDOList);
}
}

View File

@ -51,5 +51,13 @@ public class RzUserRepositoryImpl extends BaseRepositoryImpl<RzUserMapper, RzUse
public SingleResponse<RzUserDO> getInfoById(Long id) {
return SingleResponse.of(rzUserMapper.selectById(id));
}
@Override
public RzUserDO getByPhoneAndIdCardNumber(String phone, String idCardNumber) {
QueryWrapper<RzUserDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("phone_number", phone);
queryWrapper.eq("id_card_number", idCardNumber);
return this.getOne(queryWrapper);
}
}

View File

@ -436,5 +436,13 @@ public class UserRepositoryImpl extends BaseRepositoryImpl<UserMapper, UserDO> i
queryWrapper.eq("phone", phone);
return getOne(queryWrapper);
}
@Override
public UserDO getByPhoneAndIdCard(String phone, String idCardNumber) {
QueryWrapper<UserDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("phone", phone);
queryWrapper.eq("user_id_card", idCardNumber);
return getOne(queryWrapper);
}
}