组织快照

This commit is contained in:
钱涛 2024-12-06 16:00:05 +08:00
parent dff42953b5
commit de5af5f2c9
9 changed files with 150 additions and 57 deletions

View File

@ -221,6 +221,12 @@ public class HrmSnapshotPO {
@ElogTransform(name = "职称")
private Integer jobcall;
/**
* 职称名称
*/
@ElogTransform(name = "职称名称")
private String jobcallname;
/**
* 工作级别
*/

View File

@ -103,16 +103,16 @@ public class SalaryAcctEmployeeBO {
.employeeId(emp.getEmployeeId())
.employeeType(emp.isExtEmp() ? 1 : 0)
.taxAgentId(taxAgentId)
.departmentId(emp.getDepartmentId())
.departmentName(emp.getDepartmentName())
.jobcall(emp.getJobcall())
.jobcallId(emp.getJobcallId())
.jobtitleId(emp.getJobtitleId())
.jobtitleName(emp.getJobtitleName())
.subcompanyId(emp.getSubcompanyid())
.subcompanyName(emp.getSubcompanyName())
.status(emp.getStatus())
.accountType(emp.getAccountType())
// .departmentId(emp.getDepartmentId())
// .departmentName(emp.getDepartmentName())
// .jobcall(emp.getJobcall())
// .jobcallId(emp.getJobcallId())
// .jobtitleId(emp.getJobtitleId())
// .jobtitleName(emp.getJobtitleName())
// .subcompanyId(emp.getSubcompanyid())
// .subcompanyName(emp.getSubcompanyName())
// .status(emp.getStatus())
// .accountType(emp.getAccountType())
.creator(employeeId)
.createTime(now)
.updateTime(now)

View File

@ -6,12 +6,14 @@ import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobBackItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
import com.engine.salary.enums.UserStatusEnum;
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
import com.engine.salary.util.JsonUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.general.Util;
import java.math.BigDecimal;
import java.util.Collections;
@ -115,8 +117,8 @@ public class SalaryAcctFormulaBO {
.mobile(simpleEmployee.getMobile())
.telephone(simpleEmployee.getTelephone())
.sex(sexName)
.status(simpleEmployee.getStatus())
.statusName(simpleEmployee.getStatusName())
.status(salaryAcctEmployeePO.getStatus())
.statusName(UserStatusEnum.getDefaultLabelByValue(new Integer(Util.null2s(salaryAcctEmployeePO.getStatus(), "1"))))
.accountType(simpleEmployee.getAccountType())
.accountTypeName(simpleEmployee.getAccountTypeName())
.departmentName(salaryAcctEmployeePO.getDepartmentName())

View File

@ -16,7 +16,7 @@ public interface HrmSnapshotMapper {
*/
List<HrmSnapshotPO> listAll();
List<HrmSnapshotPO> snapshot(List<Long> employeeIds, Date snapshotTime);
List<HrmSnapshotPO> snapshot(@Param("employeeId")Long employeeId, @Param("snapshotTime")Date snapshotTime);
/**
* 条件查询
@ -42,12 +42,6 @@ public interface HrmSnapshotMapper {
*/
int insertIgnoreNull(HrmSnapshotPO hrmSnapshot);
/**
* 批量插入
*
* @param hrmSnapshot
*/
void batchInsert(@Param("collection") List<HrmSnapshotPO> hrmSnapshot);
/**
* 修改修改所有字段

View File

@ -35,6 +35,7 @@
<result column="ISLABOUUNION" property="islabouunion"/>
<result column="JOBACTIVITYDESC" property="jobactivitydesc"/>
<result column="JOBCALL" property="jobcall"/>
<result column="jobcallname" property="jobcallname"/>
<result column="JOBLEVEL" property="joblevel"/>
<result column="JOBTITLE" property="jobtitle"/>
<result column="JOBTITLENAME" property="jobtitlename"/>
@ -107,6 +108,7 @@
, t.ISLABOUUNION
, t.JOBACTIVITYDESC
, t.JOBCALL
, t.jobcallname
, t.JOBLEVEL
, t.JOBTITLE
, t.JOBTITLENAME
@ -157,6 +159,8 @@
<include refid="baseColumns"/>
FROM hrsa_hrm_snapshot t
WHERE snapshot_time >= #{snapshotTime}
AND employee_id = #{employeeId}
order by snapshot_time
</select>
<!-- 根据主键获取单条记录 -->
@ -269,6 +273,9 @@
<if test="jobcall != null">
AND JOBCALL = #{jobcall}
</if>
<if test="jobcallname != null">
AND jobcallname = #{jobcallname}
</if>
<if test="joblevel != null">
AND JOBLEVEL = #{joblevel}
</if>
@ -485,6 +492,9 @@
<if test="jobcall != null">
JOBCALL,
</if>
<if test="jobcallname != null">
jobcallname,
</if>
<if test="joblevel != null">
JOBLEVEL,
</if>
@ -688,6 +698,9 @@
<if test="jobcall != null">
#{jobcall},
</if>
<if test="jobcallname != null">
#{jobcallname},
</if>
<if test="joblevel != null">
#{joblevel},
</if>
@ -831,6 +844,7 @@
ISLABOUUNION=#{islabouunion},
JOBACTIVITYDESC=#{jobactivitydesc},
JOBCALL=#{jobcall},
jobcallname=#{jobcallname},
JOBLEVEL=#{joblevel},
JOBTITLE=#{jobtitle},
JOBTITLENAME=#{jobtitlename},
@ -968,6 +982,9 @@
<if test="jobcall != null">
JOBCALL=#{jobcall},
</if>
<if test="jobcallname != null">
jobcallname=#{jobcallname},
</if>
<if test="joblevel != null">
JOBLEVEL=#{joblevel},
</if>
@ -1148,6 +1165,7 @@
,e.DEGREE
,e.USEKIND
,e.JOBCALL
,job.NAME as jobcallname
,e.ACCUMFUNDACCOUNT
,e.BIRTHPLACE
,e.FOLK
@ -1177,6 +1195,7 @@
left join hrmdepartment d on e.departmentid = d.id
left join HrmSubCompany c on e.SUBCOMPANYID1=c.id
left join hrmjobtitles j on e.jobtitle = j.id
left join hrmjobcall job on e.jobcall=job.id
</select>
</mapper>

View File

@ -9,6 +9,7 @@ import com.engine.salary.entity.hrm.dto.EmployeeInfoExpandDTO;
import com.engine.salary.entity.salarysob.param.SalarySobRangeEmpQueryParam;
import com.engine.salary.enums.datacollection.UseEmployeeTypeEnum;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -181,4 +182,6 @@ public interface SalaryEmployeeService {
* @return
*/
JobCallInfo getJobCallInfoById(Long jobCallId);
List<DataCollectionEmployee> snapshot(List<Long> employeeIds, Date snapshotTime);
}

View File

@ -7,7 +7,6 @@ import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.hrmelog.entity.dto.LoggerContext;
import com.engine.salary.config.SalaryElogConfig;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryacct.bo.SalaryAcctConfig;
import com.engine.salary.entity.salaryacct.bo.SalaryAcctEmployeeBO;
@ -154,24 +153,24 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
@Override
public void addFromReduce(SalaryAcctEmployeeAddParam addParam) {
ValidUtil.doValidator(addParam);
// 查询薪资核算记录
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(addParam.getSalaryAcctRecordId());
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
// 查询环比减少的薪资核算人员
List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = listByIds(addParam.getIds());
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98830, "薪资核算人员不存在或已被删除"));
}
// 添加薪资核算人员
Date now = new Date();
List<SalaryAcctEmployeePO> newSalaryAcctEmployeePOS = salaryAcctEmployeePOS.stream().map(salaryAcctEmployeePO -> new SalaryAcctEmployeePO()
.setSalaryAcctRecordId(salaryAcctRecordPO.getId()).setSalarySobId(salaryAcctRecordPO.getSalarySobId()).setSalaryMonth(salaryAcctRecordPO.getSalaryMonth()).setEmployeeId(salaryAcctEmployeePO.getEmployeeId()).setTaxAgentId(salaryAcctEmployeePO.getTaxAgentId()).setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY).setCreateTime(now).setUpdateTime(now).setCreator((long) user.getUID()).setDeleteType(0)).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(newSalaryAcctEmployeePOS)) {
batchSave(newSalaryAcctEmployeePOS);
}
// ValidUtil.doValidator(addParam);
// // 查询薪资核算记录
// SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(addParam.getSalaryAcctRecordId());
// if (Objects.isNull(salaryAcctRecordPO)) {
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
// }
// // 查询环比减少的薪资核算人员
// List<SalaryAcctEmployeePO> salaryAcctEmployeePOS = listByIds(addParam.getIds());
// if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98830, "薪资核算人员不存在或已被删除"));
// }
// // 添加薪资核算人员
// Date now = new Date();
// List<SalaryAcctEmployeePO> newSalaryAcctEmployeePOS = salaryAcctEmployeePOS.stream().map(salaryAcctEmployeePO -> new SalaryAcctEmployeePO()
// .setSalaryAcctRecordId(salaryAcctRecordPO.getId()).setSalarySobId(salaryAcctRecordPO.getSalarySobId()).setSalaryMonth(salaryAcctRecordPO.getSalaryMonth()).setEmployeeId(salaryAcctEmployeePO.getEmployeeId()).setTaxAgentId(salaryAcctEmployeePO.getTaxAgentId()).setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY).setCreateTime(now).setUpdateTime(now).setCreator((long) user.getUID()).setDeleteType(0)).collect(Collectors.toList());
// if (CollectionUtils.isNotEmpty(newSalaryAcctEmployeePOS)) {
// batchSave(newSalaryAcctEmployeePOS);
// }
}
@Override
@ -431,6 +430,9 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98769, "个税扣缴义务人下无该人员档案信息或薪资缴纳日期不在薪资周期内"));
}
//替换快照数据
shotEmpData(salaryAcctEmployeePOS, salarySobCycleDTO.getSalaryCycleFromDate());
batchSave(salaryAcctEmployeePOS);
@ -447,6 +449,24 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
SalaryElogConfig.salaryAcctRecordLoggerTemplate.write(loggerContext);
}
private void shotEmpData(List<SalaryAcctEmployeePO> salaryAcctEmployeePOS, Date shotTime) {
List<Long> employees = SalaryEntityUtil.properties(salaryAcctEmployeePOS, SalaryAcctEmployeePO::getEmployeeId, Collectors.toList());
List<DataCollectionEmployee> snapshot = getSalaryEmployeeService(user).snapshot(employees, shotTime);
Map<Long, DataCollectionEmployee> shotEmpMap = SalaryEntityUtil.convert2Map(snapshot, DataCollectionEmployee::getEmployeeId);
salaryAcctEmployeePOS.forEach(salaryAcctEmployeePO -> {
DataCollectionEmployee shotEmp = shotEmpMap.getOrDefault(salaryAcctEmployeePO.getEmployeeId(), new DataCollectionEmployee());
salaryAcctEmployeePO.setDepartmentId(shotEmp.getDepartmentId());
salaryAcctEmployeePO.setDepartmentName(shotEmp.getDepartmentName());
salaryAcctEmployeePO.setJobcall(shotEmp.getJobcall());
salaryAcctEmployeePO.setJobcallId(shotEmp.getJobcallId());
salaryAcctEmployeePO.setJobtitleId(shotEmp.getJobtitleId());
salaryAcctEmployeePO.setJobtitleName(shotEmp.getJobtitleName());
salaryAcctEmployeePO.setSubcompanyId(shotEmp.getSubcompanyid());
salaryAcctEmployeePO.setSubcompanyName(shotEmp.getSubcompanyName());
salaryAcctEmployeePO.setStatus(shotEmp.getStatus());
salaryAcctEmployeePO.setAccountType(shotEmp.getAccountType());
});
}
@Override
public void batchSave(Collection<SalaryAcctEmployeePO> salaryAcctEmployeePOS) {
if (CollectionUtils.isEmpty(salaryAcctEmployeePOS)) {
@ -560,6 +580,7 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
// 保存薪资核算人员
if (CollectionUtils.isNotEmpty(salaryAcctEmployeePOS)) {
shotEmpData(salaryAcctEmployeePOS, salarySobCycleDTO.getSalaryCycleFromDate());
batchSave(salaryAcctEmployeePOS);
}
}
@ -606,6 +627,7 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
List<Long> delIds = oldEmps.stream().filter(po -> !newEmpMap.containsKey(po.getTaxAgentId() + "_" + po.getEmployeeId())).map(SalaryAcctEmployeePO::getId).collect(Collectors.toList());
deleteByIds(delIds);
shotEmpData(addEmps, salarySobCycleDTO.getSalaryCycleFromDate());
batchSave(addEmps);
}
@ -762,7 +784,7 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
list = list.stream().filter(po -> param.getEmployee().contains(po.getEmployeeId())).collect(Collectors.toList());
}
if(isRealOrg){
if (isRealOrg) {
Set<Long> empIds = SalaryEntityUtil.properties(employeeList, DataCollectionEmployee::getEmployeeId);
list = list.stream().filter(po -> empIds.contains(po.getEmployeeId())).collect(Collectors.toList());
}
@ -788,16 +810,16 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct
throw new SalaryRunTimeException("锁定状态异常!");
}
if (updateParam.getLockStatus() == LockStatusEnum.LOCK){
if (updateParam.getLockStatus() == LockStatusEnum.LOCK) {
SalaryAcctConfig salaryAcctSobConfig = getSalaryAcctSobConfigService(user).getSalaryAcctConfig(updateParam.getSalaryAcctRecordId());
List<SalarySobItemPO> salarySobItems = salaryAcctSobConfig.getSalarySobItems();
List<Long> itemIds = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId,Collectors.toList());
List<Long> itemIds = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId, Collectors.toList());
salaryAcctEmployees.forEach(salaryAcctEmployeePO -> {
salaryAcctEmployeePO.setLockItems(itemIds);
lock(salaryAcctEmployeePO);
});
}else {
} else {
salaryAcctEmployees.forEach(salaryAcctEmployeePO -> {
salaryAcctEmployeePO.setLockItems(new ArrayList<>());
lock(salaryAcctEmployeePO);

View File

@ -1,5 +1,6 @@
package com.engine.salary.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import com.api.formmode.mybatis.util.SqlProxyHandle;
import com.engine.common.util.ServiceUtil;
@ -19,6 +20,7 @@ import com.engine.salary.entity.hrm.po.HrmSnapshotPO;
import com.engine.salary.entity.salarysob.bo.SalarySobRangeBO;
import com.engine.salary.entity.salarysob.param.SalarySobRangeEmpQueryParam;
import com.engine.salary.entity.salarysob.po.SalarySobRangePO;
import com.engine.salary.enums.AccountTypeEnum;
import com.engine.salary.enums.UserStatusEnum;
import com.engine.salary.enums.datacollection.UseEmployeeTypeEnum;
import com.engine.salary.enums.salarysob.TargetTypeEnum;
@ -620,7 +622,49 @@ public class SalaryEmployeeServiceImpl extends Service implements SalaryEmployee
return SalaryI18nUtil.i18n(getEmployMapper().getJobCallInfoById(jobCallId));
}
public List<HrmSnapshotPO> snapshot(List<Long> employeeIds, Date snapshotTime) {
return getHrmSnapshotMapper().snapshot(employeeIds, snapshotTime);
public List<DataCollectionEmployee> snapshot(List<Long> employeeIds, Date snapshotTime) {
List<DataCollectionEmployee> currentEmployees = getEmployeeByIdsAll(employeeIds);
Map<Long, DataCollectionEmployee> currentEmployeeMap = SalaryEntityUtil.convert2Map(currentEmployees, DataCollectionEmployee::getEmployeeId);
List<DataCollectionEmployee> employees = employeeIds.stream()
.map(employeeId -> {
List<HrmSnapshotPO> snapshot = getHrmSnapshotMapper().snapshot(employeeId, snapshotTime);
return snapshot.stream().findFirst().map(hrmSnapshotPO -> DataCollectionEmployee.
builder()
.employeeId(employeeId)
.username(hrmSnapshotPO.getLastname())
.departmentName(hrmSnapshotPO.getDepartmentname())
.departmentId(NumberUtil.parseLong(Util.null2String(hrmSnapshotPO.getDepartmentid())))
.subcompanyName(hrmSnapshotPO.getSubcompanyname())
.subcompanyid(NumberUtil.parseLong(Util.null2String(hrmSnapshotPO.getSubcompanyid1())))
.costcenterId(NumberUtil.parseLong(Util.null2String(hrmSnapshotPO.getCostcenterid())))
.locationId(NumberUtil.parseLong(Util.null2String(hrmSnapshotPO.getLocationid())))
.jobtitleName(hrmSnapshotPO.getJobtitlename())
.jobtitleId(NumberUtil.parseLong(Util.null2String(hrmSnapshotPO.getJobtitle())))
.companystartdate(hrmSnapshotPO.getCompanystartdate())
.mobile(hrmSnapshotPO.getMobile())
// .dismissdate()
.status(Util.null2String(hrmSnapshotPO.getStatus()))
.statusName(UserStatusEnum.getDefaultLabelByValue(NumberUtils.toInt(Util.null2String(hrmSnapshotPO.getStatus()), 1)))
.workcode(hrmSnapshotPO.getWorkcode())
.sex(hrmSnapshotPO.getSex())
.email(hrmSnapshotPO.getEmail())
.telephone(hrmSnapshotPO.getTelephone())
.jobcall(hrmSnapshotPO.getJobcallname())
.jobcallId(NumberUtil.parseLong(Util.null2String(hrmSnapshotPO.getJobcall())))
.birthday(hrmSnapshotPO.getBirthday())
.workYear(hrmSnapshotPO.getWorkyear() == null ? 0.00 : hrmSnapshotPO.getWorkyear().doubleValue())
.companyWorkYear(hrmSnapshotPO.getCompanyworkyear() == null ? 0.00 : hrmSnapshotPO.getCompanyworkyear().doubleValue())
.idNo(hrmSnapshotPO.getCertificatenum())
.accountTypeName(AccountTypeEnum.getDefaultLabelByValue(hrmSnapshotPO.getAccounttype()))
.accountType(hrmSnapshotPO.getAccounttype())
.build())
.orElse(currentEmployeeMap.get(employeeId));
}).collect(Collectors.toList());
return SalaryI18nUtil.i18nList(employees);
}
}

View File

@ -6,6 +6,7 @@ import com.engine.salary.mapper.hrm.HrmSnapshotMapper;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.db.IdGenerator;
import com.engine.salary.util.db.MapperProxyFactory;
import lombok.extern.slf4j.Slf4j;
import weaver.hrm.User;
import weaver.interfaces.schedule.BaseCronJob;
@ -13,9 +14,10 @@ import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@Slf4j
public class HrmSnapshotJob extends BaseCronJob {
//指定筷子时间
private String appointSnapshotTime;
private HrmSnapshotMapper getHrmSnapshotMapper() {
@ -28,24 +30,25 @@ public class HrmSnapshotJob extends BaseCronJob {
user.setUid(1);
user.setLoginid("sysadmin");
List<HrmSnapshotPO> hrmSnapshotPOS = getHrmSnapshotMapper().currentEmpData();
try {
List<HrmSnapshotPO> hrmSnapshotPOS = getHrmSnapshotMapper().currentEmpData();
Date snapshotTime = StrUtil.isNotBlank(appointSnapshotTime) && SalaryDateUtil.checkDay(appointSnapshotTime) ? SalaryDateUtil.dateStrToLocalDate(appointSnapshotTime) : SalaryDateUtil.localDateToDate(LocalDate.now());
Date snapshotTime = StrUtil.isNotBlank(appointSnapshotTime) && SalaryDateUtil.checkDay(appointSnapshotTime) ? SalaryDateUtil.dateStrToLocalDate(appointSnapshotTime) : SalaryDateUtil.localDateToDate(LocalDate.now());
//先删除当日快照
getHrmSnapshotMapper().deleteBySnapshotTime(snapshotTime);
//先删除当日快照
getHrmSnapshotMapper().deleteBySnapshotTime(snapshotTime);
hrmSnapshotPOS.forEach(hrmSnapshotPO -> {
hrmSnapshotPOS.forEach(hrmSnapshotPO -> {
hrmSnapshotPO.setId(IdGenerator.generate());
hrmSnapshotPO.setSnapshotTime(snapshotTime);
hrmSnapshotPO.setId(IdGenerator.generate());
hrmSnapshotPO.setSnapshotTime(snapshotTime);
getHrmSnapshotMapper().insertIgnoreNull(hrmSnapshotPO);
getHrmSnapshotMapper().insertIgnoreNull(hrmSnapshotPO);
});
System.out.println(hrmSnapshotPOS);
});
}catch (Exception e){
log.error("生成快照失败", e);
}
}
}