diff --git a/src/main/java/com/xujie/sys/modules/sampletracking/service/impl/SampleTrackingServiceImpl.java b/src/main/java/com/xujie/sys/modules/sampletracking/service/impl/SampleTrackingServiceImpl.java index fbf6bd01..abde9056 100644 --- a/src/main/java/com/xujie/sys/modules/sampletracking/service/impl/SampleTrackingServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/sampletracking/service/impl/SampleTrackingServiceImpl.java @@ -18,7 +18,9 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Objects; @Slf4j @@ -202,17 +204,10 @@ public class SampleTrackingServiceImpl implements SampleTrackingService { if (trackingProject == null) { throw new RuntimeException("项目追踪记录不存在: " + trackingProjectId); } - if (isBlank(trackingProject.getSite())) { - throw new RuntimeException("项目追踪记录缺少工厂信息,无法同步"); - } - if (isBlank(trackingProject.getProjectNo())) { - throw new RuntimeException("项目追踪记录缺少项目编码,无法同步"); - } - if (isBlank(trackingProject.getProjectName()) && !isBlank(trackingProject.getProjectDesc())) { - trackingProject.setProjectName(trackingProject.getProjectDesc().trim()); - } - if (isBlank(trackingProject.getProjectDesc()) && !isBlank(trackingProject.getProjectName())) { - trackingProject.setProjectDesc(trackingProject.getProjectName().trim()); + normalizeSyncProjectDefaults(trackingProject); + List missingFields = collectSyncProjectMissingFields(trackingProject); + if (!missingFields.isEmpty()) { + throw new RuntimeException("项目追踪记录缺少以下必填项,无法同步: " + String.join("、", missingFields)); } Project existedNpiProject = projectMapper.selectById(trackingProjectId); Integer npiProjectId = existedNpiProject == null ? null : existedNpiProject.getProjectId(); @@ -240,20 +235,21 @@ public class SampleTrackingServiceImpl implements SampleTrackingService { if (trackingPart == null) { throw new RuntimeException("项目物料追踪记录不存在: " + trackingProjectPartId); } - if (trackingPart.getProjectId() == null) { - throw new RuntimeException("项目物料追踪记录缺少项目ID,无法同步"); - } - if (isBlank(trackingPart.getSite())) { - throw new RuntimeException("项目物料追踪记录缺少工厂信息,无法同步"); - } - if (isBlank(trackingPart.getTestPartNo())) { - throw new RuntimeException("项目物料追踪记录缺少项目料号,无法同步"); + normalizeSyncPartDefaults(trackingPart); + List missingPartFields = collectSyncPartMissingFields(trackingPart); + if (!missingPartFields.isEmpty()) { + throw new RuntimeException("项目物料追踪记录缺少以下必填项,无法同步: " + String.join("、", missingPartFields)); } Integer npiProjectId = syncProjectInfoInternal(trackingPart.getProjectId(), operator); ProjectPartTrackingData latestPart = sampleTrackingMapper.selectProjectPartTrackingById(trackingProjectPartId); if (latestPart == null) { throw new RuntimeException("项目物料追踪记录不存在: " + trackingProjectPartId); } + normalizeSyncPartDefaults(latestPart); + List latestPartMissingFields = collectSyncPartMissingFields(latestPart); + if (!latestPartMissingFields.isEmpty()) { + throw new RuntimeException("项目物料追踪记录缺少以下必填项,无法同步: " + String.join("、", latestPartMissingFields)); + } latestPart.setProjectId(npiProjectId); ProjectPart existedNpiPart = projectPartMapper.selectById(trackingProjectPartId); Integer npiProjectPartId = existedNpiPart == null ? null : existedNpiPart.getId(); @@ -330,6 +326,171 @@ public class SampleTrackingServiceImpl implements SampleTrackingService { return value == null || value.trim().isEmpty(); } + private void normalizeSyncProjectDefaults(ProjectInfoTrackingData data) { + if (data == null) { + return; + } + if (isBlank(data.getProjectName()) && !isBlank(data.getProjectDesc())) { + data.setProjectName(data.getProjectDesc().trim()); + } + if (isBlank(data.getProjectDesc()) && !isBlank(data.getProjectName())) { + data.setProjectDesc(data.getProjectName().trim()); + } + if (isBlank(data.getCustomerNo())) { + data.setCustomerNo("C0000"); + } + if (isBlank(data.getFinalCustomerId())) { + data.setFinalCustomerId(data.getCustomerNo()); + } + } + + private void normalizeSyncPartDefaults(ProjectPartTrackingData data) { + if (data == null) { + return; + } + if (isBlank(data.getCustomerNo())) { + data.setCustomerNo("C0000"); + } + } + + private List collectSyncProjectMissingFields(ProjectInfoTrackingData data) { + List missingFields = new ArrayList<>(); + if (data == null) { + missingFields.add("项目数据"); + return missingFields; + } + if (isBlank(data.getSite())) { + missingFields.add("工厂"); + } + if (isBlank(data.getBuNo())) { + missingFields.add("BU"); + } + if (isBlank(data.getProjectNo())) { + missingFields.add("项目编码"); + } + if (isBlank(data.getProjectName()) && isBlank(data.getProjectDesc())) { + missingFields.add("项目名称"); + } + if (isBlank(data.getcProjectRegion())) { + missingFields.add("区域"); + } + if (data.getProjectCreationDate() == null) { + missingFields.add("立项日期"); + } + if (data.getNeedDate() == null) { + missingFields.add("预计完成日期"); + } + if (isBlank(data.getProjectCategory())) { + missingFields.add("项目分类"); + } + if (isBlank(data.getPriority())) { + missingFields.add("优先级"); + } + if (isBlank(data.getProjectManager())) { + missingFields.add("PM/Sales"); + } + if (isBlank(data.getProjectOwner())) { + missingFields.add("PjM"); + } + if (isBlank(data.getEngineer())) { + missingFields.add("Engineer"); + } + if (isBlank(data.getcQualityEngineer6())) { + missingFields.add("IQC"); + } + if (isBlank(data.getcQualityEngineer1())) { + missingFields.add("IPQC-Lam/Pri/Etch/Slit"); + } + if (isBlank(data.getcQualityEngineer2())) { + missingFields.add("IPQC-Converting"); + } + if (isBlank(data.getcManufactureEngineer())) { + missingFields.add("MFG"); + } + if (isBlank(data.getcQualityEngineer4())) { + missingFields.add("SQE"); + } + if (isBlank(data.getDocEngineer())) { + missingFields.add("文档工程师"); + } + if (isBlank(data.getcQualityEngineer3())) { + missingFields.add("FQC1"); + } + if (isBlank(data.getcQualityEngineer5())) { + missingFields.add("FQC2"); + } + return missingFields; + } + + private List collectSyncPartMissingFields(ProjectPartTrackingData data) { + List missingFields = new ArrayList<>(); + if (data == null) { + missingFields.add("项目物料数据"); + return missingFields; + } + if (data.getProjectId() == null) { + missingFields.add("项目ID"); + } + if (isBlank(data.getSite())) { + missingFields.add("工厂"); + } + if (isBlank(data.getTestPartNo())) { + missingFields.add("项目料号"); + } + if (isBlank(data.getPartDesc())) { + missingFields.add("料号描述"); + } + if (isBlank(data.getPartType())) { + missingFields.add("料号状态"); + } + if (data.getBuildDate() == null) { + missingFields.add("立项日期"); + } + if (data.getNeedDate() == null) { + missingFields.add("预计完成日期"); + } + if (isBlank(data.getProjectCategory())) { + missingFields.add("项目分类"); + } + if (isBlank(data.getPriority())) { + missingFields.add("优先级"); + } + if (isBlank(data.getProjectManager())) { + missingFields.add("PM/Sales"); + } + if (isBlank(data.getProjectOwner())) { + missingFields.add("PjM"); + } + if (isBlank(data.getEngineer())) { + missingFields.add("Engineer"); + } + if (isBlank(data.getcQualityEngineer6())) { + missingFields.add("IQC"); + } + if (isBlank(data.getcQualityEngineer1())) { + missingFields.add("IPQC-Lam/Pri/Etch/Slit"); + } + if (isBlank(data.getcQualityEngineer2())) { + missingFields.add("IPQC-Converting"); + } + if (isBlank(data.getcManufactureEngineer())) { + missingFields.add("MFG"); + } + if (isBlank(data.getcQualityEngineer4())) { + missingFields.add("SQE"); + } + if (isBlank(data.getDocEngineer())) { + missingFields.add("文档工程师"); + } + if (isBlank(data.getcQualityEngineer3())) { + missingFields.add("FQC1"); + } + if (isBlank(data.getcQualityEngineer5())) { + missingFields.add("FQC2"); + } + return missingFields; + } + private Project buildProjectForInsert(ProjectInfoTrackingData trackingProject, String operator) { Project project = new Project(); BeanUtils.copyProperties(trackingProject, project);