From b69671d75ba283f8d47c31ae989b5dd346b62967 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期四, 24 四月 2025 15:17:54 +0800
Subject: [PATCH] #出库任务预调度提升机

---
 src/main/resources/docs/台升四向库WCS与货叉提升机PLC通讯接口协议1.1.docx             |    0 
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java         |   86 +++++++++++++++++
 src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java           |    1 
 src/main/java/com/zy/core/action/ForkLiftAction.java                |    2 
 src/main/java/com/zy/asrs/controller/ForkLiftController.java        |   31 +++++-
 src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java |   39 +++++++
 src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java      |    5 +
 src/main/resources/sql/20250424151727.nb3                           |    0 
 /dev/null                                                           |   48 ---------
 src/main/java/com/zy/asrs/controller/ShuttleController.java         |    2 
 src/main/java/com/zy/core/enums/WrkIoType.java                      |    2 
 src/main/resources/sql/出库任务预调度提升机sql                                |    1 
 src/main/java/com/zy/core/MainProcess.java                          |    3 
 src/main/java/com/zy/core/thread/ForkLiftThread.java                |    4 
 src/main/java/com/zy/common/service/CommonService.java              |   17 +++
 src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java         |   37 +++++++
 src/main/webapp/views/forklift.html                                 |    3 
 17 files changed, 223 insertions(+), 58 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/ForkLiftController.java b/src/main/java/com/zy/asrs/controller/ForkLiftController.java
index 844e50a..747abf8 100644
--- a/src/main/java/com/zy/asrs/controller/ForkLiftController.java
+++ b/src/main/java/com/zy/asrs/controller/ForkLiftController.java
@@ -16,10 +16,7 @@
 import com.zy.core.action.ForkLiftAction;
 import com.zy.core.cache.OutputQueue;
 import com.zy.core.cache.SlaveConnection;
-import com.zy.core.enums.ForkLiftProtocolStatusType;
-import com.zy.core.enums.ForkLiftTaskModeType;
-import com.zy.core.enums.RedisKeyType;
-import com.zy.core.enums.SlaveType;
+import com.zy.core.enums.*;
 import com.zy.core.model.ForkLiftSlave;
 import com.zy.core.model.command.*;
 import com.zy.core.model.protocol.ForkLiftProtocol;
