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}