From 61c143a295df0a5d54e067ea991080209e63d042 Mon Sep 17 00:00:00 2001 From: wxr Date: Sat, 28 Feb 2026 15:14:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9C=89=E6=95=88=E4=BD=8D?= =?UTF-8?q?=E6=95=B0=E5=8F=8A=E5=8F=98=E6=9B=B4=E6=96=B9=E6=B3=95=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...usinessAssayProjectAndParameterRespVO.java | 3 + .../vo/BusinessAssayProjectDataPageReqVO.java | 3 + .../vo/BusinessAssayProjectDataReqVO.java | 3 + .../vo/BusinessAssayProjectDataRespVO.java | 3 + .../vo/BusinessAssayProjectDataSaveReqVO.java | 3 + ...inessQCManagementProjectDataPageReqVO.java | 3 + .../BusinessQCManagementProjectDataReqVO.java | 3 + ...BusinessQCManagementProjectDataRespVO.java | 3 + ...inessQCManagementProjectDataSaveReqVO.java | 3 + ...arentSampleAssessmentProjectPageReqVO.java | 3 + ...ubParentSampleAssessmentProjectRespVO.java | 3 + ...arentSampleAssessmentProjectSaveReqVO.java | 3 + ...ssSubSampleAssessmentProjectPageReqVO.java | 3 + ...inessSubSampleAssessmentProjectRespVO.java | 3 + ...ssSubSampleAssessmentProjectSaveReqVO.java | 3 + .../BusinessAssayProjectDataDO.java | 5 + .../BusinessQCManagementProjectDataDO.java | 5 + ...essSubParentSampleAssessmentProjectDO.java | 5 + .../BusinessSubSampleAssessmentProjectDO.java | 5 + .../BusinessAssayParameterDataMapper.java | 1 + .../BusinessAssayProjectDataMapper.java | 5 + .../BusinessAssayTaskParameterDataMapper.java | 1 + ...inessQCCoefficientParameterDataMapper.java | 1 + ...sinessQCManagementParameterDataMapper.java | 1 + ...BusinessQCManagementProjectDataMapper.java | 5 + ...QCManagementSampleParameterDataMapper.java | 1 + ...ubParentSampleAssessmentProjectMapper.java | 2 + ...inessSubSampleAssessmentProjectMapper.java | 1 + .../SampleEntrustGenSampleDataCmp.java | 2 + .../SampleTaskAssignQCSampleCmp.java | 1 + .../SampleAnalysisAuditServiceImpl.java | 16 +- .../SampleResultReportingServiceImpl.java | 1 + .../service/SampleTaskAssignServiceImpl.java | 15 +- .../vo/ConfigAssayMethodProjectPageReqVO.java | 3 + .../vo/ConfigAssayMethodProjectRespVO.java | 3 + .../vo/ConfigAssayMethodProjectSaveReqVO.java | 3 + .../ConfigAssayMethodProjectDO.java | 5 + .../ConfigAssayMethodProjectMapper.java | 1 + .../util/number/EffectiveNumberFormatter.java | 231 ++++++++++++++++++ .../qms/EffectiveNumberFormatterTest.java | 46 ++++ 40 files changed, 404 insertions(+), 6 deletions(-) create mode 100644 zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/core/util/number/EffectiveNumberFormatter.java create mode 100644 zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/EffectiveNumberFormatterTest.java diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectAndParameterRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectAndParameterRespVO.java index aa9dcd42..a8981792 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectAndParameterRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectAndParameterRespVO.java @@ -37,6 +37,9 @@ public class BusinessAssayProjectAndParameterRespVO implements Serializable { @Schema(description = "小数位数") private Integer decimalPosition; + + @Schema(description = "有效数字位") + private Integer effectiveDigit; /** 元素或参数单位 **/ @Schema(description = "元素或参数单位") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataPageReqVO.java index 091c4596..476a26dd 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataPageReqVO.java @@ -48,6 +48,9 @@ public class BusinessAssayProjectDataPageReqVO extends PageParam { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "是否不参与超差判定") private Integer isNotAssessment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataReqVO.java index 00fdba9c..a34fc31f 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataReqVO.java @@ -54,6 +54,9 @@ public class BusinessAssayProjectDataReqVO { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "是否不参与超差判定") private Integer isNotAssessment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataRespVO.java index 01f7130e..dcb9d5e6 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataRespVO.java @@ -57,6 +57,9 @@ public class BusinessAssayProjectDataRespVO { @ExcelProperty("小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "是否不参与超差判定", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("是否不参与超差判定") private Integer isNotAssessment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataSaveReqVO.java index 71fb30dc..97369804 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessAssayProjectDataSaveReqVO.java @@ -45,6 +45,9 @@ public class BusinessAssayProjectDataSaveReqVO { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "是否不参与超差判定", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "是否不参与超差判定不能为空") private Integer isNotAssessment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataPageReqVO.java index 90a541ea..bac38a32 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataPageReqVO.java @@ -37,6 +37,9 @@ public class BusinessQCManagementProjectDataPageReqVO extends PageParam { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "是否不参与超差判定") private Integer isNotAssessment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataReqVO.java index 4200d73d..6ec52f29 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataReqVO.java @@ -37,6 +37,9 @@ public class BusinessQCManagementProjectDataReqVO { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "是否不参与超差判定") private Integer isNotAssessment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataRespVO.java index 9558976f..e40a3957 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataRespVO.java @@ -48,6 +48,9 @@ public class BusinessQCManagementProjectDataRespVO { @ExcelProperty("小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "是否不参与超差判定", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("是否不参与超差判定") private Integer isNotAssessment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataSaveReqVO.java index c6aaa83d..ab321fe7 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessQCManagementProjectDataSaveReqVO.java @@ -40,6 +40,9 @@ public class BusinessQCManagementProjectDataSaveReqVO { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "是否不参与超差判定", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "是否不参与超差判定不能为空") private Integer isNotAssessment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectPageReqVO.java index c1beacfc..59539c72 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectPageReqVO.java @@ -46,6 +46,9 @@ public class BusinessSubParentSampleAssessmentProjectPageReqVO extends PageParam @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "判定值") private String assessmentValue; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectRespVO.java index 64dc59ae..49b88c53 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectRespVO.java @@ -55,6 +55,9 @@ public class BusinessSubParentSampleAssessmentProjectRespVO { @ExcelProperty("小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "判定值") @ExcelProperty("判定值") private String assessmentValue; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectSaveReqVO.java index 78b1a6fc..e19f07aa 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubParentSampleAssessmentProjectSaveReqVO.java @@ -49,6 +49,9 @@ public class BusinessSubParentSampleAssessmentProjectSaveReqVO { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "判定值") private String assessmentValue; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectPageReqVO.java index da7eb6d4..5a19941f 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectPageReqVO.java @@ -49,6 +49,9 @@ public class BusinessSubSampleAssessmentProjectPageReqVO extends PageParam { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "判定值") private String assessmentValue; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectRespVO.java index 57a51966..a65dfd0c 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectRespVO.java @@ -61,6 +61,9 @@ public class BusinessSubSampleAssessmentProjectRespVO { @ExcelProperty("小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "判定值") @ExcelProperty("判定值") private String assessmentValue; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectSaveReqVO.java index 8d0ddbbf..318bba37 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSubSampleAssessmentProjectSaveReqVO.java @@ -57,6 +57,9 @@ public class BusinessSubSampleAssessmentProjectSaveReqVO { @Schema(description = "小数位") private Integer decimalPosition; + @Schema(description = "有效数字位") + private Integer effectiveDigit; + @Schema(description = "判定值") private String assessmentValue; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessAssayProjectDataDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessAssayProjectDataDO.java index 3cd1e562..e82045f4 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessAssayProjectDataDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessAssayProjectDataDO.java @@ -87,6 +87,11 @@ public class BusinessAssayProjectDataDO extends BusinessBaseDO { @TableField("DEC_POS") private Integer decimalPosition; /** + * 有效数字位 + */ + @TableField("EFCT_DGT") + private Integer effectiveDigit; + /** * 是否不参与超差判定 */ @TableField("IS_NT_ASMT") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessQCManagementProjectDataDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessQCManagementProjectDataDO.java index 95eda72d..ff2858e0 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessQCManagementProjectDataDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessQCManagementProjectDataDO.java @@ -72,6 +72,11 @@ public class BusinessQCManagementProjectDataDO extends BusinessBaseDO { @TableField("DEC_POS") private Integer decimalPosition; /** + * 有效数字位 + */ + @TableField("EFCT_DGT") + private Integer effectiveDigit; + /** * 是否不参与超差判定 */ @TableField("IS_NT_ASMT") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSubParentSampleAssessmentProjectDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSubParentSampleAssessmentProjectDO.java index a9e60046..da922000 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSubParentSampleAssessmentProjectDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSubParentSampleAssessmentProjectDO.java @@ -88,6 +88,11 @@ public class BusinessSubParentSampleAssessmentProjectDO extends BusinessBaseDO { @TableField("DEC_POS") private Integer decimalPosition; /** + * 有效数字位 + */ + @TableField("EFCT_DGT") + private Integer effectiveDigit; + /** * 判定值 */ @TableField(value = "ASMT_VAL", updateStrategy = FieldStrategy.ALWAYS) diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSubSampleAssessmentProjectDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSubSampleAssessmentProjectDO.java index a41230ac..c103bf64 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSubSampleAssessmentProjectDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSubSampleAssessmentProjectDO.java @@ -93,6 +93,11 @@ public class BusinessSubSampleAssessmentProjectDO extends BusinessBaseDO { @TableField("DEC_POS") private Integer decimalPosition; /** + * 有效数字位 + */ + @TableField("EFCT_DGT") + private Integer effectiveDigit; + /** * 判定值 */ @TableField(value = "ASMT_VAL", updateStrategy = FieldStrategy.ALWAYS) diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayParameterDataMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayParameterDataMapper.java index b77f686a..5e153188 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayParameterDataMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessAssayParameterDataMapper.java @@ -39,6 +39,7 @@ public interface BusinessAssayParameterDataMapper extends BaseMapperX 1) ? parts[1] : ""; + + // 如果第一步处理后小数部分为空或全0(理论上setScale后不会空,但可能全0) + if (fractionalPart.isEmpty()) { + return step1.toPlainString(); + } + + // 3. 寻找小数部分第一个非零数字的位置 + int firstNonZeroIndex = -1; + for (int i = 0; i < fractionalPart.length(); i++) { + if (fractionalPart.charAt(i) != '0') { + firstNonZeroIndex = i; + break; + } + } + + // 如果小数部分全是0 (例如 1.0000),则不需要再做有效数字截断,直接返回 + if (firstNonZeroIndex == -1) { + return step1.toPlainString(); + } + + // 4. 计算新的目标小数位数 (Scale) + // 逻辑:保留从 firstNonZeroIndex 开始的 decimalSignificantDigits 个数字 + // 目标长度 = (第一个非零数的索引) + (要保留的有效位数) + // 例如: 0.001234, firstNonZero=2 ('1'), 要留2位 -> 目标长度 2+2=4 -> 0.0012 + int targetFractionalLength = firstNonZeroIndex + effectiveDigit; + + // 如果计算出的目标长度超过了当前小数长度,说明不需要截断(甚至可能需要补0,但setScale会自动补0) + // 如果目标长度小于等于0(极端情况),至少保留到第一个非零位? + // 按照常规逻辑,如果 targetFractionalLength <= firstNonZeroIndex,意味着保留0位有效数字? + // 这里假设用户输入的 decimalSignificantDigits >= 1 + + int newScale = targetFractionalLength; + + // 5. 执行第二次舍入 + // 注意:如果 newScale > currentScale, setScale 会补0 + // 如果 newScale < currentScale, setScale 会截断并使用 RoundingMode + BigDecimal finalResult = step1.setScale(newScale, RoundingMode.HALF_EVEN); + + return finalResult.toPlainString(); + + /** + // --- 第一步:保留固定小数位 --- + // 使用 HALF_EVEN (银行家算法) + BigDecimal step1 = value.setScale(decimalPlaces, RoundingMode.HALF_EVEN); + + // --- 第二步:保留有效数字 --- + // 基于第一步的结果计算有效数字 + int currentPrecision = step1.precision(); + int currentScale = step1.scale(); + + // 计算目标 scale: newScale = currentScale + (targetSignificance - currentPrecision) + int targetScale = currentScale + (effectiveDigit - currentPrecision); + + // 再次使用 HALF_EVEN 进行舍入 + // 注意:如果 targetScale 小于 0,setScale 会正确处理(例如变成 1200) + BigDecimal step2 = step1.setScale(targetScale, RoundingMode.HALF_EVEN); + return step2.toPlainString(); + **/ + + } + + /** + * 保留有效数字 + * @param value 输入的数字 + * @param effectiveDigit 要保留的有效数字位 + * @return + */ +// public static String formatNumber(BigDecimal value, int effectiveDigit) { +// //是总位数 +// int currentPrecision = value.precision(); +// //获取当前标度 (小数位数) +// int currentScale = value.scale(); +// +// // 计算目标 scale: newScale = currentScale + (targetSignificance - currentPrecision) +// int targetScale = currentScale + (effectiveDigit - currentPrecision); +// +// // 再次使用 HALF_EVEN 进行舍入 +// // 注意:如果 targetScale 小于 0,setScale 会正确处理(例如变成 1200) +// BigDecimal result = value.setScale(targetScale, RoundingMode.HALF_EVEN); +// +// return result.toPlainString(); +// } + + /** + * 保留有效数字 + * @param value 输入的数字 + * @param effectiveDigit 要保留的有效数字位 + * @return + */ + public static BigDecimal formatNumber(BigDecimal value, int effectiveDigit) { + + // 如果结果为0,直接返回 (0.00...) + if (value.compareTo(BigDecimal.ZERO) == 0) { + return value; + } + + // 1. 获取当前标度 (小数位数) + int currentScale = value.scale(); + if (currentScale <= 0) { + // 如果没有小数部分,直接返回整数 + return value; + } + + // 2. 将数字转换为纯小数字符串进行分析 + // toPlainString 确保不使用科学计数法 + String plainStr = value.toPlainString(); + + // 分离整数和小数部分 + String[] parts = plainStr.split("\\."); + String fractionalPart = (parts.length > 1) ? parts[1] : ""; + + // 如果第一步处理后小数部分为空或全0(理论上setScale后不会空,但可能全0) + if (fractionalPart.isEmpty()) { + return value; + } + + // 3. 寻找小数部分第一个非零数字的位置 + int firstNonZeroIndex = -1; + for (int i = 0; i < fractionalPart.length(); i++) { + if (fractionalPart.charAt(i) != '0') { + firstNonZeroIndex = i; + break; + } + } + + // 如果小数部分全是0 (例如 1.0000),则不需要再做有效数字截断,直接返回 + if (firstNonZeroIndex == -1) { + return value; + } + + // 4. 计算新的目标小数位数 (Scale) + // 逻辑:保留从 firstNonZeroIndex 开始的 decimalSignificantDigits 个数字 + // 目标长度 = (第一个非零数的索引) + (要保留的有效位数) + // 例如: 0.001234, firstNonZero=2 ('1'), 要留2位 -> 目标长度 2+2=4 -> 0.0012 + int targetFractionalLength = firstNonZeroIndex + effectiveDigit; + + // 如果计算出的目标长度超过了当前小数长度,说明不需要截断(甚至可能需要补0,但setScale会自动补0) + // 如果目标长度小于等于0(极端情况),至少保留到第一个非零位? + // 按照常规逻辑,如果 targetFractionalLength <= firstNonZeroIndex,意味着保留0位有效数字? + // 这里假设用户输入的 decimalSignificantDigits >= 1 + + int newScale = targetFractionalLength; + + // 5. 执行第二次舍入 + // 注意:如果 newScale > currentScale, setScale 会补0 + // 如果 newScale < currentScale, setScale 会截断并使用 RoundingMode + BigDecimal finalResult = value.setScale(newScale, RoundingMode.HALF_EVEN); + + return finalResult; + } + +} diff --git a/zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/EffectiveNumberFormatterTest.java b/zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/EffectiveNumberFormatterTest.java new file mode 100644 index 00000000..b26a5e7a --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/test/java/com/zt/plat/module/qms/EffectiveNumberFormatterTest.java @@ -0,0 +1,46 @@ +package com.zt.plat.module.qms; + +import org.junit.jupiter.api.Test; + +import com.zt.plat.module.qms.core.util.number.EffectiveNumberFormatter; + +public class EffectiveNumberFormatterTest { + + + @Test + public void formatNumberTest() { + System.out.println("=== 测试案例:测试结果 ==="); + test("0.012356", 4, 2, "0.012356->(4位小数)0.0124->(小数2位有效)0.012"); + + System.out.println("\n=== 测试案例:验证银行家算法 (小数部分) ==="); + // 案例 A: 0.012500 -> 4位小数 0.0125 -> 小数2位有效 (1,2,遇5) -> 2是偶数,舍去 -> 0.012 + test("0.012500", 4, 2, "0.0125 -> 2是偶数,遇5舍去 -> 0.012"); + + // 案例 B: 0.013500 -> 4位小数 0.0135 -> 小数2位有效 (1,3,遇5) -> 3是奇数,进位 -> 0.014 + test("0.013500", 4, 2, "0.0135 -> 3是奇数,遇5进位 -> 0.014"); + + System.out.println("\n=== 测试案例:多位前导零 ==="); + // 0.00012345 -> 6位小数 0.000123 -> 小数2位有效 (1,2,遇3舍去) -> 0.00012 + test("0.00012345", 6, 2, "0.000123 -> 0.00012"); + + // 0.00012555 -> 6位小数 0.000126 (5进位) -> 小数2位有效 (1,2,遇6进位) -> 0.00013 + test("0.00012555", 6, 2, "0.000126 -> 0.00013"); + + System.out.println("\n=== 测试案例:整数部分较大 ==="); + // 12345.001234 -> 4位小数 12345.0012 -> 小数2位有效 (1,2) -> 12345.0012 + test("12345.001234", 4, 2, "整数不影响,只看小数部分"); + + // 12345.00001234 -> 6位小数 12345.000012 -> 小数2位有效 -> 12345.000012 + test("12345.00001234", 6, 2, "前导零不计入有效位"); + } + + private void test(String input, int d, int s, String desc) { + try { + String res = EffectiveNumberFormatter.formatNumber(input, d, s); + System.out.printf("输入: %-10s | 小数:%d, 有效:%d | 结果: %-10s | 说明: %s%n", + input, d, s, res, desc); + } catch (Exception e) { + System.out.println("测试失败: " + e.getMessage()); + } + } +}