薪资项目拷贝
This commit is contained in:
parent
cb46fccb16
commit
c3dfc5692e
|
|
@ -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);
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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", "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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟运行公式
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue