From 51c7748c8cd55f5bd19712dfb4746744bcd5fc57 Mon Sep 17 00:00:00 2001
From: wxr
Date: Mon, 20 Oct 2025 11:07:40 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E6=95=B0=E6=8D=AE=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E6=8A=A5=E8=A1=A8=E6=9D=A5=E6=BA=90=E3=80=81=E6=98=AF?=
=?UTF-8?q?=E5=90=A6=E5=B7=B2=E5=85=A8=E9=83=A8=E4=B8=8A=E6=8A=A5=E3=80=81?=
=?UTF-8?q?=E5=B7=B2=E4=B8=8A=E6=8A=A5=E6=95=B0=E6=8D=AE=E6=9D=A5=E6=BA=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../BusinessAssayTaskDetailController.java | 8 ++
.../vo/BusinessAssayReportDataPageReqVO.java | 9 ++
.../vo/BusinessAssayReportDataRespVO.java | 9 ++
.../vo/BusinessAssayReportDataSaveReqVO.java | 9 ++
.../BusinessAssayTaskDetailExtendRespVO.java | 17 ++++
.../dataobject/BusinessAssayReportDataDO.java | 15 +++
.../mapper/BusinessAssayReportDataMapper.java | 3 +
.../mapper/BusinessAssayTaskDetailMapper.java | 18 ++++
.../BusinessAssayTaskDetailService.java | 12 ++-
.../BusinessAssayTaskDetailServiceImpl.java | 9 +-
.../SampleAnalysisAuditServiceImpl.java | 22 ++++-
.../config/dal/mapper/ConfigRuleMapper.java | 5 +
.../config/QlExpressRuleEngineConfig.java | 2 +
.../function/RoundToScaleHalfEven.java | 25 +++++
.../plat/module/qms/QLExpressRunnerTest.java | 92 +++++++++++++++++++
15 files changed, 246 insertions(+), 9 deletions(-)
create mode 100644 zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayTaskDetailExtendRespVO.java
create mode 100644 zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/function/RoundToScaleHalfEven.java
create mode 100644 zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/QLExpressRunnerTest.java
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/admin/BusinessAssayTaskDetailController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/admin/BusinessAssayTaskDetailController.java
index bb5c69a..2e93b80 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/admin/BusinessAssayTaskDetailController.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/admin/BusinessAssayTaskDetailController.java
@@ -92,6 +92,14 @@ public class BusinessAssayTaskDetailController implements BusinessControllerMark
return success(BeanUtils.toBean(pageResult, BusinessAssayTaskDetailRespVO.class));
}
+ @GetMapping("/list")
+ @Operation(summary = "获得检测任务分配明细分页")
+ @PreAuthorize("@ss.hasPermission('qms:business-assay-task-detail:query')")
+ public CommonResult> getBusinessAssayTaskDetailList(@Valid BusinessAssayTaskDetailReqVO reqVO) {
+ List resultList = businessAssayTaskDetailService.getBusinessAssayTaskDetailList(reqVO);
+ return success(resultList);
+ }
+
@GetMapping("/export-excel")
@Operation(summary = "导出检测任务分配明细 Excel")
@PreAuthorize("@ss.hasPermission('qms:business-assay-task-detail:export')")
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataPageReqVO.java
index 903412e..826de2c 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataPageReqVO.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataPageReqVO.java
@@ -24,9 +24,18 @@ public class BusinessAssayReportDataPageReqVO extends PageParam {
@Schema(description = "样品编号")
private String sampleCode;
+
+ @Schema(description = "数据来源")
+ private String dataSource;
@Schema(description = "分析数据")
private String assayData;
+
+ @Schema(description = "是否已全部上报")
+ private Integer isAllReported;
+
+ @Schema(description = "已上报数据来源")
+ private String reportedSource;
@Schema(description = "流程code")
private String reportFlowCode;
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataRespVO.java
index f244b68..5866b49 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataRespVO.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataRespVO.java
@@ -31,10 +31,19 @@ public class BusinessAssayReportDataRespVO {
@Schema(description = "样品编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("样品编号")
private String sampleCode;
+
+ @Schema(description = "数据来源")
+ private String dataSource;
@Schema(description = "分析数据")
@ExcelProperty("分析数据")
private String assayData;
+
+ @Schema(description = "是否已全部上报")
+ private Integer isAllReported;
+
+ @Schema(description = "已上报数据来源")
+ private String reportedSource;
@Schema(description = "流程code")
@ExcelProperty("流程code")
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataSaveReqVO.java
index 458422c..80bcf3e 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataSaveReqVO.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayReportDataSaveReqVO.java
@@ -27,9 +27,18 @@ public class BusinessAssayReportDataSaveReqVO {
@Schema(description = "样品编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "样品编号不能为空")
private String sampleCode;
+
+ @Schema(description = "数据来源")
+ private String dataSource;
@Schema(description = "分析数据")
private String assayData;
+
+ @Schema(description = "是否已全部上报")
+ private Integer isAllReported;
+
+ @Schema(description = "已上报数据来源")
+ private String reportedSource;
@Schema(description = "流程code")
private String reportFlowCode;
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayTaskDetailExtendRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayTaskDetailExtendRespVO.java
new file mode 100644
index 0000000..615f271
--- /dev/null
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayTaskDetailExtendRespVO.java
@@ -0,0 +1,17 @@
+package com.zt.plat.module.qms.business.bus.controller.vo;
+
+/**
+ * BusinessAssayTaskDetailExtendRespVO
+ *
+ * 更新历史:
+ *
版本 更新时间 更新者 更新内容
+ * V1.0 2025年10月17日 wxr Add
+ * Copyright (C) 云南志者竟成科技有限公司
+ *
+ * @author 王兴荣
+ * @version V1.0
+ * @since 2025年10月17日
+ */
+public class BusinessAssayTaskDetailExtendRespVO extends BusinessAssayTaskDetailRespVO {
+
+}
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessAssayReportDataDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessAssayReportDataDO.java
index 54dbc5f..f70d202 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessAssayReportDataDO.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessAssayReportDataDO.java
@@ -52,10 +52,25 @@ public class BusinessAssayReportDataDO extends BusinessBaseDO {
@TableField("SMP_CD")
private String sampleCode;
/**
+ * 数据来源
+ */
+ @TableField("DAT_SRC")
+ private String dataSource;
+ /**
* 分析数据
*/
@TableField("ASY_DAT")
private String assayData;
+ /**
+ * 是否已全部上报(0-否,1-是)
+ */
+ @TableField("IS_ALL_RPOD")
+ private Integer isAllReported;
+ /**
+ * 已上报数据来源
+ */
+ @TableField("RPOD_SRC")
+ private String reportedSource;
/**
* 流程code
*/
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayReportDataMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayReportDataMapper.java
index 5dfd6ef..0b846da 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayReportDataMapper.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayReportDataMapper.java
@@ -25,7 +25,10 @@ public interface BusinessAssayReportDataMapper extends BaseMapperX selectList(BusinessAssayTaskDetailReqVO reqVO) {
+ return selectJoinList(BusinessAssayTaskDetailExtendRespVO.class, new MPJLambdaWrapperX()
+ .eqIfPresent(BusinessAssayTaskDetailDO::getBusinessAssayTaskId, reqVO.getBusinessAssayTaskId())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getSampleId, reqVO.getSampleId())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getTaskNo, reqVO.getTaskNo())
+ .likeIfPresent(BusinessAssayTaskDetailDO::getSampleName, reqVO.getSampleName())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getSampleCode, reqVO.getSampleCode())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getCupNumber, reqVO.getCupNumber())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getDataSourceType, reqVO.getDataSourceType())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getSortNo, reqVO.getSortNo())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getRollbackStatus, reqVO.getRollbackStatus())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
+ .betweenIfPresent(BusinessAssayTaskDetailDO::getCreateTime, reqVO.getCreateTime())
+ .eqIfPresent(BusinessAssayTaskDetailDO::getRemark, reqVO.getRemark())
+ .orderByDesc(BusinessAssayTaskDetailDO::getId));
+ }
default List selectByBusinessAssayTaskId(Long businessAssayTaskId) {
return selectList(new LambdaQueryWrapperX()
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/BusinessAssayTaskDetailService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/BusinessAssayTaskDetailService.java
index e357ed7..53601f6 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/BusinessAssayTaskDetailService.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/BusinessAssayTaskDetailService.java
@@ -2,14 +2,10 @@ package com.zt.plat.module.qms.business.bus.service;
import java.util.*;
-import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayTaskDetailPageReqVO;
-import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayTaskDetailRespVO;
-import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayTaskDetailSaveReqVO;
import jakarta.validation.*;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.qms.business.bus.controller.vo.*;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDetailDO;
-import com.zt.plat.framework.common.pojo.PageParam;
/**
* 检测任务分配明细 Service 接口
@@ -63,4 +59,12 @@ public interface BusinessAssayTaskDetailService {
*/
PageResult getBusinessAssayTaskDetailPage(BusinessAssayTaskDetailPageReqVO pageReqVO);
+ /**
+ * 获得检测任务分配明细列表
+ *
+ * @param reqVO 分页查询
+ * @return 检测任务分配明细列表
+ */
+ List getBusinessAssayTaskDetailList(BusinessAssayTaskDetailReqVO reqVO);
+
}
\ No newline at end of file
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/BusinessAssayTaskDetailServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/BusinessAssayTaskDetailServiceImpl.java
index 4f62640..72e5d5b 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/BusinessAssayTaskDetailServiceImpl.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/BusinessAssayTaskDetailServiceImpl.java
@@ -1,9 +1,7 @@
package com.zt.plat.module.qms.business.bus.service;
import cn.hutool.core.collection.CollUtil;
-import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayTaskDetailPageReqVO;
-import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayTaskDetailRespVO;
-import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayTaskDetailSaveReqVO;
+
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -90,4 +88,9 @@ public class BusinessAssayTaskDetailServiceImpl implements BusinessAssayTaskDeta
return businessAssayTaskDetailMapper.selectPage(pageReqVO);
}
+ @Override
+ public List getBusinessAssayTaskDetailList(BusinessAssayTaskDetailReqVO reqVO) {
+ return businessAssayTaskDetailMapper.selectList(reqVO);
+ }
+
}
\ No newline at end of file
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 501becd..6190d9d 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
@@ -19,6 +19,7 @@ import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
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;
@@ -46,12 +47,14 @@ import com.zt.plat.module.qms.business.bus.dal.mapper.BusinessTeamAssessmentMapp
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.mapper.ConfigAssayMethodProjectAssessmentMapper;
import com.zt.plat.module.qms.business.config.dal.mapper.ConfigAssayMethodProjectMapper;
import com.zt.plat.module.qms.business.config.dal.mapper.ConfigProjectMapper;
import com.zt.plat.module.qms.business.config.dal.mapper.ConfigReportFieldMapper;
import com.zt.plat.module.qms.business.config.dal.mapper.ConfigReportTypeMapper;
+import com.zt.plat.module.qms.business.config.dal.mapper.ConfigRuleMapper;
import com.zt.plat.module.qms.business.config.dal.mapper.ConfigSampleReportMapper;
import com.zt.plat.module.qms.business.config.dal.mapper.ConfigSubSampleMapper;
import com.zt.plat.module.qms.core.qlexpress.cmp.AllowanceCalculatorComponent;
@@ -669,11 +672,17 @@ public class SampleAnalysisAuditServiceImpl implements SampleAnalysisAuditServic
}
+ @Resource
+ private ConfigRuleMapper configRuleMapper;
+
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject modifyParallelResultAssessment(Long businessSubSampleId, Long configAssayMethodId, Long businessSubSampleAssessmentId, List businessAssayProjectDataIds) {
BusinessSubSampleAssessmentDO businessSubSampleAssessmentDO = businessSubSampleAssessmentMapper.selectById(businessSubSampleAssessmentId);
+ //计算平均值
+ ConfigRuleDO calculateAverageValue = configRuleMapper.selectLatestConfigRuleByCode("calculateAverageValue");
+
BusinessAssayProjectDataReqVO businessAssayProjectDataSearch = new BusinessAssayProjectDataReqVO();
businessAssayProjectDataSearch.setBusinessSubSampleId(businessSubSampleId);
businessAssayProjectDataSearch.setConfigAssayMethodId(configAssayMethodId);
@@ -699,8 +708,17 @@ public class SampleAnalysisAuditServiceImpl implements SampleAnalysisAuditServic
// 获取小数精度
int elementScale = businessSubSampleAssessmentDO.getDecimalPosition();
- // 计算代表值(均值或差值)
- BigDecimal representativeValue = calculateRepresentativeValue(sortedValues, elementScale);
+ // 计算代表值(均值\)
+// BigDecimal representativeValue = calculateRepresentativeValue(sortedValues, elementScale);
+ DefaultContext context = new DefaultContext<>();
+ context.put("values", sortedValues);
+ context.put("scale", elementScale);
+ BigDecimal representativeValue = null;
+ try {
+ representativeValue = (BigDecimal) expressRunner.execute(calculateAverageValue.getExpression(), context, null, false, false);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
//设置判定值
businessSubSampleAssessmentDO.setAssessmentValue(representativeValue.toPlainString());
diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/dal/mapper/ConfigRuleMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/dal/mapper/ConfigRuleMapper.java
index 8b3e802..1815ae3 100644
--- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/dal/mapper/ConfigRuleMapper.java
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/config/dal/mapper/ConfigRuleMapper.java
@@ -6,6 +6,7 @@ import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.module.qms.business.config.controller.vo.*;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigRuleDO;
+import com.zt.plat.module.qms.enums.QmsCommonConstant;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
@@ -32,4 +33,8 @@ public interface ConfigRuleMapper extends BaseMapperX {
.orderByDesc(ConfigRuleDO::getId));
}
+ default ConfigRuleDO selectLatestConfigRuleByCode(String code) {
+ return selectOne(new LambdaQueryWrapperX()
+ .eq(ConfigRuleDO::getCode, code).eq(ConfigRuleDO::getIsLast, QmsCommonConstant.YES));
+ }
}
\ No newline at end of file
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 8bbd346..5d0180e 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
@@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.ql.util.express.ExpressRunner;
+import com.zt.plat.module.qms.core.qlexpress.function.RoundToScaleHalfEven;
@Configuration
public class QlExpressRuleEngineConfig {
@@ -12,6 +13,7 @@ public class QlExpressRuleEngineConfig {
public ExpressRunner expressRunner() {
//需要高精度计算支持
ExpressRunner expressRunner = new ExpressRunner(true, false);
+ 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
new file mode 100644
index 0000000..2053ae0
--- /dev/null
+++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/qlexpress/function/RoundToScaleHalfEven.java
@@ -0,0 +1,25 @@
+package com.zt.plat.module.qms.core.qlexpress.function;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+import com.ql.util.express.Operator;
+
+public class RoundToScaleHalfEven extends Operator {
+
+ @Override
+ public Object executeInner(Object[] list) throws Exception {
+ if (list.length != 2) {
+ throw new Exception("roundToScale函数需要2个参数:数值和小数位数");
+ }
+
+ double value = Double.parseDouble(list[0].toString());
+ int scale = Integer.parseInt(list[1].toString());
+
+ BigDecimal bd = BigDecimal.valueOf(value);
+ bd = bd.setScale(scale, RoundingMode.HALF_EVEN);
+ return bd;
+ }
+
+
+}
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
new file mode 100644
index 0000000..128d1c7
--- /dev/null
+++ b/zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/QLExpressRunnerTest.java
@@ -0,0 +1,92 @@
+package com.zt.plat.module.qms;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+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.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());
+ String express_3 = "roundToScale(0.2434, 3)";
+ Object result_3 = expressRunner.execute(express_3, null, null, false, false);
+ 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);
+ 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);
+ 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);
+ }
+
+ @Test
+ void calculateAverageValueTest() throws Exception {
+ ExpressRunner expressRunner = new ExpressRunner(true, false);
+
+ /**
+ String exp = ""
+ + "function abc(int a, int b) {"
+ + " return a + b;"
+ + "}"
+ + "return abc(1 + 100, 2 * 100)";
+ IExpressContext context = new DefaultContext<>();
+ Object result = expressRunner.execute(exp, context, null, false, false);
+ System.out.println(result);
+ **/
+//
+// String express = """
+// function calculateAverageValue(values, elementScale) {
+// if (values == null || values.size() == 0) return roundToScale(0, elementScale);
+// if (values.size() == 1) return roundToScale(values.get(0), elementScale);
+// sum = reduce(values, 0, "a + b");
+// return roundToScale(sum / values.size(), elementScale);
+// }
+// calculateAverageValue(values, elementScale);
+// """;
+ String express = """
+ if (values == null || values.size() == 0) return roundToScale(0, scale);
+ if (values.size() == 1) return roundToScale(values.get(0), scale);
+ sum = 0;
+ for(int i = 0; i < values.size(); i = i + 1) {
+ sum = sum + values.get(i);
+ }
+ return roundToScale(sum / values.size(), scale);
+ """;
+
+ expressRunner.addFunction("roundToScale", new RoundToScaleHalfEven());
+
+ List valuesList = new ArrayList<>();
+// valuesList.add(new BigDecimal("0.2445"));
+// valuesList.add(new BigDecimal("0.5435"));
+// valuesList.add(new BigDecimal("0.8436"));
+ valuesList.add(new BigDecimal("2.05"));
+ valuesList.add(new BigDecimal("2.05"));
+ valuesList.add(new BigDecimal("0"));
+
+ int elementScale = 2;
+
+ DefaultContext context = new DefaultContext<>();
+ context.put("values", valuesList);
+ context.put("scale", elementScale);
+ Object result = expressRunner.execute(express, context, null, false, false);
+ System.out.println(result);
+
+
+ String[] names = expressRunner.getOutVarNames(express);
+ for(String s:names){
+ System.out.println("var : " + s);
+ }
+ }
+}