|
|
@ -18,7 +18,9 @@ import org.springframework.beans.BeanUtils; |
|
|
import org.springframework.stereotype.Service; |
|
|
import org.springframework.stereotype.Service; |
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
import java.util.Date; |
|
|
import java.util.Date; |
|
|
|
|
|
import java.util.List; |
|
|
import java.util.Objects; |
|
|
import java.util.Objects; |
|
|
|
|
|
|
|
|
@Slf4j |
|
|
@Slf4j |
|
|
@ -202,17 +204,10 @@ public class SampleTrackingServiceImpl implements SampleTrackingService { |
|
|
if (trackingProject == null) { |
|
|
if (trackingProject == null) { |
|
|
throw new RuntimeException("项目追踪记录不存在: " + trackingProjectId); |
|
|
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<String> missingFields = collectSyncProjectMissingFields(trackingProject); |
|
|
|
|
|
if (!missingFields.isEmpty()) { |
|
|
|
|
|
throw new RuntimeException("项目追踪记录缺少以下必填项,无法同步: " + String.join("、", missingFields)); |
|
|
} |
|
|
} |
|
|
Project existedNpiProject = projectMapper.selectById(trackingProjectId); |
|
|
Project existedNpiProject = projectMapper.selectById(trackingProjectId); |
|
|
Integer npiProjectId = existedNpiProject == null ? null : existedNpiProject.getProjectId(); |
|
|
Integer npiProjectId = existedNpiProject == null ? null : existedNpiProject.getProjectId(); |
|
|
@ -240,20 +235,21 @@ public class SampleTrackingServiceImpl implements SampleTrackingService { |
|
|
if (trackingPart == null) { |
|
|
if (trackingPart == null) { |
|
|
throw new RuntimeException("项目物料追踪记录不存在: " + trackingProjectPartId); |
|
|
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<String> missingPartFields = collectSyncPartMissingFields(trackingPart); |
|
|
|
|
|
if (!missingPartFields.isEmpty()) { |
|
|
|
|
|
throw new RuntimeException("项目物料追踪记录缺少以下必填项,无法同步: " + String.join("、", missingPartFields)); |
|
|
} |
|
|
} |
|
|
Integer npiProjectId = syncProjectInfoInternal(trackingPart.getProjectId(), operator); |
|
|
Integer npiProjectId = syncProjectInfoInternal(trackingPart.getProjectId(), operator); |
|
|
ProjectPartTrackingData latestPart = sampleTrackingMapper.selectProjectPartTrackingById(trackingProjectPartId); |
|
|
ProjectPartTrackingData latestPart = sampleTrackingMapper.selectProjectPartTrackingById(trackingProjectPartId); |
|
|
if (latestPart == null) { |
|
|
if (latestPart == null) { |
|
|
throw new RuntimeException("项目物料追踪记录不存在: " + trackingProjectPartId); |
|
|
throw new RuntimeException("项目物料追踪记录不存在: " + trackingProjectPartId); |
|
|
} |
|
|
} |
|
|
|
|
|
normalizeSyncPartDefaults(latestPart); |
|
|
|
|
|
List<String> latestPartMissingFields = collectSyncPartMissingFields(latestPart); |
|
|
|
|
|
if (!latestPartMissingFields.isEmpty()) { |
|
|
|
|
|
throw new RuntimeException("项目物料追踪记录缺少以下必填项,无法同步: " + String.join("、", latestPartMissingFields)); |
|
|
|
|
|
} |
|
|
latestPart.setProjectId(npiProjectId); |
|
|
latestPart.setProjectId(npiProjectId); |
|
|
ProjectPart existedNpiPart = projectPartMapper.selectById(trackingProjectPartId); |
|
|
ProjectPart existedNpiPart = projectPartMapper.selectById(trackingProjectPartId); |
|
|
Integer npiProjectPartId = existedNpiPart == null ? null : existedNpiPart.getId(); |
|
|
Integer npiProjectPartId = existedNpiPart == null ? null : existedNpiPart.getId(); |
|
|
@ -330,6 +326,171 @@ public class SampleTrackingServiceImpl implements SampleTrackingService { |
|
|
return value == null || value.trim().isEmpty(); |
|
|
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<String> collectSyncProjectMissingFields(ProjectInfoTrackingData data) { |
|
|
|
|
|
List<String> 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<String> collectSyncPartMissingFields(ProjectPartTrackingData data) { |
|
|
|
|
|
List<String> 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) { |
|
|
private Project buildProjectForInsert(ProjectInfoTrackingData trackingProject, String operator) { |
|
|
Project project = new Project(); |
|
|
Project project = new Project(); |
|
|
BeanUtils.copyProperties(trackingProject, project); |
|
|
BeanUtils.copyProperties(trackingProject, project); |
|
|
|