From 9d0acfb65c80c4948c305ca01338f894b87346a0 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 08 四月 2024 09:44:37 +0800
Subject: [PATCH] Merge branch 'Four-Way-Rack' of http://47.97.1.152:5880/r/zy-asrs-master into Four-Way-Rack

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java         |    4 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java                    |   75 ++++
 zy-asrs-flow/src/pages/device/shuttle/index.less                                         |   15 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java                |   93 +++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java                  |    4 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java         |   10 
 zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml                                |   18 +
 zy-asrs-flow/src/pages/device/shuttle/index.jsx                                          |  318 +++++++++++--------
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleOperatorParam.java    |   17 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java                    |    4 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java            |    3 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasShuttleController.java      |   90 +++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java              |    2 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java |  228 ++-----------
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java              |   24 +
 15 files changed, 568 insertions(+), 337 deletions(-)

diff --git a/zy-asrs-flow/src/pages/device/shuttle/index.jsx b/zy-asrs-flow/src/pages/device/shuttle/index.jsx
index 13a5bb2..11d4f34 100644
--- a/zy-asrs-flow/src/pages/device/shuttle/index.jsx
+++ b/zy-asrs-flow/src/pages/device/shuttle/index.jsx
@@ -1,66 +1,18 @@
 import React, { useEffect, useRef, useState } from "react";
 import { getToken } from '@/utils/token-util'
-import { Badge, Descriptions } from 'antd';
+import Http from '@/utils/http';
+import { Badge, Button, Descriptions, Drawer, Input, Card, Select, message } from 'antd';
 import {
     PageContainer,
 } from '@ant-design/pro-components';
