核算优先级
This commit is contained in:
parent
d49b33c66f
commit
d03aed1d1b
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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<>();
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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、查询本次核算人员
|
||||
|
|
|
|||
Loading…
Reference in New Issue