From 628aa6a42e587e9f337e213f87f922fc2ab2af02 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期二, 02 十二月 2025 17:00:39 +0800
Subject: [PATCH] 修改卧转立扫码到卧转立任务流转,卧转立判断玻璃超时时间

---
 mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/scanner/handler/HorizontalScannerLogicHandler.java |  267 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 215 insertions(+), 52 deletions(-)

diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/scanner/handler/HorizontalScannerLogicHandler.java b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/scanner/handler/HorizontalScannerLogicHandler.java
index 3b45e80..71ad7f1 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/scanner/handler/HorizontalScannerLogicHandler.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/scanner/handler/HorizontalScannerLogicHandler.java
@@ -10,12 +10,16 @@
 import com.mes.s7.enhanced.EnhancedS7Serializer;
 import com.mes.s7.provider.S7SerializerProvider;
 import com.mes.service.PlcDynamicDataService;
+import com.mes.task.model.TaskExecutionContext;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
 import java.time.LocalDateTime;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -53,68 +57,232 @@
                                                     String operation,
                                                     Map<String, Object> params,
                                                     Map<String, Object> logicParams) {
-        WorkstationLogicConfig config = parseWorkstationConfig(logicParams);
         EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
         if (serializer == null) {
-            return buildResult(deviceConfig, operation, false, "鑾峰彇PLC搴忓垪鍖栧櫒澶辫触");
+            return buildResult(deviceConfig, operation, false, "鑾峰彇PLC搴忓垪鍖栧櫒澶辫触", null);
         }
 
+        if ("clearPlc".equalsIgnoreCase(operation) || "reset".equalsIgnoreCase(operation)) {
+            return clearPlc(deviceConfig, serializer);
+        }
+
+        WorkstationLogicConfig config = parseWorkstationConfig(logicParams);
+        return executeScan(deviceConfig, config, serializer, params);
+    }
+
+    private DevicePlcVO.OperationResult executeScan(DeviceConfig deviceConfig,
+                                                    WorkstationLogicConfig config,
+                                                    EnhancedS7Serializer serializer,
+                                                    Map<String, Object> params) {
         try {
-            log.debug("鍗ц浆绔嬫壂鐮佽鍙朚ES鍐欏尯: deviceId={}, scanInterval={}ms",
-                    deviceConfig.getId(), config.getScanIntervalMs());
-            Map<String, Object> mesData = plcDynamicDataService.readPlcData(deviceConfig, MES_FIELDS, serializer);
-            if (mesData == null || mesData.isEmpty()) {
-                return buildResult(deviceConfig, operation, false, "璇诲彇MES鍐欏尯澶辫触");
+            // 浠庡弬鏁颁腑鑾峰彇鐜荤拑ID锛堝畾鏃跺櫒姣忔鍙鐞嗕竴涓級
+            String inputGlassId = null;
+            if (params != null) {
+                Object glassIdObj = params.get("glassId");
+                if (glassIdObj != null) {
+                    inputGlassId = String.valueOf(glassIdObj).trim();
+                }
             }
-
-            Integer mesSend = parseInteger(mesData.get("mesSend"));
-            if (mesSend == null || mesSend == 0) {
-                return buildResult(deviceConfig, operation, true, "鏆傛棤寰呭鐞嗙殑鐜荤拑淇℃伅");
-            }
-
-            String glassId = parseString(mesData.get("mesGlassId"));
-            if (!StringUtils.hasText(glassId)) {
-                return buildResult(deviceConfig, operation, false, "MES鍐欏尯鏈彁渚涚幓鐠僆D");
-            }
-
-            Integer longSide = convertDimension(parseInteger(mesData.get("mesWidth")));
-            Integer shortSide = convertDimension(parseInteger(mesData.get("mesHeight")));
-            Integer workLine = parseInteger(mesData.get("workLine"));
-
-            GlassInfo glassInfo = buildGlassInfo(glassId, longSide, shortSide, workLine);
-            boolean saved = glassInfoService.saveOrUpdateGlassInfo(glassInfo);
-            if (!saved) {
-                return buildResult(deviceConfig, operation, false, "淇濆瓨鐜荤拑淇℃伅澶辫触: " + glassId);
-            }
-
-            // 璇诲彇鍒癕ES鏁版嵁鍚庯紝閲嶇疆mesSend锛岄伩鍏嶉噸澶嶆秷璐�
-            plcDynamicDataService.writePlcField(deviceConfig, "mesSend", 0, serializer);
-
-            String msg = String.format("鐜荤拑[%s] 灏哄[%s x %s] 宸叉帴鏀跺苟鍏ュ簱锛寃orkLine=%s",
-                    glassId,
-                    longSide != null ? longSide + "mm" : "-",
-                    shortSide != null ? shortSide + "mm" : "-",
-                    workLine != null ? workLine : "-");
-            return buildResult(deviceConfig, operation, true, msg);
+            
+            // 鎵ц鍗曟鎵弿锛堝畾鏃跺櫒浼氬惊鐜皟鐢ㄦ鏂规硶锛�
+            return executeSingleScan(deviceConfig, config, serializer, inputGlassId, params);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            log.warn("鍗ц浆绔嬫壂鐮佺瓑寰匨ES鏁版嵁琚腑鏂�, deviceId={}", deviceConfig.getId(), e);
+            return buildResult(deviceConfig, "scanOnce", false, "绛夊緟MES鏁版嵁琚腑鏂�", null);
         } catch (Exception e) {
             log.error("鍗ц浆绔嬫壂鐮佸鐞嗗紓甯�, deviceId={}", deviceConfig.getId(), e);
-            return buildResult(deviceConfig, operation, false, "澶勭悊寮傚父: " + e.getMessage());
+            return buildResult(deviceConfig, "scanOnce", false, "澶勭悊寮傚父: " + e.getMessage(), null);
+        }
+    }
+    
+    /**
+     * 鎵ц鍗曟鎵弿
+     */
+    private DevicePlcVO.OperationResult executeSingleScan(DeviceConfig deviceConfig,
+                                                          WorkstationLogicConfig config,
+                                                          EnhancedS7Serializer serializer,
+                                                          String inputGlassId,
+                                                          Map<String, Object> params) throws InterruptedException {
+        // 1. 鍐欏叆plcRequest=1鍜宲lcGlassId锛堝鏋滄彁渚涗簡鐜荤拑ID锛�
+        triggerScanRequest(deviceConfig, serializer, inputGlassId);
+        
+        // 2. 绛夊緟MES鍥炲啓mesSend=1浠ュ強鐜荤拑淇℃伅
+        Map<String, Object> mesData = waitForMesData(deviceConfig, serializer, config);
+        if (mesData == null || mesData.isEmpty()) {
+            log.error("绛夊緟MES鍐欏叆鐜荤拑淇℃伅瓒呮椂: deviceId={}, timeout={}ms", 
+                    deviceConfig.getId(), config.getScanIntervalMs());
+            return buildResult(deviceConfig, "scanOnce", false,
+                    String.format("绛夊緟MES鍐欏叆鐜荤拑淇℃伅瓒呮椂(%dms)", config.getScanIntervalMs()), null);
+        }
+
+        // 3. 璇诲彇MES鍥炲啓鐨勭幓鐠冧俊鎭�
+        String glassId = parseString(mesData.get("mesGlassId"));
+        if (!StringUtils.hasText(glassId)) {
+            return buildResult(deviceConfig, "scanOnce", false, "MES鍐欏尯鏈彁渚涚幓鐠僆D", null);
+        }
+        // 璇诲彇MES灏哄鏁版嵁锛歮esWidth=琛ㄥ锛宮esHeight=闀�
+        Integer rawWidth = parseInteger(mesData.get("mesWidth"));
+        Integer rawHeight = parseInteger(mesData.get("mesHeight"));
+        Integer workLine = parseInteger(mesData.get("workLine"));
+
+        // 4. 娓呯┖plcRequest鍜宲lcGlassId锛堝彧娓呴櫎PLC瀛楁锛�
+        clearPlcRequestFields(deviceConfig, serializer);
+
+
+            // 5. 淇濆瓨鐜荤拑淇℃伅鍒版暟鎹簱
+            GlassInfo glassInfo = buildGlassInfo(glassId, rawWidth, rawHeight, workLine);
+            boolean saved = glassInfoService.saveOrUpdateGlassInfo(glassInfo);
+            if (!saved) {
+                return buildResult(deviceConfig, "scanOnce", false, "淇濆瓨鐜荤拑淇℃伅澶辫触: " + glassId, null);
+            }
+            
+            // 6. 灏嗘壂鎻忓埌鐨勭幓鐠僆D淇濆瓨鍒板叡浜暟鎹腑锛堜緵澶ц溅璁惧瀹氭椂鍣ㄨ鍙栵級
+            saveScannedGlassId(params, glassId);
+
+            String msg = String.format("鐜荤拑[%s] 灏哄[琛ㄥ:%s x 闀�:%s] 宸叉帴鏀跺苟鍏ュ簱锛寃orkLine=%s",
+                    glassId,
+                    rawWidth != null ? rawWidth + "mm" : "-",
+                    rawHeight != null ? rawHeight + "mm" : "-",
+                    workLine != null ? workLine : "-");
+            Map<String, Object> resultData = new HashMap<>();
+            resultData.put("glassIds", Collections.singletonList(glassId));
+            if (workLine != null) {
+                resultData.put("workLine", workLine);
+            }
+            return buildResult(deviceConfig, "scanOnce", true, msg, resultData);
+    }
+    
+    /**
+     * 璁剧疆鏆傚仠鏍囧織锛堜緵澶ц溅璁惧璋冪敤锛�
+     */
+    public static void setPauseFlag(TaskExecutionContext context, boolean pause) {
+        if (context != null) {
+            context.getSharedData().put("scannerPause", pause);
+        }
+    }
+    
+    /**
+     * 淇濆瓨鎵弿鍒扮殑鐜荤拑ID鍒板叡浜暟鎹腑
+     */
+    @SuppressWarnings("unchecked")
+    private void saveScannedGlassId(Map<String, Object> params, String glassId) {
+        if (params == null || !StringUtils.hasText(glassId)) {
+            return;
+        }
+        
+        Object contextObj = params.get("_taskContext");
+        if (contextObj instanceof TaskExecutionContext) {
+            TaskExecutionContext context = (TaskExecutionContext) contextObj;
+            List<String> scannedGlassIds = (List<String>) context.getSharedData()
+                    .computeIfAbsent("scannedGlassIds", k -> new java.util.ArrayList<>());
+            if (!scannedGlassIds.contains(glassId)) {
+                scannedGlassIds.add(glassId);
+                log.debug("宸蹭繚瀛樻壂鎻忓埌鐨勭幓鐠僆D鍒板叡浜暟鎹�: glassId={}", glassId);
+            }
         }
     }
 
-    private GlassInfo buildGlassInfo(String glassId, Integer longSide, Integer shortSide, Integer workLine) {
+    private DevicePlcVO.OperationResult clearPlc(DeviceConfig deviceConfig,
+                                                 EnhancedS7Serializer serializer) {
+        try {
+            // 鍙竻绌篜LC鎿嶄綔鍖哄瓧娈碉紙plcRequest銆乸lcGlassId锛夛紝涓嶆竻绌篗ES鍐欏尯瀛楁
+            Map<String, Object> resetFields = new HashMap<>();
+            resetFields.put("plcRequest", 0);
+            resetFields.put("plcGlassId", "");
+            plcDynamicDataService.writePlcData(deviceConfig, resetFields, serializer);
+            return buildResult(deviceConfig, "clearPlc", true, "宸叉竻绌篜LC鎿嶄綔鍖哄瓧娈碉紙淇濈暀MES鍐欏尯瀛楁锛�", null);
+        } catch (Exception e) {
+            log.error("鍗ц浆绔嬫壂鐮佹竻绌篜LC澶辫触, deviceId={}", deviceConfig.getId(), e);
+            return buildResult(deviceConfig, "clearPlc", false, "娓呯┖PLC澶辫触: " + e.getMessage(), null);
+        }
+    }
+
+    /**
+     * 瑙﹀彂MES璇锋眰锛氬啓鍏lcRequest=1鍜宲lcGlassId锛堝鏋滄彁渚涗簡鐜荤拑ID锛�
+     */
+    private void triggerScanRequest(DeviceConfig deviceConfig, EnhancedS7Serializer serializer, String glassId) {
+        Map<String, Object> writeFields = new HashMap<>();
+        writeFields.put("plcRequest", 1);
+        
+        if (StringUtils.hasText(glassId)) {
+            writeFields.put("plcGlassId", glassId);
+        }
+        
+        plcDynamicDataService.writePlcData(deviceConfig, writeFields, serializer);
+    }
+    
+    /**
+     * 娓呯┖PLC璇锋眰瀛楁锛氬彧娓呴櫎plcRequest鍜宲lcGlassId锛堜笉娓呴櫎MES鍐欏尯瀛楁锛�
+     */
+    private void clearPlcRequestFields(DeviceConfig deviceConfig, EnhancedS7Serializer serializer) {
+        try {
+            Map<String, Object> clearFields = new HashMap<>();
+            clearFields.put("plcRequest", 0);
+            clearFields.put("plcGlassId", "");
+            plcDynamicDataService.writePlcData(deviceConfig, clearFields, serializer);
+        } catch (Exception e) {
+            log.error("娓呯┖PLC璇锋眰瀛楁澶辫触: deviceId={}", deviceConfig.getId(), e);
+            // 涓嶆竻绌轰笉褰卞搷涓绘祦绋嬶紝鍙褰曢敊璇�
+        }
+    }
+
+    private Map<String, Object> waitForMesData(DeviceConfig deviceConfig,
+                                               EnhancedS7Serializer serializer,
+                                               WorkstationLogicConfig config) throws InterruptedException {
+        long timeoutMs = Math.max(config.getScanIntervalMs(), 3_000);
+        long deadline = System.currentTimeMillis() + timeoutMs;
+        int pollInterval = Math.max(200, Math.min(config.getScanIntervalMs() / 5, 1_000));
+        
+        while (System.currentTimeMillis() < deadline) {
+            Map<String, Object> mesData = plcDynamicDataService.readPlcData(deviceConfig, MES_FIELDS, serializer);
+            
+            if (mesData != null && !mesData.isEmpty()) {
+                Integer mesSend = parseInteger(mesData.get("mesSend"));
+                if (mesSend != null && mesSend == 1) {
+                    log.info("妫�娴嬪埌MES宸插啓鍏ユ暟鎹�: deviceId={}, mesSend=1, mesGlassId={}, mesWidth={}, mesHeight={}, workLine={}", 
+                            deviceConfig.getId(), 
+                            mesData.get("mesGlassId"),
+                            mesData.get("mesWidth"),
+                            mesData.get("mesHeight"),
+                            mesData.get("workLine"));
+                    return mesData;
+                }
+            }
+            
+            Thread.sleep(pollInterval);
+        }
+        
+        // 瓒呮椂鍓嶆渶鍚庝竴娆″皾璇曡鍙�
+        log.warn("绛夊緟MES鏁版嵁瓒呮椂: deviceId={}, timeout={}ms", deviceConfig.getId(), timeoutMs);
+        Map<String, Object> lastMesData = plcDynamicDataService.readPlcData(deviceConfig, MES_FIELDS, serializer);
+        if (lastMesData != null && !lastMesData.isEmpty()) {
+            log.warn("瓒呮椂鍓嶆渶鍚庝竴娆¤鍙栧埌鐨勬暟鎹�: deviceId={}, mesData={}", 
+                    deviceConfig.getId(), lastMesData);
+        }
+        
+        return Collections.emptyMap();
+    }
+
+    private GlassInfo buildGlassInfo(String glassId, Integer width, Integer height, Integer workLine) {
         GlassInfo glassInfo = new GlassInfo();
         glassInfo.setGlassId(glassId.trim());
-        if (longSide != null) {
-            glassInfo.setGlassLength(longSide);
+        // mesWidth=琛ㄥ -> glassWidth, mesHeight=闀� -> glassLength
+        if (width != null) {
+            glassInfo.setGlassWidth(width);  // 琛ㄥ
         }
-        if (shortSide != null) {
-            glassInfo.setGlassWidth(shortSide);
+        if (height != null) {
+            glassInfo.setGlassLength(height); // 闀�
         }
-        glassInfo.setStatus(GlassInfo.Status.ACTIVE);
+        glassInfo.setStatus(GlassInfo.Status.PENDING);
         if (workLine != null) {
             glassInfo.setDescription("workLine=" + workLine);
         }
+        Date now = new Date();
+        glassInfo.setCreatedTime(now);
+        glassInfo.setUpdatedTime(now);
+        glassInfo.setCreatedBy("system");
+        glassInfo.setUpdatedBy("system");
         return glassInfo;
     }
 
@@ -136,17 +304,11 @@
         return value == null ? null : String.valueOf(value).trim();
     }
 
-    private Integer convertDimension(Integer raw) {
-        if (raw == null) {
-            return null;
-        }
-        return raw / 10;
-    }
-
     private DevicePlcVO.OperationResult buildResult(DeviceConfig deviceConfig,
                                                     String operation,
                                                     boolean success,
-                                                    String message) {
+                                                    String message,
+                                                    Map<String, Object> data) {
         return DevicePlcVO.OperationResult.builder()
                 .deviceId(deviceConfig.getId())
                 .deviceName(deviceConfig.getDeviceName())
@@ -156,6 +318,7 @@
                 .success(success)
                 .message(message)
                 .timestamp(LocalDateTime.now())
+                .data(data)
                 .build();
     }
 }

--
Gitblit v1.8.0