From dd6df68061b7d34a3301c7c6ea63f5b0edf23c32 Mon Sep 17 00:00:00 2001 From: wxr Date: Fri, 12 Dec 2025 08:48:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7liteflow=E5=8F=8A=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=8D=A7=E5=85=89=E6=95=B0=E6=8D=AE=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zt-module-qms/zt-module-qms-server/pom.xml | 11 +-- .../bus/controller/vo/ReportedDataSource.java | 2 +- .../mapper/BusinessAssayTaskDataMapper.java | 25 +++++++ .../flow/SampleSubProcessUpdateCmp.java | 13 ++-- .../SampleAnalysisAuditServiceImpl.java | 19 ++--- .../module/qms/core/code/CodeGenUtil.java | 2 +- .../qms/core/code/SampleEncryptUtil.java | 2 +- .../AbstractQueryBlackListHandler.java | 2 +- .../cmp/AllowanceCalculatorComponent.java | 13 ++-- .../config/QlExpressRuleEngineConfig.java | 11 ++- .../function/RoundToScaleHalfEven.java | 16 ++-- .../module/qms/iot/tcpserver/IotUtils.java | 2 +- .../handler/IotDeviceBalanceHandler.java | 7 +- .../service/XRFDataServiceImpl.java | 73 ++++++++++--------- .../plat/module/qms/QLExpressRunnerTest.java | 48 ++++++++---- 15 files changed, 149 insertions(+), 97 deletions(-) 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); } }