-
-let items = [
-    {
-        key: '1',
-        label: '浠诲姟鍙�',
-        children: '1',
-    },
-    {
-        key: '2',
-        label: '宸ヤ綔鐘舵��',
-        children: <Badge status="processing" text="Running" />,
-    },
-    {
-        key: '3',
-        label: '璁惧鐘舵��',
-        children: <Badge status="processing" text="Running" />,
-    },
-    {
-        key: '4',
-        label: '鍧愭爣鐮�',
-        children: '1,2,3',
-    },
-    {
-        key: '5',
-        label: '鐢甸噺',
-        children: '50%',
-    },
-    {
-        key: '6',
-        label: '閿欒鐮�',
-        children: '0',
-    },
-    {
-        key: '7',
-        label: '椤跺崌鐘舵��',
-        children: 'Y',
-    },
-    {
-        key: '8',
-        label: '鍏呯數鐘舵��',
-        children: 'Y',
-    },
-    {
-        key: '9',
-        label: '浣滀笟鏍囪',
-        children: 'Y',
-    },
-    {
-        key: '10',
-        label: '璺戝簱寮�鍏�',
-        children: 'Y',
-    },
-];
+import './index.less'
 
 const Main = () => {
     const [deviceInfos, setDeviceInfos] = useState([]);
     const [ws, setWs] = useState(null);
+    const [openOpera, setOpenOpera] = useState(false);
+    const [currentData, setCurrentData] = useState(null);
+    const [targetLoc, setTargetLoc] = useState("");
 
     useEffect(() => {
         var newWs = new WebSocket("ws://127.0.0.1:9090/wcs/ws/shuttle/websocket");
@@ -74,7 +26,6 @@
     }, [])
 
     useEffect(() => {
-
         if (ws) {
             ws.onopen = function () {
                 console.log("open");
@@ -122,87 +73,184 @@
         }))
     }
 
-    return (
-        <PageContainer
-            header={{
-                breadcrumb: {},
-            }}
-        >
-            <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: 'space-around' }}>
-                {deviceInfos.map(item => {
-                    if(item == null) {
-                        return;
-                    }
-                    let tmpTitle = item.shuttleNo + "鍙峰洓鍚戣溅"
-                    let tmpData = [
-                        {
-                            key: '1',
-                            label: '浠诲姟鍙�',
-                            children: item.taskNo,
-                        },
-                        {
-                            key: '2',
-                            label: '宸ヤ綔鐘舵��',
-                            children: <Badge status="processing" text={item.protocolStatusType} />,
-                        },
-                        {
-                            key: '3',
-                            label: '璁惧鐘舵��',
-                            children: <Badge status="processing" text={item.deviceStatus$} />,
-                        },
-                        {
-                            key: '4',
-                            label: '鍧愭爣鐮�',
-                            children: item.currentCode,
-                        },
-                        {
-                            key: '5',
-                            label: '鐢甸噺',
-                            children: item.batteryPower,
-                        },
-                        {
-                            key: '6',
-                            label: '閿欒鐮�',
-                            children: '0',
-                        },
-                        {
-                            key: '7',
-                            label: '椤跺崌鐘舵��',
-                            children: item.hasLift ? 'Y' : 'N',
-                        },
-                        {
-                            key: '8',
-                            label: '鍏呯數鐘舵��',
-                            children: item.hasCharge ? 'Y' : 'N',
-                        },
-                        {
-                            key: '9',
-                            label: '浣滀笟鏍囪',
-                            children: item.pakMk ? 'Y' : 'N',
-                        },
-                        {
-                            key: '10',
-                            label: '璺戝簱寮�鍏�',
-                            children: item.moveLoc ? 'Y' : 'N',
-                        },
-                        {
-                            key: '11',
-                            label: '杩愯鏂瑰悜',
-                            children: item.runDirection,
-                        },
-                        {
-                            key: '12',
-                            label: '鏄惁鏈夋墭鐩�',
-                            children: item.hasPallet ? 'Y' : 'N',
-                        },
-                    ];
-                    return <div key={item.id} style={{ width: '45%' }}>
-                        <Descriptions size="small" title={tmpTitle} bordered items={tmpData} />
+    const showOpera = (data) => {
+        setOpenOpera(true);
+        console.log(data);
+        setCurrentData(data);
+    };
+
+    const closeOpera = () => {
+        setOpenOpera(false);
+    };
+
+    const targetLocChange = (e) => {
+        setTargetLoc(e.target.value)
+    }
+
+    const shuttleOperator = async (type) => {
+        if (type == 'moveLoc') {
+            if (targetLoc == '') {
+                message.warning('璇疯緭鍏ョ洰鏍囦綅缃�');
+                return;
+            }
+        }
+
+        try {
+            const resp = await Http.doPost('api/basShuttle/operator/shuttle', {
+                shuttleNo: currentData.shuttleNo,
+                shuttleTaskMode: type,
+                targetLocNo: targetLoc
+            });
+            if (resp.code === 200) {
+                message.success("璇锋眰鎴愬姛");
+                return true;
+            } else {
+                message.warning(resp.msg);
+                return false;
+            }
+        } catch (error) {
+            message.warning("璇锋眰澶辫触");
+            return false;
+        }
+    }
+
+    let codeContent = (<PageContainer
+        header={{
+            breadcrumb: {},
+        }}
+    >
+        <div style={{ display: 'flex', flexWrap: 'wrap', justifyContent: 'space-around' }}>
+            {deviceInfos.map(item => {
+                if (item == null) {
+                    return;
+                }
+                let tmpTitle = item.shuttleNo + "鍙峰洓鍚戣溅"
+                let tmpData = [
+                    {
+                        key: '1',
+                        label: '浠诲姟鍙�',
+                        children: item.taskNo,
+                    },
+                    {
+                        key: '2',
+                        label: '宸ヤ綔鐘舵��',
+                        children: <Badge status="processing" text={item.protocolStatusType} />,
+                    },
+                    {
+                        key: '3',
+                        label: '璁惧鐘舵��',
+                        children: <Badge status="processing" text={item.deviceStatus$} />,
+                    },
+                    {
+                        key: '4',
+                        label: '鍧愭爣鐮�',
+                        children: item.currentCode,
+                    },
+                    {
+                        key: '5',
+                        label: '鐢甸噺',
+                        children: item.batteryPower,
+                    },
+                    {
+                        key: '6',
+                        label: '閿欒鐮�',
+                        children: '0',
+                    },
+                    {
+                        key: '7',
+                        label: '椤跺崌鐘舵��',
+                        children: item.hasLift ? 'Y' : 'N',
+                    },
+                    {
+                        key: '8',
+                        label: '鍏呯數鐘舵��',
+                        children: item.hasCharge ? 'Y' : 'N',
+                    },
+                    {
+                        key: '9',
+                        label: '浣滀笟鏍囪',
+                        children: item.pakMk ? 'Y' : 'N',
+                    },
+                    {
+                        key: '10',
+                        label: '璺戝簱寮�鍏�',
+                        children: item.moveLoc ? 'Y' : 'N',
+                    },
+                    {
+                        key: '11',
+                        label: '杩愯鏂瑰悜',
+                        children: item.runDirection,
+                    },
+                    {
+                        key: '12',
+                        label: '鏄惁鏈夋墭鐩�',
+                        children: item.hasPallet ? 'Y' : 'N',
+                    },
+                ];
+                return <div key={item.id} style={{ width: '45%' }}>
+                    <div style={{ marginBottom: '10px' }}>
+                        <span style={{ marginRight: '10px' }}>{tmpTitle}</span>
+                        <Button type="primary" onClick={() => showOpera(item)}>鎿嶄綔</Button>
                     </div>
-                })}
-            </div>
-        </PageContainer>
-    )
+                    <Descriptions size="small" bordered items={tmpData} />
+                </div>
+            })}
+        </div>
+    </PageContainer>);
+
+    if (currentData) {
+        codeContent = (
+            <>
+                {codeContent}
+                <Drawer title="鎿嶄綔闈㈡澘" onClose={closeOpera} open={openOpera}>
+                    <h2 style={{ marginBottom: '15px' }}>{currentData.shuttleNo}鍙峰洓鍚戣溅</h2>
+                    <div style={{ marginBottom: '15px' }}>
+                        <Card title="绉诲姩鎸囦护" style={{ width: 300 }}>
+                            <p>
+                                <Input addonBefore="鐩爣浣嶇疆" defaultValue="1-1-1" onChange={targetLocChange} />
+                            </p>
+                            <p>
+                                <Button onClick={() => shuttleOperator('moveLoc')}>绉诲姩鍒扮洰鏍囦綅缃�</Button>
+                            </p>
+                        </Card>
+                    </div>
+
+                    <div style={{ marginBottom: '15px' }}>
+                        <Card title="鐩稿叧鎸囦护" style={{ width: 300 }}>
+                            <div className="commandItem">
+                                <Button onClick={() => shuttleOperator('palletLift')}>鎵樼洏椤跺崌</Button>
+                                <Button onClick={() => shuttleOperator('palletDown')}>鎵樼洏涓嬮檷</Button>
+                                <Button onClick={() => shuttleOperator('chargeOpen')}>鍏呯數寮�</Button>
+                                <Button onClick={() => shuttleOperator('chargeClose')}>鍏呯數鍏�</Button>
+                                <Button onClick={() => shuttleOperator('reset')}>澶嶄綅</Button>
+                            </div>
+                        </Card>
+                    </div>
+
+                    <div style={{ marginBottom: '15px' }}>
+                        <Card title="璺戝簱绯荤粺" style={{ width: 300 }}>
+                            <div className="commandItem">
+                                <div><Input addonBefore="X璧风偣" defaultValue="1" /></div>
+                                <div><Input addonBefore="X缁堢偣" defaultValue="1" /></div>
+                                <div><Input addonBefore="Y璧风偣" defaultValue="1" /></div>
+                                <div><Input addonBefore="Y缁堢偣" defaultValue="1" /></div>
+                                <div>
+                                    <Select
+                                        defaultValue="0"
+                                        style={{ width: 120 }}
+                                        options={[{ value: '0', label: '璺戣建閬�' }, { value: '1', label: '璺戝簱浣�' }, { value: '2', label: '姣嶈建閬撳惊鐜窇' }, { value: '3', label: '瀛愯建閬撳惊鐜窇' }]}
+                                    />
+                                </div>
+                                <Button>璺戝簱</Button>
+                            </div>
+                        </Card>
+                    </div>
+                </Drawer>
+            </>
+        )
+    }
+
+    return (codeContent);
 }
 
 export default Main;
