From 7bcb5ba04e658a435cb12e85254002bc1fa62502 Mon Sep 17 00:00:00 2001 From: shenzhouyu Date: Wed, 26 Aug 2026 14:26:45 +0800 Subject: [PATCH] =?UTF-8?q?QMS=E9=A1=B9=E7=9B=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/pms/data/QcFAIRecordData.java | 5 + .../gaotao/modules/pms/mapper/QcMapper.java | 10 + .../pms/service/Impl/QcServiceImpl.java | 178 +++++++++++++----- .../gaotao/modules/pms/service/QcService.java | 3 + .../main/resources/mapper/pms/QcMapper.xml | 116 +++++++++++- 5 files changed, 255 insertions(+), 57 deletions(-) diff --git a/cclqms-java/src/main/java/com/gaotao/modules/pms/data/QcFAIRecordData.java b/cclqms-java/src/main/java/com/gaotao/modules/pms/data/QcFAIRecordData.java index 24b5a55..48d518e 100644 --- a/cclqms-java/src/main/java/com/gaotao/modules/pms/data/QcFAIRecordData.java +++ b/cclqms-java/src/main/java/com/gaotao/modules/pms/data/QcFAIRecordData.java @@ -192,6 +192,8 @@ public class QcFAIRecordData extends QueryPage { private String poItemNo; // 关联单行号 // 子明细数据数量 private Integer subDetailRecordNum; + /** 采集标识(来自检验项目 eam_properties_item.collection_flag) */ + private String collectionFlag; // 加工中心 private String workCenterNo; // 加工中心 @@ -355,4 +357,7 @@ public class QcFAIRecordData extends QueryPage { private BigDecimal pendingInspectQty; private BigDecimal inspectedQty; private Date arrivalDate; + + /** 检验模块:iqc/ipqc/fqc/sqc/fqas(oqc) */ + private String qcModule; } diff --git a/cclqms-java/src/main/java/com/gaotao/modules/pms/mapper/QcMapper.java b/cclqms-java/src/main/java/com/gaotao/modules/pms/mapper/QcMapper.java index 8175e89..cf54e33 100644 --- a/cclqms-java/src/main/java/com/gaotao/modules/pms/mapper/QcMapper.java +++ b/cclqms-java/src/main/java/com/gaotao/modules/pms/mapper/QcMapper.java @@ -82,6 +82,8 @@ public interface QcMapper { void updateIPQCDetailedRecord(QcFAIRecordData data); + void patchIPQCDetailedItemResult(QcFAIRecordData data); + void updateIPQCMasterSubmitFlag(QcFAIRecordData data); void updateIPQCDetailSubmitFlag(QcFAIRecordData data); @@ -136,6 +138,8 @@ public interface QcMapper { void updateIQCDetailedRecord(QcFAIRecordData data); + void patchIQCDetailedItemResult(QcFAIRecordData data); + List checkIQCDetail(QcFAIRecordData data); QcFAIRecordData checkIQCIsSubmit(SubDetailValues data); @@ -190,6 +194,8 @@ public interface QcMapper { void updateFQCDetailedRecord(QcFAIRecordData data); + void patchFQCDetailedItemResult(QcFAIRecordData data); + void updateFQCMasterSubmitFlag(QcFAIRecordData qcData); void updateFQCDetailSubmitFlag(QcFAIRecordData qcData); @@ -393,6 +399,8 @@ public interface QcMapper { void updateSQCDetailedRecord(QcFAIRecordData data); + void patchSQCDetailedItemResult(QcFAIRecordData data); + void updateSQCMasterSubmitFlag(QcFAIRecordData data); void updateSQCDetailSubmitFlag(QcFAIRecordData data); @@ -586,6 +594,8 @@ public interface QcMapper { void updateFQASDetailedRecord(QcFAIRecordData qcFAIRecordData); + void patchFQASDetailedItemResult(QcFAIRecordData data); + QcFAIRecordData getFQASInspectionRecord(QcFAIRecordData data); void updateFQASMasterSubmitFlag(QcFAIRecordData record); diff --git a/cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java b/cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java index e12d67e..6cc030a 100644 --- a/cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java +++ b/cclqms-java/src/main/java/com/gaotao/modules/pms/service/Impl/QcServiceImpl.java @@ -706,11 +706,9 @@ public class QcServiceImpl implements QcService { List subDetailValues = data.getSubDetailValues(); // 删除子明细的老数据 qcMapper.delFQCSubDetailedRecord(data); - if (subDetailValues.isEmpty()) { - return null; - } - // 统计是否有不符合上下限得值 Integer count = 0; + if (subDetailValues != null && !subDetailValues.isEmpty()) { + // 统计是否有不符合上下限得值 for (int i = 0; i < subDetailValues.size(); i++) { subDetailValues.get(i).setSite(data.getSite()); subDetailValues.get(i).setBuNo(data.getBuNo()); @@ -752,6 +750,8 @@ public class QcServiceImpl implements QcService { qcMapper.saveFQCSubDetailed(subList); } + } + syncDetailItemResultFromSubDetail("fqc", data, count); return count; } @@ -1031,11 +1031,9 @@ public class QcServiceImpl implements QcService { List subDetailValues = data.getSubDetailValues(); // 删除子明细的老数据 qcMapper.delIPQCSubDetailedRecord(data); - if (subDetailValues.isEmpty()) { - return null; - } - // 统计是否有不符合上下限得值 Integer count = 0; + if (subDetailValues != null && !subDetailValues.isEmpty()) { + // 统计是否有不符合上下限得值 for (int i = 0; i < subDetailValues.size(); i++) { subDetailValues.get(i).setSite(data.getSite()); subDetailValues.get(i).setBuNo(data.getBuNo()); @@ -1078,6 +1076,8 @@ public class QcServiceImpl implements QcService { qcMapper.saveIPQCSubDetailed(subList); } + } + syncDetailItemResultFromSubDetail("ipqc", data, count); return count; } @@ -1243,10 +1243,8 @@ public class QcServiceImpl implements QcService { public Integer saveSQCSubDetailed(QcSubDetailInformationData data) { List subDetailValues = data.getSubDetailValues(); qcMapper.delSQCSubDetailedRecord(data); - if (subDetailValues.isEmpty()) { - return null; - } Integer count = 0; + if (subDetailValues != null && !subDetailValues.isEmpty()) { for (int i = 0; i < subDetailValues.size(); i++) { subDetailValues.get(i).setSite(data.getSite()); subDetailValues.get(i).setBuNo(data.getBuNo()); @@ -1281,6 +1279,8 @@ public class QcServiceImpl implements QcService { List subList = subDetailValues.subList(i, end); qcMapper.saveSQCSubDetailed(subList); } + } + syncDetailItemResultFromSubDetail("sqc", data, count); return count; } @@ -1856,6 +1856,80 @@ public class QcServiceImpl implements QcService { // } } + /** + * 实测值变更后即时应用单条明细(结论/实测值落库) + **/ + @Override + @Transactional + public void applyQcDetailedItem(QcFAIRecordData data) { + String qcModule = data.getQcModule(); + if (qcModule == null || qcModule.trim().isEmpty()) { + throw new RuntimeException("qcModule is required"); + } + if (data.getItemNo() != null) { + data.setItemNo(data.getItemNo().trim()); + } + QcFAIRecordData currentRecord = getRecordStatusByModule(data, qcModule); + if (currentRecord != null && ("Y".equals(currentRecord.getSubmitFlag()) || "已完成".equals(currentRecord.getState()))) { + throw new RuntimeException(pmsI18nHelper.text("pms.error.inspection.approved.noModify", null, "该检验单已审核完成,无法修改!")); + } + switch (qcModule.trim().toLowerCase()) { + case "iqc": + qcMapper.patchIQCDetailedItemResult(data); + break; + case "ipqc": + qcMapper.patchIPQCDetailedItemResult(data); + break; + case "fqc": + qcMapper.patchFQCDetailedItemResult(data); + break; + case "sqc": + qcMapper.patchSQCDetailedItemResult(data); + break; + case "fqas": + case "oqc": + qcMapper.patchFQASDetailedItemResult(data); + break; + default: + throw new RuntimeException("unsupported qcModule: " + qcModule); + } + } + + /** 子明细保存后同步项目检验结论/不合格数到明细主表 */ + private void syncDetailItemResultFromSubDetail(String qcModule, QcSubDetailInformationData data, Integer count) { + if (data == null || data.getItemNo() == null || data.getItemNo().trim().isEmpty()) { + return; + } + int unqualified = count == null ? 0 : count; + QcFAIRecordData record = new QcFAIRecordData(); + record.setSite(data.getSite()); + record.setBuNo(data.getBuNo()); + record.setInspectionNo(data.getInspectionNo()); + record.setItemNo(data.getItemNo().trim()); + record.setUnqualifiedQuantity(BigDecimal.valueOf(unqualified)); + record.setItemResult(unqualified > 0 ? "N" : "Y"); + record.setQcModule(qcModule); + applyQcDetailedItem(record); + } + + private QcFAIRecordData getRecordStatusByModule(QcFAIRecordData data, String qcModule) { + switch (qcModule.trim().toLowerCase()) { + case "iqc": + return qcMapper.getIQCRecordStatus(data); + case "ipqc": + return qcMapper.getIPQCRecordStatus(data); + case "fqc": + return qcMapper.getFQCRecordStatus(data); + case "sqc": + return qcMapper.getSQCRecordStatus(data); + case "fqas": + case "oqc": + return qcMapper.getFQASRecordStatus(data); + default: + return null; + } + } + /** * 检查是否已提交 **/ @@ -1878,53 +1952,53 @@ public class QcServiceImpl implements QcService { List subDetailValues = data.getSubDetailValues(); // 删除子明细的老数据 qcMapper.delIQCSubDetailedRecord(data); - if (subDetailValues.isEmpty()) { - return null; - } - // 统计是否有不符合上下限得值 Integer count = 0; - for (int i = 0; i < subDetailValues.size(); i++) { - subDetailValues.get(i).setSite(data.getSite()); - subDetailValues.get(i).setBuNo(data.getBuNo()); - subDetailValues.get(i).setInspectionNo(data.getInspectionNo()); - subDetailValues.get(i).setItemNo(data.getItemNo()); - // 如果该项目维护了上下限且实测值类型为数值 - if ("N".equals(data.getValueTypeDb()) && (data.getMaxValue() != null || data.getMinValue() != null)) { - // 如果实际填入值为数值 - if (isNumberString(subDetailValues.get(i).getSubDetailValue())) { - BigDecimal value = new BigDecimal(subDetailValues.get(i).getSubDetailValue()); - // 只维护上限 - if (data.getMaxValue() != null && data.getMinValue() == null) { - if (value.compareTo(data.getMaxValue()) > 0) { - count ++; + if (subDetailValues != null && !subDetailValues.isEmpty()) { + // 统计是否有不符合上下限得值 + for (int i = 0; i < subDetailValues.size(); i++) { + subDetailValues.get(i).setSite(data.getSite()); + subDetailValues.get(i).setBuNo(data.getBuNo()); + subDetailValues.get(i).setInspectionNo(data.getInspectionNo()); + subDetailValues.get(i).setItemNo(data.getItemNo()); + // 如果该项目维护了上下限且实测值类型为数值 + if ("N".equals(data.getValueTypeDb()) && (data.getMaxValue() != null || data.getMinValue() != null)) { + // 如果实际填入值为数值 + if (isNumberString(subDetailValues.get(i).getSubDetailValue())) { + BigDecimal value = new BigDecimal(subDetailValues.get(i).getSubDetailValue()); + // 只维护上限 + if (data.getMaxValue() != null && data.getMinValue() == null) { + if (value.compareTo(data.getMaxValue()) > 0) { + count ++; + } } - } - // 只维护下限 - if (data.getMaxValue() == null && data.getMinValue() != null) { - if (value.compareTo(data.getMinValue()) < 0) { - count ++; + // 只维护下限 + if (data.getMaxValue() == null && data.getMinValue() != null) { + if (value.compareTo(data.getMinValue()) < 0) { + count ++; + } } - } - // 同时维护上下限 - if (data.getMaxValue() != null && data.getMinValue() != null) { - if (value.compareTo(data.getMaxValue()) > 0 || value.compareTo(data.getMinValue()) < 0) { - count ++; + // 同时维护上下限 + if (data.getMaxValue() != null && data.getMinValue() != null) { + if (value.compareTo(data.getMaxValue()) > 0 || value.compareTo(data.getMinValue()) < 0) { + count ++; + } } + } else { + count ++; } - } else { - count ++; } } - } - // 分批插入 - int batchSize = 150; // 假设每批200条记录 - for (int i = 0; i < subDetailValues.size(); i += batchSize) { - int end = Math.min(i + batchSize, subDetailValues.size()); - List subList = subDetailValues.subList(i, end); - qcMapper.saveIQCSubDetailed(subList); + // 分批插入 + int batchSize = 150; // 假设每批200条记录 + for (int i = 0; i < subDetailValues.size(); i += batchSize) { + int end = Math.min(i + batchSize, subDetailValues.size()); + List subList = subDetailValues.subList(i, end); + qcMapper.saveIQCSubDetailed(subList); + } } + syncDetailItemResultFromSubDetail("iqc", data, count); return count; } @@ -5017,11 +5091,9 @@ public class QcServiceImpl implements QcService { List subDetailValues = data.getSubDetailValues(); // 删除子明细的老数据 qcMapper.delFQASSubDetailedRecord(data); - if (subDetailValues.isEmpty()) { - return null; - } - // 统计是否有不符合上下限得值 Integer count = 0; + if (subDetailValues != null && !subDetailValues.isEmpty()) { + // 统计是否有不符合上下限得值 for (int i = 0; i < subDetailValues.size(); i++) { subDetailValues.get(i).setSite(data.getSite()); subDetailValues.get(i).setBuNo(data.getBuNo()); @@ -5057,6 +5129,8 @@ public class QcServiceImpl implements QcService { } // 新增子明细新数据 qcMapper.saveFQASSubDetailed(subDetailValues); + } + syncDetailItemResultFromSubDetail("oqc", data, count); return count; } diff --git a/cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java b/cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java index c38b84d..f2f8c41 100644 --- a/cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java +++ b/cclqms-java/src/main/java/com/gaotao/modules/pms/service/QcService.java @@ -84,6 +84,9 @@ public interface QcService { void saveIQCDetailedRecord(QcFAIRecordData data); + /** 实测值变更后即时应用单条明细(结论/实测值落库) */ + void applyQcDetailedItem(QcFAIRecordData data); + Integer checkIQCIsSubmit(SubDetailValues data); Integer saveIQCSubDetailed(QcSubDetailInformationData data); diff --git a/cclqms-java/src/main/resources/mapper/pms/QcMapper.xml b/cclqms-java/src/main/resources/mapper/pms/QcMapper.xml index 99a6bde..39c9a1c 100644 --- a/cclqms-java/src/main/resources/mapper/pms/QcMapper.xml +++ b/cclqms-java/src/main/resources/mapper/pms/QcMapper.xml @@ -704,7 +704,14 @@ c.method_name, c.method_remark, sw.color_code as qcSpecWarningColorCode, - sw.threshold_value as qcSpecWarningThresholdValue + sw.threshold_value as qcSpecWarningThresholdValue, + (SELECT TOP 1 epi.collection_flag + FROM eam_properties_item epi + WHERE epi.site = a.site + AND epi.bu_no = a.bu_no + AND RTRIM(epi.ItemNo) = RTRIM(a.item_no) + ORDER BY CASE WHEN RTRIM(ISNULL(epi.inspection_type_no, '')) = RTRIM(ISNULL(r.inspection_type_no, '')) THEN 0 ELSE 1 END, + epi.inspection_type_no) AS collectionFlag FROM qc_ipqc_detailed_record as a LEFT JOIN qc_ipqc_record as r on a.site = r.site and a.bu_no = r.bu_no and a.inspection_no = r.inspection_no OUTER APPLY ( @@ -799,6 +806,20 @@ WHERE inspection_no = #{inspectionNo} and item_no = #{itemNo} and site = #{site} and bu_no = #{buNo} + + UPDATE qc_ipqc_detailed_record + + item_result = #{itemResult}, + unqualified_quantity = #{unqualifiedQuantity,jdbcType=DECIMAL}, + number_value = #{numberValue,jdbcType=DECIMAL}, + text_value = #{textValue}, + + WHERE inspection_no = #{inspectionNo} + and RTRIM(item_no) = RTRIM(#{itemNo}) + and site = #{site} + and bu_no = #{buNo} + + UPDATE qc_ipqc_record @@ -1115,7 +1136,14 @@ c.method_name, c.method_remark, sw.color_code as qcSpecWarningColorCode, - sw.threshold_value as qcSpecWarningThresholdValue + sw.threshold_value as qcSpecWarningThresholdValue, + (SELECT TOP 1 epi.collection_flag + FROM eam_properties_item epi + WHERE epi.site = a.site + AND epi.bu_no = a.bu_no + AND RTRIM(epi.ItemNo) = RTRIM(a.item_no) + ORDER BY CASE WHEN RTRIM(ISNULL(epi.inspection_type_no, '')) = RTRIM(ISNULL(r.inspection_type_no, '')) THEN 0 ELSE 1 END, + epi.inspection_type_no) AS collectionFlag FROM qc_sqc_detailed_record as a LEFT JOIN qc_sqc_record as r on a.site = r.site and a.bu_no = r.bu_no and a.inspection_no = r.inspection_no OUTER APPLY ( @@ -1206,6 +1234,20 @@ WHERE inspection_no = #{inspectionNo} and item_no = #{itemNo} and site = #{site} and bu_no = #{buNo} + + UPDATE qc_sqc_detailed_record + + item_result = #{itemResult}, + unqualified_quantity = #{unqualifiedQuantity,jdbcType=DECIMAL}, + number_value = #{numberValue,jdbcType=DECIMAL}, + text_value = #{textValue}, + + WHERE inspection_no = #{inspectionNo} + and RTRIM(item_no) = RTRIM(#{itemNo}) + and site = #{site} + and bu_no = #{buNo} + + UPDATE qc_sqc_record SET submit_flag = 'Y', @@ -1907,7 +1949,14 @@ c.method_remark, sw.color_code as qcSpecWarningColorCode, sw.threshold_value as qcSpecWarningThresholdValue, - a.sampling_qty + a.sampling_qty, + (SELECT TOP 1 epi.collection_flag + FROM eam_properties_item epi + WHERE epi.site = a.site + AND epi.bu_no = a.bu_no + AND RTRIM(epi.ItemNo) = RTRIM(a.item_no) + ORDER BY CASE WHEN RTRIM(ISNULL(epi.inspection_type_no, '')) = RTRIM(ISNULL(r.inspection_type_no, '')) THEN 0 ELSE 1 END, + epi.inspection_type_no) AS collectionFlag FROM qc_iqc_detailed_record as a LEFT JOIN qc_iqc_record as r on a.site = r.site and a.bu_no = r.bu_no and a.inspection_no = r.inspection_no OUTER APPLY ( @@ -1993,6 +2042,21 @@ WHERE inspection_no = #{inspectionNo} and item_no = #{itemNo} and site = #{site} and bu_no = #{buNo} + + + UPDATE qc_iqc_detailed_record + + item_result = #{itemResult}, + unqualified_quantity = #{unqualifiedQuantity,jdbcType=DECIMAL}, + number_value = #{numberValue,jdbcType=DECIMAL}, + text_value = #{textValue}, + + WHERE inspection_no = #{inspectionNo} + and RTRIM(item_no) = RTRIM(#{itemNo}) + and site = #{site} + and bu_no = #{buNo} + + SELECT