From c3dfc5692e07e664fd066dc5fa56783115fb02fb Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Tue, 11 Apr 2023 09:56:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=96=AA=E8=B5=84=E9=A1=B9=E7=9B=AE=E6=8B=B7?= =?UTF-8?q?=E8=B4=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/RemoteExcelService.java | 3 + .../service/impl/RemoteExcelServiceImpl.java | 41 +++++++++ .../impl/SalaryFormulaServiceImpl.java | 84 +++++++++++++++++++ 3 files changed, 128 insertions(+) diff --git a/src/com/engine/salary/service/RemoteExcelService.java b/src/com/engine/salary/service/RemoteExcelService.java index 8081451ee..bbcfe6e66 100644 --- a/src/com/engine/salary/service/RemoteExcelService.java +++ b/src/com/engine/salary/service/RemoteExcelService.java @@ -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> fieldGroupList(Map extendParam); + Map> allFieldList(ReferenceTypeEnum referenceTypeEnum); + // ExcelPage dataSourceList(String categoryId, ExcelPage page, Map extendParam, SimpleEmployee employee); // diff --git a/src/com/engine/salary/service/impl/RemoteExcelServiceImpl.java b/src/com/engine/salary/service/impl/RemoteExcelServiceImpl.java index 93b7c17ea..46436a4f0 100644 --- a/src/com/engine/salary/service/impl/RemoteExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/RemoteExcelServiceImpl.java @@ -200,6 +200,47 @@ public class RemoteExcelServiceImpl extends Service implements RemoteExcelServic }).collect(Collectors.toList()); } + @Override + public Map> allFieldList(ReferenceTypeEnum referenceTypeEnum) { + + Map> 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 dataSourceList(String categoryId, ExcelPage page, Map extendParam, SimpleEmployee employee) { // log.info("categoryId: {}, page: {}", categoryId, JsonUtil.toJsonString(page)); diff --git a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java index 3b842a167..f612d623d 100644 --- a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java @@ -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 listExpressFormula(Collection 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 parameterList = parseFormulaParameters(param.getFormula(), ReferenceTypeEnum.FORMULA); + param.setParameters(parameterList); + }else if(ReferenceTypeEnum.parseByValue(param.getReferenceType()) == ReferenceTypeEnum.SQL){ + List 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 parseFormulaParameters(String formula, ReferenceTypeEnum referenceTypeEnum){ + List parameters = new ArrayList<>(); + // 获取公式中所有可选的变量项目 + Map> allParameters = getRemoteExcelService(user).allFieldList(referenceTypeEnum); + List 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 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 formulaVars = allParameters.get(split[0]); + if(formulaVars == null){ + throw new SalaryRunTimeException("保存失败,公式变量"+split[0]+"输入有误!"); + } + Optional 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 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 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; + } + /** * 模拟运行公式 *