From 6c5963052282dfe4ae2f20d2e18012d1cff93c85 Mon Sep 17 00:00:00 2001
From: pjb <pjb123456>
Date: 星期一, 23 六月 2025 08:54:51 +0800
Subject: [PATCH] rgv调度优化

---
 src/main/java/com/zy/core/enums/RgvStatusType.java                  |    1 
 src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java |    7 -
 src/main/java/com/zy/asrs/controller/RgvController.java             |    4 
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java         |  157 ++++++++++++++++++++++++++++++++++++++-
 src/main/webapp/views/index.html                                    |   20 +++-
 src/main/java/com/zy/asrs/entity/WrkMast.java                       |    8 ++
 src/main/resources/mapper/WrkMastMapper.xml                         |    3 
 src/main/java/com/zy/core/MainProcess.java                          |   19 +++-
 src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java         |    9 +-
 9 files changed, 200 insertions(+), 28 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/RgvController.java b/src/main/java/com/zy/asrs/controller/RgvController.java
index 8e951c1..35fe0b3 100644
--- a/src/main/java/com/zy/asrs/controller/RgvController.java
+++ b/src/main/java/com/zy/asrs/controller/RgvController.java
@@ -430,7 +430,8 @@
 //    @ManagerAuth(memo = "浣滀笟淇℃伅")
     public R ringThroughTaskWrkMast(){
         List<RgvWrkMastParam> result = new ArrayList<>();
-        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts",9,10));
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts",9,10).orderBy("wrk_sts",false)
+                .orderBy("rgv_no",true));
         for (WrkMast wrkMast : wrkMasts){
             RgvWrkMastParam rgvWrkMastParam = new RgvWrkMastParam(wrkMast);
             if (Cools.isEmpty(rgvWrkMastParam.getRgvNo())){
@@ -466,6 +467,7 @@
                     RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                     if (rgvProtocol != null) {
                         rgvCircularShuttleParam.setPosition(rgvProtocol.getRgvPos());
+                        rgvCircularShuttleParam.setTaskNo(rgvProtocol.taskNo1);
                         if (rgvCircularShuttleParam.getStatus()==0){
                             rgvCircularShuttleParam.setStatus$(rgvProtocol.statusType.desc);
                         }
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java b/src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
index f5e29d4..bc1ca9e 100644
--- a/src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/RgvCircularShuttleParam.java
@@ -1,11 +1,6 @@
 package com.zy.asrs.domain.param;
 
-import com.baomidou.mybatisplus.annotations.TableField;
-import com.baomidou.mybatisplus.annotations.TableId;
-import com.baomidou.mybatisplus.enums.IdType;
 import com.zy.asrs.entity.BasCircularShuttle;
-import com.zy.asrs.entity.WrkMast;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -21,6 +16,8 @@
 
     private Integer rgvNo;
 
+    private short taskNo;
+
     /**
      * 0:姝e父锛�1锛氱鐢�
      */
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java b/src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java
index b454541..fe4a429 100644
--- a/src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java
+++ b/src/main/java/com/zy/asrs/domain/param/RgvWrkMastParam.java
@@ -1,11 +1,7 @@
 package com.zy.asrs.domain.param;
 
-import com.core.common.Cools;
 import com.zy.asrs.entity.WrkMast;
-import com.zy.asrs.utils.TimeCalculatorUtils;
 import lombok.Data;
-
-import java.util.Date;
 
 /**
  * Created by vincent on 2020-06-02
@@ -21,6 +17,8 @@
     private Long wrkSts;
     private String wrkSts$;
     // 宸ヤ綅1鐩爣绔�
+    private Integer rgvDstaNo;
+    // 鏈�缁堢洰鏍囩珯
     private Integer staNo;
     // 宸ヤ綅1婧愮珯
     private Integer sourceStaNo;
@@ -36,7 +34,8 @@
     public RgvWrkMastParam(WrkMast wrkMast){
         this.wrkNo = wrkMast.getWrkNo();
         this.rgvNo = wrkMast.getRgvNo();
-        this.sourceStaNo = wrkMast.getSourceStaNo();
+        this.sourceStaNo = wrkMast.getRgvSstaNo();
+        this.rgvDstaNo = wrkMast.getRgvDstaNo();
         this.staNo = wrkMast.getStaNo();
         this.wrkSts = wrkMast.getWrkSts();
         this.wrkSts$ = wrkMast.getWrkSts$();
diff --git a/src/main/java/com/zy/asrs/entity/WrkMast.java b/src/main/java/com/zy/asrs/entity/WrkMast.java
index 64f7e78..6c4efa8 100644
--- a/src/main/java/com/zy/asrs/entity/WrkMast.java
+++ b/src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -134,6 +134,14 @@
     @TableField("rgv_dsta_no")
     private Integer rgvDstaNo;
 
+    @ApiModelProperty(value= "rgv鍛戒护涓嬪彂鏃堕棿")
+    @TableField("rgv_create_time")
+    private Date rgvCreateTime;
+
+    @ApiModelProperty(value= "rgv浠诲姟瀹屾垚鏃堕棿")
+    @TableField("rgv_finish_time")
+    private Date rgvFinishTime;
+
     @ApiModelProperty(value= "")
     @TableField("loc_sts")
     private String locSts;
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index 86f45c2..8bcef14 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -32,9 +32,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * 绔嬩綋浠撳簱WCS绯荤粺涓绘祦绋嬩笟鍔�
@@ -358,6 +356,117 @@
         }
     }
 
+    public synchronized void rgvTheHandlingTaskIsIssued() {
+        try {
+            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("rgv_no", 0).eq("wrk_sts", 9)
+                    .orderBy("io_pri", false)
+                    .orderBy("modi_time", true));
+            if (wrkMasts.isEmpty()) {
+                return;
+            }
+
+            LinkedList<RgvProtocol> rgvProtocolList = new LinkedList<>();
+            for (int i = 1; i <= 5; i++) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, i);
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    continue;
+                }
+                rgvProtocolList.add(rgvProtocol);
+            }
+
+            runRgv:
+            for (WrkMast wrkMast : wrkMasts) {
+                BasDevpPosition basDevpPositions = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast.getRgvSstaNo())); // 绔欑偣
+                long position = basDevpPositions.getPlcPosition(); // 璧峰绔欎綅缃�
+                TreeMap<Long, RgvProtocol> map = new TreeMap<>();
+                for (RgvProtocol rgvProtocol : rgvProtocolList) {
+                    long distance;
+                    if (rgvProtocol.getRgvPos() <= position) {
+                        distance = position - rgvProtocol.getRgvPos();
+                    } else {
+                        distance = position + (perimeter - rgvProtocol.getRgvPos());
+                    }
+                    map.put(distance, rgvProtocol);
+                }
+                log.info("鍙栬揣绔欑偣锛歿}锛屽悗闈㈠皬杞︽帓搴�", basDevpPositions.getDevNo());
+                StringBuilder sb = new StringBuilder();
+                for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) {
+                    RgvProtocol rgvProtocol = rgvProtocolMap.getValue();
+                    sb.append("[").append(rgvProtocol.getRgvNo()).append(",").append(rgvProtocol.getStatusType().desc).append("]");
+                }
+                log.info(sb.toString());
+
+                for (Map.Entry<Long, RgvProtocol> rgvProtocolMap : map.entrySet()) {
+                    RgvProtocol rgvProtocol = rgvProtocolMap.getValue(); // 鏈�杩戣窛绂诲皬杞�
+//                    log.info("鍙栬揣绔欑偣锛歿}锛屽悗闈㈡渶杩戝皬杞︼細{},鐘舵��:{}", basDevpPositions.getDevNo(), rgvProtocol.getRgvNo(), rgvProtocol.getStatusType().desc);
+                    int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("rgv_no", rgvProtocol.getRgvNo()).eq("wrk_sts", 10));
+                    if(wrkMast.getIoType() == 10 || wrkMast.getIoType() == 110 || wrkMast.getSourceStaNo() == 1034) {
+                        if (count != 0) {
+                            continue;
+                        }
+                        if (rgvProtocol.modeType == RgvModeType.AUTO
+                                && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM)
+                                && rgvProtocol.getTaskNo1() == 0
+                                && rgvProtocol.getAlarm() == 0) {
+                            RgvCommand rgvCommand = new RgvCommand();
+                            rgvCommand.setRgvNo(rgvProtocol.getRgvNo());
+                            rgvCommand.setAckFinish1((short) 0);  // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+                            rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());
+                            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 宸ヤ綅1浠诲姟妯″紡:  鍙栨斁璐�
+                            rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue());   //宸ヤ綅1璧风偣
+                            rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue());   //宸ヤ綅1鐩爣绔欑偣
+                            rgvCommand.setCommand((short) 1);   //宸ヤ綅1浠诲姟纭
+                            if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
+                                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
+                                break runRgv;
+                            }
+                            log.info("RGV鍛戒护涓嬪彂鎴愬姛锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
+                            Date now = new Date();
+                            wrkMast.setRgvNo(rgvProtocol.getRgvNo());
+                            wrkMast.setWrkSts(10L);
+                            wrkMast.setRgvCreateTime(now);
+                            wrkMastService.updateById(wrkMast);
+                            break runRgv;
+                        }
+                    } else {
+                        if (count != 0) {
+                            break;
+                        }
+                        if (rgvProtocol.modeType == RgvModeType.AUTO
+                                && (rgvProtocol.getStatusType() == RgvStatusType.IDLE || rgvProtocol.getStatusType() == RgvStatusType.ROAM)
+                                && rgvProtocol.getTaskNo1() == 0
+                                && rgvProtocol.getAlarm() == 0) {
+                            RgvCommand rgvCommand = new RgvCommand();
+                            rgvCommand.setRgvNo(rgvProtocol.getRgvNo());
+                            rgvCommand.setAckFinish1((short) 0);  // 宸ヤ綅1浠诲姟瀹屾垚纭浣�
+                            rgvCommand.setTaskNo1(wrkMast.getWrkNo().shortValue());
+                            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 宸ヤ綅1浠诲姟妯″紡:  鍙栨斁璐�
+                            rgvCommand.setSourceStaNo1(wrkMast.getRgvSstaNo().shortValue());   //宸ヤ綅1璧风偣
+                            rgvCommand.setDestinationStaNo1(wrkMast.getRgvDstaNo().shortValue());   //宸ヤ綅1鐩爣绔欑偣
+                            rgvCommand.setCommand((short) 1);   //宸ヤ綅1浠诲姟纭
+                            if (!MessageQueue.offer(SlaveType.Rgv, rgvProtocol.getRgvNo(), new Task(2, rgvCommand))) {
+                                log.error("RGV鍛戒护涓嬪彂澶辫触锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
+                                break runRgv;
+                            }
+                            log.info("RGV鍛戒护涓嬪彂鎴愬姛锛孯GV鍙�={}锛屼换鍔℃暟鎹�={}", rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
+                            Date now = new Date();
+                            wrkMast.setRgvNo(rgvProtocol.getRgvNo());
+                            wrkMast.setWrkSts(10L);
+                            wrkMast.setRgvCreateTime(now);
+                            wrkMastService.updateById(wrkMast);
+                            break runRgv;
+                        } else {
+                            break ; // 鍙湅鏈�杩戠殑绗竴涓皬杞�
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("鑷姩涓嬪彂灏忚溅鍙栨斁浠诲姟澶辫触锛屽紓甯革細" + e);
+        }
+    }
+
     //浠诲姟瀹屾垚
     public synchronized void rgvCompleteWrkMastSta(int[] autoZ) {
         try {
@@ -394,7 +503,47 @@
                     }
                     wrkMast.setWrkSts(2L);
                     Date now = new Date();
-                    wrkMast.setModiTime(now);
+                    wrkMast.setRgvFinishTime(now);
+                    wrkMastService.updateById(wrkMast);
+                }
+            }
+        } catch (Exception e) {
+            log.error("灏忚溅澶嶄綅绾跨▼鎶ラ敊锛�" + e);
+        }
+    }
+
+    // 灏忚溅鍙栬揣瓒婁綅,浠诲姟鍙栨秷
+    public synchronized void rgvTaskCancel() {
+        try {
+            for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
+                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    continue;
+                }
+
+                // 鍙湁褰揜GV绛夊緟WCS纭銆佽嚜鍔�
+                if (rgvProtocol.getStatusType() == RgvStatusType.PICK_UP_OFFSIDE
+                        && rgvProtocol.getModeType() == RgvModeType.AUTO
+                        && rgvProtocol.getTaskNo1() != 0
+                ) {
+                    log.info("{}鍙峰皬杞﹀皬杞﹀彇璐ц秺浣嶏紝鐘舵�亄}锛屽弬鏁皗}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
+                    WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", rgvProtocol.getTaskNo1().longValue()));
+                    if (Cools.isEmpty(wrkMast)) {
+                        log.error("鏈煡鍒板皬杞︽墽琛屼换鍔★紒" + rgvProtocol.getTaskNo1());
+                        continue;
+                    } else if(wrkMast.getWrkSts() != 10) {
+                        log.error("鎵ц浠诲姟鐘舵�佷笉绗﹀悎锛�" + rgvProtocol.getTaskNo1());
+                        continue;
+                    }
+                    boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
+                    if (!rgvComplete) {
+                        log.error("灏忚溅鍙栬揣瓒婁綅,浠诲姟鍙栨秷,澶嶄綅澶辫触锛屽皬杞﹀彿{}锛�", rgvProtocol.getRgvNo());
+                        break;
+                    }
+                    wrkMast.setWrkSts(9L);
+                    wrkMast.setRgvNo(0);
+                    wrkMast.setRgvCreateTime(new Date());
                     wrkMastService.updateById(wrkMast);
                 }
             }
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index b7e5d18..ff6b6ee 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -48,7 +48,7 @@
             while (!Thread.currentThread().isInterrupted()) {
                 try {
                     // 闂撮殧
-                    Thread.sleep(200);
+                    Thread.sleep(500);
 
                     // 绯荤粺杩愯鐘舵�佸垽鏂�
 //                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
@@ -56,15 +56,22 @@
 //                    }
 
                     //鏇存柊灏忚溅鎺掑簭
-                    mainService.updateStePositionNearby();
-                    //鏇存柊浣嶇疆淇℃伅
-                    mainService.updateStePosition();
+//                    mainService.updateStePositionNearby();
+//                    //鏇存柊浣嶇疆淇℃伅
+//                    mainService.updateStePosition();
+//                    // 浠诲姟涓嬪彂
+//                    mainService.DevpTaskNoRun();
+
+                    // 灏忚溅鍙栬揣瓒婁綅,浠诲姟鍙栨秷
+                    mainService.rgvTaskCancel();
+
                     // 浠诲姟涓嬪彂
-                    mainService.DevpTaskNoRun();
+                    mainService.rgvTheHandlingTaskIsIssued();
+
                     // 浠诲姟瀹屾垚
                     mainService.rgvCompleteWrkMastSta(autoZ);
                     //鏇存柊浣嶇疆淇℃伅
-                    mainService.updateStePosition();
+//                    mainService.updateStePosition();
 
                 } catch (Exception e) {
                     e.printStackTrace();
diff --git a/src/main/java/com/zy/core/enums/RgvStatusType.java b/src/main/java/com/zy/core/enums/RgvStatusType.java
index be1b7ba..6c93c3a 100644
--- a/src/main/java/com/zy/core/enums/RgvStatusType.java
+++ b/src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -12,6 +12,7 @@
     Outbound_request(6, "鍑虹珯璇锋眰","#2196F3"),
     Outbound_operation_in_progress(7, "鍑虹珯杩愯涓�","#2196F3"),
     Outbound_completed(8, "鍑虹珯瀹屾垚","#2196F3"),
+    PICK_UP_OFFSIDE(9, "灏忚溅鍙栬揣瓒婁綅","#2196F3"),
     ROAM(11, "婕父","#2196F3"),
     WAITING(100, "浠诲姟鎵ц瀹屾垚绛夊緟纭","#2196F3"),
     SOS110(110, "鎶ヨ","#2196F3"),
diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml
index a805e5e..0410542 100644
--- a/src/main/resources/mapper/WrkMastMapper.xml
+++ b/src/main/resources/mapper/WrkMastMapper.xml
@@ -63,7 +63,8 @@
         <result column="ctn_no" property="ctnNo" />
         <result column="full_plt" property="fullPlt" />
         <result column="work_no_other" property="workNoOther" />
-
+        <result column="rgv_create_time" property="rgvCreateTime" />
+        <result column="rgv_finish_time" property="rgvFinishTime" />
     </resultMap>
 
     <select id="selectByLocNo"  resultMap="BaseResultMap">
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 9a152eb..647f504 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -273,7 +273,11 @@
                     </el-table-column>
                     <el-table-column
                             prop="sourceStaNo"
-                            label="婧愮珯">
+                            label="RGV婧愮珯">
+                    </el-table-column>
+                    <el-table-column
+                            prop="rgvDstaNo"
+                            label="RGV鐩爣绔�">
                     </el-table-column>
                     <el-table-column
                             prop="staNo"
@@ -325,16 +329,20 @@
                         :data="tableDataRight"
                         style="width: 100%"
                         :row-class-name="tableRowClassName">
-                    <el-table-column
-                            prop="rgvId"
-                            label="缂栧彿"
-                            width="80">
-                    </el-table-column>
+<!--                    <el-table-column-->
+<!--                            prop="rgvId"-->
+<!--                            label="缂栧彿"-->
+<!--                            width="80">-->
+<!--                    </el-table-column>-->
                     <el-table-column
                             prop="rgvNo"
                             label="灏忚溅鍙�">
                     </el-table-column>
                     <el-table-column
+                            prop="taskNo"
+                            label="浠诲姟鍙�">
+                    </el-table-column>
+                    <el-table-column
                             prop="position"
                             label="浣嶇疆">
                     </el-table-column>

--
Gitblit v1.9.1