\ No newline at end of file
diff --git a/zy-asrs-flow/src/pages/device/shuttle/index.less b/zy-asrs-flow/src/pages/device/shuttle/index.less
new file mode 100644
index 0000000..d70f38a
--- /dev/null
+++ b/zy-asrs-flow/src/pages/device/shuttle/index.less
@@ -0,0 +1,15 @@
+.commandItem {
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+}
+
+.commandItem > Button {
+    width: 120px;
+    margin-bottom: 10px;
+}
+
+.commandItem > div {
+    width: 120px;
+    margin-bottom: 10px;
+}
\ No newline at end of file
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasShuttleController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasShuttleController.java
index 21b798f..763cdfe 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasShuttleController.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/BasShuttleController.java
@@ -2,25 +2,36 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.asrs.framework.common.BaseRes;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.common.SnowflakeIdWorker;
 import com.zy.asrs.wcs.common.annotation.OperationLog;
 import com.zy.asrs.wcs.common.domain.BaseParam;
 import com.zy.asrs.wcs.common.domain.KeyValVo;
 import com.zy.asrs.wcs.common.domain.PageParam;
+import com.zy.asrs.wcs.core.domain.param.ShuttleOperatorParam;
 import com.zy.asrs.wcs.core.entity.BasShuttle;
+import com.zy.asrs.wcs.core.entity.Motion;
+import com.zy.asrs.wcs.core.entity.Task;
+import com.zy.asrs.wcs.core.entity.TaskCtg;
+import com.zy.asrs.wcs.core.kernel.AnalyzeService;
+import com.zy.asrs.wcs.core.model.enums.TaskStsType;
 import com.zy.asrs.wcs.core.service.BasShuttleService;
+import com.zy.asrs.wcs.core.service.MotionService;
+import com.zy.asrs.wcs.core.service.TaskCtgService;
+import com.zy.asrs.wcs.core.service.TaskService;
+import com.zy.asrs.wcs.core.utils.Utils;
+import com.zy.asrs.wcs.rcs.News;
 import com.zy.asrs.wcs.system.controller.BaseController;
 import com.zy.asrs.wcs.utils.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/api")
@@ -28,6 +39,16 @@
 
     @Autowired
     private BasShuttleService basShuttleService;
+    @Autowired
+    private TaskCtgService taskCtgService;
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private AnalyzeService analyzeService;
+    @Autowired
+    private MotionService motionService;
 
     @PreAuthorize("hasAuthority('core:basShuttle:list')")
     @PostMapping("/basShuttle/page")
@@ -99,4 +120,65 @@
         ExcelUtil.build(ExcelUtil.create(basShuttleService.list(), BasShuttle.class), response);
     }
 
+    @PreAuthorize("hasAuthority('core:basShuttle:operator')")
+    @PostMapping("/basShuttle/operator/shuttle")
+    @Transactional
+    public R shuttleOperator(@RequestBody ShuttleOperatorParam param) {
+        if (Cools.isEmpty(param.getShuttleNo(), param.getShuttleTaskMode())) {
+            return R.error("鍙傛暟涓虹┖");
+        }
+
+        Integer shuttleNo = param.getShuttleNo();
+
+        //鑾峰彇杩佺Щ浠诲姟绫诲瀷
+        TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>()
+                .eq(TaskCtg::getFlag, "MANUAL")
+                .eq(TaskCtg::getStatus, 1));
+        if (taskCtg == null) {
+            return R.error();
+        }
+
+        String targetLoc = null;//浠诲姟鐩爣(鍊熺敤瀛楁)
+        String targetSite = param.getShuttleTaskMode();//浠诲姟绫诲瀷(鍊熺敤瀛楁)
+        if (param.getShuttleTaskMode().equals("moveLoc")) {
+            //杩佺Щ浠诲姟
+            targetLoc = param.getTargetLocNo();
+        }
+
+        Task task = new Task();
+        task.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
+        task.setTaskNo(String.valueOf(Utils.getTaskNo("MANUAL")));
+        task.setTaskSts(TaskStsType.NEW_MANUAL.getId());
+        task.setTaskCtg(taskCtg.getId());
+        task.setPriority(10);
+        task.setOriginSite(null);
+        task.setOriginLoc(null);
+        task.setDestSite(targetSite);
+        task.setDestLoc(targetLoc);
+        task.setIoTime(new Date());
+        task.setStartTime(new Date());
+        task.setStatus(1);
+        task.setMemo("manual");
+        task.setShuttleNo(param.getShuttleNo());
+        boolean result = taskService.save(task);
+        if (!result) {
+            return R.error();
+        }
+
+        // generate motion list
+        List<Motion> motionList = analyzeService.generateShuttleManualMotion(task);
+        if (Cools.isEmpty(motionList)) {
+            News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鎵嬪姩浠诲姟澶辫触!!!", shuttleNo);
+            return R.error();
+        }
+        motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()));
+
+        task.setTaskSts(TaskStsType.ANALYZE_MANUAL.getId());
+        if (!taskService.updateById(task)) {
+            News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅鎵嬪姩浠诲姟澶辫触!!!", shuttleNo);
+            return R.error();
+        }
+        return R.ok();
+    }
+
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleOperatorParam.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleOperatorParam.java
new file mode 100644
index 0000000..00ddd3a
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleOperatorParam.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.wcs.core.domain.param;
+
+import lombok.Data;
+
+@Data
+public class ShuttleOperatorParam {
+
+    // 鍥涘悜绌挎杞﹀彿
+    private Integer shuttleNo;
+
+    // 鍛戒护绫诲瀷
+    private String shuttleTaskMode;
+
+    // 鐩爣搴撲綅
+    private String targetLocNo;
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
index 08280d0..f2ce497 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
@@ -4,6 +4,7 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.wcs.core.domain.dto.MotionDto;
 import com.zy.asrs.wcs.core.entity.Task;
+import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
 import com.zy.asrs.wcs.core.model.enums.MotionCtgType;
 import com.zy.asrs.wcs.core.model.enums.TaskStsType;
 import com.zy.asrs.wcs.core.model.enums.WorkZoneType;
@@ -982,6 +983,98 @@
         return motionList;
     }
 
