核算优先级

This commit is contained in:
钱涛 2023-09-06 14:01:56 +08:00
parent d49b33c66f
commit d03aed1d1b
4 changed files with 106 additions and 22 deletions

View File

@ -0,0 +1,57 @@
package com.engine.salary.entity.salaryacct.bo;
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.enums.SalaryRoundingModeEnum;
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @description: 薪资核算涉及的薪资项目
* @author: xiajun
* @modified By: xiajun
* @date: Created in 2023/5/19 16:00
* @version:v1.0
*/
@Data
@Accessors(chain = true)
public class SalaryCalcItem {
/**
* 薪资项目id
*/
private Long salaryItemId;
/**
* 薪资项目编号
*/
private String salaryItemCode;
/**
* 所得项目
*/
private String incomeCategory;
/**
* 薪资档案引用0薪资档案未引用1薪资档案引用
* 为处理历史数据而留不再使用
*/
@Deprecated
private Integer useInEmployeeSalary;
/**
* 字段类型
* @see SalaryDataTypeEnum
*/
private String dataType;
/**
* 舍入规则
* @see SalaryRoundingModeEnum
*/
private Integer roundingMode;
/**
* 小数位数
*/
private Integer pattern;
/**
* 公式
*/
private ExpressFormula expressFormula;
}

View File