@@ -274,7 +271,7 @@
 
         if (param.getLiftTaskMode() == 1) {
             //灏忚溅鎹㈠眰
-            int workNo = commonService.getWorkNo(99);//鑾峰彇浠诲姟鍙�
+            int workNo = commonService.getWorkNo(WrkIoType.MANUAL.id);//鑾峰彇浠诲姟鍙�
 
             Integer startSta = param.getSourceStaNo();
             Integer targetSta = param.getStaNo();
@@ -296,7 +293,7 @@
             return R.ok();
         } else if (param.getLiftTaskMode() == 2) {
             //绉诲姩鎵樼洏
-            int workNo = commonService.getWorkNo(99);//鑾峰彇浠诲姟鍙�
+            int workNo = commonService.getWorkNo(WrkIoType.MANUAL.id);//鑾峰彇浠诲姟鍙�
 
             Integer startSta = param.getSourceStaNo();
             Integer targetSta = param.getStaNo();
@@ -317,6 +314,28 @@
             forkLiftAction.assignWork(forkLiftProtocol.getLiftNo(), assignCommand);
             return R.ok();
         } else if (param.getLiftTaskMode() == 3) {
+            //绉诲姩
+            int workNo = commonService.getWorkNo(WrkIoType.MANUAL.id);//鑾峰彇浠诲姟鍙�
+
+            Integer startSta = param.getSourceStaNo();
+            Integer targetSta = param.getStaNo();
+
+            //鑾峰彇鎻愬崌鏈哄懡浠�
+            List<ForkLiftCommand> liftCommand = forkLiftThread.getMoveCommand(workNo, startSta, targetSta);
+            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
+            commands.addAll(liftCommand);
+
+            //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
+            LiftAssignCommand assignCommand = new LiftAssignCommand();
+            assignCommand.setCommands(commands);
+            assignCommand.setLiftNo(forkLiftProtocol.getLiftNo().shortValue());
+            assignCommand.setTaskNo((short) workNo);
+            assignCommand.setAuto(false);//鎵嬪姩妯″紡
+            assignCommand.setTaskMode(ForkLiftTaskModeType.MOVE.id.shortValue());
+
+            forkLiftAction.assignWork(forkLiftProtocol.getLiftNo(), assignCommand);
+            return R.ok();
+        } else if (param.getLiftTaskMode() == 4) {
             //浠诲姟纭
             forkLiftThread.reset();
             return R.ok();
diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java
index 2c0f5bc..983162a 100644
--- a/src/main/java/com/zy/asrs/controller/ShuttleController.java
+++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -298,7 +298,7 @@
         ShuttleTaskModeType shuttleTaskModeType = ShuttleTaskModeType.get(param.getShuttleTaskMode().intValue());
         assignCommand.setShuttleNo(param.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙�
         assignCommand.setTaskMode(shuttleTaskModeType.id);
-        assignCommand.setTaskNo(commonService.getWorkNo(99));//鑾峰彇浠诲姟鍙�
+        assignCommand.setTaskNo(commonService.getWorkNo(WrkIoType.MANUAL.id));//鑾峰彇浠诲姟鍙�
         assignCommand.setAuto(false);//鎵嬪姩妯″紡
 
         if (shuttleTaskModeType == ShuttleTaskModeType.MOVE_LOC_NO) {
diff --git a/src/main/java/com/zy/asrs/domain/enums/WorkNoType.java b/src/main/java/com/zy/asrs/domain/enums/WorkNoType.java
deleted file mode 100644
index 4aa3911..0000000
--- a/src/main/java/com/zy/asrs/domain/enums/WorkNoType.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.zy.asrs.domain.enums;
-
-import com.core.exception.CoolException;
-
-/**
- * 宸ヤ綔鍙锋帓搴忚鍒�
- */
-public enum WorkNoType {
-
-    PAKIN(0),
-    PICK(1),
-    PAKOUT(2),
-    OTHER(3),
-    ;
-
-    public Integer type;
-
-    WorkNoType(Integer type) {
-        this.type = type;
-    }
-
-    public static Integer getWorkNoType(Integer ioType) {
-        switch (ioType) {
-            case 1:
-                return PAKIN.type;
-            case 10:
-                return PAKIN.type;
-            case 11:
-                return PICK.type;
-            case 53:
-            case 54:
-            case 57:
-                return PICK.type;
-            case 101:
-                return PAKOUT.type;
-            case 103:
-            case 104:
-            case 107:
-                return PICK.type;
-            case 110:
-                return PAKOUT.type;
-            default:
-                break;
-        }
-        throw new CoolException(ioType + "鐨勪换鍔$被鍨嬫棤娉曠敓鎴愬伐浣滃彿");
-    }
-
-}
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 ec17584..655216b 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -919,6 +919,15 @@
                         } else {
                             News.error("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傛彁鍗囨満鍙�={}锛屽伐浣滃彿={}", forkLiftProtocol.getLiftNo(), forkLiftProtocol.getWrkNo());
                         }
+                    }else {
+                        boolean checkPreviewDispatchForkLift = commonService.checkWorkNoContainMk(forkLiftProtocol.getWrkNo(), WrkIoType.FORKLIFT_MOVE.id);
+                        if (checkPreviewDispatchForkLift) {
+                            //灞炰簬鎻愬崌鏈洪璋冨害绉诲姩浠诲姟
+                            //鏃犲伐浣滄。鏀拺锛岀洿鎺ョ‘璁ゅ畬鎴�
+                            forkLiftThread.setSyncTaskNo(0);
+                            forkLiftThread.reset();
+                            News.info("宸茬‘璁ゆ彁鍗囨満棰勮皟搴︾Щ鍔ㄤ换鍔°�傛彁鍗囨満鍙�={}", forkLiftProtocol.getLiftNo());
+                        }
                     }
                 }
             }
@@ -1860,4 +1869,81 @@
         }
     }
 