+    /**
+     * 鐢熸垚灏忚溅鎵嬪姩鍔ㄤ綔
+     */
+    public List<Motion> generateShuttleManualMotion(Task task) {
+        List<Motion> motionList = new ArrayList<>();
+        if (task.getTaskSts() != TaskStsType.NEW_MOVE.getId()) {
+            return motionList;
+        }
 
+        String targetLoc = task.getDestLoc();//浠诲姟鐩爣(鍊熺敤瀛楁)
+        String targetSite = task.getDestSite();//浠诲姟绫诲瀷(鍊熺敤瀛楁)
+
+        //鑾峰彇绌挎杞︾被鍨�
+        DeviceType deviceType = deviceTypeService.getOne(new LambdaQueryWrapper<DeviceType>()
+                .eq(DeviceType::getFlag, String.valueOf(SlaveType.Shuttle))
+                .eq(DeviceType::getStatus, 1));
+        if (deviceType == null) {
+            return motionList;
+        }
+
+        Device device = deviceService.getOne(new LambdaQueryWrapper<Device>()
+                .eq(Device::getDeviceNo, task.getShuttleNo())
+                .eq(Device::getDeviceType, deviceType.getId())
+                .eq(Device::getHostId, task.getHostId())
+                .eq(Device::getStatus, 1));
+        if (device == null) {
+            return motionList;
+        }
+
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue());
+        if (shuttleThread == null) {
+            return motionList;
+        }
+
+        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+        if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
+            return motionList;
+        }
+
+        if (targetSite.equals("moveLoc")) {//绉诲姩
+            String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
+
+            // 鍒ゆ柇绌挎杞︽槸鍚﹀湪鐩爣灞�
+            if (Utils.getLev(shuttleLocNo) == Utils.getLev(targetLoc)) {
+
+                // 绌挎杞﹁蛋琛岃嚦鐩爣搴撲綅
+                motionList.addAll(kernelService.shuttleMove(
+                        MotionDto.build((dto -> {
+                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
+                            dto.setLocNo(shuttleLocNo);
+                        })),
+                        MotionDto.build((dto -> {
+                            dto.setShuttleNo(shuttleProtocol.getShuttleNo().intValue());
+                            dto.setLocNo(targetLoc);
+                        })),
+                        MotionCtgType.SHUTTLE_MOVE
+                ));
+
+            }
+        } else if (targetSite.equals("palletLift")) {
+            //鎵樼洏椤跺崌
+            motionList.add(Motion.build(motion -> {
+                motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val());
+                motion.setDevice(String.valueOf(task.getShuttleNo()));
+                motion.setMotionCtg(MotionCtgType.SHUTTLE_PALLET_LIFT.val());
+            }));
+        } else if (targetSite.equals("palletDown")) {
+            //鎵樼洏涓嬮檷
+            motionList.add(Motion.build(motion -> {
+                motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val());
+                motion.setDevice(String.valueOf(task.getShuttleNo()));
+                motion.setMotionCtg(MotionCtgType.SHUTTLE_PALLET_DOWN.val());
+            }));
+        } else if (targetSite.equals("chargeOpen")) {
+            //鍏呯數寮�
+            motionList.add(Motion.build(motion -> {
+                motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val());
+                motion.setDevice(String.valueOf(task.getShuttleNo()));
+                motion.setMotionCtg(MotionCtgType.SHUTTLE_CHARGE_ON.val());
+            }));
+        } else if (targetSite.equals("chargeClose")) {
+            //鍏呯數鍏�
+            motionList.add(Motion.build(motion -> {
+                motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val());
+                motion.setDevice(String.valueOf(task.getShuttleNo()));
+                motion.setMotionCtg(MotionCtgType.SHUTTLE_CHARGE_OFF.val());
+            }));
+        } else if (targetSite.equals("reset")) {
+            //澶嶄綅
+        }
+
+        return motionList;
+    }
 
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
index fc451d3..e276f9a 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/command/ShuttleCommandService.java
@@ -203,164 +203,24 @@
                 shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
                 shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO;
                 break;
