This commit is contained in:
钱涛 2023-04-25 17:08:42 +08:00
parent cef3d26693
commit 59c32b24e6
4 changed files with 142 additions and 38 deletions

View File

@ -6,6 +6,7 @@ import com.engine.salary.maintainer.salaryacct.SalaryAcctManager;
import com.engine.salary.maintainer.salaryacct.SalaryAcctSupplementParam;
import com.engine.salary.util.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
@ -16,7 +17,9 @@ import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 累计专项附加扣除
@ -48,9 +51,25 @@ public class MaintainerController {
@Path("/acct/supplement")
@Produces(MediaType.APPLICATION_JSON)
public String supplementAcctRecord(@Context HttpServletRequest request, @Context HttpServletResponse response) {
String type = request.getParameter("type");
String salaryAcctRecordStrIds = request.getParameter("salaryAcctRecordStrIds");
String salarySobStrIds = request.getParameter("salarySobStrIds");
String salaryItemStrIds = request.getParameter("salaryItemStrIds");
SalaryAcctSupplementParam queryParam = SalaryAcctSupplementParam.builder()
.salaryAcctRecordId(Long.parseLong(request.getParameter("salaryAcctRecordId")))
.salaryItemStrIds(request.getParameter("salaryItemStrIds")).build();
.type(type)
.salaryAcctRecordStrIds(salaryAcctRecordStrIds)
.salarySobStrIds(salarySobStrIds)
.salaryItemStrIds(salaryItemStrIds)
.build();
if (StringUtils.isNotBlank(salaryAcctRecordStrIds)) {
queryParam.setSalaryAcctRecordIds(Arrays.stream(salaryAcctRecordStrIds.split(",")).map(Long::valueOf).collect(Collectors.toList()));
}
if (StringUtils.isNotBlank(salarySobStrIds)) {
queryParam.setSalarySobIds(Arrays.stream(salarySobStrIds.split(",")).map(Long::valueOf).collect(Collectors.toList()));
}
if (StringUtils.isNotBlank(salaryItemStrIds)) {
queryParam.setSalaryItemIds(Arrays.stream(salaryItemStrIds.split(",")).map(Long::valueOf).collect(Collectors.toList()));
}
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<SalaryAcctSupplementParam, Map<String, Object>>(user).run(getSalaryAcctManager(user)::supplementAcctRecord, queryParam);
}

View File

@ -104,9 +104,6 @@ public class SalaryAcctManager extends Service {
return ServiceUtil.getService(SalarySobAdjustRuleServiceImpl.class, user);
}
private SalarySobItemHideService getSalarySobItemHideService(User user) {
return ServiceUtil.getService(SalarySobItemHideServiceImpl.class, user);
}
private SalaryAcctCalculateService getSalaryAcctCalculateService(User user) {
return ServiceUtil.getService(SalaryAcctCalculateServiceImpl.class, user);
@ -151,14 +148,41 @@ public class SalaryAcctManager extends Service {
public void supplementAcctRecord(SalaryAcctSupplementParam param) {
ValidUtil.doValidator(param);
List<Long> salaryItemIds = Arrays.stream(param.getSalaryItemStrIds().split(",")).map(Long::valueOf).collect(Collectors.toList());
param.setSalaryItemIds(salaryItemIds);
if(CollectionUtils.isEmpty(salaryItemIds)){
throw new SalaryRunTimeException("薪资项目为空!");
//待补算的记录
List<SalaryAcctRecordPO> salaryAcctRecordPOS = new ArrayList<>();
if (StringUtils.equals(param.getType(), "sob")) {
List<Long> salarySobIds = param.getSalarySobIds();
if (CollectionUtils.isEmpty(salarySobIds)) {
throw new SalaryRunTimeException("补算账套为空!");
}
//获取账套下面所有的核算记录
salaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIds(salarySobIds);
if (CollectionUtils.isEmpty(salaryAcctRecordPOS)) {
throw new SalaryRunTimeException("账套下不存在核算记录");
}
} else if (StringUtils.equals(param.getType(), "record")) {
List<Long> salaryAcctRecordIds = param.getSalaryAcctRecordIds();
salaryAcctRecordPOS = getSalaryAcctRecordService(user).listByIds(salaryAcctRecordIds);
if (CollectionUtils.isEmpty(salaryAcctRecordPOS)) {
throw new SalaryRunTimeException("核算记录不存在");
}
} else {
throw new SalaryRunTimeException("补算方式异常!");
}
calculate(param);
salaryAcctRecordPOS.forEach(salaryAcctRecordPO -> {
param.setSalaryAcctRecordId(salaryAcctRecordPO.getId());
calculate(param);
});
}
@ -170,12 +194,15 @@ public class SalaryAcctManager extends Service {
public void calculate(SalaryAcctSupplementParam calculateParam) {
log.info("补算开始{}", calculateParam);
//核算记录
Long salaryAcctRecordId = calculateParam.getSalaryAcctRecordId();
//当前登陆人员
DataCollectionEmployee simpleEmployee = new DataCollectionEmployee();
simpleEmployee.setEmployeeId((long) user.getUID());
// 检查是否正在核算中
SalaryAcctProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress("SUPPLEMENT_ACCT_PROGRESS_" + calculateParam.getSalaryAcctRecordId());
SalaryAcctProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId);
if (Objects.nonNull(salaryAcctProgressDTO) && salaryAcctProgressDTO.isStatus() && Optional.ofNullable(salaryAcctProgressDTO.getProgress()).orElse(BigDecimal.ZERO).compareTo(BigDecimal.ONE) < 0) {
return;
}
@ -188,20 +215,16 @@ public class SalaryAcctManager extends Service {
.setProgress(BigDecimal.ZERO)
.setStatus(true)
.setMessage(StringUtils.EMPTY);
getSalaryAcctProgressService(user).initProgress("SUPPLEMENT_ACCT_PROGRESS_" + calculateParam.getSalaryAcctRecordId(), initProgress);
new Thread() {
public void run() {
calculate(calculateParam, simpleEmployee);
}
}.start();
getSalaryAcctProgressService(user).initProgress("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId, initProgress);
calculate(calculateParam, simpleEmployee);
}
public void calculate(SalaryAcctSupplementParam calculateParam, DataCollectionEmployee simpleEmployee) {
Long salaryAcctRecordId = calculateParam.getSalaryAcctRecordId();
try {
// 1查询薪资核算记录
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(calculateParam.getSalaryAcctRecordId());
SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(salaryAcctRecordId);
if (Objects.isNull(salaryAcctRecordPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资核算记录不存在或已被删除"));
}
@ -211,7 +234,7 @@ public class SalaryAcctManager extends Service {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98747, "薪资账套不存在或已被删除"));
}
// 2查询薪资核算记录的薪资周期考勤周期等
SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(calculateParam.getSalaryAcctRecordId());
SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(salaryAcctRecordId);
// 3查询薪资核算记录所用薪资账套的薪资项目副本
List<SalarySobItemPO> salarySobItemPOS = getSalarySobItemService(user).listBySalarySobId(salaryAcctRecordPO.getSalarySobId());
if (CollectionUtils.isEmpty(salarySobItemPOS)) {
@ -235,7 +258,7 @@ public class SalaryAcctManager extends Service {
List<Long> lockSalaryItemIds = salaryAcctRecordPO.getLockSalaryItemIds();
Map<String, SalaryAcctResultPO> acctResults = new HashMap<>();
if (CollectionUtils.isNotEmpty(lockSalaryItemIds)) {
List<SalaryAcctResultPO> acctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIds(Collections.singleton(calculateParam.getSalaryAcctRecordId()));
List<SalaryAcctResultPO> acctResultPOS = getSalaryAcctResultService(user).listBySalaryAcctRecordIds(Collections.singleton(salaryAcctRecordId));
acctResults = Optional.ofNullable(acctResultPOS)
.orElse(new ArrayList<>())
.stream()
@ -261,7 +284,7 @@ public class SalaryAcctManager extends Service {
}
// 11.1初始化进度
SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO().setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")).setTitleLabelId(97515L).setTotalQuantity(salaryAcctEmployeePOS.size() * 2 + 1).setCalculatedQuantity(0).setProgress(BigDecimal.ZERO).setStatus(true).setMessage(StringUtils.EMPTY);
getSalaryAcctProgressService(user).initProgress("SUPPLEMENT_ACCT_PROGRESS_" + calculateParam.getSalaryAcctRecordId(), initProgress);
getSalaryAcctProgressService(user).initProgress("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId, initProgress);
// 12对薪资核算人员进行拆分
List<List<SalaryAcctEmployeePO>> partition = Lists.partition(salaryAcctEmployeePOS, 5000);
// 12.1监控子线程的任务执行
@ -307,7 +330,7 @@ public class SalaryAcctManager extends Service {
if (!allSuccess) {
// 薪资核算实现的线程的错误信息
String errorMsg = calculateResults.stream().filter(result -> !result.isStatus()).map(SalaryAcctCalculateBO.Result::getErrMsg).collect(Collectors.joining("|"));
getSalaryAcctProgressService(user).fail("SUPPLEMENT_ACCT_PROGRESS_" + calculateParam.getSalaryAcctRecordId(), errorMsg);
getSalaryAcctProgressService(user).fail("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId, errorMsg);
// 删除薪资核算临时存储表中的数据
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
return;
@ -315,11 +338,11 @@ public class SalaryAcctManager extends Service {
// 15处理核算结果临时表数据
handleSalaryAcctResultTemp(calculateParam, calculateKey);
getSalaryAcctProgressService(user).finish("SUPPLEMENT_ACCT_PROGRESS_" + calculateParam.getSalaryAcctRecordId(), true);
getSalaryAcctProgressService(user).finish("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId, true);
} catch (Exception e) {
log.info("薪资核算出错:{}", e.getMessage(), e);
getSalaryAcctProgressService(user).fail("SUPPLEMENT_ACCT_PROGRESS_" + calculateParam.getSalaryAcctRecordId(), SalaryI18nUtil.getI18nLabel(99642, "薪资核算出错") + ": " + e.getMessage());
getSalaryAcctProgressService(user).fail("SUPPLEMENT_ACCT_PROGRESS_" + salaryAcctRecordId, SalaryI18nUtil.getI18nLabel(99642, "薪资核算出错") + ": " + e.getMessage());
}
}
@ -336,15 +359,14 @@ public class SalaryAcctManager extends Service {
List<Long> salaryItemIds = calculateParam.getSalaryItemIds();
getSalaryAcctResultMapper().deleteBySalaryAcctRecordIdAndSalaryItemIds(calculateParam.getSalaryAcctRecordId(), salaryItemIds);
// 保存薪资的薪资核算结果
List<SalaryAcctResultPO> salaryAcctResultPOS = salaryAcctResultTempPOS.stream().filter(salaryAcctResultTempPO -> salaryItemIds.contains(salaryAcctResultTempPO.getSalaryItemId())).map(e -> {
SalaryAcctResultPO salaryAcctResult = new SalaryAcctResultPO();
BeanUtils.copyProperties(e, salaryAcctResult);
return salaryAcctResult;
}).collect(Collectors.toList());
List<SalaryAcctResultPO> salaryAcctResultPOS = salaryAcctResultTempPOS.stream()
.filter(salaryAcctResultTempPO -> salaryItemIds.contains(salaryAcctResultTempPO.getSalaryItemId()))
.map(e -> {
SalaryAcctResultPO salaryAcctResult = new SalaryAcctResultPO();
BeanUtils.copyProperties(e, salaryAcctResult);
return salaryAcctResult;
}).collect(Collectors.toList());
getSalaryAcctResultService(user).batchSave(salaryAcctResultPOS);
//保存核算报表数据
// List<SalaryAcctResultReportPO> salaryAcctResultReportPOS = SalaryAcctResultReportBO.convert2ReportPO(salaryAcctResultTempPOS, calculateParam.getEmps());
// getSalaryAcctReportService(user).batchSave(salaryAcctResultReportPOS);
// 删除薪资核算临时存储表中的数据
getSalaryAcctResultTempService(user).deleteByCalculateKey(calculateKey);
}

View File

@ -22,12 +22,33 @@ import java.util.List;
@AllArgsConstructor
public class SalaryAcctSupplementParam {
@DataCheck(require = true,message = "参数错误薪资核算记录ID不能为空")
private Long salaryAcctRecordId;
@DataCheck(require = true,message = "参数错误薪资项目ID不能为空")
//前端传入
/**
* 补算方式0按核算记录进行补充核算1按账套进行补充核算
*/
@DataCheck(require = true, message = "补算方式为空")
private String type;
/**
* 按核算记录进行补充核算
*/
private List<Long> salaryAcctRecordIds;
private String salaryAcctRecordStrIds;
/**
* 按账套进行补充核算
*/
private List<Long> salarySobIds;
private String salarySobStrIds;
/**
* 待核算的项目
*/
@DataCheck(require = true, message = "补算项目为空")
private List<Long> salaryItemIds;
private String salaryItemStrIds;
private List<Long> salaryItemIds;
//核算使用
private Long salaryAcctRecordId;
}

View File

@ -0,0 +1,42 @@
package com.engine.salary.maintainer.salaryacct;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
public abstract class SupAcctThread implements Runnable {
private SalaryAcctSupplementParam calculateParam;
private DataCollectionEmployee simpleEmployee;
public SalaryAcctSupplementParam getCalculateParam() {
return calculateParam;
}
public void setCalculateParam(SalaryAcctSupplementParam calculateParam) {
this.calculateParam = calculateParam;
}
public DataCollectionEmployee getSimpleEmployee() {
return simpleEmployee;
}
public void setSimpleEmployee(DataCollectionEmployee simpleEmployee) {
this.simpleEmployee = simpleEmployee;
}
public SupAcctThread(SalaryAcctSupplementParam calculateParam, DataCollectionEmployee simpleEmployee) {
this.calculateParam = calculateParam;
this.simpleEmployee = simpleEmployee;
}
@Override
public void run() {
try {
execute(calculateParam, simpleEmployee);
} catch (Exception e) {
e.printStackTrace();
}
}
public abstract void execute(SalaryAcctSupplementParam calculateParam, DataCollectionEmployee simpleEmployee) throws Exception;
}