+    //鍑哄簱浠诲姟棰勮皟搴︽彁鍗囨満
+    public void outTaskPreviewDispatchForkLift() {
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
+                .in("wrk_sts"
+                        , WrkStsType.OUTBOUND_SHUTTLE_RUN.sts
+                ));
+        for (WrkMast wrkMast : wrkMasts) {
+            if(wrkMast.getShuttleNo() == null){
+                continue;
+            }
+
+            //鑾峰彇鍥涘悜绌挎杞︾嚎绋�
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo());
+            if (shuttleThread == null) {
+                continue;
+            }
+
+            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+            if (shuttleProtocol == null) {
+                continue;
+            }
+
+            if(shuttleProtocol.getCurrentLocNo() == null){
+                continue;
+            }
+
+            //閫氳繃杈撻�佺嚎绔欏彿鑾峰彇鎻愬崌鏈哄彿
+            Integer liftNo = ForkLiftUtils.getConveyorBindLiftNo(wrkMast.getStaNo());
+            if (liftNo == null) {
+                News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo());
+                continue;
+            }
+
+            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo);
+            if (forkLiftThread == null) {
+                continue;
+            }
+
+            ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus();
+            if (forkLiftProtocol == null) {
+                continue;
+            }
+
+            //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟
+            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo());
+            if (liftWrkMast != null) {
+                continue;//鎻愬崌鏈哄凡琚粦瀹氾紝涓嶅啀鎵ц棰勮皟搴︿换鍔�
+            }
+
+            if (!forkLiftThread.isIdle()) {
+                continue;
+            }
+
+            //鎻愬崌鏈轰笉鍦ㄥ嚭搴撳眰
+            if (forkLiftProtocol.getLev() != Utils.getLev(wrkMast.getSourceLocNo())) {
+                continue;
+            }
+
+            //绉诲姩
+            int workNo = commonService.getWorkNo(WrkIoType.FORKLIFT_MOVE.id);//鑾峰彇浠诲姟鍙�
+
+            //鑾峰彇鎻愬崌鏈哄懡浠�
+            List<ForkLiftCommand> liftCommand = forkLiftThread.getMoveCommand(workNo, forkLiftProtocol.getLev(), Utils.getLev(wrkMast.getSourceLocNo()));
+            ArrayList<ForkLiftCommand> commands = new ArrayList<>();
+            commands.addAll(liftCommand);
+
+            //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔
+            LiftAssignCommand assignCommand = new LiftAssignCommand();
+            assignCommand.setCommands(commands);
+            assignCommand.setLiftNo(forkLiftProtocol.getLiftNo().shortValue());
+            assignCommand.setTaskNo((short) workNo);
+            assignCommand.setTaskMode(ForkLiftTaskModeType.MOVE.id.shortValue());
+
+            forkLiftAction.assignWork(forkLiftProtocol.getLiftNo(), assignCommand);
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index c9df23c..fd32480 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -21,8 +21,6 @@
     @Autowired
     private WrkMastService wrkMastService;
     @Autowired
-    private WrkMastLogService wrkMastLogService;
-    @Autowired
     private WrkLastnoService wrkLastnoService;
     @Autowired
     private LocMastService locMastService;
@@ -65,6 +63,21 @@
         return workNo;
     }
 
