薪资项目拷贝

This commit is contained in:
Harryxzy 2023-04-11 09:56:20 +08:00
parent cb46fccb16
commit c3dfc5692e
3 changed files with 128 additions and 0 deletions

View File

@ -2,6 +2,7 @@ package com.engine.salary.service;
import com.engine.salary.entity.salaryformula.po.FormulaVar;
import com.engine.salary.enums.salaryformula.ReferenceTypeEnum;
import java.util.List;
import java.util.Map;
@ -15,6 +16,8 @@ public interface RemoteExcelService {
List<Map<String,Object>> fieldGroupList(Map<String, Object> extendParam);
Map<String,List<FormulaVar>> allFieldList(ReferenceTypeEnum referenceTypeEnum);
// ExcelPage<FormulaDataSource> dataSourceList(String categoryId, ExcelPage<FormulaDataSource> page, Map<String, Object> extendParam, SimpleEmployee employee);
//

View File

@ -200,6 +200,47 @@ public class RemoteExcelServiceImpl extends Service implements RemoteExcelServic
}).collect(Collectors.toList());
}
@Override
public Map<String, List<FormulaVar>> allFieldList(ReferenceTypeEnum referenceTypeEnum) {
Map<String, List<FormulaVar>> result = new HashMap<>();
//sql
if (ReferenceTypeEnum.SQL.equals(referenceTypeEnum)) {
result.put(SalarySQLReferenceEnum.EMPLOYEE_INFO.getDefaultLabel(),
convert2FormulaVar(DataCollectionEmployee.class, SalarySQLReferenceEnum.EMPLOYEE_INFO.getValue() + ""));
result.put(SalarySQLReferenceEnum.SALARY_ACCT_EMPLOYEE.getDefaultLabel(),
convert2FormulaVar(SalaryAcctEmployeePO.class, SalarySQLReferenceEnum.SALARY_ACCT_EMPLOYEE.getValue() + ""));
result.put(SalarySQLReferenceEnum.SALARY_CYCLE.getDefaultLabel(),
convert2FormulaVar(SalarySobCycleDTO.class, SalarySQLReferenceEnum.SALARY_CYCLE.getValue() + ""));
return result;
}
// 如果是其他数据源
if (ReferenceTypeEnum.FORMULA.equals(referenceTypeEnum)) {
result.put(SalaryFormulaReferenceEnum.SALARY_ITEM.getDefaultLabel(),
salaryItem2FormulaVar(SalaryFormulaReferenceEnum.SALARY_ITEM, null));
result.put(SalaryFormulaReferenceEnum.ISSUED.getDefaultLabel(),
salaryItem2FormulaVar(SalaryFormulaReferenceEnum.SALARY_ITEM, null));
result.put(SalaryFormulaReferenceEnum.SALARY_ARCHIVES.getDefaultLabel(),
salaryArchives2FormulaVar(SalaryFormulaReferenceEnum.SALARY_ARCHIVES, null));
result.put(SalaryFormulaReferenceEnum.ADD_UP_SITUATION.getDefaultLabel(),
convert2FormulaVar(AddUpSituation.class, SalaryFormulaReferenceEnum.ADD_UP_SITUATION.getValue() + ""));
result.put(SalaryFormulaReferenceEnum.ADD_UP_DEDUCTIONS.getDefaultLabel(),
convert2FormulaVar(AddUpDeduction.class, SalaryFormulaReferenceEnum.ADD_UP_DEDUCTIONS.getValue() + ""));
result.put(SalaryFormulaReferenceEnum.EMPLOYEE_INFO.getDefaultLabel(),
convert2FormulaVar(DataCollectionEmployee.class, SalaryFormulaReferenceEnum.EMPLOYEE_INFO.getValue() + ""));
result.put(SalaryFormulaReferenceEnum.OTHER_DEDUCTION.getDefaultLabel(),
convert2FormulaVar(OtherDeductionPO.class, SalaryFormulaReferenceEnum.OTHER_DEDUCTION.getValue() + ""));
result.put(SalaryFormulaReferenceEnum.WELFARE.getDefaultLabel(),
welfare2FormulaVar(SalaryFormulaReferenceEnum.WELFARE));
result.put(SalaryFormulaReferenceEnum.ATTEND.getDefaultLabel(),
attendData2FormulaVar(SalaryFormulaReferenceEnum.ATTEND));
return result;
}
return result;
}
// @Override
// public ExcelPage<FormulaDataSource> dataSourceList(String categoryId, ExcelPage<FormulaDataSource> page, Map<String, Object> extendParam, SimpleEmployee employee) {
// log.info("categoryId: {}, page: {}", categoryId, JsonUtil.toJsonString(page));

View File

