From ea06fb3e25f23505f5ef4a3234467969e99c3751 Mon Sep 17 00:00:00 2001 From: shenzhouyu Date: Tue, 19 May 2026 11:46:09 +0800 Subject: [PATCH] =?UTF-8?q?QC=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/pms/controller/QcController.java | 9 ++ .../pms/service/Impl/QcServiceImpl.java | 82 +++++++++++++++++-- .../heai/modules/pms/service/QcService.java | 5 ++ src/main/resources/mapper/pms/QcMapper.xml | 17 +++- 4 files changed, 101 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/heai/modules/pms/controller/QcController.java b/src/main/java/com/heai/modules/pms/controller/QcController.java index 4da6a87..87f10ff 100644 --- a/src/main/java/com/heai/modules/pms/controller/QcController.java +++ b/src/main/java/com/heai/modules/pms/controller/QcController.java @@ -753,6 +753,15 @@ public class QcController { return R.ok(); } + /** + * 根据检验模板检验项目同步到物料属性检验标准(qc_part_attr_detailed) + */ + @PostMapping("/syncPartAttrDetailedFromTemplate") + public R syncPartAttrDetailedFromTemplate(@RequestBody QcTemplateData data) { + qcService.syncPartAttrDetailedFromTemplate(data); + return R.ok(); + } + /** * @description: 删除物料属性模板 * @author: fengyuan_yang diff --git a/src/main/java/com/heai/modules/pms/service/Impl/QcServiceImpl.java b/src/main/java/com/heai/modules/pms/service/Impl/QcServiceImpl.java index 588ba2e..26b24e4 100644 --- a/src/main/java/com/heai/modules/pms/service/Impl/QcServiceImpl.java +++ b/src/main/java/com/heai/modules/pms/service/Impl/QcServiceImpl.java @@ -1201,9 +1201,74 @@ public class QcServiceImpl implements QcService { /** * 新增物料属性模板 **/ + /** + * 保存物料属性模板关联,并将模板检验项目写入物料检验标准(已存在项目跳过) + */ + private void savePartAttributeDetailAndSync(QcTemplateData partData, Set syncedTemplateKeys) { + qcMapper.savePartAttributeDetails(partData); + String syncKey = partData.getSite() + "|" + partData.getBuNo() + "|" + + partData.getAttributeNo() + "|" + partData.getTemplateId(); + if (syncedTemplateKeys.add(syncKey)) { + syncPartAttrDetailedFromTemplate(partData); + } + } + + /** + * 根据检验模板检验项目同步到物料属性检验标准(qc_part_attr_detailed) + */ + @Override + public void syncPartAttrDetailedFromTemplate(QcTemplateData partData) { + if (partData == null || StringUtils.isBlank(partData.getTemplateId()) + || StringUtils.isBlank(partData.getAttributeNo())) { + return; + } + QcTemplateData query = new QcTemplateData(); + query.setSite(partData.getSite()); + query.setBuNo(partData.getBuNo()); + query.setTemplateId(partData.getTemplateId()); + query.setAttributeNo(partData.getAttributeNo()); + query.setItemType("D"); + List itemList = qcMapper.templateDetailsSearch(query); + if (itemList == null || itemList.isEmpty()) { + return; + } + boolean inserted = false; + for (QcTemplateData item : itemList) { + if (StringUtils.isBlank(item.getItemNo())) { + continue; + } + QcTemplateData attrItem = new QcTemplateData(); + attrItem.setSite(partData.getSite()); + attrItem.setBuNo(partData.getBuNo()); + attrItem.setAttributeNo(partData.getAttributeNo()); + attrItem.setItemNo(item.getItemNo()); + if (qcMapper.selectPartAttrItemDetails(attrItem) != null) { + continue; + } + attrItem.setInspectionTypeNo(partData.getInspectionTypeNo()); + attrItem.setDefaultValue(item.getDefaultValue()); + attrItem.setMaxValue(item.getMaxValue()); + attrItem.setMinValue(item.getMinValue()); + attrItem.setObjectID(item.getObjectID()); + attrItem.setOrderId(qcMapper.getPartAttrDetailedMaxOrderId(attrItem)); + qcMapper.insertPartAttrDetailed(attrItem); + inserted = true; + } + if (inserted) { + QcTemplateData timeData = new QcTemplateData(); + timeData.setSite(partData.getSite()); + timeData.setBuNo(partData.getBuNo()); + timeData.setAttributeNo(partData.getAttributeNo()); + timeData.setAttributeType(partData.getAttributeType()); + timeData.setUpdateBy(partData.getUpdateBy()); + qcMapper.updatePartAttributeTime(timeData); + } + } + @Override @Transactional public void savePartAttributeDetails (QcTemplateData data) { + Set syncedTemplateKeys = new HashSet<>(); // 与 boying-vue 一致:支持 IPQC/FQC 多工序×多机台、IQC 多供应商、OQC 多客户 for (QcTemplateData partData : data.getItemList()) { partData.setSite(data.getSite()); @@ -1237,7 +1302,7 @@ public class QcServiceImpl implements QcService { if (!paList.isEmpty()) { throw new RuntimeException("工序【" + operation + "】和机台【" + resourceId + "】的组合已存在!"); } - qcMapper.savePartAttributeDetails(partData); + savePartAttributeDetailAndSync(partData, syncedTemplateKeys); } } } else if (hasOperations && !hasResources) { @@ -1248,14 +1313,14 @@ public class QcServiceImpl implements QcService { if (!paList.isEmpty()) { throw new RuntimeException("工序【" + operation + "】已存在!"); } - qcMapper.savePartAttributeDetails(partData); + savePartAttributeDetailAndSync(partData, syncedTemplateKeys); } } else if (!hasOperations && hasResources) { throw new RuntimeException("如果想选择机台,必须要先选择工序!"); } else { partData.setOperation(null); partData.setResourceID(null); - qcMapper.savePartAttributeDetails(partData); + savePartAttributeDetailAndSync(partData, syncedTemplateKeys); } } else if ("105".equals(partData.getInspectionTypeNo())) { if (data.getManufacturerList() != null && !data.getManufacturerList().isEmpty()) { @@ -1265,11 +1330,11 @@ public class QcServiceImpl implements QcService { if (!paList2.isEmpty()) { throw new RuntimeException("待新增的供应商已存在!"); } - qcMapper.savePartAttributeDetails(partData); + savePartAttributeDetailAndSync(partData, syncedTemplateKeys); } } else { partData.setManufacturerID(null); - qcMapper.savePartAttributeDetails(partData); + savePartAttributeDetailAndSync(partData, syncedTemplateKeys); } } else if ("110".equals(partData.getInspectionTypeNo())) { if (data.getCustomerList() != null && !data.getCustomerList().isEmpty()) { @@ -1279,14 +1344,14 @@ public class QcServiceImpl implements QcService { if (!paList3.isEmpty()) { throw new RuntimeException("待新增的客户已存在!"); } - qcMapper.savePartAttributeDetails(partData); + savePartAttributeDetailAndSync(partData, syncedTemplateKeys); } } else { partData.setCustomerID(null); - qcMapper.savePartAttributeDetails(partData); + savePartAttributeDetailAndSync(partData, syncedTemplateKeys); } } else if ("108".equals(partData.getInspectionTypeNo()) || "109".equals(partData.getInspectionTypeNo())) { - qcMapper.savePartAttributeDetails(partData); + savePartAttributeDetailAndSync(partData, syncedTemplateKeys); } } } @@ -1539,6 +1604,7 @@ public class QcServiceImpl implements QcService { templateData.setResourceID(resourceId); // 新增 qcMapper.savePartAttributeDetails(templateData); + syncPartAttrDetailedFromTemplate(templateData); } }catch (Exception e){ throw new RuntimeException("导入失败:"+e.getMessage()); diff --git a/src/main/java/com/heai/modules/pms/service/QcService.java b/src/main/java/com/heai/modules/pms/service/QcService.java index e0f1b3c..a626ddb 100644 --- a/src/main/java/com/heai/modules/pms/service/QcService.java +++ b/src/main/java/com/heai/modules/pms/service/QcService.java @@ -117,6 +117,11 @@ public interface QcService { void savePartAttributeDetails(QcTemplateData data); + /** + * 根据检验模板检验项目同步到物料属性检验标准(qc_part_attr_detailed) + */ + void syncPartAttrDetailedFromTemplate(QcTemplateData data); + List getTemplateList(QcTemplateData data); List getPartTemplateList(QcTemplateData data); diff --git a/src/main/resources/mapper/pms/QcMapper.xml b/src/main/resources/mapper/pms/QcMapper.xml index 9644934..12d7b85 100644 --- a/src/main/resources/mapper/pms/QcMapper.xml +++ b/src/main/resources/mapper/pms/QcMapper.xml @@ -2227,6 +2227,9 @@ AND d.sku LIKE '%' + #{query.sku} + '%' + + AND d.Spec LIKE '%' + #{query.spec} + '%' + AND a.disposal_measures LIKE '%' + #{query.disposalMeasures} + '%' @@ -2625,6 +2628,9 @@ AND d.sku LIKE '%' + #{query.sku} + '%' + + AND d.Spec LIKE '%' + #{query.spec} + '%' + AND a.state in @@ -3193,8 +3199,8 @@ AND a.submission_type = #{query.submissionType} - - AND d.invdefinetype LIKE '%' + #{query.invdefinetype} + '%' + + AND d.Spec LIKE '%' + #{query.spec} + '%' ORDER BY @@ -3504,8 +3510,8 @@ AND a.submission_type = #{query.submissionType} - - AND d.invdefinetype LIKE '%' + #{query.invdefinetype} + '%' + + AND d.Spec LIKE '%' + #{query.spec} + '%' ORDER BY @@ -3983,6 +3989,9 @@ AND d.sku LIKE '%' + #{query.sku} + '%' + + AND d.Spec LIKE '%' + #{query.spec} + '%' + AND a.disposal_measures LIKE '%' + #{query.disposalMeasures} + '%'