+    //妫�娴嬪伐浣滃彿鏄惁鍦ㄦ寚瀹氱被鍨嬪伐浣滆寖鍥村唴
+    public synchronized boolean checkWorkNoContainMk(Integer workNo, Integer wrkMk) {
+        WrkLastno wrkLastno = wrkLastnoService.selectById(wrkMk);
+        if (Cools.isEmpty(wrkLastno)) {
+            throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�");
+        }
+
+        int sNo = wrkLastno.getSNo();
+        int eNo = wrkLastno.getENo();
+        if (workNo >= sNo && workNo <= eNo) {
+            return true;
+        }
+        return false;
+    }
+
     public static String zerofill(String msg, Integer count) {
         if (msg.length() == count) {
             return msg;
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index 1f0250b..c9e4c8b 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -66,6 +66,9 @@
                     //鑷姩鍒囨崲鍑哄叆搴撴ā寮�
                     mainService.autoSwitchForkLiftIOMode();
 
+                    //鍑哄簱浠诲姟棰勮皟搴︽彁鍗囨満
+                    mainService.outTaskPreviewDispatchForkLift();
+
                     // 闂撮殧
                     Thread.sleep(200);
                 } catch (Exception e) {
diff --git a/src/main/java/com/zy/core/action/ForkLiftAction.java b/src/main/java/com/zy/core/action/ForkLiftAction.java
index b6e7c0f..e7c6a4b 100644
--- a/src/main/java/com/zy/core/action/ForkLiftAction.java
+++ b/src/main/java/com/zy/core/action/ForkLiftAction.java
@@ -148,6 +148,8 @@
             response = forkLiftThread.pickAndPut(command);
         } else if (command.getMode().intValue() == ForkLiftTaskModeType.SHUTTLE_SWITCH.id) {
             response = forkLiftThread.shuttleSwitch(command);
+        } else if (command.getMode().intValue() == ForkLiftTaskModeType.MOVE.id) {
+            response = forkLiftThread.move(command);
         }
         return response;
     }
diff --git a/src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java b/src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java
index d49b56e..894c60d 100644
--- a/src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java
+++ b/src/main/java/com/zy/core/enums/ForkLiftTaskModeType.java
@@ -8,6 +8,7 @@
     PUT_DOWN(2, "鏀捐揣"),
     PICK_PUT(3, "鍙栨斁璐�"),
     SHUTTLE_SWITCH(4, "灏忚溅鎹㈠眰"),
+    MOVE(5, "鎻愬崌鏈虹Щ鍔�"),
     ;
 
     public Integer id;
diff --git a/src/main/java/com/zy/core/enums/WrkIoType.java b/src/main/java/com/zy/core/enums/WrkIoType.java
index e6fbccb..5926868 100644
--- a/src/main/java/com/zy/core/enums/WrkIoType.java
+++ b/src/main/java/com/zy/core/enums/WrkIoType.java
@@ -9,6 +9,8 @@
     SHUTTLE_MOVE(200, "灏忚溅绉诲姩"),
     LOC_MOVE(201, "绉诲簱浠诲姟"),
     SHUTTLE_CHARGE(300, "灏忚溅鍏呯數"),
+    FORKLIFT_MOVE(98, "鎻愬崌鏈洪璋冨害绉诲姩浠诲姟"),
+    MANUAL(99, "鎵嬪姩浠诲姟"),
     ;
 
     WrkIoType(int id, String desc) {
diff --git a/src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java b/src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java
index 6e29736..36a6e91 100644
--- a/src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/ForkLiftProtocol.java
@@ -85,6 +85,11 @@
     private Integer errorCode;
 
     /**
+     * 褰撳墠灞�
+     */
+    private Integer lev;
+
+    /**
      * 浣滀笟鏍囪
      */
     private Boolean pakMk = false;
diff --git a/src/main/java/com/zy/core/thread/ForkLiftThread.java b/src/main/java/com/zy/core/thread/ForkLiftThread.java
index 866de88..408ad8c 100644
--- a/src/main/java/com/zy/core/thread/ForkLiftThread.java
+++ b/src/main/java/com/zy/core/thread/ForkLiftThread.java
@@ -24,6 +24,8 @@
 
     CommandResponse shuttleSwitch(ForkLiftCommand command);//灏忚溅鎹㈠眰
 
+    CommandResponse move(ForkLiftCommand command);//灏忚溅鎹㈠眰
+
     CommandResponse reset();//澶嶄綅
 
     boolean isIdle();//鏄惁绌洪棽
@@ -46,4 +48,6 @@
 
     List<ForkLiftCommand> getShuttleSwitchCommand(Integer taskNo, Integer pick, Integer put);//灏忚溅鎹㈠眰
 
+    List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put);//鎻愬崌鏈虹Щ鍔�
+
 }
