From c3dfc5692e07e664fd066dc5fa56783115fb02fb Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Tue, 11 Apr 2023 09:56:20 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=96=AA=E8=B5=84=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=8B=B7=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; + } + /** * 模拟运行公式 * From 482f4dfc253d07307c491097181f876294d860ad Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Tue, 11 Apr 2023 10:36:06 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=96=AA=E8=B5=84=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=90=8D=E4=B8=8D=E5=85=81=E8=AE=B8=E5=8C=85=E5=90=AB=E5=A4=A7?= =?UTF-8?q?=E6=8B=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/wrapper/SalaryItemWrapper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/engine/salary/wrapper/SalaryItemWrapper.java b/src/com/engine/salary/wrapper/SalaryItemWrapper.java index 163695d1c..3a03a30d3 100644 --- a/src/com/engine/salary/wrapper/SalaryItemWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryItemWrapper.java @@ -220,6 +220,9 @@ public class SalaryItemWrapper extends Service { if (SalaryDataTypeEnum.parseByValue(saveParam.getDataType()) == null) { throw new SalaryRunTimeException("字段类型异常"); } + if (saveParam.getName().contains("{") || saveParam.getName().contains("}")) { + throw new SalaryRunTimeException("薪资项目名称中不得包含大括号"); + } } /** From 8c58cf01b396d161e128f82e59e4339f15325a33 Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Tue, 11 Apr 2023 10:48:41 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=8B=B7=E8=B4=9D?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SalaryFormulaServiceImpl.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java index f612d623d..896311a27 100644 --- a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java @@ -120,6 +120,19 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe throw new SalaryRunTimeException("校验类型异常"); } + // 解析公式中的参数 + 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); + } + int orderIndex = 0; + for(FormulaVar parameter : param.getParameters() ){ + parameter.setOrderIndex(orderIndex++); + } + List parameters = param.getParameters(); //防止参数名和字段名呈现一对多的问题 if (CollectionUtils.isNotEmpty(parameters)) { @@ -170,15 +183,6 @@ 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); From 0bfe0b62a7c45f6825e36f21678c0284dc0dfe45 Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Tue, 11 Apr 2023 11:43:32 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix=20=E5=AD=97=E6=AE=B5=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/salary/service/impl/SalaryFormulaServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java index 896311a27..fd62a97a5 100644 --- a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java @@ -254,6 +254,8 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe vars.add(var); } } + // 去重 + vars = vars.stream().distinct().collect(Collectors.toList()); for(String var : vars){ String[] split = var.split("\\."); if(split.length==2){