-//            case SHUTTLE_MOVE_FROM_CONVEYOR:
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO;
-//                break;
-//            case SHUTTLE_MOVE_TO_CONVEYOR:
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO;
-//                break;
-//            case SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR://绌挎杞﹀嚭鎻愬崌鏈哄幓杈撻�佺嚎
-//                // 鍒ゆ柇鎻愬崌鏈虹姸鎬�
-//                liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp()));
-//                if (liftThread == null) {
-//                    return false;
-//                }
-//                liftProtocol = liftThread.getLiftProtocol();
-//                // 鍒ゆ柇鎻愬崌鏈烘槸鍚﹁嚜鍔ㄣ�佺┖闂层�佸噯澶囧氨缁�侀摼鏉℃病鏈夎浆鍔ㄣ�佹病鏈夋湭灏辩华鎶ラ敊
-//                if (!liftProtocol.getMode()
-//                        || liftProtocol.getRunning()
-//                        || !liftProtocol.getReady()
-//                        || liftProtocol.getForwardRotationFeedback()
-//                        || liftProtocol.getReverseFeedback()
-//                        || liftProtocol.getNotReady().intValue() != 0
-//                ) {
-//                    return false;
-//                }
-//
-//                if (liftProtocol.getLev().intValue() != Utils.getLev(motion.getTarget())) {//鍒ゆ柇鎻愬崌鏈烘槸鍚﹁揪鍒扮洰鏍囧眰
-//                    return false;
-//                }
-//
-//                //鍒ゆ柇鎻愬崌鏈烘槸鍚﹁閿佸畾
-//                if (!liftProtocol.getLiftLock()) {
-//                    //閿佸畾鎻愬崌鏈�
-//                    LiftCommand lockCommand = liftThread.getLockCommand(true);//鑾峰彇鎻愬崌鏈洪攣瀹氬懡浠�
-//                    lockCommand.setLiftNo(liftProtocol.getLiftNo());
-//                    lockCommand.setTaskNo(motion.getWrkNo().shortValue());//鑾峰彇浠诲姟鍙�
-//                    liftThread.assignWork(lockCommand);
-//                    return false;//绛夊緟涓嬩竴娆¤疆璇�
-//                }
-//
-//                //鍒ゆ柇鎻愬崌鏈哄伐浣滃彿鏄惁鍜屽綋鍓嶄换鍔$浉鍚�
-//                if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) {
-//                    return false;
-//                }
-//
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO;
-//                break;
-//            case SHUTTLE_TRANSPORT:
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.PAK_IN;
-//
-//                shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1));
-//                shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2));
-//                break;
-//            case SHUTTLE_TRANSPORT_FROM_LIFT://绌挎杞﹁浇璐у嚭鎻愬崌鏈�
-//                // 鍒ゆ柇鎻愬崌鏈虹姸鎬�
-//                liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp()));
-//                if (liftThread == null) {
-//                    return false;
-//                }
-//                liftProtocol = liftThread.getLiftProtocol();
-//                // 鍒ゆ柇鎻愬崌鏈烘槸鍚﹁嚜鍔ㄣ�佺┖闂层�佸噯澶囧氨缁�侀摼鏉℃病鏈夎浆鍔ㄣ�佹病鏈夋湭灏辩华鎶ラ敊
-//                if (!liftProtocol.getMode()
-//                        || liftProtocol.getRunning()
-//                        || !liftProtocol.getReady()
-//                        || liftProtocol.getForwardRotationFeedback()
-//                        || liftProtocol.getReverseFeedback()
-//                        || liftProtocol.getNotReady().intValue() != 0
-//                ) {
-//                    return false;
-//                }
-//
-//                if (liftProtocol.getLev().intValue() != Utils.getLev(motion.getTarget())) {//鍒ゆ柇鎻愬崌鏈烘槸鍚﹁揪鍒扮洰鏍囧眰
-//                    return false;
-//                }
-//
-//                //鍒ゆ柇鎻愬崌鏈烘槸鍚﹁閿佸畾
-//                if (!liftProtocol.getLiftLock()) {
-//                    //閿佸畾鎻愬崌鏈�
-//                    LiftCommand lockCommand = liftThread.getLockCommand(true);//鑾峰彇鎻愬崌鏈洪攣瀹氬懡浠�
-//                    lockCommand.setLiftNo(liftProtocol.getLiftNo());
-//                    lockCommand.setTaskNo(motion.getWrkNo().shortValue());//鑾峰彇浠诲姟鍙�
-//                    liftThread.assignWork(lockCommand);
-//                    return false;//绛夊緟涓嬩竴娆¤疆璇�
-//                }
-//
-//                //鍒ゆ柇鎻愬崌鏈哄伐浣滃彿鏄惁鍜屽綋鍓嶄换鍔$浉鍚�
-//                if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) {
-//                    return false;
-//                }
-//
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.PAK_IN;
-//                shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1));
-////                shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2));
-//                break;
-//            case SHUTTLE_TRANSPORT_TO_LIFT://绌挎杞﹁浇璐ц繘鎻愬崌鏈�
-//                // 鍒ゆ柇鎻愬崌鏈虹姸鎬�
-//                liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp()));
-//                if (liftThread == null) {
-//                    return false;
-//                }
-//                liftProtocol = liftThread.getLiftProtocol();
-//                // 鍒ゆ柇鎻愬崌鏈烘槸鍚﹁嚜鍔ㄣ�佺┖闂层�佸噯澶囧氨缁�侀摼鏉℃病鏈夎浆鍔ㄣ�佹病鏈夋湭灏辩华鎶ラ敊
-//                if (!liftProtocol.getMode()
-//                        || liftProtocol.getRunning()
-//                        || !liftProtocol.getReady()
-//                        || liftProtocol.getForwardRotationFeedback()
-//                        || liftProtocol.getReverseFeedback()
-//                        || liftProtocol.getNotReady().intValue() != 0
-//                ) {
-//                    return false;
-//                }
-//
-//                if (liftProtocol.getLev().intValue() != Utils.getLev(motion.getTarget())) {//鍒ゆ柇鎻愬崌鏈烘槸鍚﹁揪鍒扮洰鏍囧眰
-//                    return false;
-//                }
-//
-//                //鍒ゆ柇鎻愬崌鏈烘槸鍚﹁閿佸畾
-//                if (!liftProtocol.getLiftLock()) {
-//                    //閿佸畾鎻愬崌鏈�
-//                    LiftCommand lockCommand = liftThread.getLockCommand(true);//鑾峰彇鎻愬崌鏈洪攣瀹氬懡浠�
-//                    lockCommand.setLiftNo(liftProtocol.getLiftNo());
-//                    lockCommand.setTaskNo(motion.getWrkNo().shortValue());//鑾峰彇浠诲姟鍙�
-//                    liftThread.assignWork(lockCommand);
-//                    return false;//绛夊緟涓嬩竴娆¤疆璇�
-//                }
-//
-//                //鍒ゆ柇鎻愬崌鏈哄伐浣滃彿鏄惁鍜屽綋鍓嶄换鍔$浉鍚�
-//                if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) {
-//                    return false;
-//                }
-//
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.PAK_IN;
-////                shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1));
-//                shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2));
-//                break;
-//            case SHUTTLE_TRANSPORT_FROM_CONVEYOR:
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.PAK_IN;
-//
-//                shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1));
-//                shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2));
-//                break;
-//            case SHUTTLE_TRANSPORT_TO_CONVEYOR:
-//                shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread);
-//                shuttleTaskModeType = ShuttleTaskModeType.PAK_IN;
-//
-//                shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1));
-//                shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2));
-//                break;
-//            case SHUTTLE_CHARGE_ON:
-//                shuttleTaskModeType = ShuttleTaskModeType.CHARGE;
-//                shuttleCommands.add(shuttleThread.getChargeSwitchCommand((short) 1));
-//                assignCommand.setCharge(Boolean.TRUE);
-//                break;
+            case SHUTTLE_CHARGE_ON://鍏呯數寮�
+                shuttleTaskModeType = ShuttleTaskModeType.CHARGE;
+                shuttleCommands.add(shuttleThread.getChargeCommand(motion.getWrkNo(), true));
+                assignCommand.setCharge(Boolean.TRUE);
+                break;
+            case SHUTTLE_CHARGE_OFF://鍏呯數鍏�
+                shuttleTaskModeType = ShuttleTaskModeType.CHARGE;
+                shuttleCommands.add(shuttleThread.getChargeCommand(motion.getWrkNo(), false));
+                assignCommand.setCharge(Boolean.TRUE);
+                break;
+            case SHUTTLE_PALLET_LIFT://鎵樼洏椤跺崌
+                shuttleTaskModeType = ShuttleTaskModeType.PALLET_LIFT;
+                shuttleCommands.add(shuttleThread.getLiftCommand(motion.getWrkNo(), true));
+                break;
+            case SHUTTLE_PALLET_DOWN://鎵樼洏涓嬮檷
+                shuttleTaskModeType = ShuttleTaskModeType.PALLET_DOWN;
+                shuttleCommands.add(shuttleThread.getLiftCommand(motion.getWrkNo(), false));
+                break;
             default:
                 throw new CoolException(motion.getMotionCtgEl() + "娌℃湁鎸囧畾浠诲姟浣滀笟娴佺▼锛侊紒锛�");
         }
