From 4937f052ec2c91b3fdcbb669aef7991912cde98e Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期三, 31 十二月 2025 10:48:28 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java |  174 +++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 125 insertions(+), 49 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
index 9e7f54a..13ef79e 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -2,19 +2,19 @@
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.common.constant.RedisConstant;
 import com.zy.acs.common.domain.AgvAction;
 import com.zy.acs.common.domain.AgvActionItem;
 import com.zy.acs.common.domain.AgvProtocol;
 import com.zy.acs.common.domain.BaseResult;
-import com.zy.acs.common.domain.protocol.AGV_11_UP;
-import com.zy.acs.common.domain.protocol.AGV_70_UP;
-import com.zy.acs.common.domain.protocol.IMessageBody;
+import com.zy.acs.common.domain.protocol.*;
 import com.zy.acs.common.domain.protocol.action.*;
 import com.zy.acs.common.enums.AgvBackpackType;
 import com.zy.acs.common.enums.AgvCompleteType;
 import com.zy.acs.common.enums.AgvDirectionType;
 import com.zy.acs.common.enums.AgvSpeedType;
 import com.zy.acs.common.utils.GsonUtils;
+import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.common.utils.Utils;
 import com.zy.acs.framework.common.Cools;
 import com.zy.acs.framework.common.SnowflakeIdWorker;
@@ -49,6 +49,8 @@
 @Slf4j
 @Service("mainService")
 public class MainService {
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
 
     @Autowired
     private BusService busService;
@@ -98,6 +100,8 @@
     private ActionSorter actionSorter;
     @Autowired
     private StaReserveService staReserveService;
+    @Autowired
+    private ConveyorStationService conveyorStationService;
 
     @SuppressWarnings("all")
     @Transactional
@@ -177,29 +181,15 @@
                         throw new BusinessException("oriLoc锛�" + task.getOriLoc$() + " failed to update");
                     }
 
-                    // reserver station inbound, qty: 1
                     destSta = staService.getById(task.getDestSta());
                     if (null == staReserveService.reserveStaIn(destSta, task, 1)) {
                         throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to reserve");
                     }
-//                    if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) {
-//                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " is not in IDLE status");
-//                    }
-//                    destSta.setStaSts(StaStsType.READY_RELEASE.val());
-//                    destSta.setUpdateTime(now);
-//                    if (!staService.updateById(destSta)) {
-//                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to update");
-//                    }
                     break;
                 case STA_TO_LOC:
                     oriSta = staService.getById(task.getOriSta());
-                    if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) {
-                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " is not in STOCK status");
-                    }
-                    oriSta.setStaSts(StaStsType.READY_TAKE.val());
-                    oriSta.setUpdateTime(now);
-                    if (!staService.updateById(oriSta)) {
-                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to update");
+                    if (null == staReserveService.reserveStaOut(oriSta, task, 1)) {
+                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to reserve");
                     }
 
                     destLoc = locService.getById(task.getDestLoc());
@@ -214,23 +204,13 @@
                     break;
                 case STA_TO_STA:
                     oriSta = staService.getById(task.getOriSta());
-                    if (!oriSta.getStaSts().equals(StaStsType.STOCK.val())) {
-                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " is not in STOCK status");
-                    }
-                    oriSta.setStaSts(StaStsType.READY_TAKE.val());
-                    oriSta.setUpdateTime(now);
-                    if (!staService.updateById(oriSta)) {
-                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to update");
+                    if (null == staReserveService.reserveStaOut(oriSta, task, 1)) {
+                        throw new BusinessException("oriSta锛�" + task.getOriSta$() + " failed to reserve");
                     }
 
                     destSta = staService.getById(task.getDestSta());
-                    if (!destSta.getStaSts().equals(StaStsType.IDLE.val())) {
-                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " is not in IDLE status");
-                    }
-                    destSta.setStaSts(StaStsType.READY_RELEASE.val());
-                    destSta.setUpdateTime(now);
-                    if (!staService.updateById(destSta)) {
-                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to update");
+                    if (null == staReserveService.reserveStaIn(destSta, task, 1)) {
+                        throw new BusinessException("destSta锛�" + task.getDestSta$() + " failed to reserve");
                     }
                     break;
                 default:
@@ -266,19 +246,36 @@
             }
 
             List<Long> taskIds = taskList.stream().map(Task::getId).distinct().collect(Collectors.toList());
-            for (Task task : taskList) {
-                Agv agv = allocateService.execute(task);
-                if (null == agv) {
-//                    log.warn("Task[{}] has an issue锛� because it failed to check out agv which is idle...", task.getSeqNum());
-                    continue;
-                }
-                task.setAgvId(agv.getId());
-                task.setTaskSts(TaskStsType.WAITING.val());
-                task.setIoTime(now);
-                task.setUpdateTime(now);
-                if (!taskService.updateById(task)) {
-                    throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update");
-                }
+            for (Task t : taskList) {
+                String resultAgvNo = allocateService.execute(t
+                        // inbound
+                        , (task, agvNo) -> {
+
+                        }
+                        // normal
+                        , (task, agvNo) -> {
+                            if (Cools.isEmpty(agvNo)) {
+                                return;
+                            }
+                            task.setAgvId(agvService.getAgvId(agvNo));
+                            task.setTaskSts(TaskStsType.WAITING.val());
+                            task.setIoTime(now);
+                            task.setUpdateTime(now);
+                            if (!taskService.updateById(task)) {
+                                throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update");
+                            }
+                        });
+//                if (Cools.isEmpty(agvNo)) {
+////                    log.warn("Task[{}] has an issue锛� because it failed to check out agv which is idle...", task.getSeqNum());
+//                    continue;
+//                }
+//                task.setAgvId(agvService.getAgvId(agvNo));
+//                task.setTaskSts(TaskStsType.WAITING.val());
+//                task.setIoTime(now);
+//                task.setUpdateTime(now);
+//                if (!taskService.updateById(task)) {
+//                    throw new BusinessException("seqNum: " + task.getSeqNum() + " failed to update");
+//                }
             }
         } catch (Exception e) {
             log.error("mainService.infuseAgvForTask", e);
@@ -316,7 +313,7 @@
                     return o2.getPriority() - o1.getPriority();
                 }
             });