diff --git a/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java b/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java
index 3ee487a..7075597 100644
--- a/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java
+++ b/src/main/java/com/zy/core/thread/impl/LfdZyForkLiftSlaveThread.java
@@ -159,6 +159,8 @@
                 forkLiftProtocol.setIOMode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 12));
                 //鏁呴殰鐮�
                 forkLiftProtocol.setErrorCode((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 14));
+                //褰撳墠灞�
+                forkLiftProtocol.setLev((int) siemensS7Net.getByteTransform().TransInt16(result1.Content, 16));
 
                 //************琛ュ厖鎵╁睍瀛楁*************
                 InnerForkLiftExtend forkLiftExtend = (InnerForkLiftExtend) forkLiftProtocol.getExtend();
@@ -304,6 +306,25 @@
     }
 
     @Override
+    public CommandResponse move(ForkLiftCommand command) {
+        CommandResponse response = new CommandResponse(false);
+
+        short[] array = new short[4];
+        array[0] = command.getTaskNo();//浠诲姟鍙�
+        array[1] = command.getMode();//浠诲姟妯″紡
+        array[2] = command.getPick();//鍙栬揣鏁版嵁
+        array[3] = command.getPut();//鏀捐揣鏁版嵁
+        OperateResult result = this.masterThread.write(this.slave.getId(), "write", array);
+        if (result.IsSuccess) {
+            OperateResult result2 = this.masterThread.write(this.slave.getId(), "writeConfirm", command.getConfirm());
+            if (result2.IsSuccess) {
+                response.setResult(true);
+            }
+        }
+        return response;
+    }
+
+    @Override
     public CommandResponse reset() {
         CommandResponse response = new CommandResponse(false);
         OperateResult result = this.masterThread.write(this.slave.getId(), "confirm", (short) 1);
@@ -424,6 +445,24 @@
         return commands;
     }
 
+    @Override
+    public List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put) {
+        Integer realPick = pick % 1000;
+        Integer realPut = put % 1000;
+
+        List<ForkLiftCommand> commands = new ArrayList<>();
+        ForkLiftCommand command = new ForkLiftCommand();
+        command.setLiftNo(slave.getId());
+        command.setTaskNo(taskNo.shortValue());
+        command.setMode(ForkLiftTaskModeType.MOVE.id.shortValue());
+        command.setPick(realPick.shortValue());
+        command.setPut(realPut.shortValue());
+        command.setConfirm((short) 1);
+
+        commands.add(command);
+        return commands;
+    }
+
     /**
      * 鎵╁睍瀛楁
      */
diff --git a/src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java b/src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java
index fc0c40c..e795ce3 100644
--- a/src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java
+++ b/src/main/java/com/zy/core/thread/impl/ZyForkLiftThread.java
@@ -285,6 +285,25 @@
     }
 
     @Override
+    public CommandResponse move(ForkLiftCommand command) {
+        CommandResponse response = new CommandResponse(false);
+
+        short[] array = new short[4];
+        array[0] = command.getTaskNo();//浠诲姟鍙�
+        array[1] = command.getMode();//浠诲姟妯″紡
+        array[2] = command.getPick();//鍙栬揣鏁版嵁
+        array[3] = command.getPut();//鏀捐揣鏁版嵁
+        OperateResult result = siemensS7Net.Write("DB103.0", array);
+        if (result.IsSuccess) {
+            OperateResult result2 = siemensS7Net.Write("DB103.8", command.getConfirm());
+            if (result2.IsSuccess) {
+                response.setResult(true);
+            }
+        }
+        return response;
+    }
+
+    @Override
     public CommandResponse reset() {
         CommandResponse response = new CommandResponse(false);
         OperateResult result = siemensS7Net.Write("DB103.10", (short) 1);
@@ -405,6 +424,24 @@
         return commands;
     }
 