@@ -417,8 +277,8 @@
             return false;
         }
 
-//        SiemensLiftThread liftThread = null;
-//        LiftProtocol liftProtocol = null;
+        LiftThread liftThread = null;
+        LiftProtocol liftProtocol = null;
 
         switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){
             case SHUTTLE_MOVE:
@@ -430,21 +290,21 @@
                     return false;
                 }
                 break;
-//            case SHUTTLE_MOVE_TO_LIFT:
-//            case SHUTTLE_MOVE_FROM_LIFT:
-//            case SHUTTLE_TRANSPORT_FROM_LIFT:
-//            case SHUTTLE_TRANSPORT_TO_LIFT:
-//            case SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR:
-//                liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp()));
-//                if (liftThread == null) {
-//                    return false;
-//                }
-//                liftProtocol = liftThread.getLiftProtocol();
-//
-//                if (!shuttleProtocol.getCurrentLocNo().equals(motion.getTarget())) {
-//                    return false;
-//                }
-//
+            case SHUTTLE_MOVE_TO_LIFT:
+            case SHUTTLE_MOVE_FROM_LIFT:
+            case SHUTTLE_TRANSPORT_FROM_LIFT:
+            case SHUTTLE_TRANSPORT_TO_LIFT:
+            case SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR:
+                liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp()));
+                if (liftThread == null) {
+                    return false;
+                }
+                liftProtocol = liftThread.getStatus();
+
+                if (!shuttleProtocol.getCurrentLocNo().equals(motion.getTarget())) {
+                    return false;
+                }
+
 //                //鍒ゆ柇鎻愬崌鏈烘槸鍚﹁閿佸畾
 //                if (liftProtocol.getLiftLock()) {
 //                    //瑙i攣鎻愬崌鏈�
@@ -454,18 +314,18 @@
 //                    liftThread.assignWork(lockCommand);
 //                    return false;
 //                }
