diff --git a/zt-module-qms/zt-module-qms-server/pom.xml b/zt-module-qms/zt-module-qms-server/pom.xml
index 747c7ac..afbba64 100644
--- a/zt-module-qms/zt-module-qms-server/pom.xml
+++ b/zt-module-qms/zt-module-qms-server/pom.xml
@@ -18,6 +18,7 @@
3.9.1.v20251204-RELEASE
+ 2.15.2
@@ -141,27 +142,27 @@
com.yomahub
liteflow-spring-boot-starter
- 2.15.1
+ ${liteflow.version}
com.yomahub
liteflow-script-javax-pro
- 2.15.1
+ ${liteflow.version}
com.yomahub
liteflow-script-groovy
- 2.15.1
+ ${liteflow.version}
com.yomahub
liteflow-script-qlexpress
- 2.15.1
+ ${liteflow.version}
com.yomahub
liteflow-script-graaljs
- 2.15.1
+ ${liteflow.version}
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/ReportedDataSource.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/ReportedDataSource.java
index 4d1a5f6..f3042f3 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/ReportedDataSource.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/ReportedDataSource.java
@@ -6,7 +6,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonFormat;
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayTaskDataMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayTaskDataMapper.java
index e54e0fd..9b6c5ac 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayTaskDataMapper.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayTaskDataMapper.java
@@ -263,6 +263,31 @@ public interface BusinessAssayTaskDataMapper extends BaseMapperX selectBySampleAssayCodesAndConfigAssayMethodId(List sampleAssayCodes, Long configAssayMethodId) {
+ return selectJoinList(BusinessAssayTaskDataExtendRespVO.class, new MPJLambdaWrapperX()
+ .leftJoin(BusinessSubSampleDO.class, BusinessSubSampleDO::getId, BusinessAssayTaskDataDO::getBusinessSubSampleId)
+ .selectAll(BusinessAssayTaskDataDO.class)
+ .selectAs(BusinessSubSampleDO::getSampleName, BusinessAssayTaskDataExtendRespVO::getSampleName)
+ .selectAs(BusinessSubSampleDO::getSampleCode, BusinessAssayTaskDataExtendRespVO::getSampleCode)
+ .selectAs(BusinessSubSampleDO::getSampleAssayCode, BusinessAssayTaskDataExtendRespVO::getSampleAssayCode)
+ .in(BusinessSubSampleDO::getSampleAssayCode, sampleAssayCodes)
+ .eq(BusinessAssayTaskDataDO::getConfigAssayMethodId, configAssayMethodId)
+ .eq(BusinessAssayTaskDataDO::getIsReported, QmsCommonConstant.NO));
+ }
+
+ default List selectBySampleAssayCodesAndConfigAssayMethodDictionaryBusinessKey(List sampleAssayCodes, String configAssayMethodDictionaryBusinessKey) {
+ return selectJoinList(BusinessAssayTaskDataExtendRespVO.class, new MPJLambdaWrapperX()
+ .leftJoin(BusinessSubSampleDO.class, BusinessSubSampleDO::getId, BusinessAssayTaskDataDO::getBusinessSubSampleId)
+ .leftJoin(ConfigAssayMethodDO.class, ConfigAssayMethodDO::getId, BusinessAssayTaskDataDO::getConfigAssayMethodId)
+ .selectAll(BusinessAssayTaskDataDO.class)
+ .selectAs(BusinessSubSampleDO::getSampleName, BusinessAssayTaskDataExtendRespVO::getSampleName)
+ .selectAs(BusinessSubSampleDO::getSampleCode, BusinessAssayTaskDataExtendRespVO::getSampleCode)
+ .selectAs(BusinessSubSampleDO::getSampleAssayCode, BusinessAssayTaskDataExtendRespVO::getSampleAssayCode)
+ .in(BusinessSubSampleDO::getSampleAssayCode, sampleAssayCodes)
+ .eq(ConfigAssayMethodDO::getDictionaryBusinessKey, configAssayMethodDictionaryBusinessKey)
+ .eq(BusinessAssayTaskDataDO::getIsReported, QmsCommonConstant.NO));
+ }
+
default List selectResultAssessmentList(BusinessAssayTaskDataReqVO reqVO) {
MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper()
.leftJoin(ConfigAssayMethodDO.class, ConfigAssayMethodDO::getId, BusinessAssayTaskDataDO::getConfigAssayMethodId)
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/liteflow/sample/flow/SampleSubProcessUpdateCmp.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/liteflow/sample/flow/SampleSubProcessUpdateCmp.java
index e270636..e5e6e7a 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/liteflow/sample/flow/SampleSubProcessUpdateCmp.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/liteflow/sample/flow/SampleSubProcessUpdateCmp.java
@@ -2,14 +2,16 @@ package com.zt.plat.module.qms.business.bus.liteflow.sample.flow;
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson2.JSON;
-import com.ql.util.express.DefaultContext;
-import com.ql.util.express.ExpressRunner;
+import com.alibaba.qlexpress4.Express4Runner;
+import com.alibaba.qlexpress4.QLOptions;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import com.zt.plat.framework.common.exception.ServiceException;
@@ -41,7 +43,7 @@ public class SampleSubProcessUpdateCmp extends NodeComponent {
// private ConfigSubSampleService configSubSampleService;
@Resource
- private ExpressRunner expressRunner;
+ private Express4Runner express4Runner;
@Resource
private ConfigRuleMapper configRuleMapper;
@@ -89,7 +91,7 @@ public class SampleSubProcessUpdateCmp extends NodeComponent {
for (SampleFlowNode flowNode : nextFlowNodeList) {
ConfigRuleDO conditionRule = configRuleMapper.selectLatestConfigRuleByCode(flowNode.getCondition());
Boolean isMeetCondition = false;
- DefaultContext context = new DefaultContext<>();
+ Map context = new HashMap<>();
ConfigSubSampleDO configSubSample = sampleFlowContext.getConfigSubSampleById(businessSubSample.getConfigSubSampleId());
Boolean hasSubSimpleCodeRule = configSubSample != null && StringUtils.isNotBlank(configSubSample.getSimpleCodeRule());
Boolean hasSubSampleEncrypt = businessHandoverRecordSubDOList.stream().filter(f -> f.getBusinessSubSampleId().equals(businessSubSample.getId())).anyMatch(m -> QmsCommonConstant.FlOW_NODE_SAMPLE_ENCRYPT.equals(m.getSampleFlowNodeKey()));
@@ -105,7 +107,8 @@ public class SampleSubProcessUpdateCmp extends NodeComponent {
context.put("hasSubSimpleCodeRule", hasSubSimpleCodeRule);
context.put("hasSubSampleEncrypt", hasSubSampleEncrypt);
try {
- isMeetCondition = (Boolean) expressRunner.execute(conditionRule.getExpression(), context, null, false, false);
+// isMeetCondition = (Boolean) express4Runner.execute(conditionRule.getExpression(), context, null, false, false);
+ isMeetCondition = (Boolean) express4Runner.execute(conditionRule.getExpression(), context, QLOptions.DEFAULT_OPTIONS).getResult();
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException(1_032_100_000, e.getMessage());
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleAnalysisAuditServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleAnalysisAuditServiceImpl.java
index e6e26b7..037879e 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleAnalysisAuditServiceImpl.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleAnalysisAuditServiceImpl.java
@@ -4,13 +4,10 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
-import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.collections4.map.HashedMap;
@@ -23,18 +20,17 @@ import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONFactory;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
-import com.alibaba.nacos.shaded.io.grpc.Attributes.Key;
+import com.alibaba.qlexpress4.Express4Runner;
+import com.alibaba.qlexpress4.QLOptions;
+import com.alibaba.qlexpress4.QLResult;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
-import com.ql.util.express.DefaultContext;
-import com.ql.util.express.ExpressRunner;
import com.zt.plat.framework.common.exception.ServiceException;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils;
import com.zt.plat.module.qms.business.bus.controller.vo.*;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayParameterDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayProjectDataDO;
-import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayReportDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDetailDO;
@@ -67,7 +63,6 @@ import com.zt.plat.module.qms.business.bus.dal.mapper.BusinessSubSampleAssessmen
import com.zt.plat.module.qms.business.bus.dal.mapper.BusinessSubSampleMapper;
import com.zt.plat.module.qms.business.config.controller.vo.*;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigAssayMethodProjectAssessmentDO;
-import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigReportFieldDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigRuleDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigSubSampleDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigSubSampleMethodDO;
@@ -104,7 +99,7 @@ import jakarta.annotation.Resource;
public class SampleAnalysisAuditServiceImpl implements SampleAnalysisAuditService {
@Resource
- private ExpressRunner expressRunner;
+ private Express4Runner express4Runner;
@Resource
private AllowanceCalculatorComponent allowanceCalculatorComponent;
@@ -991,12 +986,14 @@ public class SampleAnalysisAuditServiceImpl implements SampleAnalysisAuditServic
int elementScale = businessSubSampleAssessmentProjectDO.getDecimalPosition();
// 计算代表值(均值\)
// BigDecimal representativeValue = calculateRepresentativeValue(sortedValues, elementScale);
- DefaultContext context = new DefaultContext<>();
+ Map context = new HashMap<>();
context.put("values", sortedValues);
context.put("scale", elementScale);
BigDecimal representativeValue = null;
try {
- representativeValue = (BigDecimal) expressRunner.execute(calculateAssessmentValue.getExpression(), context, null, false, false);
+ //representativeValue = (BigDecimal) expressRunner.execute(calculateAssessmentValue.getExpression(), context, null, false, false);
+ QLResult expressResult = express4Runner.execute(calculateAssessmentValue.getExpression(), context, QLOptions.builder().precise(true).build());//高精度计算
+ representativeValue = (BigDecimal) expressResult.getResult();
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/code/CodeGenUtil.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/code/CodeGenUtil.java
index b5209fb..b462b00 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/code/CodeGenUtil.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/code/CodeGenUtil.java
@@ -7,7 +7,7 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/code/SampleEncryptUtil.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/code/SampleEncryptUtil.java
index 37cb497..7bff5f7 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/code/SampleEncryptUtil.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/code/SampleEncryptUtil.java
@@ -3,7 +3,7 @@ package com.zt.plat.module.qms.core.code;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
public class SampleEncryptUtil {
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/legend/security/AbstractQueryBlackListHandler.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/legend/security/AbstractQueryBlackListHandler.java
index 39086fd..ae02309 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/legend/security/AbstractQueryBlackListHandler.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/legend/security/AbstractQueryBlackListHandler.java
@@ -1,7 +1,7 @@
package com.zt.plat.module.qms.core.legend.security;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.regex.Matcher;
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/cmp/AllowanceCalculatorComponent.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/cmp/AllowanceCalculatorComponent.java
index fcc29d1..757f011 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/cmp/AllowanceCalculatorComponent.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/cmp/AllowanceCalculatorComponent.java
@@ -2,11 +2,13 @@ package com.zt.plat.module.qms.core.qlexpress.cmp;
import java.math.BigDecimal;
import java.math.RoundingMode;
+import java.util.HashMap;
+import java.util.Map;
import org.springframework.stereotype.Component;
-import com.ql.util.express.DefaultContext;
-import com.ql.util.express.ExpressRunner;
+import com.alibaba.qlexpress4.Express4Runner;
+import com.alibaba.qlexpress4.QLOptions;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -19,7 +21,7 @@ import lombok.extern.slf4j.Slf4j;
public class AllowanceCalculatorComponent {
@Resource
- private ExpressRunner expressRunner;
+ private Express4Runner express4Runner;
/**
* 计算允差值:支持原生线性公式 和 Express 自定义公式混合模式
@@ -80,11 +82,12 @@ public class AllowanceCalculatorComponent {
* 使用 Express 执行自定义公式
*/
private BigDecimal evaluateCustomFormula(String formula, BigDecimal xValue, int scale) {
- DefaultContext context = new DefaultContext<>();
+ Map context = new HashMap<>();
context.put("X", xValue); // 用户公式中使用 X 作为变量名
try {
- Object result = expressRunner.execute(formula, context, null, true, false);
+// Object result = expressRunner.execute(formula, context, null, true, false);
+ Object result = express4Runner.execute(formula, context, QLOptions.builder().precise(true).build());
if (result == null) {
throw new RuntimeException("Express 公式返回结果为 null");
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/config/QlExpressRuleEngineConfig.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/config/QlExpressRuleEngineConfig.java
index 5d0180e..6acce8c 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/config/QlExpressRuleEngineConfig.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/config/QlExpressRuleEngineConfig.java
@@ -3,16 +3,19 @@ package com.zt.plat.module.qms.core.qlexpress.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import com.ql.util.express.ExpressRunner;
+import com.alibaba.qlexpress4.Express4Runner;
+import com.alibaba.qlexpress4.InitOptions;
+import com.alibaba.qlexpress4.security.QLSecurityStrategy;
import com.zt.plat.module.qms.core.qlexpress.function.RoundToScaleHalfEven;
@Configuration
public class QlExpressRuleEngineConfig {
@Bean
- public ExpressRunner expressRunner() {
- //需要高精度计算支持
- ExpressRunner expressRunner = new ExpressRunner(true, false);
+ public Express4Runner expressRunner() {
+ //兼容 3 的行为,则在新建 Express4Runner 时, 要将安全策略设置为 “开放”
+ InitOptions initOptions = InitOptions.builder().securityStrategy(QLSecurityStrategy.open()).build();
+ Express4Runner expressRunner = new Express4Runner(initOptions);
expressRunner.addFunction("roundToScale", new RoundToScaleHalfEven());
return expressRunner;
}
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/function/RoundToScaleHalfEven.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/function/RoundToScaleHalfEven.java
index 2053ae0..f5806b4 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/function/RoundToScaleHalfEven.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/function/RoundToScaleHalfEven.java
@@ -3,18 +3,20 @@ package com.zt.plat.module.qms.core.qlexpress.function;
import java.math.BigDecimal;
import java.math.RoundingMode;
-import com.ql.util.express.Operator;
+import com.alibaba.qlexpress4.runtime.Parameters;
+import com.alibaba.qlexpress4.runtime.QContext;
+import com.alibaba.qlexpress4.runtime.function.CustomFunction;
-public class RoundToScaleHalfEven extends Operator {
+
+public class RoundToScaleHalfEven implements CustomFunction {
@Override
- public Object executeInner(Object[] list) throws Exception {
- if (list.length != 2) {
+ public Object call(QContext qContext, Parameters parameters) throws Throwable {
+ if (parameters.size() != 2) {
throw new Exception("roundToScale函数需要2个参数:数值和小数位数");
}
-
- double value = Double.parseDouble(list[0].toString());
- int scale = Integer.parseInt(list[1].toString());
+ double value = Double.parseDouble(parameters.get(0).get().toString());
+ int scale = Integer.parseInt(parameters.get(1).get().toString());
BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(scale, RoundingMode.HALF_EVEN);
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/iot/tcpserver/IotUtils.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/iot/tcpserver/IotUtils.java
index 6d4fa80..6fae7b2 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/iot/tcpserver/IotUtils.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/iot/tcpserver/IotUtils.java
@@ -1,7 +1,7 @@
package com.zt.plat.module.qms.iot.tcpserver;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ObjectUtils;
import tech.zzjc.tio.core.ChannelContext;
import tech.zzjc.tio.core.Tio;
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/iot/tcpserver/device/handler/IotDeviceBalanceHandler.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/iot/tcpserver/device/handler/IotDeviceBalanceHandler.java
index b4da687..cb8e7f6 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/iot/tcpserver/device/handler/IotDeviceBalanceHandler.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/iot/tcpserver/device/handler/IotDeviceBalanceHandler.java
@@ -10,8 +10,9 @@ import com.zt.plat.module.qms.iot.tcpserver.handler.IotDataHander;
import com.zt.plat.module.qms.iot.tcpserver.publisher.BalanceDataPublisher;
import com.fhs.common.spring.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.NumberUtils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.stereotype.Component;
import tech.zzjc.tio.cluster.TioClusterConfig;
import tech.zzjc.tio.cluster.TioClusterVo;
@@ -81,7 +82,7 @@ public class IotDeviceBalanceHandler implements IotDataHander {
String[] dataArray = analysisData(data, weightUnit);
weightData = dataArray[0];
weightUnit = dataArray[1];
- if (!NumberUtils.isNumber(weightData)) {
+ if (!NumberUtils.isParsable(weightData)) {
log.error("{},天平接收到的数据不正确!接收到的数据:{} 16进制:{}", realClient, data, IotUtils.bytesToHex(data.getBytes("UTF-8")));
return null;
}
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/thirdpartyapi/service/XRFDataServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/thirdpartyapi/service/XRFDataServiceImpl.java
index ebe2461..15a01b0 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/thirdpartyapi/service/XRFDataServiceImpl.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/thirdpartyapi/service/XRFDataServiceImpl.java
@@ -82,6 +82,9 @@ public class XRFDataServiceImpl implements XRFDataService {
//获取荧光样品id列表
List sampleIdList = xrfDeviceSampleList.stream().map(XRFDeviceSampleReqVO::getSampleId).collect(Collectors.toList());
+ //获取荧光样品编号列表
+ List sampleCodeList = xrfDeviceSampleList.stream().map(m -> m.getSampleCode()).collect(Collectors.toList());
+
//查询数据库是否已保存了荧光数据
BusinessXRFDataReqVO existXRFDataSearch = new BusinessXRFDataReqVO();
existXRFDataSearch.setDeviceNo(xrfDeviceSampleFirst.getDeviceNo());
@@ -95,6 +98,9 @@ public class XRFDataServiceImpl implements XRFDataService {
}
//根据设备编号查询荧光元素配置
List conYgElementList = configXRFProjectMapper.selectByDeviceNo(xrfDeviceSampleFirst.getDeviceNo());
+
+ //根据样品编号及分析方法类型,获取检测任务数据
+ List businessAssayTaskDataList = businessAssayTaskDataMapper.selectBySampleAssayCodesAndConfigAssayMethodDictionaryBusinessKey(sampleCodeList, "xshxyggpf");
List businessAssayTaskDataDOList = new ArrayList<>();
List busElementValueList = new ArrayList<>();
@@ -128,10 +134,12 @@ public class XRFDataServiceImpl implements XRFDataService {
//处理匹配
List tempBusElementValueList = new ArrayList<>();
- BusinessAssayTaskDataExtendRespVO businessAssayTaskData = businessAssayTaskDataMapper.selectBySampleCode(ygDeviceSample.getSampleCode());
- if (businessAssayTaskData != null) {
- List busElementValues = businessAssayProjectDataMapper.selectByBusinessAssayTaskDataId(businessAssayTaskData.getId());
- tempBusElementValueList.addAll(busElementValues);
+ List currBusinessAssayTaskDataList = businessAssayTaskDataList.stream().filter(f -> ygDeviceSample.getSampleCode().equals(f.getSampleAssayCode())).collect(Collectors.toList());
+ if (currBusinessAssayTaskDataList != null && currBusinessAssayTaskDataList.size() > 0) {
+ for (BusinessAssayTaskDataExtendRespVO businessAssayTaskData : currBusinessAssayTaskDataList) {
+ List busElementValues = businessAssayProjectDataMapper.selectByBusinessAssayTaskDataId(businessAssayTaskData.getId());
+ tempBusElementValueList.addAll(busElementValues);
+ }
}
//分析元素
@@ -142,9 +150,7 @@ public class XRFDataServiceImpl implements XRFDataService {
continue;
}
- //查询是否有特殊转换率
-// QmsConYgConverRate conYgConverRate = conYgConverRateService.getOne(Wrappers.query().lambda().eq(QmsConYgConverRate::getDeviceNo, ygDeviceSample.getDeviceNo())
-// .eq(QmsConYgConverRate::getLineName, ygDeviceSample.getLineName()).eq(QmsConYgConverRate::getElementName, ygDeviceSampleElement.getElementName()));
+ //查询是否有特殊转换率
ConfigXRFConversionRateDO conYgConverRate = configXRFConversionRateMapper.selectBy(ygDeviceSample.getDeviceNo(), ygDeviceSample.getLineName(), ygDeviceSampleElement.getXrfProjectName());
ConfigXRFProjectDO conYgElement = null;
@@ -171,16 +177,19 @@ public class XRFDataServiceImpl implements XRFDataService {
conYgElementDataType = conYgElement.getDecimalPosition();
}
Long elementId = conYgElement.getDictionaryProjectId();
- BusinessAssayProjectDataExtendRespVO busElementValue = tempBusElementValueList.stream().filter(f -> f.getDictionaryProjectId().equals(elementId) && f.getIsEnabled().equals(1)).findFirst().orElse(null);
- if (busElementValue != null) {
- //化验数据小数精度四舍六入五单双
- if("decimal".equals(busElementValue.getDataType())) {
- busElementValue.setValue(elementValue.setScale(busElementValue.getDecimalPosition(), RoundingMode.HALF_EVEN).toPlainString());
- } else {
- busElementValue.setValue(elementValue.setScale(conYgElementDataType, RoundingMode.HALF_EVEN).toPlainString());
- }
- busElementValue.setRemark(conYgElement.getShowName() + ": " + busElementValue.getValue());
- busElementValueList.add(BeanUtils.toBean(busElementValue, BusinessAssayProjectDataDO.class));
+ List currBusElementValueList = tempBusElementValueList.stream().filter(f -> f.getDictionaryProjectId().equals(elementId) && f.getIsEnabled().equals(1)).collect(Collectors.toList());
+ if (currBusElementValueList != null && currBusElementValueList.size() > 0) {
+ for (BusinessAssayProjectDataExtendRespVO busElementValue : currBusElementValueList) {
+ //化验数据小数精度四舍六入五单双
+ if("decimal".equals(busElementValue.getDataType())) {
+ busElementValue.setValue(elementValue.setScale(busElementValue.getDecimalPosition(), RoundingMode.HALF_EVEN).toPlainString());
+ } else {
+ busElementValue.setValue(elementValue.setScale(conYgElementDataType, RoundingMode.HALF_EVEN).toPlainString());
+ }
+ busElementValue.setRemark(conYgElement.getShowName() + ": " + busElementValue.getValue());
+ busElementValueList.add(BeanUtils.toBean(busElementValue, BusinessAssayProjectDataDO.class));
+
+ }
}
ReportFieldValueData reportFieldValueData = new ReportFieldValueData();
@@ -191,11 +200,6 @@ public class XRFDataServiceImpl implements XRFDataService {
reportFieldValueData.setUnit(ygDeviceSampleElement.getXrfProjectUnit());
assayDataJson.put(conYgElement.getSaveColumn(), reportFieldValueData);
-// if(conYgElementDataType != null && conYgElementDataType.intValue() > -1) {
-// BeanUtil.setFieldValue(busYgData, conYgElement.getSaveColumn(), elementValue.setScale(conYgElementDataType, BigDecimal.ROUND_HALF_EVEN).toPlainString());//数据格式化-四舍六入五单双
-// } else {
-// BeanUtil.setFieldValue(busYgData, conYgElement.getSaveColumn(), elementValue);
-// }
}
}
//循环元素修改流程节点
@@ -209,13 +213,15 @@ public class XRFDataServiceImpl implements XRFDataService {
//设置分析数据
busYgData.setAssayData(assayDataJson.toJSONString());
- if (businessAssayTaskData != null) {
- busYgData.setIsMatched(QmsCommonConstant.YES);
- busYgData.setBusinessBaseSampleId(businessAssayTaskData.getBusinessBaseSampleId());
- busYgData.setBusinessSubParentSampleId(businessAssayTaskData.getBusinessSubParentSampleId());
- busYgData.setBusinessSubSampleId(businessAssayTaskData.getBusinessSubSampleId());
- busYgData.setBusinessAssayTaskDataId(businessAssayTaskData.getId());
- businessAssayTaskDataDOList.add(BeanUtils.toBean(businessAssayTaskData, BusinessAssayTaskDataDO.class));
+ if (currBusinessAssayTaskDataList != null && currBusinessAssayTaskDataList.size() > 0) {
+ for (BusinessAssayTaskDataExtendRespVO businessAssayTaskData : currBusinessAssayTaskDataList) {
+ busYgData.setIsMatched(QmsCommonConstant.YES);
+ busYgData.setBusinessBaseSampleId(businessAssayTaskData.getBusinessBaseSampleId());
+ busYgData.setBusinessSubParentSampleId(businessAssayTaskData.getBusinessSubParentSampleId());
+ busYgData.setBusinessSubSampleId(businessAssayTaskData.getBusinessSubSampleId());
+ busYgData.setBusinessAssayTaskDataId(businessAssayTaskData.getId());
+ businessAssayTaskDataDOList.add(BeanUtils.toBean(businessAssayTaskData, BusinessAssayTaskDataDO.class));
+ }
}
busYgDataList.add(busYgData);
@@ -227,18 +233,13 @@ public class XRFDataServiceImpl implements XRFDataService {
} else {
conYgLine.setLastSynchronousDataTime(maxSampleTime);
}
- //更新配置时间
+ //更新荧光线配置时间
configXRFLineMapper.updateById(conYgLine);
if (busYgDataList.size() > 0) {
//保存荧光数据
businessXRFDataMapper.insertBatch(busYgDataList);
-
- //更新分样子样
-// if(businessAssayTaskDataDOs.size() > 0) {
-// busSubCsampleService.updateBatchById(businessAssayTaskDataDOs);
-// }
-
+
//更新分析结果
if (busElementValueList.size() > 0) {
businessAssayProjectDataMapper.updateBatch(busElementValueList);
diff --git a/zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/QLExpressRunnerTest.java b/zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/QLExpressRunnerTest.java
index 128d1c7..0cdc8af 100644
--- a/zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/QLExpressRunnerTest.java
+++ b/zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/QLExpressRunnerTest.java
@@ -2,39 +2,51 @@ package com.zt.plat.module.qms;
import java.math.BigDecimal;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.junit.jupiter.api.Test;
-import com.ql.util.express.DefaultContext;
-import com.ql.util.express.ExpressRunner;
-import com.ql.util.express.IExpressContext;
+import com.alibaba.qlexpress4.Express4Runner;
+import com.alibaba.qlexpress4.InitOptions;
+import com.alibaba.qlexpress4.QLOptions;
+import com.alibaba.qlexpress4.security.QLSecurityStrategy;
import com.zt.plat.module.qms.core.qlexpress.function.RoundToScaleHalfEven;
public class QLExpressRunnerTest {
@Test
void roundToScaleTest() throws Exception {
- ExpressRunner expressRunner = new ExpressRunner(true, false);
- expressRunner.addFunction("roundToScale", new RoundToScaleHalfEven());
+// ExpressRunner expressRunner = new ExpressRunner(true, false);
+ Express4Runner express4Runner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);
+ express4Runner.addFunction("roundToScale", new RoundToScaleHalfEven());
String express_3 = "roundToScale(0.2434, 3)";
- Object result_3 = expressRunner.execute(express_3, null, null, false, false);
+// Object result_3 = expressRunner.execute(express_3, null, null, false, false);
+ Object result_3 = express4Runner.execute(express_3, new HashMap<>(), QLOptions.DEFAULT_OPTIONS).getResult();
+
System.out.println("四舍0.2434 :" + result_3);
String express_4 = "roundToScale(0.2416, 3)";
- Object result_4 = expressRunner.execute(express_4, null, null, false, false);
+// Object result_4 = expressRunner.execute(express_4, null, null, false, false);
+ Object result_4 = express4Runner.execute(express_4, new HashMap<>(), QLOptions.DEFAULT_OPTIONS).getResult();
System.out.println("六入0.2416 :" + result_4);
String express_1 = "roundToScale(0.2445, 3)";
- Object result_1 = expressRunner.execute(express_1, null, null, false, false);
+// Object result_1 = expressRunner.execute(express_1, null, null, false, false);
+ Object result_1 = express4Runner.execute(express_1, new HashMap<>(), QLOptions.DEFAULT_OPTIONS).getResult();
System.out.println("偶不变0.2445 :" + result_1);
String express_2 = "roundToScale(0.2455, 3)";
- Object result_2 = expressRunner.execute(express_2, null, null, false, false);
- System.out.println("奇变0.2445 :" + result_2);
+// Object result_2 = expressRunner.execute(express_2, null, null, false, false);
+ Object result_2 = express4Runner.execute(express_2, new HashMap<>(), QLOptions.DEFAULT_OPTIONS).getResult();
+ System.out.println("奇变0.2455 :" + result_2);
}
@Test
void calculateAverageValueTest() throws Exception {
- ExpressRunner expressRunner = new ExpressRunner(true, false);
-
+ //兼容3 将安全策略设置为 “开放”
+ InitOptions initOptions = InitOptions.builder().securityStrategy(QLSecurityStrategy.open()).build();
+ Express4Runner expressRunner = new Express4Runner(initOptions);
+// Express4Runner expressRunner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);
/**
String exp = ""
+ "function abc(int a, int b) {"
@@ -77,15 +89,19 @@ public class QLExpressRunnerTest {
int elementScale = 2;
- DefaultContext context = new DefaultContext<>();
+ Map context = new HashMap<>();
context.put("values", valuesList);
context.put("scale", elementScale);
- Object result = expressRunner.execute(express, context, null, false, false);
+// Object result = expressRunner.execute(express, context, null, false, false);
+ Object result = expressRunner.execute(express, context, QLOptions.DEFAULT_OPTIONS).getResult();
+ System.out.println(result);
+ result = expressRunner.execute(express, context, QLOptions.builder().precise(true).build()).getResult();
System.out.println(result);
- String[] names = expressRunner.getOutVarNames(express);
- for(String s:names){
+// String[] names = expressRunner.getOutVarNames(express);
+ Set outVarNames = expressRunner.getOutVarNames(express);
+ for(String s: outVarNames){
System.out.println("var : " + s);
}
}