@ -15,6 +15,7 @@ import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.formula.FormulaMapper;
import com.engine.salary.mapper.formula.FormulaVarMapper;
import com.engine.salary.service.FormulaRunService;
import com.engine.salary.service.RemoteExcelService;
import com.engine.salary.service.SalaryFormulaService;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.valid.ValidUtil;
@ -31,6 +32,8 @@ import org.springframework.beans.BeanUtils;
import weaver.hrm.User;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@ -57,6 +60,10 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe
return (FormulaRunService) ServiceUtil.getService(FormulaRunServiceImpl.class, user);
}
private RemoteExcelService getRemoteExcelService(User user) {
return ServiceUtil.getService(RemoteExcelServiceImpl.class, user);
}
@Override
public List<ExpressFormula> listExpressFormula(Collection<Long> formulaIds) {
formulaIds = formulaIds.stream().filter(id -> id != null && id > 0).collect(Collectors.toList());
@ -163,6 +170,15 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe
param.setFormula(param.getFormula().replaceAll("", "BETWEEN"));
}
// 解析公式中的参数
if (ReferenceTypeEnum.parseByValue(param.getReferenceType()) == ReferenceTypeEnum.FORMULA) {
List<FormulaVar> parameterList = parseFormulaParameters(param.getFormula(), ReferenceTypeEnum.FORMULA);
param.setParameters(parameterList);
}else if(ReferenceTypeEnum.parseByValue(param.getReferenceType()) == ReferenceTypeEnum.SQL){
List<FormulaVar> parameterList = parseFormulaParameters(param.getFormula(), ReferenceTypeEnum.SQL);
param.setParameters(parameterList);
}
//试运行公式
checkRun(param);
@ -196,6 +212,7 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe
formulaRunScript = formulaRunScript.replace(po.getFieldName(), po.getFieldId());
}
formulaPO.setFormulaRunScript(formulaRunScript);
getFormulaMapper().insertIgnoreNull(formulaPO);
for (FormulaVar po : parameters) {
@ -210,6 +227,73 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe
return formulaPO;
}
public List<FormulaVar> parseFormulaParameters(String formula, ReferenceTypeEnum referenceTypeEnum){
List<FormulaVar> parameters = new ArrayList<>();
// 获取公式中所有可选的变量项目
Map<String, List<FormulaVar>> allParameters = getRemoteExcelService(user).allFieldList(referenceTypeEnum);
List<String> groups = new ArrayList<>(allParameters.keySet());
StringBuilder reg =new StringBuilder("(");
for(int i =0; i < groups.size(); i++ ){
reg.append("\\{"+ groups.get(i) +"\\.");
if(i+1 != groups.size()){
reg.append("|");
}
}
reg.append(").*?}");
// 提取公式中所有的变量
Pattern pattern = Pattern.compile(reg.toString());
Matcher matcher = pattern.matcher(formula);
List<String> vars = new ArrayList<>();
while (matcher.find()) {
String var = matcher.group(0).replaceAll("\\{", "").replaceAll("}", "");
if(StringUtils.isNotBlank(var)){
vars.add(var);
}
}
for(String var : vars){
String[] split = var.split("\\.");
if(split.length==2){
List<FormulaVar> formulaVars = allParameters.get(split[0]);
if(formulaVars == null){
throw new SalaryRunTimeException("保存失败,公式变量"+split[0]+"输入有误!");
}
Optional<FormulaVar> field = formulaVars.stream().filter(v -> Objects.equals(v.getName(), split[1])).findFirst();
if(field.isPresent()){
FormulaVar formulaVar = field.get();
String fieldName = "{" + split[0] + "." + split[1] +"}";
formulaVar.setFieldName(fieldName);
parameters.add(formulaVar);
}else{
throw new SalaryRunTimeException("保存失败,公式变量"+split[0]+split[1]+"输入有误!");
}
}else if(split.length > 2){
// 变量名称中包含.
List<FormulaVar> formulaVars = allParameters.get(split[0]);
if(formulaVars == null){
throw new SalaryRunTimeException("保存失败,公式变量"+split[0]+"输入有误!");
}
StringBuilder field = new StringBuilder("");
for(int i =1; i< split.length; i++){
if(i != 1){
field.append(".");
}
field = field.append(split[i]);
}
String finalField = field.toString();
Optional<FormulaVar> optional = formulaVars.stream().filter(v -> Objects.equals(v.getName(), finalField)).findFirst();
if(optional.isPresent()){
FormulaVar formulaVar = optional.get();
String fieldName = "{" + split[0] + "." + field +"}";
formulaVar.setFieldName(fieldName);
parameters.add(optional.get());
}else{
throw new SalaryRunTimeException("保存失败,公式变量"+split[0]+split[1]+"输入有误!");
}
}
}
return parameters;
}
/**
* 模拟运行公式
*