-//
-//                //鍒ゆ柇鎻愬崌鏈哄伐浣滃彿鏄惁鍜屽綋鍓嶄换鍔$浉鍚�
-//                if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) {
-//                    return false;
-//                }
-//
-//                if (liftProtocol.getTaskNo().intValue() != 0) {
+
+                //鍒ゆ柇鎻愬崌鏈哄伐浣滃彿鏄惁鍜屽綋鍓嶄换鍔$浉鍚�
+                if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) {
+                    return false;
+                }
+
+//                if (liftProtocol.getTaskNo() != 0) {
 //                    //娓呯┖鎻愬崌鏈哄彿
 //                    liftThread.setTaskNo(0);
 //                }
-//
-//                break;
+
+                break;
             default:
                 break;
         }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
index 2f74a3c..5c2c38c 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
@@ -18,6 +18,10 @@
 
     List<Task> selectByExecuteSts();
 
+    List<Task> selectManualByAnalyzeSts();
+
+    List<Task> selectManualByExecuteSts();
+
     List<Task> selectWaitAnalyzeInBoundTask();
 
     List<Task> selectPakOut();
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
index ad73d9b..6374639 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/MotionCtgType.java
@@ -51,6 +51,9 @@
     SHUTTLE_CHARGE_ON(SHUTTLE),
     SHUTTLE_CHARGE_OFF(SHUTTLE),
 
+    SHUTTLE_PALLET_LIFT(SHUTTLE),//鎵樼洏椤跺崌
+    SHUTTLE_PALLET_DOWN(SHUTTLE),//鎵樼洏涓嬮檷
+
     // AGV ----------------------------------------------
     AGV_TRANSPORT(AGV),
 
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java
index 405119c..6b8b3e5 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java
@@ -1,6 +1,10 @@
 package com.zy.asrs.wcs.core.model.enums;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.framework.common.SpringUtils;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wcs.core.entity.TaskSts;
+import com.zy.asrs.wcs.core.service.TaskStsService;
 
 public enum TaskStsType {
 
@@ -51,4 +55,24 @@
         throw new CoolException("TaskStsType Error!!!");
     }
 
+    public static TaskStsType queryById(Long id) {
+        TaskStsService taskStsService = SpringUtils.getBean(TaskStsService.class);
+        TaskSts taskSts = taskStsService.getById(id);
+        if (taskSts == null) {
+            throw new CoolException("TaskStsType Error!!!");
+        }
+        return query(Long.valueOf(taskSts.getUuid()));
+    }
+
+    public Long getId() {
+        TaskStsService taskStsService = SpringUtils.getBean(TaskStsService.class);
+        TaskSts taskSts = taskStsService.getOne(new LambdaQueryWrapper<TaskSts>()
+                .eq(TaskSts::getUuid, sts)
+                .eq(TaskSts::getStatus, 1));
+        if (taskSts == null) {
+            throw new CoolException("TaskStsType Error!!!");
+        }
+        return taskSts.getId();
+    }
+
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
index ef8f451..a79c50e 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
@@ -16,6 +16,10 @@
 
     List<Task> selectByExecuteSts();
 
+    List<Task> selectManualByAnalyzeSts();
+
+    List<Task> selectManualByExecuteSts();
+
     List<Task> selectWaitAnalyzeInBoundTask();
 
     List<Task> selectPakOut();
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
index e7c5592..a342164 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
@@ -268,7 +268,7 @@
             Task task = new Task();
             task.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
             task.setTaskNo(String.valueOf(Utils.getTaskNo("CHARGE")));
-            task.setTaskSts(TaskStsType.NEW_CHARGE.sts);
+            task.setTaskSts(TaskStsType.NEW_CHARGE.getId());
             task.setTaskCtg(taskCtg.getId());
             task.setPriority(10);
             task.setOriginSite(null);
@@ -365,7 +365,7 @@
             Task task = new Task();
             task.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
             task.setTaskNo(String.valueOf(Utils.getTaskNo("MOVE")));
-            task.setTaskSts(TaskStsType.NEW_MOVE.sts);
+            task.setTaskSts(TaskStsType.NEW_MOVE.getId());
             task.setTaskCtg(taskCtg.getId());
             task.setPriority(10);
             task.setOriginSite(null);
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
index 3964219..0dd46fb 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
@@ -66,6 +66,16 @@
     }
 
     @Override
+    public List<Task> selectManualByAnalyzeSts() {
+        return this.baseMapper.selectManualByAnalyzeSts();
+    }
+
+    @Override
+    public List<Task> selectManualByExecuteSts() {
+        return this.baseMapper.selectManualByExecuteSts();
+    }
+
+    @Override
     public List<Task> selectWaitAnalyzeInBoundTask() {
         return this.baseMapper.selectWaitAnalyzeInBoundTask();
     }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
index 5a364fb..7ef0cb4 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
@@ -45,7 +45,7 @@
     private ShuttleCommandService shuttleCommandService;
 
 //    @Scheduled(cron = "0/1 * * * * ? ")
