diff --git a/resource/QLExpress-3.2.0.jar b/resource/QLExpress-3.2.0.jar
new file mode 100644
index 000000000..52f48b289
Binary files /dev/null and b/resource/QLExpress-3.2.0.jar differ
diff --git a/src/com/engine/salary/constant/SalaryFormulaFieldConstant.java b/src/com/engine/salary/constant/SalaryFormulaFieldConstant.java
index 8dd24c3ad..61910bf95 100644
--- a/src/com/engine/salary/constant/SalaryFormulaFieldConstant.java
+++ b/src/com/engine/salary/constant/SalaryFormulaFieldConstant.java
@@ -1,5 +1,7 @@
package com.engine.salary.constant;
+import java.util.regex.Pattern;
+
/**
* 薪酬管理公式编辑器的常量
*
Copyright: Copyright (c) 2022
@@ -15,4 +17,14 @@ public class SalaryFormulaFieldConstant {
// 公式中变量的fieldId的分隔符
public static final String FIELD_ID_SEPARATOR = "_";
+
+ /**
+ * 公式中变量的fieldId的正则表达式
+ */
+ public static final String SALARY_REGEX = "(\\w+)" + SalaryFormulaFieldConstant.FIELD_ID_SEPARATOR + "(\\w+)";
+
+ /**
+ * 解析公式中变量的fieldId的正则表达式
+ */
+ public static final Pattern SALARY_PATTERN = Pattern.compile(SALARY_REGEX);
}
diff --git a/src/com/engine/salary/entity/salaryformula/ExpressFormula.java b/src/com/engine/salary/entity/salaryformula/ExpressFormula.java
index 60faadd1b..ef051e6ed 100644
--- a/src/com/engine/salary/entity/salaryformula/ExpressFormula.java
+++ b/src/com/engine/salary/entity/salaryformula/ExpressFormula.java
@@ -48,6 +48,12 @@ public class ExpressFormula {
* 公式内容
*/
private String formula;
+
+ /**
+ * 公式实际运行脚本
+ */
+ private String formulaRunScript;
+
/**
* 创建人
*/
diff --git a/src/com/engine/salary/entity/salaryformula/param/SalaryFormulaSaveParam.java b/src/com/engine/salary/entity/salaryformula/param/SalaryFormulaSaveParam.java
index 8f5f8aaa0..d6763e7d4 100644
--- a/src/com/engine/salary/entity/salaryformula/param/SalaryFormulaSaveParam.java
+++ b/src/com/engine/salary/entity/salaryformula/param/SalaryFormulaSaveParam.java
@@ -23,6 +23,7 @@ public class SalaryFormulaSaveParam {
/**
* 名称
*/
+ @DataCheck(require = true,message = "名称为空")
private String name;
/**
* 备注
@@ -31,6 +32,7 @@ public class SalaryFormulaSaveParam {
/**
* 模块
*/
+ @DataCheck(require = true,message = "模块为空")
private String module;
/**
* 用途
@@ -43,10 +45,12 @@ public class SalaryFormulaSaveParam {
/**
* 返回类型
*/
+ @DataCheck(require = true,message = "返回类型为空")
private String returnType;
/**
* 校验类型
*/
+ @DataCheck(require = true,message = "校验类型为空")
private String validateType;
/**
* 扩展参数
@@ -55,6 +59,7 @@ public class SalaryFormulaSaveParam {
/**
* 公式内容
*/
+ @DataCheck(require = true,message = "公式内容为空")
private String formula;
diff --git a/src/com/engine/salary/entity/salaryformula/po/FormulaPO.java b/src/com/engine/salary/entity/salaryformula/po/FormulaPO.java
index 8694b18e7..36770bd56 100644
--- a/src/com/engine/salary/entity/salaryformula/po/FormulaPO.java
+++ b/src/com/engine/salary/entity/salaryformula/po/FormulaPO.java
@@ -53,6 +53,12 @@ public class FormulaPO {
* 公式内容
*/
private String formula;
+
+ /**
+ * 公式实际运行脚本
+ */
+ private String formulaRunScript;
+
/**
* 创建人
*/
diff --git a/src/com/engine/salary/entity/salarysob/param/SalarySobItemSaveParam.java b/src/com/engine/salary/entity/salarysob/param/SalarySobItemSaveParam.java
index 62076ebc9..5eb4aacca 100644
--- a/src/com/engine/salary/entity/salarysob/param/SalarySobItemSaveParam.java
+++ b/src/com/engine/salary/entity/salarysob/param/SalarySobItemSaveParam.java
@@ -42,7 +42,7 @@ public class SalarySobItemSaveParam {
//"薪资账套薪资项目保存参数-员工基本信息字段")
public static class SalarySobEmpFieldParam {
- //主键id")
+ //主键id
private Long id;
//员工基本信息字段")
diff --git a/src/com/engine/salary/mapper/formula/FormulaMapper.xml b/src/com/engine/salary/mapper/formula/FormulaMapper.xml
index 4184bceb1..1c6ad932d 100644
--- a/src/com/engine/salary/mapper/formula/FormulaMapper.xml
+++ b/src/com/engine/salary/mapper/formula/FormulaMapper.xml
@@ -12,6 +12,7 @@
+
@@ -32,6 +33,7 @@
, t.validate_type
, t.extend_param
, t.formula
+ , t.formulaRunScript
, t.creator
, t.delete_type
, t.create_time
diff --git a/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java b/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java
index f27c0cb0a..15bf8079b 100644
--- a/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java
+++ b/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java
@@ -5,33 +5,29 @@ import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.po.FormulaVar;
import com.engine.salary.service.FormulaRunService;
-import org.apache.commons.jexl3.*;
+import com.ql.util.express.DefaultContext;
+import com.ql.util.express.ExpressRunner;
+import lombok.extern.slf4j.Slf4j;
import java.util.List;
+@Slf4j
public class FormulaRunServiceImpl extends Service implements FormulaRunService {
@Override
public Object run(ExpressFormula expressFormula, List formulaVars, DataCollectionEmployee simpleEmployee) {
- /*
- 公式内容以如下显示方式存储
- {薪资项目.输入项1}+{薪资项目.输入项2}
- */
String formula = expressFormula.getFormula();
-
-
- JexlBuilder jexlBuilder = new JexlBuilder();
- // 创建Jexl表达式引擎
- JexlEngine jexlEngine = jexlBuilder.create();
- // 创建Jexl表达式解析器
- JexlScript jexlScript = jexlEngine.createScript(formula);
- // 创建Jexl表达式变量上下文
- JexlContext jexlContext = new MapContext();
+ ExpressRunner runner = new ExpressRunner(true, false);
+ DefaultContext context = new DefaultContext();
formulaVars.forEach(v -> {
- jexlContext.set(v.getFieldId(), v.getContent());
+ context.put(v.getFieldId(), v.getContent());
});
- // 执行Jexl表达式,得到结果
- Object execute = jexlScript.execute(jexlContext);
+ Object execute = null;
+ try {
+ execute = runner.execute(formula, context, null, true, false);
+ } catch (Exception e) {
+ log.error("公式执行异常", e);
+ }
return execute;
}
}
diff --git a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java
index 22af93677..0965a803e 100644
--- a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java
+++ b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java
@@ -1,6 +1,7 @@
package com.engine.salary.service.impl;
import com.engine.core.impl.Service;
+import com.engine.salary.constant.SalaryFormulaFieldConstant;
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.param.SalaryFormulaSaveParam;
import com.engine.salary.entity.salaryformula.po.FormulaPO;
@@ -19,6 +20,8 @@ import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.BeanUtils;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -90,11 +93,19 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe
@Override
public FormulaPO save(SalaryFormulaSaveParam param) {
+ ValidUtil.doValidator(param);
+
+ //公式参数与公式内容是否相符
+ String paramFormula = param.getFormula();
+ Pattern salaryPattern = SalaryFormulaFieldConstant.SALARY_PATTERN;
+ Matcher matcher = salaryPattern.matcher(paramFormula);
+ int end = matcher.end();
+ if(!Objects.equals(end,param.getParameters())){
+ throw new SalaryRunTimeException("参数不匹配");
+ }
FormulaPO formulaPO = new FormulaPO();
-
String formula = param.getFormula();
-
formulaPO.setName(param.getName());
formulaPO.setDescription(param.getDescription());
formulaPO.setModule(param.getModule());
@@ -110,23 +121,28 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe
formulaPO.setCreateTime(now);
formulaPO.setUpdateTime(now);
formulaPO.setCreator((long) user.getUID());
+
+ /*
+ 公式内容以如下显示方式存储
+ {薪资项目.输入项1}+{薪资项目.输入项2}
+ 转换为实际的运行脚本
+ */
+ String formulaRunScript = formula;
+ List parameters = param.getParameters();
+ for (FormulaVar po : parameters) {
+ formulaRunScript = formulaRunScript.replace(po.getFieldName(), po.getFieldId());
+ }
+ formulaPO.setFormulaRunScript(formulaRunScript);
getFormulaMapper().insertIgnoreNull(formulaPO);
- List parameters = param.getParameters();
- parameters.forEach(po -> {
-
- formula.replace(po.getFieldName(), po.getFieldId());
-
-
+ for (FormulaVar po : parameters) {
po.setFormulaId(formulaPO.getId());
po.setDeleteType(NumberUtils.INTEGER_ZERO);
po.setCreator((long) user.getUID());
po.setCreateTime(now);
po.setUpdateTime(now);
getFormulaVarMapper().insertIgnoreNull(po);
- });
-
-
+ }
return formulaPO;
}
diff --git a/src/com/engine/salary/service/impl/SalarySobItemServiceImpl.java b/src/com/engine/salary/service/impl/SalarySobItemServiceImpl.java
index f2227fb9b..d07a63fc0 100644
--- a/src/com/engine/salary/service/impl/SalarySobItemServiceImpl.java
+++ b/src/com/engine/salary/service/impl/SalarySobItemServiceImpl.java
@@ -19,6 +19,7 @@ import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.service.*;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
+import com.engine.salary.util.valid.ValidUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
@@ -49,7 +50,9 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
return (SalarySobItemGroupService) ServiceUtil.getService(SalarySobItemGroupServiceImpl.class, user);
}
- private SalaryFormulaService salaryFormulaService;
+ private SalaryFormulaService getSalaryFormulaService(User user) {
+ return (SalaryFormulaService) ServiceUtil.getService(SalaryFormulaServiceImpl.class, user);
+ }
private SalaryItemService getSalaryItemService(User user) {
return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user);
@@ -111,9 +114,8 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
List salarySobItemPOS = listBySalarySobId(salarySobId);
// 薪资账套的薪资项目副本所用的公式id
Set formulaIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getFormulaId);
- // 查询公式详情 todo
-// List expressFormulas = salaryFormulaService.listExpressFormula(formulaIds);
- List expressFormulas = new ArrayList<>();
+ // 查询公式详情
+ List expressFormulas = getSalaryFormulaService(user).listExpressFormula(formulaIds);
// 查询薪资账套的薪资项目副本所关联的薪资项目
Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
List salaryItemPOS = getSalaryItemService(user).listByIds(salaryItemIds);
@@ -129,7 +131,7 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
Long salarySobId = saveParam.getSalarySobId();
// 校验
- validSaveParam(salarySobId);
+ validSaveParam(saveParam);
//fixme 事务
@@ -151,10 +153,13 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
/**
* 校验
- * @param salarySobId
*/
- private void validSaveParam(Long salarySobId) {
+ private void validSaveParam(SalarySobItemSaveParam saveParam) {
+
+ ValidUtil.doValidator(saveParam);
+
//1、账套存在
+ Long salarySobId = saveParam.getSalarySobId();
SalarySobPO salarySobPO = salarySobBiz.getById(salarySobId);
if (Objects.isNull(salarySobPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98379, "参数错误,薪资账套不存在或者已被删除"));
@@ -168,7 +173,6 @@ public class SalarySobItemServiceImpl extends Service implements SalarySobItemSe
* @param salarySobId
*/
private void cleanOldData(Long salarySobId) {
- //todo
// 删除薪资账套的员工信息字段
getSalarySobEmpFieldService(user).deleteBySalarySobIds(Collections.singleton(salarySobId));
// 删除薪资账套的薪资项目副本