-            Integer backpack = agvService.getBackpack(agv);
+            Integer backpack = agvService.getBackpack(agvId);
             if (taskList.size() > backpack) {
                 taskList = taskList.subList(0, backpack);
             }
@@ -1483,6 +1480,86 @@
             }
         }
 
+        // 鍙栨斁璐ц姹傚寘
+        if (msgBody instanceof AGV_06_UP) {
+            AGV_06_UP agv_06_up = (AGV_06_UP) msgBody;
+            log.info("Agv [{}] 鍙栨斁璐ц姹傚寘 ===>> {}", protocol.getAgvNo(), JSON.toJSONString(agv_06_up));
+
+            boolean success = false;
+
+            try {
+                Code code = codeService.getCacheByData(agv_06_up.getQrCode());
+
+                // query current segment
+                Segment currSeg = segmentService.getCurrRunningSeg(agv.getId(), code.getId());
+                if (null == currSeg) {
+                    log.error("failed to find curr segment [{}]", agv.getUuid());
+                } else {
+
+                    // query current task
+                    Task currTask = taskService.getById(currSeg.getTaskId());
+                    if (currTask == null || !currTask.getTaskSts().equals(TaskStsType.PROGRESS.val())) {
+
+                        log.error("agv[{}] task invalid, task={}", protocol.getAgvNo(), currSeg.getTaskId());
+                    } else {
+
+                        Sta sta;
+                        TaskPosDto.PosType posType = TaskPosDto.PosType.of(currSeg.getPosType());
+                        assert null != posType;
+                        switch (posType) {
+                            case ORI_LOC:
+                            case DEST_LOC:
+                                success = true;
+                                break;
+                            case ORI_STA:
+                                // load from sta
+                                sta = staService.getById(currTask.getOriSta());
+                                // reserve to be waiting
+                                if (!staReserveService.waitingStaReserve(sta, currTask, 1, StaReserveType.OUT)) {
+                                    break;
+                                }
+                                // convey plc valid
+                                if (!conveyorStationService.allowAgvWork(sta, currTask, currSeg, StaReserveType.OUT)) {
+                                    // reserve rollback
+                                    staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT);
+                                    break;
+                                }
+                                success = true;
+                                break;
+                            case DEST_STA:
+                                // place to sta
+                                sta = staService.getById(currTask.getDestSta());
+                                // reserve to be waiting
+                                if (!staReserveService.waitingStaReserve(sta, currTask, 1, StaReserveType.IN)) {
+                                    break;
+                                }
+                                // convey plc valid
+                                if (!conveyorStationService.allowAgvWork(sta, currTask, currSeg, StaReserveType.IN)) {
+                                    // reserve rollback
+                                    staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN);
+                                    break;
+                                }
+                                success = true;
+                                break;
+                            default:
+                                log.error("agv[{}] has wrong posType [{}], segment [{}]", protocol.getAgvNo(), posType.toString(), currSeg.getId());
+                                break;
+                        }
+                    }
+                }
+
+            } catch (Exception e) {
+                log.error("agv[{}] failed to deal with action request, qrCode={}", agv.getUuid(), agv_06_up.getVal(), e);
+            }
+
+            AGV_06_DOWN agv_06_down = new AGV_06_DOWN();
+            agv_06_down.setSerialNo(agv_06_up.getSerialNo());
+            agv_06_down.setActionCode(agv_06_up.getActionCode());
+            agv_06_down.setResult(success ? 1 : 0);
+
+            redis.push(RedisConstant.AGV_PATH_DOWN_FLAG, AgvProtocol.build(protocol.getAgvNo()).setMessageBody(agv_06_down));
+        }
+
         // 鏂欎粨淇℃伅鍖�
         if (msgBody instanceof AGV_70_UP) {
             AGV_70_UP agv_70_up = (AGV_70_UP) msgBody;
@@ -1530,14 +1607,13 @@
             }
 
             if (taskComplete) {
-                locService.taskCallBack(task);
-
                 task.setTaskSts(TaskStsType.COMPLETE.val());
                 task.setEndTime(now);
                 task.setUpdateTime(now);
                 if (!taskService.updateById(task)) {
                     log.error("Task [{}] 鏇存柊澶辫触 锛侊紒锛�", task.getSeqNum());
                 } else {
+                    taskService.maintainLocAndSta(task);
                     log.info("Task [{}] 浣滀笟瀹屾瘯 ==========>> ", task.getSeqNum());
                 }
 

--
Gitblit v1.9.1