-    public synchronized void executeWrkMast() {
+    public synchronized void executeTask() {
         Date now = new Date();
         // ANALYZE_INBOUND
         for (Task task : taskService.selectByAnalyzeSts()) {
@@ -61,13 +61,13 @@
                     continue;
                 }
 
-                // 鏇存柊wrkMast
-                switch (TaskStsType.query(task.getTaskSts())) {
+                // 鏇存柊Task
+                switch (TaskStsType.queryById(task.getTaskSts())) {
                     case ANALYZE_INBOUND:
-                        task.setTaskSts(TaskStsType.EXECUTE_INBOUND.sts);
+                        task.setTaskSts(TaskStsType.EXECUTE_INBOUND.getId());
                         break;
                     case ANALYZE_OUTBOUND:
-                        task.setTaskSts(TaskStsType.EXECUTE_OUTBOUND.sts);
+                        task.setTaskSts(TaskStsType.EXECUTE_OUTBOUND.getId());
                         break;
                 }
                 task.setUpdateTime(now);
@@ -90,13 +90,13 @@
                         continue;
                     }
 
-                    // 鏇存柊wrkMast
-                    switch (TaskStsType.query(task.getTaskSts())) {
+                    // 鏇存柊Task
+                    switch (TaskStsType.queryById(task.getTaskSts())) {
                         case EXECUTE_INBOUND:
-                            task.setTaskSts(TaskStsType.COMPLETE_INBOUND.sts);
+                            task.setTaskSts(TaskStsType.COMPLETE_INBOUND.getId());
                             break;
                         case EXECUTE_OUTBOUND:
-                            task.setTaskSts(TaskStsType.COMPLETE_OUTBOUND.sts);
+                            task.setTaskSts(TaskStsType.COMPLETE_OUTBOUND.getId());
                             break;
                     }
                     task.setUpdateTime(now);
@@ -171,6 +171,63 @@
 //        }
 //    }
 
+//    @Scheduled(cron = "0/1 * * * * ? ")
+    public synchronized void executeManualTask() {
+        Date now = new Date();
+        // ANALYZE_MANUAL
+        for (Task task : taskService.selectByAnalyzeSts()) {
+            Motion executingMotion = motionService.selectOfTop1(task.getUuid(), MotionStsType.EXECUTING.val(), task.getHostId());
+            if (executingMotion != null) {//瀛樺湪姝e湪鎵ц鐨刴otion
+                continue;
+            }
+
+            Motion motion = motionService.selectOfTop1(task.getUuid(), MotionStsType.INIT.val(), task.getHostId());
+            if (null != motion) {
+                boolean result = this.executeMotion(motion);
+                if (!result) {
+                    continue;
+                }
+                // 鏇存柊Task
+                switch (TaskStsType.queryById(task.getTaskSts())) {
+                    case ANALYZE_MANUAL:
+                        task.setTaskSts(TaskStsType.EXECUTE_MANUAL.getId());
+                        break;
+                }
+                task.setUpdateTime(now);
+                if (!taskService.updateById(task)) {
+                    log.error("{}鍏朵粬宸ヤ綔妗f洿鏂扮姸鎬佸け璐ワ紒", task.getTaskNo());
+                }
+            }
+        }
+        // EXECUTE_MANUAL
+        for (Task task : taskService.selectManualByExecuteSts()) {
+            if (!motionService.hasRunningMotion(task.getUuid(), task.getHostId())) {
+                Motion motion = motionService.selectOfTop1(task.getUuid(), MotionStsType.WAITING.val(), task.getHostId());
+                if (null != motion) {
+                    boolean result = this.executeMotion(motion);
+                    if (!result) {
+                        continue;
+                    }
+                } else {
+                    if (motionService.selectOfTop1(task.getUuid(), MotionStsType.EXECUTING.val(), task.getHostId()) != null) {
+                        continue;
+                    }
+
+                    // 鏇存柊Task
+                    switch (TaskStsType.queryById(task.getTaskSts())) {
+                        case EXECUTE_MANUAL:
+                            task.setTaskSts(TaskStsType.COMPLETE_MANUAL.getId());
+                            break;
+                    }
+                    task.setUpdateTime(now);
+                    if (!taskService.updateById(task)) {
+                        log.error("{}浠栧伐浣滄。鏇存柊鐘舵�佸け璐ワ紒", task.getTaskNo());
+                    }
+                }
+            }
+        }
+    }
+
     @Scheduled(cron = "0/1 * * * * ? ")
     public void scanMotionByExecuting() {
         List<Motion> motionList = motionService.selectBySts(MotionStsType.EXECUTING.val());
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
index 58d0e4b..8188546 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
@@ -177,7 +177,7 @@
         Task task = new Task();
         task.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
         task.setTaskNo(String.valueOf(Utils.getTaskNo("MOVE")));
-        task.setTaskSts(TaskStsType.NEW_MOVE.sts);
+        task.setTaskSts(TaskStsType.NEW_MOVE.getId());
         task.setTaskCtg(taskCtg.getId());
         task.setPriority(10);
         task.setOriginSite(null);
diff --git a/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml b/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
index 7467945..7654c7e 100644
--- a/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
+++ b/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
@@ -13,14 +13,28 @@
     <select id="selectByAnalyzeSts" resultType="com.zy.asrs.wcs.core.entity.Task">
         select * from wcs_task
         where 1=1
-        and task_sts in (2, 102, 202, 302)
+        and task_sts in (2, 102)
         order by priority desc,start_time,task_no asc
     </select>
 
     <select id="selectByExecuteSts" resultType="com.zy.asrs.wcs.core.entity.Task">
         select * from wcs_task
         where 1=1
-        and task_sts in (3, 103, 203, 303)
+        and task_sts in (3, 103)
+        order by priority desc,start_time,task_no asc
+    </select>
+
+    <select id="selectManualByAnalyzeSts" resultType="com.zy.asrs.wcs.core.entity.Task">
+        select * from wcs_task
+        where 1=1
+          and task_sts in (402)
+        order by priority desc,start_time,task_no asc
+    </select>
+
+    <select id="selectManualByExecuteSts" resultType="com.zy.asrs.wcs.core.entity.Task">
+        select * from wcs_task
+        where 1=1
+          and task_sts in (403)
         order by priority desc,start_time,task_no asc
     </select>
 

--
Gitblit v1.9.1