weaver-hrm-salary/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java

96 lines
4.0 KiB
Java
Raw Normal View History

2022-04-15 13:54:47 +08:00
package com.engine.salary.service.impl;
import com.engine.core.impl.Service;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryformula.ExpressFormula;
import com.engine.salary.entity.salaryformula.po.FormulaVar;
2022-04-27 17:20:33 +08:00
import com.engine.salary.enums.salaryformula.ReferenceTypeEnum;
2022-04-20 19:23:16 +08:00
import com.engine.salary.formlua.entity.parameter.DataType;
2022-04-15 13:54:47 +08:00
import com.engine.salary.service.FormulaRunService;
2022-04-29 14:56:33 +08:00
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
2022-04-18 14:45:12 +08:00
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import lombok.extern.slf4j.Slf4j;
2022-04-29 14:56:33 +08:00
import org.apache.commons.lang3.StringUtils;
2022-05-07 15:20:39 +08:00
import org.apache.commons.lang3.math.NumberUtils;
2022-04-29 14:56:33 +08:00
import weaver.conn.RecordSet;
2022-04-15 13:54:47 +08:00
2022-04-20 11:17:25 +08:00
import java.math.BigDecimal;
2022-04-15 13:54:47 +08:00
import java.util.List;
2022-04-18 14:45:12 +08:00
@Slf4j
2022-04-15 13:54:47 +08:00
public class FormulaRunServiceImpl extends Service implements FormulaRunService {
2022-04-24 17:42:32 +08:00
2022-04-29 14:56:33 +08:00
private static ExpressRunner runner = new ExpressRunner(true, false);
private static final ObjectMapper objectMapper = new ObjectMapper();
2022-04-27 17:20:33 +08:00
2022-04-24 17:42:32 +08:00
2022-04-15 13:54:47 +08:00
@Override
public Object run(ExpressFormula expressFormula, List<FormulaVar> formulaVars, DataCollectionEmployee simpleEmployee) {
2022-04-27 17:20:33 +08:00
if (ReferenceTypeEnum.parseByValue(expressFormula.getReferenceType()) == ReferenceTypeEnum.FORMULA) {
return runFormula(expressFormula, formulaVars);
}
2022-04-29 14:56:33 +08:00
if (ReferenceTypeEnum.parseByValue(expressFormula.getReferenceType()) == ReferenceTypeEnum.SQL) {
return runSQL(expressFormula, formulaVars);
}
log.error("express execute fail, {} not in ReferenceTypeEnum ", expressFormula.getReferenceType());
return StringUtils.EMPTY;
}
private String runSQL(ExpressFormula expressFormula, List<FormulaVar> formulaVars) {
try {
RecordSet rs = new RecordSet();
String formulaRunScript = expressFormula.getFormulaRunScript();
String extendParam = expressFormula.getExtendParam();
String sqlReturnKey = "";
try {
JsonNode jsonNode = objectMapper.readTree(extendParam);
JsonNode sqlReturnKeyNode = jsonNode.get("sqlReturnKey");
if (sqlReturnKeyNode != null) {
sqlReturnKey = sqlReturnKeyNode.asText();
}
} catch (JsonProcessingException e) {
log.error("express execute fail, sql extendParam parse fail", e);
}
2022-04-27 17:20:33 +08:00
2022-04-29 14:56:33 +08:00
String sql = formulaRunScript;
for (FormulaVar formulaVar : formulaVars) {
sql = formulaRunScript.replaceAll(formulaVar.getFieldId(), "'" + formulaVar.getContent() + "'");
}
2022-05-07 15:20:39 +08:00
log.info("sql run {}", sql);
2022-04-29 14:56:33 +08:00
if (rs.execute(sql)) {
if (rs.next()) {
return rs.getString(sqlReturnKey);
}
}
} catch (Exception e) {
log.error("express execute fail, sql execute fail", e);
}
return StringUtils.EMPTY;
2022-04-27 17:20:33 +08:00
}
private Object runFormula(ExpressFormula expressFormula, List<FormulaVar> formulaVars) {
2022-05-07 15:20:39 +08:00
log.info("fExpressFormula {}, formulaVars {}", expressFormula, formulaVars);
2022-04-18 14:45:12 +08:00
try {
2022-04-29 14:56:33 +08:00
DefaultContext<String, Object> context = new DefaultContext<String, Object>();
formulaVars.forEach(v -> {
2022-05-07 15:20:39 +08:00
if (DataType.NUMBER.equals(v.getFieldType()) && NumberUtils.isCreatable(v.getContent())) {
2022-04-29 14:56:33 +08:00
context.put(v.getFieldId(), new BigDecimal(v.getContent()));
} else {
context.put(v.getFieldId(), v.getContent());
}
});
2022-04-20 19:23:16 +08:00
String formula = expressFormula.getFormulaRunScript();
2022-05-07 15:20:39 +08:00
log.info("formula run {}", formula);
2022-04-29 14:56:33 +08:00
return runner.execute(formula, context, null, true, false);
2022-04-18 14:45:12 +08:00
} catch (Exception e) {
2022-04-29 14:56:33 +08:00
log.error("express execute fail, formula execute fail", e);
2022-04-18 14:45:12 +08:00
}
2022-04-29 14:56:33 +08:00
return StringUtils.EMPTY;
2022-04-15 13:54:47 +08:00
}
}