diff --git a/src/main/java/com/xujie/sys/modules/sampletracking/mapper/SampleProofTrackingMapper.java b/src/main/java/com/xujie/sys/modules/sampletracking/mapper/SampleProofTrackingMapper.java index 0216c3d5..3982588b 100644 --- a/src/main/java/com/xujie/sys/modules/sampletracking/mapper/SampleProofTrackingMapper.java +++ b/src/main/java/com/xujie/sys/modules/sampletracking/mapper/SampleProofTrackingMapper.java @@ -74,6 +74,11 @@ public interface SampleProofTrackingMapper { @Param("actualityDeliveryDate") Date actualityDeliveryDate, @Param("updateBy") String updateBy); + int updateTrackingProofingStatusAndActualityDate(@Param("trackingId") Integer trackingId, + @Param("proofingStatus") String proofingStatus, + @Param("actualityDeliveryDate") Date actualityDeliveryDate, + @Param("updateBy") String updateBy); + void deleteProofTrackingLogByTrackingId(@Param("trackingId") Integer trackingId); void deleteProcessValuesByTrackingId(@Param("trackingId") Integer trackingId); diff --git a/src/main/java/com/xujie/sys/modules/sampletracking/service/impl/SampleProofTrackingServiceImpl.java b/src/main/java/com/xujie/sys/modules/sampletracking/service/impl/SampleProofTrackingServiceImpl.java index 0e868ef4..e2786370 100644 --- a/src/main/java/com/xujie/sys/modules/sampletracking/service/impl/SampleProofTrackingServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/sampletracking/service/impl/SampleProofTrackingServiceImpl.java @@ -64,6 +64,9 @@ public class SampleProofTrackingServiceImpl implements SampleProofTrackingServic private static final String DEFAULT_PROCESS_CONFIG_BU = "*"; private static final String DELIVERY_PACKAGE_PROCESS_CODE = "deliveryPackage"; private static final String DELIVERY_PACKAGE_PROCESS_NAME = "Delivery&Package"; + private static final String TRACKING_PROOFING_STATUS_IN_PROGRESS = "进行中"; + private static final String TRACKING_PROOFING_STATUS_FINISHED = "打样完成"; + private static final String NPI_PROOFING_STATUS_FINISHED = "完成"; private static final int NPI_ID_THRESHOLD = 100000; /** @@ -931,6 +934,9 @@ public class SampleProofTrackingServiceImpl implements SampleProofTrackingServic if (isCompletedStatus(status)) { Date completionDate = resolveDeliveryPackageCompletionDate(newValue, data.getActualDate(), trackingData.getActualityDeliveryDate()); markProofingCompletedAndSyncNpi(trackingData, completionDate, updateBy); + } else { + // 误点“已完成”时允许从 Delivery&Package 回退,避免整单长期锁死在打样完成态。 + rollbackProofingCompletedAndSyncNpi(trackingData, updateBy); } } } @@ -1135,7 +1141,9 @@ public class SampleProofTrackingServiceImpl implements SampleProofTrackingServic if (isBlank(normalizedStatus) || "未完成".equals(normalizedStatus) || "进行中".equals(normalizedStatus)) { return false; } - if ("已完成".equals(normalizedStatus) || "打样完成".equals(normalizedStatus) || "完成".equals(normalizedStatus)) { + if ("已完成".equals(normalizedStatus) + || TRACKING_PROOFING_STATUS_FINISHED.equals(normalizedStatus) + || NPI_PROOFING_STATUS_FINISHED.equals(normalizedStatus)) { return true; } return normalizedStatus.contains("完成") && !normalizedStatus.contains("未"); @@ -1169,7 +1177,7 @@ public class SampleProofTrackingServiceImpl implements SampleProofTrackingServic } int syncedRows = sampleTrackingMapper.updateNpiProofingStatusAndActualityDate( npiProofingId, - "完成", + NPI_PROOFING_STATUS_FINISHED, completionDate, updateBy ); @@ -1178,6 +1186,49 @@ public class SampleProofTrackingServiceImpl implements SampleProofTrackingServic } } + private void rollbackProofingCompletedAndSyncNpi(ProofTrackingData trackingData, + String updateBy) { + if (trackingData == null || trackingData.getTrackingId() == null) { + throw new RuntimeException("跟踪记录不存在,无法撤回打样完成"); + } + if (!isTrackingProofingCompleted(trackingData.getProofingStatus())) { + return; + } + int trackingUpdatedRows = sampleProofTrackingMapper.updateTrackingProofingStatusAndActualityDate( + trackingData.getTrackingId(), + TRACKING_PROOFING_STATUS_IN_PROGRESS, + null, + updateBy + ); + if (trackingUpdatedRows <= 0) { + throw new RuntimeException("撤回打样完成失败,跟踪记录不存在"); + } + Integer npiProofingId = resolveNpiProofingIdForAutoComplete(trackingData); + if (npiProofingId == null) { + // 历史未同步到 NPI 的记录允许仅回退 tracking,避免误点后无法恢复。 + return; + } + int syncedRows = sampleTrackingMapper.updateNpiProofingStatusAndActualityDate( + npiProofingId, + TRACKING_PROOFING_STATUS_IN_PROGRESS, + null, + updateBy + ); + if (syncedRows <= 0) { + throw new RuntimeException("撤回NPI打样状态失败,请先确认NPI打样单是否存在"); + } + } + + private boolean isTrackingProofingCompleted(String proofingStatus) { + if (isBlank(proofingStatus)) { + return false; + } + String normalizedStatus = proofingStatus.trim(); + return TRACKING_PROOFING_STATUS_FINISHED.equals(normalizedStatus) + || "已完成".equals(normalizedStatus) + || NPI_PROOFING_STATUS_FINISHED.equals(normalizedStatus); + } + private Integer resolveNpiProofingIdForAutoComplete(ProofTrackingData trackingData) { if (trackingData == null) { return null; diff --git a/src/main/resources/mapper/sampletracking/SampleProofTrackingMapper.xml b/src/main/resources/mapper/sampletracking/SampleProofTrackingMapper.xml index a7ae45ee..f81111c8 100644 --- a/src/main/resources/mapper/sampletracking/SampleProofTrackingMapper.xml +++ b/src/main/resources/mapper/sampletracking/SampleProofTrackingMapper.xml @@ -472,6 +472,15 @@ WHERE id = #{trackingId} + + UPDATE plm_proofing_information_tracking + SET proofing_status = #{proofingStatus}, + actuality_delivery_date = #{actualityDeliveryDate,jdbcType=DATE}, + update_date = GETDATE(), + update_by = #{updateBy} + WHERE id = #{trackingId} + + DELETE FROM plm_proofing_information_tracking_log WHERE tracking_id = #{trackingId}