From 04914a9997afbbead6f8adbb9d9c40e05b2edbd1 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期三, 17 十二月 2025 17:04:34 +0800
Subject: [PATCH] 修复调用导入工程失败 重复保存;修复分批出片逻辑

---
 mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/EngineeringSequenceServiceImpl.java |  117 ++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 65 insertions(+), 52 deletions(-)

diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/EngineeringSequenceServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/EngineeringSequenceServiceImpl.java
index 2eb888c..f5eaab5 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/EngineeringSequenceServiceImpl.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/EngineeringSequenceServiceImpl.java
@@ -16,66 +16,79 @@
 
 /**
  * 宸ョ▼搴忓彿淇℃伅鏈嶅姟瀹炵幇绫�
- * 
+ *
  * @author mes
- * @since 2024-11-20
+ * @since 2025-11-20
  */
 @Slf4j
 @Service
 public class EngineeringSequenceServiceImpl extends ServiceImpl<EngineeringSequenceMapper, EngineeringSequence> implements EngineeringSequenceService {
 
-    // 鏃ユ湡鏍煎紡鍖栧櫒锛堢嚎绋嬩笉瀹夊叏锛屼娇鐢═hreadLocal淇濊瘉绾跨▼瀹夊叏锛�
-    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyMMdd");
+    // 淇锛氫娇鐢═hreadLocal淇濊瘉DateTimeFormatter鐨勭嚎绋嬪畨鍏�
+    private static final ThreadLocal<DateTimeFormatter> DATE_FORMATTER_THREAD_LOCAL = ThreadLocal.withInitial(
+            () -> DateTimeFormatter.ofPattern("yyMMdd")
+    );
+
+    // 閲嶈瘯闂撮殧锛堟绉掞級锛屼娇鐢ㄩ殢鏈烘暟閬垮厤骞跺彂璇锋眰鍚屾椂閲嶈瘯
+    private static final int RETRY_INTERVAL_MIN = 50;
+    private static final int RETRY_INTERVAL_MAX = 200;
+
+    @Override
+    public String generateEngineeringId(Date date) {
+        Integer maxSequence = baseMapper.selectMaxSequenceByDate(date);
+        maxSequence = (maxSequence == null) ? 0 : maxSequence;
+        int newSequence = maxSequence + 1;
+
+        LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+        String dateStr = DATE_FORMATTER_THREAD_LOCAL.get().format(localDate);
+        String engineeringId = "P" + dateStr + String.format("%02d", newSequence);
+
+        log.info("鐢熸垚宸ョ▼鍙凤紙鏈繚瀛橈級: engineeringId={}, date={}, sequence={}", engineeringId, date, newSequence);
+        return engineeringId;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean saveEngineeringId(Date date, String engineeringId) {
+        try {
+            // 瑙f瀽宸ョ▼鍙疯幏鍙栧簭鍙�
+            LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            String dateStr = DATE_FORMATTER_THREAD_LOCAL.get().format(localDate);
+            String sequenceStr = engineeringId.substring(engineeringId.length() - 2);
+            int sequence = Integer.parseInt(sequenceStr);
+
+            EngineeringSequence engineeringSequence = new EngineeringSequence();
+            engineeringSequence.setEngineeringId(engineeringId);
+            engineeringSequence.setDate(date);
+            engineeringSequence.setSequence(sequence);
+            engineeringSequence.setCreatedTime(new Date());
+            engineeringSequence.setUpdatedTime(new Date());
+            engineeringSequence.setCreatedBy("system");
+            engineeringSequence.setUpdatedBy("system");
+
+            boolean result = save(engineeringSequence);
+
+            if (result) {
+                log.info("淇濆瓨宸ョ▼鍙锋垚鍔�: engineeringId={}, date={}, sequence={}", engineeringId, date, sequence);
+            } else {
+                log.error("淇濆瓨宸ョ▼鍙峰け璐�: engineeringId={}, date={}, sequence={}", engineeringId, date, sequence);
+            }
+
+            return result;
+        } catch (DuplicateKeyException dup) {
+            log.error("淇濆瓨宸ョ▼鍙峰敮涓�閿啿绐�: date={}, engineeringId={}", date, engineeringId, dup);
+            throw new RuntimeException("淇濆瓨宸ョ▼鍙峰け璐�", dup);
+        } catch (Exception e) {
+            log.error("淇濆瓨宸ョ▼鍙峰け璐�, date={}, engineeringId={}", date, engineeringId, e);
+            throw new RuntimeException("淇濆瓨宸ョ▼鍙峰け璐�", e);
+        }
+    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String generateAndSaveEngineeringId(Date date) {
-        // 涔愯閲嶈瘯锛岄槻姝㈠苟鍙戝啓鍏ラ�犳垚閲嶅閿�
-        int retry = 0;
-        final int maxRetry = 5;
-        while (true) {
-            try {
-                // 1. 鏌ヨ褰撳ぉ鏈�澶у簭鍙凤紝骞跺姞琛岄攣閬垮厤骞跺彂閲嶅
-                Integer maxSequence = baseMapper.selectMaxSequenceByDateForUpdate(date);
-                if (maxSequence == null) {
-                    maxSequence = 0;
-                }
-
-                // 2. 搴忓彿鑷1
-                int newSequence = maxSequence + 1;
-
-                // 3. 鐢熸垚宸ョ▼鍙凤細P + yyMMdd + 涓や綅搴忓彿
-                LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
-                String dateStr = localDate.format(DATE_FORMATTER);
-                String engineeringId = "P" + dateStr + String.format("%02d", newSequence);
-
-                // 4. 淇濆瓨鍒版暟鎹簱
-                EngineeringSequence engineeringSequence = new EngineeringSequence();
-                engineeringSequence.setEngineeringId(engineeringId);
-                engineeringSequence.setDate(date);
-                engineeringSequence.setSequence(newSequence);
-                engineeringSequence.setCreatedTime(new Date());
-                engineeringSequence.setUpdatedTime(new Date());
-                engineeringSequence.setCreatedBy("system");
-                engineeringSequence.setUpdatedBy("system");
-
-                save(engineeringSequence);
-
-                log.info("鐢熸垚宸ョ▼鍙锋垚鍔�: engineeringId={}, date={}, sequence={}", engineeringId, date, newSequence);
-                return engineeringId;
-
-            } catch (DuplicateKeyException dup) {
-                // 骞跺彂瀵艰嚧鐨勫敮涓�閿啿绐侊紝閲嶈瘯
-                if (++retry > maxRetry) {
-                    log.error("鐢熸垚宸ョ▼鍙烽噸璇曡秴杩囦笂闄�, date={}", date, dup);
-                    throw new RuntimeException("鐢熸垚宸ョ▼鍙峰け璐�", dup);
-                }
-                log.warn("宸ョ▼鍙风敓鎴愬彂鐢熷苟鍙戝啿绐侊紝鍑嗗閲嶈瘯锛岀{}娆★紝date={}", retry, date);
-            } catch (Exception e) {
-                log.error("鐢熸垚宸ョ▼鍙峰け璐�, date={}", date, e);
-                throw new RuntimeException("鐢熸垚宸ョ▼鍙峰け璐�", e);
-            }
-        }
+        String engineeringId = generateEngineeringId(date);
+        saveEngineeringId(date, engineeringId);
+        return engineeringId;
     }
-}
-
+}
\ No newline at end of file

--
Gitblit v1.8.0