From de17b5cd90520d3c21b3db372004f1ba918e4625 Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Thu, 14 Sep 2023 21:42:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=A1=E7=AE=97=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coalAnalysis/dto/CoalAnalysisDto.java | 60 +++++++++++++++- .../service/CoalAnalysisService.java | 47 ++++++++++++- .../dto/CoalParameterDefDto.java | 2 +- .../entity/CoalParameterDefEntity.java | 9 +++ .../service/CoalParameterDefService.java | 32 ++++----- .../coal/common/GroovyScriptUtils.java | 69 +++++++++++++++++++ 6 files changed, 196 insertions(+), 23 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/common/GroovyScriptUtils.java diff --git a/src/main/java/cn/lihongjie/coal/coalAnalysis/dto/CoalAnalysisDto.java b/src/main/java/cn/lihongjie/coal/coalAnalysis/dto/CoalAnalysisDto.java index cc16e552..0c2c9293 100644 --- a/src/main/java/cn/lihongjie/coal/coalAnalysis/dto/CoalAnalysisDto.java +++ b/src/main/java/cn/lihongjie/coal/coalAnalysis/dto/CoalAnalysisDto.java @@ -2,11 +2,13 @@ package cn.lihongjie.coal.coalAnalysis.dto; import cn.lihongjie.coal.base.dto.OrgCommonDto; import cn.lihongjie.coal.coalInfo.entity.CoalInfoEntity; -import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.DecimalMin; import lombok.Data; import org.hibernate.annotations.Comment; +import java.util.HashMap; +import java.util.Map; + @Data public class CoalAnalysisDto extends OrgCommonDto { @Comment("关联的煤源信息") @@ -73,4 +75,60 @@ public class CoalAnalysisDto extends OrgCommonDto { @Comment("参数 20 ") @DecimalMin(value = "0.1", inclusive = true, message = "参数不能小于0.1") private Double param20; + + + public Map toMap() { + + + HashMap ma = new HashMap<>(); + + + ma.put("param1", param1); + ma.put("param2", param2); + ma.put("param3", param3); + ma.put("param4", param4); + ma.put("param5", param5); + ma.put("param6", param6); + ma.put("param7", param7); + ma.put("param8", param8); + ma.put("param9", param9); + ma.put("param10", param10); + ma.put("param11", param11); + ma.put("param12", param12); + ma.put("param13", param13); + ma.put("param14", param14); + ma.put("param15", param15); + ma.put("param16", param16); + ma.put("param17", param17); + ma.put("param18", param18); + ma.put("param19", param19); + ma.put("param20", param20); + + return ma; + } + + + public void updateFromMap(Map map) { + + this.param1 = (Double) map.getOrDefault("param1", null); + this.param2 = (Double) map.getOrDefault("param2", null); + this.param3 = (Double) map.getOrDefault("param3", null); + this.param4 = (Double) map.getOrDefault("param4", null); + this.param5 = (Double) map.getOrDefault("param5", null); + this.param6 = (Double) map.getOrDefault("param6", null); + this.param7 = (Double) map.getOrDefault("param7", null); + this.param8 = (Double) map.getOrDefault("param8", null); + this.param9 = (Double) map.getOrDefault("param9", null); + this.param10 = (Double) map.getOrDefault("param10", null); + this.param11 = (Double) map.getOrDefault("param11", null); + this.param12 = (Double) map.getOrDefault("param12", null); + this.param13 = (Double) map.getOrDefault("param13", null); + this.param14 = (Double) map.getOrDefault("param14", null); + this.param15 = (Double) map.getOrDefault("param15", null); + this.param16 = (Double) map.getOrDefault("param16", null); + this.param17 = (Double) map.getOrDefault("param17", null); + this.param18 = (Double) map.getOrDefault("param18", null); + this.param19 = (Double) map.getOrDefault("param19", null); + this.param20 = (Double) map.getOrDefault("param20", null); + } } diff --git a/src/main/java/cn/lihongjie/coal/coalAnalysis/service/CoalAnalysisService.java b/src/main/java/cn/lihongjie/coal/coalAnalysis/service/CoalAnalysisService.java index 8913c712..af2c4b9f 100644 --- a/src/main/java/cn/lihongjie/coal/coalAnalysis/service/CoalAnalysisService.java +++ b/src/main/java/cn/lihongjie/coal/coalAnalysis/service/CoalAnalysisService.java @@ -9,8 +9,15 @@ import cn.lihongjie.coal.coalAnalysis.dto.UpdateCoalAnalysisDto; import cn.lihongjie.coal.coalAnalysis.entity.CoalAnalysisEntity; import cn.lihongjie.coal.coalAnalysis.mapper.CoalAnalysisMapper; import cn.lihongjie.coal.coalAnalysis.repository.CoalAnalysisRepository; -import java.lang.String; +import cn.lihongjie.coal.coalParameterDef.entity.CoalParameterDefEntity; +import cn.lihongjie.coal.coalParameterDef.repository.CoalParameterDefRepository; +import cn.lihongjie.coal.common.Ctx; +import cn.lihongjie.coal.common.GroovyScriptUtils; +import cn.lihongjie.coal.exception.BizException; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.Page; @@ -18,6 +25,11 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Service @Slf4j public class CoalAnalysisService extends BaseService { @@ -39,6 +51,39 @@ public class CoalAnalysisService extends BaseService parameters = coalParameterDefRepository.findByOrganizationId(Ctx.currentUser().getOrganizationId()); + + + List toCalculate = parameters.stream().filter(x -> StringUtils.equalsIgnoreCase(x.getInputType(), "1")).sorted(Comparator.comparing(x -> ObjectUtils.defaultIfNull(x.getPriority(), -1))).collect(Collectors.toList()); + + + Map map = dto.toMap(); + + for (CoalParameterDefEntity def : toCalculate) { + + Object exec = GroovyScriptUtils.exec(def.getFormula0(), map); + + if (exec!=null && !(exec instanceof Number)) { + throw new BizException("计算结果不是数字"); + } + + map.put(def.getCode(), exec != null ? NumberUtils.toDouble(exec + "") : null); + } + + + dto.updateFromMap(map); + + return dto; + + + + } + public CoalAnalysisDto update(UpdateCoalAnalysisDto request) { CoalAnalysisEntity entity = this.repository.get(request.getId()); this.mapper.updateEntity(entity, request); diff --git a/src/main/java/cn/lihongjie/coal/coalParameterDef/dto/CoalParameterDefDto.java b/src/main/java/cn/lihongjie/coal/coalParameterDef/dto/CoalParameterDefDto.java index 3d3941b5..d8da55d7 100644 --- a/src/main/java/cn/lihongjie/coal/coalParameterDef/dto/CoalParameterDefDto.java +++ b/src/main/java/cn/lihongjie/coal/coalParameterDef/dto/CoalParameterDefDto.java @@ -12,7 +12,7 @@ public class CoalParameterDefDto extends OrgCommonDto { private String parentName; @Comment("类型 0 手动输入 1 自动计算" ) private String inputType; - + private String inputTypeName; @Comment("计算公式" ) private String formula; diff --git a/src/main/java/cn/lihongjie/coal/coalParameterDef/entity/CoalParameterDefEntity.java b/src/main/java/cn/lihongjie/coal/coalParameterDef/entity/CoalParameterDefEntity.java index 67660fc5..952b7d05 100644 --- a/src/main/java/cn/lihongjie/coal/coalParameterDef/entity/CoalParameterDefEntity.java +++ b/src/main/java/cn/lihongjie/coal/coalParameterDef/entity/CoalParameterDefEntity.java @@ -4,6 +4,7 @@ import cn.lihongjie.coal.base.entity.OrgCommonEntity; import jakarta.persistence.Entity; import lombok.Data; import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; @Entity @Data @@ -17,6 +18,14 @@ public class CoalParameterDefEntity extends OrgCommonEntity { @Comment("类型 0 手动输入 1 自动计算" ) private String inputType; + @Formula("(select i.name\n" + + "from t_dictionary d,\n" + + " t_dictionary_item i\n" + + "where d.id = i.dictionary_id\n" + + " and d.code = 'coalParameter.inputType'\n" + + " and i.code = input_type)") + private String inputTypeName; + @Comment("计算公式" ) private String formula; diff --git a/src/main/java/cn/lihongjie/coal/coalParameterDef/service/CoalParameterDefService.java b/src/main/java/cn/lihongjie/coal/coalParameterDef/service/CoalParameterDefService.java index cdcc922c..26bebb96 100644 --- a/src/main/java/cn/lihongjie/coal/coalParameterDef/service/CoalParameterDefService.java +++ b/src/main/java/cn/lihongjie/coal/coalParameterDef/service/CoalParameterDefService.java @@ -10,6 +10,7 @@ import cn.lihongjie.coal.coalParameterDef.entity.CoalParameterDefEntity; import cn.lihongjie.coal.coalParameterDef.mapper.CoalParameterDefMapper; import cn.lihongjie.coal.coalParameterDef.repository.CoalParameterDefRepository; import cn.lihongjie.coal.common.Ctx; +import cn.lihongjie.coal.common.GroovyScriptUtils; import cn.lihongjie.coal.organization.service.OrganizationService; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -31,9 +32,7 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.io.InputStream; -import java.util.Comparator; import java.util.List; -import java.util.Objects; import java.util.Optional; @Service @@ -62,6 +61,12 @@ public class CoalParameterDefService extends BaseService sorted = all.stream().sorted(Comparator.comparing((CoalParameterDefEntity x) -> x.getName().length()).reversed()).toList(); - for (CoalParameterDefEntity def : sorted) { - if (Objects.equals(def.getId(), entity.getId())) { - continue; - } - if (formula.contains(def.getName())) { - - formula = formula.replaceAll(def.getName(), def.getCode()); - - dependent += def.getCode(); - - } - } - - } entity.setFormula0(formula); - entity.setDependents(dependent); + entity.setDependents(StringUtils.join(GroovyScriptUtils.variables(formula), ",")); for (CoalParameterDefEntity def : all) { @@ -159,6 +147,10 @@ public class CoalParameterDefService extends BaseService astNodes = compiler.compile(formula); + } catch (Exception e) { + log.info(formula, e); + throw new BizException("无效的计算公式"); + } + + } + + + public static List variables(String formula) { + if (StringUtils.isEmpty(formula)) { + return new ArrayList<>(); + } + + AstStringCompiler compiler = new AstStringCompiler(); + + return compiler.compile(formula).stream().flatMap(x -> { + + ArrayList ans = new ArrayList<>(); + x.visit(new GroovyCodeVisitorAdapter() { + @Override + public void visitVariableExpression(VariableExpression expression) { + ans.add(expression.getName()); + } + }); + + return ans.stream(); + + }).collect(Collectors.toList()); + + + } + + public static Object exec(String formula0, Map map) { + + + GroovyShell shell = new GroovyShell(new Binding(map)); + + return shell.evaluate(formula0); + } +}