@ -1,14 +1,11 @@
package com.engine.salary.entity.salaryacct.bo;
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.po.FormulaVar;
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
import com.engine.salary.report.common.constant.SalaryConstant;
import com.engine.salary.util.SalaryEntityUtil;
import com.google.common.collect.Lists;
import com.googlecode.aviator.Expression;
import com.weaver.excel.formula.api.entity.FormulaVar;
import com.weaver.hrm.salary.constant.SalaryConstant;
import com.weaver.hrm.salary.enums.salaryitem.SalaryFormulaReferenceEnum;
import com.weaver.teams.domain.user.SimpleEmployee;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
@ -32,33 +29,27 @@ public class SalaryCalcItemGraph {
* @param salarySobItems 薪资账套的薪资项目
* @param expressFormulas 公式详情
*/
public SalaryCalcItemGraph(List<SalarySobItemPO> salarySobItems, List<ExpressFormula> expressFormulas, SimpleEmployee currentUser) {
public SalaryCalcItemGraph(List<SalarySobItemPO> salarySobItems, List<ExpressFormula> expressFormulas) {
Map<String, SalarySobItemPO> salaryItemMap = SalaryEntityUtil.convert2Map(salarySobItems,
SalarySobItemPO::getSalaryItemCode);
Map<Long, ExpressFormula> expressFormulaMap = SalaryEntityUtil.convert2Map(expressFormulas,
ExpressFormula::getId);
Map<Long, List<FormulaVar>> formulaVarMap = ExpressFormulaBO.buildFormulaVar(expressFormulas);
Map<Long, Expression> expressionMap = ExpressFormulaBO.compile(expressFormulas, currentUser);
Map<Long, SalaryCalcItemGraphNode> nodeMap = new HashMap<>();
for (SalarySobItemPO salarySobItem : salarySobItems) {
Expression expression = expressionMap.get(salarySobItem.getFormulaId());
ExpressFormula expressFormula = expressFormulaMap.get(salarySobItem.getFormulaId());
SalaryCalcItemGraphNode node = nodeMap.computeIfAbsent(salarySobItem.getSalaryItemId(), key -> new SalaryCalcItemGraphNode(salarySobItem, expressFormula, expression));
List<FormulaVar> formulaVars = expressFormula == null ? Collections.emptyList()
: formulaVarMap.getOrDefault(expressFormula.getId(), Collections.emptyList());
SalaryCalcItemGraphNode node = nodeMap.computeIfAbsent(salarySobItem.getSalaryItemId(), key -> new SalaryCalcItemGraphNode(salarySobItem, expressFormula));
List<FormulaVar> formulaVars = expressFormula == null ? Collections.emptyList() : formulaVarMap.getOrDefault(expressFormula.getId(), Collections.emptyList());
for (FormulaVar formulaVar : formulaVars) {
if (StringUtils.equalsIgnoreCase(formulaVar.getModule(), SalaryConstant.MODULE)
&& StringUtils.isNotEmpty(formulaVar.getFieldId())
&& StringUtils.startsWith(formulaVar.getFieldId(), SalaryFormulaReferenceEnum.CURRENT_CALC.getValue() + SalaryConstant.FORMULA_VAR_SEPARATOR)) {
if ( StringUtils.isNotEmpty(formulaVar.getFieldId())) {
String salaryItemCode = formulaVar.getFieldId().split(SalaryConstant.FORMULA_VAR_SEPARATOR)[1];
SalarySobItemPO subSalarySobItem = salaryItemMap.get(salaryItemCode);
if (subSalarySobItem == null) {
continue;
}
ExpressFormula subExpressFormula = expressFormulaMap.get(subSalarySobItem.getFormulaId());
Expression subExpression = expressionMap.get(subSalarySobItem.getFormulaId());
SalaryCalcItemGraphNode destNode = nodeMap.computeIfAbsent(subSalarySobItem.getSalaryItemId(), key -> new SalaryCalcItemGraphNode(subSalarySobItem, subExpressFormula, subExpression));
SalaryCalcItemGraphNode destNode = nodeMap.computeIfAbsent(subSalarySobItem.getSalaryItemId(), key -> new SalaryCalcItemGraphNode(subSalarySobItem, subExpressFormula));
node.getDestNodes().add(destNode);
}
}
@ -158,17 +149,16 @@ public class SalaryCalcItemGraph {
*/
private List<SalaryCalcItemGraphNode> destNodes;
public SalaryCalcItemGraphNode(SalarySobItemPO salarySobItem, ExpressFormula expressFormula, Expression expression) {
public SalaryCalcItemGraphNode(SalarySobItemPO salarySobItem, ExpressFormula expressFormula) {
this.salaryCalcItem = new SalaryCalcItem()
.setSalaryItemId(salarySobItem.getSalaryItemId())
.setSalaryItemCode(salarySobItem.getSalaryItemCode())
.setIncomeCategory(salarySobItem.getIncomeCategory())
.setUseInEmployeeSalary(salarySobItem.getUseInEmployeeSalary())
.setDataType(salarySobItem.getDataType())
// .setUseInEmployeeSalary(salarySobItem.getUseInEmployeeSalary())
// .setDataType(salarySobItem.getDataType())
.setRoundingMode(salarySobItem.getRoundingMode())
.setPattern(salarySobItem.getPattern())
.setExpressFormula(expressFormula)
.setExpression(expression);
.setExpressFormula(expressFormula);
this.inDegree = 0;
this.visited = false;
this.destNodes = new ArrayList<>();

View File

@ -9,4 +9,35 @@ public class SalaryConstant {
* 列表中薪资项目动态列后缀标识
*/
public static final String DYNAMIC_SUFFIX = "_salaryItem";
/**
* 模块标识
*/
public static final String MODULE = "hrmsalary";
/**
* 公共租户标识
*/
public static final String DEFAULT_TENANT_KEY = "all_teams";
/**
* 通用的分隔符
*/
public static final String COMMON_SEPARATOR = "-";
/**
* 下划线
*/
public static final String FORMULA_VAR_SEPARATOR = "_";
/**
* 下划线分隔符
*/
public static final String UNDERLINE_SEPARATOR = "_";
/**
* 完整主域名
*/
public static final String PRIMARY_DOMAIN = "primary.domain";
/**
* 图片公共地址
*/
public static final String IMG_URL = "/papi/file/preview?type=imgs&fileId=%s&random=123456";
}

View File

@ -733,7 +733,13 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe
// 本次运算的回算薪资项目所涉及的变量
Set<String> issuedFieldIds = new HashSet<>();
// 9计算薪资项目的运算优先级
List<List<Long>> salarySobItemsWithPriority = SalaryAcctCalculatePriorityBO.calculatePriority(salarySobItemPOS, salaryItemPOS, expressFormulas, salarySobBackItems, issuedFieldIds);
// List<List<Long>> salarySobItemsWithPriority = SalaryAcctCalculatePriorityBO.calculatePriority(salarySobItemPOS, salaryItemPOS, expressFormulas, salarySobBackItems, issuedFieldIds);
List<List<Long>> salarySobItemsWithPriority = new ArrayList<>();
SalaryCalcItemGraph salaryCalcItemGraph = new SalaryCalcItemGraph(salarySobItemPOS, expressFormulas);
List<SalaryCalcItem> salaryCalcItems = salaryCalcItemGraph.sort();
List<Long> properties = SalaryEntityUtil.properties(salaryCalcItems, SalaryCalcItem::getSalaryItemId, Collectors.toList());
salarySobItemsWithPriority.add(properties);
// 10根据id查询其他合并计税的薪资核算记录
List<SalaryAcctRecordPO> otherSalaryAcctRecordPOS = getSalaryAcctRecordService(user).listById4OtherConsolidatedTax(salaryAcctRecordPO.getId());
// 11查询本次核算人员