From a7cc99fdd359068804c0b814151cd826f3f41380 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 16 May 2023 18:01:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AC=E5=BC=8F=E5=BC=82=E5=B8=B8=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salaryacct/bo/SalaryAcctResultBO.java | 2 + .../service/SalaryAcctProgressService.java | 4 ++ .../impl/SalaryAcctCalculateServiceImpl.java | 41 +++++++++++++------ .../impl/SalaryAcctProgressServiceImpl.java | 23 +++++++++++ 4 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java index 96bd7353f..19b51c780 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctResultBO.java @@ -248,6 +248,8 @@ public class SalaryAcctResultBO { } // 主键id map.put("id", e.getId()); + //人员id + map.put("employeeId", e.getEmployeeId()); // 个税扣缴义务人 String taxAgentName = taxAgentNameMap.getOrDefault(e.getTaxAgentId(), StringUtils.EMPTY); map.put("taxAgentName", taxAgentName); diff --git a/src/com/engine/salary/service/SalaryAcctProgressService.java b/src/com/engine/salary/service/SalaryAcctProgressService.java index df8833b3c..1dab7e710 100644 --- a/src/com/engine/salary/service/SalaryAcctProgressService.java +++ b/src/com/engine/salary/service/SalaryAcctProgressService.java @@ -30,6 +30,10 @@ public interface SalaryAcctProgressService { */ void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity); + + // + void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity, String message); + /** * 计算失败 * diff --git a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java index eff8b4e09..02c56f351 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java @@ -34,6 +34,7 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.hrm.User; +import weaver.wechat.util.Utils; import java.time.Month; import java.util.*; @@ -168,12 +169,14 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc Map salarySobBackItemMap = SalaryEntityUtil.convert2Map(salarySobBackItems, SalarySobBackItemPO::getSalaryItemId); List salaryAcctResultTempPOS = Lists.newArrayList(); // 开始核算 + String noticeMsg = ""; for (SalaryAcctEmployeePO salaryAcctEmployeePO : salaryAcctCalculateBO.getSalaryAcctEmployeePOS()) { Long salaryAcctEmployeePOId = salaryAcctEmployeePO.getId(); //1 获取当前薪资核算人员的公式中的变量的值 List formulaVarValues = formulaVarMap.get(salaryAcctEmployeePO.getEmployeeId() + "_" + salaryAcctEmployeePO.getTaxAgentId()); //2 人员信息 - formulaVarValues.addAll(formulaVarMap.get(salaryAcctEmployeePO.getEmployeeId() + "")); + List empInfo = formulaVarMap.get(salaryAcctEmployeePO.getEmployeeId() + ""); + formulaVarValues.addAll(empInfo); Map formulaVarValueMap = SalaryEntityUtil.convert2Map(formulaVarValues, CalculateFormulaVarBO.FormulaVarValue::getFieldId, CalculateFormulaVarBO.FormulaVarValue::getFieldValue); // 按照计算好的优先级计算薪资项目的值 for (List salaryItemIds : salaryAcctCalculateBO.getSalaryItemIdWithPriorityList()) { @@ -195,7 +198,14 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc } if (Objects.nonNull(expressFormula)) { // 运行公式 - resultValue = runExpressFormula(expressFormula, formulaVarValueMap, simpleEmployee); + ExcelResult result = runExpressFormula(expressFormula, formulaVarValueMap, simpleEmployee); + resultValue = Utils.null2String(result.getData()); + //公式异常 + if (!result.isStatus()) { + String username = empInfo.stream().filter(emp -> StringUtils.equals("employeeInfo_username", emp.getFieldId())).findFirst().map(CalculateFormulaVarBO.FormulaVarValue::getFieldValue).orElse(""); + String errorMsg = username + "的" + salaryItemPO.getName() + "核算异常,原因:" + result.getErrorMsg(); + noticeMsg = noticeMsg + errorMsg + "/n"; + } } else { // 处理取值类型为“输入/导入”的薪资项目 String key = SalaryFormulaReferenceEnum.SALARY_ITEM.getValue() + SalaryFormulaFieldConstant.FIELD_ID_SEPARATOR + salaryItemPO.getCode(); @@ -246,7 +256,9 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc getSalaryAcctResultTempService(user).batchSave(salaryAcctResultTempPOS); // 更新薪资核算进度 getSalaryAcctProgressService(user).getAndAddCalculatedQty(SalaryCacheKey.ACCT_PROGRESS + salaryAcctCalculateBO.getSalaryAcctRecordPO().getId(), - salaryAcctCalculateBO.getSalaryAcctEmployeePOS().size()); + salaryAcctCalculateBO.getSalaryAcctEmployeePOS().size(), + noticeMsg + ); // 记录子线程执行结果 salaryAcctCalculateBO.getResults().add(new SalaryAcctCalculateBO.Result(true, StringUtils.EMPTY)); } catch (Exception e) { @@ -267,24 +279,27 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc * @param formulaVarValueMap * @return */ - private String runExpressFormula(ExpressFormula expressFormula, Map formulaVarValueMap, DataCollectionEmployee simpleEmployee) { + private ExcelResult runExpressFormula(ExpressFormula expressFormula, Map formulaVarValueMap, DataCollectionEmployee simpleEmployee) { // 给公式中的变量填入值 + ExcelResult result = new ExcelResult(); try { List formulaVars = ExpressFormulaBO.buildFormulaVar4Accounting(expressFormula, formulaVarValueMap); - ExcelResult run = getFormulaRunService(user).run(expressFormula, formulaVars, simpleEmployee); - - if (run.isStatus()) { - return run.getData().toString(); - } - + result = getFormulaRunService(user).run(expressFormula, formulaVars, simpleEmployee); } catch (Exception e) { log.error("express execute fail ", e); + result.setStatus(false); + result.setErrorMsg(e.getMessage()); } - if ("number".equals(expressFormula.getReturnType())) { - return "0"; + //核算出错,给个默认值 + if (!result.isStatus() || result.getData() == null) { + if ("number".equals(expressFormula.getReturnType())) { + result.setData("0"); + } else { + result.setData(StringUtils.EMPTY); + } } - return StringUtils.EMPTY; + return result; } /** diff --git a/src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java index c3d22e069..0cb90e377 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctProgressServiceImpl.java @@ -6,6 +6,7 @@ import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; import com.engine.salary.service.SalaryAcctProgressService; import com.engine.salary.util.JsonUtil; import org.apache.commons.lang3.StringUtils; +import weaver.wechat.util.Utils; import java.math.BigDecimal; import java.math.RoundingMode; @@ -44,6 +45,28 @@ public class SalaryAcctProgressServiceImpl extends Service implements SalaryAcct } } + @Override + public synchronized void getAndAddCalculatedQty(String cacheKey, Integer calculatedQuantity, String message) { + String resultStr = (String) Util_DataCache.getObjVal(cacheKey); + if (StringUtils.isNotEmpty(resultStr)) { + SalaryAcctProgressDTO salaryAcctProgress = JsonUtil.parseObject(resultStr, SalaryAcctProgressDTO.class); + if (salaryAcctProgress == null || !salaryAcctProgress.isStatus()) { + return; + } + Integer currentCalculatedQuantity = salaryAcctProgress.getCalculatedQuantity() + calculatedQuantity; + salaryAcctProgress.setCalculatedQuantity( + currentCalculatedQuantity > salaryAcctProgress.getTotalQuantity() ? salaryAcctProgress.getTotalQuantity() : currentCalculatedQuantity); + BigDecimal progress = BigDecimal.valueOf(salaryAcctProgress.getCalculatedQuantity()) + .divide(BigDecimal.valueOf(salaryAcctProgress.getTotalQuantity()), 4, RoundingMode.HALF_DOWN); + salaryAcctProgress.setProgress(progress.compareTo(BigDecimal.ONE) > 0 ? BigDecimal.ONE : progress); + + if (StringUtils.isNotBlank(message)) { + salaryAcctProgress.setMessage(Utils.null2String(salaryAcctProgress.getMessage()) + message); + } + Util_DataCache.setObjVal(cacheKey, JsonUtil.toJsonString(salaryAcctProgress)); + } + } + @Override public void fail(String cacheKey, String message) { SalaryAcctProgressDTO salaryAcctProgress = new SalaryAcctProgressDTO();