+    @Override
+    public List<ForkLiftCommand> getMoveCommand(Integer taskNo, Integer pick, Integer put) {
+        Integer realPick = pick % 1000;
+        Integer realPut = put % 1000;
+
+        List<ForkLiftCommand> commands = new ArrayList<>();
+        ForkLiftCommand command = new ForkLiftCommand();
+        command.setLiftNo(slave.getId());
+        command.setTaskNo(taskNo.shortValue());
+        command.setMode(ForkLiftTaskModeType.MOVE.id.shortValue());
+        command.setPick(realPick.shortValue());
+        command.setPut(realPut.shortValue());
+        command.setConfirm((short) 1);
+
+        commands.add(command);
+        return commands;
+    }
+
     /**
      * 鎵╁睍瀛楁
      */
diff --git "a/src/main/resources/docs/\345\217\260\345\215\207\345\233\233\345\220\221\345\272\223WCS\344\270\216\350\264\247\345\217\211\346\217\220\345\215\207\346\234\272PLC\351\200\232\350\256\257\346\216\245\345\217\243\345\215\217\350\256\2561.1.docx" "b/src/main/resources/docs/\345\217\260\345\215\207\345\233\233\345\220\221\345\272\223WCS\344\270\216\350\264\247\345\217\211\346\217\220\345\215\207\346\234\272PLC\351\200\232\350\256\257\346\216\245\345\217\243\345\215\217\350\256\2561.1.docx"
index cecd73a..bdd75fd 100644
--- "a/src/main/resources/docs/\345\217\260\345\215\207\345\233\233\345\220\221\345\272\223WCS\344\270\216\350\264\247\345\217\211\346\217\220\345\215\207\346\234\272PLC\351\200\232\350\256\257\346\216\245\345\217\243\345\215\217\350\256\2561.1.docx"
+++ "b/src/main/resources/docs/\345\217\260\345\215\207\345\233\233\345\220\221\345\272\223WCS\344\270\216\350\264\247\345\217\211\346\217\220\345\215\207\346\234\272PLC\351\200\232\350\256\257\346\216\245\345\217\243\345\215\217\350\256\2561.1.docx"
Binary files differ
diff --git a/src/main/resources/sql/20250424151727.nb3 b/src/main/resources/sql/20250424151727.nb3
new file mode 100644
index 0000000..eaa242a
--- /dev/null
+++ b/src/main/resources/sql/20250424151727.nb3
Binary files differ
diff --git "a/src/main/resources/sql/\345\207\272\345\272\223\344\273\273\345\212\241\351\242\204\350\260\203\345\272\246\346\217\220\345\215\207\346\234\272sql" "b/src/main/resources/sql/\345\207\272\345\272\223\344\273\273\345\212\241\351\242\204\350\260\203\345\272\246\346\217\220\345\215\207\346\234\272sql"
new file mode 100644
index 0000000..a19b11e
--- /dev/null
+++ "b/src/main/resources/sql/\345\207\272\345\272\223\344\273\273\345\212\241\351\242\204\350\260\203\345\272\246\346\217\220\345\215\207\346\234\272sql"
@@ -0,0 +1 @@
+INSERT INTO `asr_wrk_lastno` (`wrk_mk`, `wrk_no`, `modi_user`, `modi_time`, `appe_user`, `appe_time`, `s_no`, `e_no`, `memo_m`) VALUES (98, 35001, 9527, '2025-04-24 14:57:34', 9527, '2025-04-24 14:57:39', 35001, 40000, NULL);
\ No newline at end of file
diff --git a/src/main/webapp/views/forklift.html b/src/main/webapp/views/forklift.html
index 2f5c1a0..0e69f9f 100644
--- a/src/main/webapp/views/forklift.html
+++ b/src/main/webapp/views/forklift.html
@@ -91,7 +91,8 @@
                         </div>
                         <button class="item" onclick="liftOperator(1)">灏忚溅鎹㈠眰</button>
                         <button class="item" onclick="liftOperator(2)">绉诲姩鎵樼洏</button>
-                        <button class="item" onclick="liftOperator(3)">浠诲姟纭</button>
+                        <button class="item" onclick="liftOperator(3)">绉诲姩</button>
+                        <button class="item" onclick="liftOperator(4)">浠诲姟纭</button>
                         <button class="item" onclick="liftOperator(0)">澶嶄綅</button>
                     </div>
                 </fieldset>

--
Gitblit v1.9.1