From 39a729e911ca4e5fb1c629fabf71cc3cf02dade8 Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期六, 12 十月 2024 16:37:19 +0800
Subject: [PATCH] #

---
 zy-asrs-flow/src/pages/task/task/index.jsx                                                         |   80 +++++-
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java                     |  165 ++++++++++----
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/DeviceTimer.java                              |   30 -
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskController.java                      |  129 +++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java                           |   12 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandParam.java               |   10 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java                                |    9 
 zy-asrs-flow/src/global.less                                                                       |    4 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandUpdateCompleteParam.java |   14 +
 zy-asrs-flow/src/pages/task/task/components/shuttleCommand.jsx                                     |  169 +++++++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandRollbackParam.java       |   12 +
 11 files changed, 537 insertions(+), 97 deletions(-)

diff --git a/zy-asrs-flow/src/global.less b/zy-asrs-flow/src/global.less
index 9618d1f..682b68f 100644
--- a/zy-asrs-flow/src/global.less
+++ b/zy-asrs-flow/src/global.less
@@ -96,4 +96,8 @@
 
 .centered-select .ant-select-selection-item {
   text-align: center;
+}
+
+.highlight-row {
+  background-color: #00d9ff;
 }
\ No newline at end of file
diff --git a/zy-asrs-flow/src/pages/task/task/components/shuttleCommand.jsx b/zy-asrs-flow/src/pages/task/task/components/shuttleCommand.jsx
new file mode 100644
index 0000000..b205f0a
--- /dev/null
+++ b/zy-asrs-flow/src/pages/task/task/components/shuttleCommand.jsx
@@ -0,0 +1,169 @@
+import React, { useState, useRef, useEffect } from 'react';
+import { Form, Modal, Space, Table, Tag, Switch, message } from 'antd';
+import { FormattedMessage, useIntl } from '@umijs/max';
+import moment from 'moment';
+import Http from '@/utils/http';
+
+const ShuttleCommand = (props) => {
+    const intl = useIntl();
+    const [form] = Form.useForm();
+    const { } = props;
+    const [commandData, setCommandData] = useState([]);
+
+    const getCommands = () => {
+        Http.doPost('api/task/shuttleCommand', {
+            taskNo: props.values.taskNo
+        }).then(resp => {
+            if (resp.data != null) {
+                setCommandData(resp.data.records)
+            }
+        })
+    }
+
+    const toggle = async (record) => {
+        const hide = message.loading(intl.formatMessage({ id: 'page.updating', defaultMessage: '姝e湪鏇存柊' }));
+        try {
+            const resp = await Http.doPost('api/task/shuttleCommand/completeSwitch', {
+                taskNo: props.values.taskNo,
+                index: record.index,
+                complete: !record.complete
+            });
+            if (resp.code === 200) {
+                getCommands()
+                message.success(intl.formatMessage({ id: 'page.update.success', defaultMessage: '鏇存柊鎴愬姛' }));
+                return true;
+            } else {
+                message.error(resp.msg);
+                return false;
+            }
+        } catch (error) {
+            message.error(intl.formatMessage({ id: 'page.update.fail', defaultMessage: '鏇存柊澶辫触璇烽噸璇曪紒' }));
+            return false;
+        } finally {
+            hide();
+        }
+    };
+
+    const commandRollback = async (record) => {
+        const hide = message.loading(intl.formatMessage({ id: 'page.updating', defaultMessage: '姝e湪鏇存柊' }));
+        try {
+            const resp = await Http.doPost('api/task/shuttleCommand/commandRollback', {
+                taskNo: props.values.taskNo,
+                index: record.index
+            });
+            if (resp.code === 200) {
+                getCommands()
+                message.success(intl.formatMessage({ id: 'page.update.success', defaultMessage: '鏇存柊鎴愬姛' }));
+                return true;
+            } else {
+                message.error(resp.msg);
+                return false;
+            }
+        } catch (error) {
+            message.error(intl.formatMessage({ id: 'page.update.fail', defaultMessage: '鏇存柊澶辫触璇烽噸璇曪紒' }));
+            return false;
+        } finally {
+            hide();
+        }
+    }
+
+    const highlightRow = (record, index) => {
+        const isHighlight = record.commandStep === index;
+        return isHighlight ? 'highlight-row' : '';
+    };
+
+    const columns = [
+        {
+            title: '鍛戒护绫诲瀷',
+            dataIndex: 'mode$',
+            key: 'mode$',
+        },
+        {
+            title: '璧风偣',
+            dataIndex: 'start',
+            key: 'start',
+        },
+        {
+            title: '缁堢偣',
+            dataIndex: 'target',
+            key: 'target',
+        },
+        {
+            title: '鍛戒护鎶ユ枃',
+            dataIndex: 'body',
+            key: 'body',
+            ellipsis: true,
+        },
+        {
+            title: '绌挎杞D',
+            dataIndex: 'shuttleNo',
+            key: 'shuttleNo',
+        },
+        {
+            title: '鏄惁瀹屾垚',
+            key: 'complete',
+            dataIndex: 'complete',
+            render: (_, record) => (
+                <>
+                    <Switch checkedChildren="瀹屾垚" unCheckedChildren="鏈畬鎴�" checked={record.complete} onClick={async () => {
+                        toggle(record)
+                    }} />
+                </>
+            ),
+        },
+        {
+            title: '鎿嶄綔',
+            key: 'action',
+            render: (_, record) => (
+                <Space size="middle">
+                    <a onClick={async () => {
+                        commandRollback(record)
+                    }}>
+                        鍥為��鍛戒护
+                    </a>
+                </Space>
+            ),
+        },
+    ];
+
+    useEffect(() => {
+        form.resetFields();
+        form.setFieldsValue({
+            ...props.values
+        })
+
+        getCommands()
+    }, [form, props])
+
+    const handleCancel = () => {
+        props.onCancel();
+    };
+
+    const handleOk = () => {
+        form.submit();
+    }
+
+    const handleFinish = async (values) => {
+        props.onSubmit({ ...values });
+    }
+
+    return (
+        <>
+            <Modal
+                title={
+                    intl.formatMessage({ id: 'page.shuttleCommand', defaultMessage: '绌挎杞︽寚浠�' })
+                }
+                width={640}
+                forceRender
+                destroyOnClose
+                open={props.open}
+                onCancel={handleCancel}
+                onOk={handleOk}
+            >
+                <Table columns={columns} dataSource={commandData} rowClassName={highlightRow} />
+            </Modal>
+        </>
+    )
+}
+
+export default ShuttleCommand;
diff --git a/zy-asrs-flow/src/pages/task/task/index.jsx b/zy-asrs-flow/src/pages/task/task/index.jsx
index c98f635..6f7590f 100644
--- a/zy-asrs-flow/src/pages/task/task/index.jsx
+++ b/zy-asrs-flow/src/pages/task/task/index.jsx
@@ -1,6 +1,6 @@
 
 import React, { useState, useRef, useEffect } from 'react';
-import { Button, message, Modal, Tag  } from 'antd';
+import { Button, message, Modal, Tag } from 'antd';
 import {
     FooterToolbar,
     PageContainer,
@@ -11,6 +11,7 @@
 import { PlusOutlined, ExportOutlined } from '@ant-design/icons';
 import Http from '@/utils/http';
 import Edit from './components/edit'
+import ShuttleCommand from './components/shuttleCommand'
 import { TextFilter, SelectFilter, DatetimeRangeFilter, LinkFilter } from '@/components/TableSearch'
 import { statusMap } from '@/utils/enum-util'
 import { repairBug } from '@/utils/common-util';
@@ -131,13 +132,13 @@
     }
 };
 
-
 const Main = () => {
     const intl = useIntl();
     const formTableRef = useRef();
     const actionRef = useRef();
     const [selectedRows, setSelectedRows] = useState([]);
     const [modalVisible, setModalVisible] = useState(false);
+    const [shuttleCommandModalVisible, setShuttleCommandModalVisible] = useState(false);
     const [currentRow, setCurrentRow] = useState();
     const [searchParam, setSearchParam] = useState({});
 
@@ -525,7 +526,7 @@
         {
             title: '鎿嶄綔',
             dataIndex: 'option',
-            width: 240,
+            width: 300,
             valueType: 'option',
             render: (_, record) => [
                 <Button
@@ -537,6 +538,16 @@
                     }}
                 >
                     <FormattedMessage id='page.edit' defaultMessage='缂栬緫' />
+                </Button>,
+                <Button
+                    type="link"
+                    key="shuttleCommand"
+                    onClick={() => {
+                        setShuttleCommandModalVisible(true);
+                        setCurrentRow(record);
+                    }}
+                >
+                    <FormattedMessage id='page.shuttleCommand' defaultMessage='绌挎杞︽寚浠�' />
                 </Button>,
                 // <Button
                 //     type="link"
@@ -580,25 +591,25 @@
                     <FormattedMessage id='page.complete' defaultMessage='瀹屾垚' />
                 </Button>,
                 <Button
-                type="link"
-                key="cancel"
-                onClick={async () => {
-                    Modal.confirm({
-                        title: intl.formatMessage({ id: 'page.cancel', defaultMessage: '鍙栨秷' }),
-                        content: intl.formatMessage({ id: 'page.cancel.confirm', defaultMessage: '纭畾鍙栨秷璇ラ」鍚楋紵' }),
-                        onOk: async () => {
-                            const success = await handleCancel([record], intl);
-                            if (success) {
-                                if (actionRef.current) {
-                                    actionRef.current.reload();
+                    type="link"
+                    key="cancel"
+                    onClick={async () => {
+                        Modal.confirm({
+                            title: intl.formatMessage({ id: 'page.cancel', defaultMessage: '鍙栨秷' }),
+                            content: intl.formatMessage({ id: 'page.cancel.confirm', defaultMessage: '纭畾鍙栨秷璇ラ」鍚楋紵' }),
+                            onOk: async () => {
+                                const success = await handleCancel([record], intl);
+                                if (success) {
+                                    if (actionRef.current) {
+                                        actionRef.current.reload();
+                                    }
                                 }
-                            }
-                        },
-                    });
-                }}
-            >
-                <FormattedMessage id='page.cancel' defaultMessage='鍙栨秷' />
-            </Button>,
+                            },
+                        });
+                    }}
+                >
+                    <FormattedMessage id='page.cancel' defaultMessage='鍙栨秷' />
+                </Button>,
             ],
         },
     ];
@@ -743,6 +754,33 @@
                     }
                 }}
             />
+
+            <ShuttleCommand
+                open={shuttleCommandModalVisible}
+                values={currentRow || {}}
+                onCancel={
+                    () => {
+                        setShuttleCommandModalVisible(false);
+                        setCurrentRow(undefined);
+                    }
+                }
+                onSubmit={async (values) => {
+                    let ok = false;
+                    if (values.id) {
+                        ok = await handleUpdate({ ...values }, intl)
+                    } else {
+                        ok = await handleSave({ ...values }, intl)
+                    }
+                    if (ok) {
+                        setShuttleCommandModalVisible(false);
+                        setCurrentRow(undefined);
+                        if (actionRef.current) {
+                            actionRef.current.reload();
+                        }
+                    }
+                }}
+            />
+
         </PageContainer>
     );
 };
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java
index 44bcacd..730dcd8 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java
@@ -133,12 +133,14 @@
         int commandStep = redisCommand.getCommandStep();
 
         // 瀹岀粨涓婁竴鏉″懡浠�
+        boolean updateCommand = false;
         if (commandStep != 0) {
             ShuttleCommand command = commands.get(commandStep - 1);
             if (command.getMode() == ShuttleCommandModeType.MOVE.id) {
                 // 姝e父绉诲姩
                 if (command.getTargetLocNo().equals(shuttleProtocol.getCurrentLocNo())) {
                     command.setComplete(true);
+                    updateCommand = true;
                     //瑙i攣閿佸畾璺緞锛屼笂涓�鏉¤矾寰�
                     List<NavigateNode> nodes = null;
                     try {
@@ -166,6 +168,7 @@
                 //鍒ゆ柇鏄惁椤跺崌鍒颁綅
                 if (shuttleProtocol.getHasLift()) {
                     command.setComplete(true);
+                    updateCommand = true;
 //                    //鍒ゆ柇鏄惁鏈夌墿
 //                    if (shuttleProtocol.getHasPallet()) {
 //                        command.setComplete(true);
@@ -176,19 +179,24 @@
                 // 鍒ゆ柇鏄惁涓嬮檷鍒颁綅
                 if (!shuttleProtocol.getHasLift()) {
                     command.setComplete(true);
+                    updateCommand = true;
                 }
             } else if (command.getMode() == ShuttleCommandModeType.CHARGE_OPEN.id) {
                 // 鍏呯數寮�
                 //鍒ゆ柇灏忚溅鍏呯數鐘舵��
                 if (shuttleProtocol.getHasCharge()) {
                     command.setComplete(true);
+                    updateCommand = true;
                 }
             }else {
                 command.setComplete(true);//鍏朵粬鍛戒护榛樿璁や负瀹屾垚
+                updateCommand = true;
             }
 
-            // 鏇存柊redis鏁版嵁
-            redisUtil.set(DeviceRedisConstant.SHUTTLE_WORK_FLAG + redisCommand.getTaskNo(), JSON.toJSONString(redisCommand, SerializerFeature.DisableCircularReferenceDetect));
+            if(updateCommand) {
+                // 鏇存柊redis鏁版嵁
+                redisUtil.set(DeviceRedisConstant.SHUTTLE_WORK_FLAG + redisCommand.getTaskNo(), JSON.toJSONString(redisCommand, SerializerFeature.DisableCircularReferenceDetect));
+            }
 
             if (!command.getComplete()) {
                 return false;
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskController.java
index bc93451..f991b05 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskController.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/TaskController.java
@@ -1,22 +1,39 @@
 package com.zy.asrs.wcs.core.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 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.ShuttleCommandParam;
+import com.zy.asrs.wcs.core.domain.param.ShuttleCommandRollbackParam;
+import com.zy.asrs.wcs.core.domain.param.ShuttleCommandUpdateCompleteParam;
 import com.zy.asrs.wcs.core.entity.Motion;
 import com.zy.asrs.wcs.core.entity.MotionLog;
 import com.zy.asrs.wcs.core.entity.Task;
 import com.zy.asrs.wcs.core.entity.TaskLog;
+import com.zy.asrs.wcs.core.model.NavigateNode;
+import com.zy.asrs.wcs.core.model.command.ShuttleAssignCommand;
+import com.zy.asrs.wcs.core.model.command.ShuttleCommand;
+import com.zy.asrs.wcs.core.model.command.ShuttleRedisCommand;
+import com.zy.asrs.wcs.core.model.enums.ShuttleCommandModeType;
 import com.zy.asrs.wcs.core.model.enums.TaskStsType;
 import com.zy.asrs.wcs.core.service.MotionLogService;
 import com.zy.asrs.wcs.core.service.MotionService;
 import com.zy.asrs.wcs.core.service.TaskLogService;
 import com.zy.asrs.wcs.core.service.TaskService;
+import com.zy.asrs.wcs.core.utils.RedisUtil;
+import com.zy.asrs.wcs.core.utils.Utils;
+import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
 import com.zy.asrs.wcs.system.controller.BaseController;
 import com.zy.asrs.wcs.utils.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +56,10 @@
     private MotionService motionService;
     @Autowired
     private MotionLogService motionLogService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private ObjectMapper objectMapper;
 
     @PreAuthorize("hasAuthority('core:task:list')")
     @PostMapping("/task/page")
@@ -190,4 +211,112 @@
 
         return R.ok("鍙栨秷鎴愬姛");
     }
+
+    @PreAuthorize("hasAuthority('core:task:list')")
+    @PostMapping("/task/shuttleCommand")
+    public R shuttleCommand(@RequestBody ShuttleCommandParam param) {
+        Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_WORK_FLAG + param.getTaskNo());
+        if (object == null) {
+            return R.ok();
+        }
+
+        ShuttleRedisCommand redisCommand = null;
+        try {
+            redisCommand = objectMapper.readValue(String.valueOf(object), ShuttleRedisCommand.class);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+
+        if (redisCommand == null) {
+            return R.ok();
+        }
+
+        HashMap<String, Object> hashMap = new HashMap<>();
+        ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
+        List<ShuttleCommand> commands = assignCommand.getCommands();
+        Integer commandStep = redisCommand.getCommandStep();//褰撳墠姝ュ簭
+
+        ArrayList<JSONObject> list = new ArrayList<>();
+        int index = 0;
+        for (ShuttleCommand command : commands) {
+            JSONObject data = JSON.parseObject(JSON.toJSONString(command));
+            data.put("index", index++);
+            data.put("commandStep", commandStep);
+
+            ShuttleCommandModeType type = ShuttleCommandModeType.get(command.getMode());
+            if (type == null) {
+                data.put("mode$", command.getMode());
+            }else {
+                data.put("mode$", type.desc);
+            }
+
+            if (command.getNodes() != null) {
+                List<NavigateNode> nodes = command.getNodes();
+                NavigateNode start = nodes.get(0);
+                NavigateNode target = nodes.get(nodes.size() - 1);
+                data.put("start", Utils.getLocNo(start.getX(), start.getY(), start.getZ()));
+                data.put("target", Utils.getLocNo(target.getX(), target.getY(), target.getZ()));
+            }
+
+            list.add(data);
+        }
+
+
+        hashMap.put("total", commands.size());
+        hashMap.put("records", list);
+        hashMap.put("commandStep", commandStep);
+        return R.ok().add(hashMap);
+    }
+
+    @PreAuthorize("hasAuthority('core:task:list')")
+    @PostMapping("/task/shuttleCommand/completeSwitch")
+    public R shuttleCommandCompleteSwitch(@RequestBody ShuttleCommandUpdateCompleteParam param) {
+        Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_WORK_FLAG + param.getTaskNo());
+        if (object == null) {
+            return R.error("鎸囦护涓嶅瓨鍦�");
+        }
+
+        ShuttleRedisCommand redisCommand = null;
+        try {
+            redisCommand = objectMapper.readValue(String.valueOf(object), ShuttleRedisCommand.class);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+
+        if (redisCommand == null) {
+            return R.error("鎸囦护涓嶅瓨鍦�");
+        }
+
+        ShuttleAssignCommand assignCommand = redisCommand.getAssignCommand();
+        List<ShuttleCommand> commands = assignCommand.getCommands();
+        ShuttleCommand command = commands.get(param.getIndex());
+        command.setComplete(param.getComplete());
+
+        redisUtil.set(DeviceRedisConstant.SHUTTLE_WORK_FLAG + param.getTaskNo(), JSON.toJSONString(redisCommand, SerializerFeature.DisableCircularReferenceDetect));
+        return R.ok();
+    }
+
+    @PreAuthorize("hasAuthority('core:task:list')")
+    @PostMapping("/task/shuttleCommand/commandRollback")
+    public R shuttleCommandRollback(@RequestBody ShuttleCommandRollbackParam param) {
+        Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_WORK_FLAG + param.getTaskNo());
+        if (object == null) {
+            return R.error("鎸囦护涓嶅瓨鍦�");
+        }
+
+        ShuttleRedisCommand redisCommand = null;
+        try {
+            redisCommand = objectMapper.readValue(String.valueOf(object), ShuttleRedisCommand.class);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+
+        if (redisCommand == null) {
+            return R.error("鎸囦护涓嶅瓨鍦�");
+        }
+
+        redisCommand.setCommandStep(param.getIndex());
+        redisUtil.set(DeviceRedisConstant.SHUTTLE_WORK_FLAG + param.getTaskNo(), JSON.toJSONString(redisCommand, SerializerFeature.DisableCircularReferenceDetect));
+        return R.ok();
+    }
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandParam.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandParam.java
new file mode 100644
index 0000000..38af64e
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandParam.java
@@ -0,0 +1,10 @@
+package com.zy.asrs.wcs.core.domain.param;
+
+import lombok.Data;
+
+@Data
+public class ShuttleCommandParam {
+
+    private String taskNo;
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandRollbackParam.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandRollbackParam.java
new file mode 100644
index 0000000..a96e142
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandRollbackParam.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wcs.core.domain.param;
+
+import lombok.Data;
+
+@Data
+public class ShuttleCommandRollbackParam {
+
+    private String taskNo;
+
+    private Integer index;
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandUpdateCompleteParam.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandUpdateCompleteParam.java
new file mode 100644
index 0000000..b7f0dee
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/domain/param/ShuttleCommandUpdateCompleteParam.java
@@ -0,0 +1,14 @@
+package com.zy.asrs.wcs.core.domain.param;
+
+import lombok.Data;
+
+@Data
+public class ShuttleCommandUpdateCompleteParam {
+
+    private String taskNo;
+
+    private Integer index;
+
+    private Boolean complete;
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/DeviceTimer.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/DeviceTimer.java
index 9df4890..a4a4f30 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/DeviceTimer.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/DeviceTimer.java
@@ -28,27 +28,15 @@
     @Autowired
     private LiftAction liftAction;
 
-    @Scheduled(cron = "0/1 * * * * ? ")
-    public synchronized void executeShuttle() {
-        List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>()
-                .eq(Device::getStatus, 1)
-                .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()));
-        for (Device device : list) {
-            //灏忚溅绌洪棽涓旀湁璺戝簱绋嬪簭
-            shuttleAction.moveLoc(device);
-
-            Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_FLAG + device.getDeviceNo());
-            if (object == null) {
-                continue;
-            }
-
-            Integer taskNo = Integer.valueOf(String.valueOf(object));
-            if (taskNo != 0) {
-                //瀛樺湪浠诲姟闇�瑕佹墽琛�
-                boolean result = shuttleAction.executeWork(device, taskNo);
-            }
-        }
-    }
+//    @Scheduled(cron = "0/1 * * * * ? ")
+//    public synchronized void executeShuttle() {
+//        List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>()
+//                .eq(Device::getStatus, 1)
+//                .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()));
+//        for (Device device : list) {
+//
+//        }
+//    }
 
     @Scheduled(cron = "0/1 * * * * ? ")
     public synchronized void executeLift() {
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
index 914afbe..27f19dd 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
@@ -45,10 +45,11 @@
                 .eq(Task::getStatus, 1)
                 .in(Task::getTaskSts, taskSts));
         for (Task task : tasks) {
-
-            boolean httpRequest = doHttpRequest(task, "127.0.0.1:8080", "/wms/open/asrs//wrkMast/finish/v1");
-            if (!httpRequest) {
-                return;
+            if(task.getTaskSts().equals(TaskStsType.COMPLETE_INBOUND.sts) || task.getTaskSts().equals(TaskStsType.COMPLETE_OUTBOUND.sts)){
+                boolean httpRequest = doHttpRequest(task, "127.0.0.1:8080", "/wms/open/asrs//wrkMast/finish/v1");
+                if (!httpRequest) {
+                    return;
+                }
             }
 
             //璁板綍搴撳瓨淇℃伅
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java
index 19e3251..56f00c1 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/NyShuttleThread.java
@@ -9,6 +9,7 @@
 import com.zy.asrs.framework.common.SpringUtils;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wcs.common.ExecuteSupport;
+import com.zy.asrs.wcs.core.action.ShuttleAction;
 import com.zy.asrs.wcs.core.domain.param.ShuttleMoveLocParam;
 import com.zy.asrs.wcs.core.entity.BasShuttle;
 import com.zy.asrs.wcs.core.entity.Loc;
@@ -62,6 +63,9 @@
 
     private List<JSONObject> socketResults = new ArrayList<>();
 
+    //鍘熷璁惧鏁版嵁
+    private Object originDeviceData;
+
     public NyShuttleThread(Device device, RedisUtil redisUtil) {
         this.device = device;
         this.redisUtil = redisUtil;
@@ -75,18 +79,118 @@
         //鐩戝惉娑堟伅骞跺瓨鍌�
         Thread innerThread = new Thread(() -> {
             while (true) {
-                listenSocketMessage();
+                try {
+                    listenSocketMessage();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
             }
         });
         innerThread.start();
 
-        while (true) {
-            try {
-                read();
-                Thread.sleep(500);
-            } catch (Exception e) {
-                log.error("ShuttleThread Fail", e);
+        //璁惧璇诲彇
+        Thread readThread = new Thread(() -> {
+            while (true) {
+                try {
+                    read();
+                    Thread.sleep(50);
+                } catch (Exception e) {
+                    log.error("ShuttleThread Fail", e);
+                }
             }
+        });
+        readThread.start();
+
+        //璁惧鎵ц
+        Thread executeThread = new Thread(() -> {
+            while (true) {
+                try {
+                    ShuttleAction shuttleAction = SpringUtils.getBean(ShuttleAction.class);
+                    if (shuttleAction == null) {
+                        continue;
+                    }
+
+                    Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_FLAG + device.getDeviceNo());
+                    if (object == null) {
+                        continue;
+                    }
+
+                    Integer taskNo = Integer.valueOf(String.valueOf(object));
+                    if (taskNo != 0) {
+                        //瀛樺湪浠诲姟闇�瑕佹墽琛�
+                        boolean result = shuttleAction.executeWork(device, taskNo);
+                    }
+
+                    //灏忚溅绌洪棽涓旀湁璺戝簱绋嬪簭
+                    shuttleAction.moveLoc(device);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+        executeThread.start();
+
+        //鍏朵粬浠诲姟
+        Thread otherThread = new Thread(() -> {
+            while (true) {
+                try {
+                    listenInit();//鐩戝惉鍒濆鍖栦簨浠�
+                    saveLog();//淇濆瓨鏁版嵁
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+        otherThread.start();
+    }
+
+    private void saveLog() {
+        if (shuttleProtocol == null) {
+            return;
+        }
+
+        if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) {
+            if (this.originDeviceData != null) {
+                //閲囬泦鏃堕棿瓒呰繃5s锛屼繚瀛樹竴娆℃暟鎹褰�
+                //淇濆瓨鏁版嵁璁板綍
+                DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class);
+                DeviceDataLog deviceDataLog = new DeviceDataLog();
+                deviceDataLog.setOriginData(JSON.toJSONString(this.originDeviceData));
+                deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol));
+                deviceDataLog.setType(String.valueOf(SlaveType.Shuttle));
+                deviceDataLog.setDeviceNo(String.valueOf(shuttleProtocol.getShuttleNo()));
+                deviceDataLog.setCreateTime(new Date());
+                deviceDataLog.setHostId(device.getHostId());
+                deviceDataLogService.save(deviceDataLog);
+
+                //鏇存柊閲囬泦鏃堕棿
+                shuttleProtocol.setDeviceDataLog(System.currentTimeMillis());
+            }
+        }
+
+        //灏嗗洓鍚戠┛姊溅鐘舵�佷繚瀛樿嚦鏁版嵁搴�
+        BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class);
+        BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>()
+                .eq(BasShuttle::getShuttleNo, device.getDeviceNo())
+                .eq(BasShuttle::getHostId, device.getHostId()));
+        if (basShuttle == null) {
+            basShuttle = new BasShuttle();
+            //鍥涘悜绌挎杞﹀彿
+            basShuttle.setShuttleNo(Integer.valueOf(device.getDeviceNo()));
+            basShuttle.setStatus(1);
+            basShuttle.setDeleted(0);
+            basShuttle.setHostId(device.getHostId());
+            basShuttle.setDeviceId(device.getId().intValue());
+            shuttleService.save(basShuttle);
+        }
+        //浠诲姟鍙�
+        basShuttle.setTaskNo(shuttleProtocol.getTaskNo().intValue());
+        //淇敼鏃堕棿
+        basShuttle.setUpdateTime(new Date());
+        //璁惧鐘舵��
+        basShuttle.setProtocol(JSON.toJSONString(shuttleProtocol));
+        if (shuttleService.updateById(basShuttle)) {
+            OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), device.getDeviceNo()));
         }
     }
 
@@ -167,7 +271,6 @@
                 this.connect();
             }
             readStatus();
-            listenInit();//鐩戝惉鍒濆鍖栦簨浠�
         } catch (Exception e) {
             e.printStackTrace();
             OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戣鍙栧洓鍚戠┛姊溅鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort()));
@@ -246,47 +349,9 @@
                     shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE);
                 }
 
-                if (System.currentTimeMillis() - shuttleProtocol.getDeviceDataLog() > 1000 * 5) {
-                    //閲囬泦鏃堕棿瓒呰繃5s锛屼繚瀛樹竴娆℃暟鎹褰�
-                    //淇濆瓨鏁版嵁璁板綍
-                    DeviceDataLogService deviceDataLogService = SpringUtils.getBean(DeviceDataLogService.class);
-                    DeviceDataLog deviceDataLog = new DeviceDataLog();
-                    deviceDataLog.setOriginData(JSON.toJSONString(data));
-                    deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol));
-                    deviceDataLog.setType(String.valueOf(SlaveType.Shuttle));
-                    deviceDataLog.setDeviceNo(String.valueOf(shuttleProtocol.getShuttleNo()));
-                    deviceDataLog.setCreateTime(new Date());
-                    deviceDataLog.setHostId(device.getHostId());
-                    deviceDataLogService.save(deviceDataLog);
+                this.originDeviceData = data;
 
-                    //鏇存柊閲囬泦鏃堕棿
-                    shuttleProtocol.setDeviceDataLog(System.currentTimeMillis());
-                }
-
-                //灏嗗洓鍚戠┛姊溅鐘舵�佷繚瀛樿嚦鏁版嵁搴�
-                BasShuttleService shuttleService = SpringUtils.getBean(BasShuttleService.class);
-                BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>()
-                        .eq(BasShuttle::getShuttleNo, device.getDeviceNo())
-                        .eq(BasShuttle::getHostId, device.getHostId()));
-                if (basShuttle == null) {
-                    basShuttle = new BasShuttle();
-                    //鍥涘悜绌挎杞﹀彿
-                    basShuttle.setShuttleNo(Integer.valueOf(device.getDeviceNo()));
-                    basShuttle.setStatus(1);
-                    basShuttle.setDeleted(0);
-                    basShuttle.setHostId(device.getHostId());
-                    basShuttle.setDeviceId(device.getId().intValue());
-                    shuttleService.save(basShuttle);
-                }
-                //浠诲姟鍙�
-                basShuttle.setTaskNo(shuttleProtocol.getTaskNo().intValue());
-                //淇敼鏃堕棿
-                basShuttle.setUpdateTime(new Date());
-                //璁惧鐘舵��
-                basShuttle.setProtocol(JSON.toJSONString(shuttleProtocol));
-                if (shuttleService.updateById(basShuttle)) {
-                    OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), device.getDeviceNo()));
-                }
+                OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), device.getDeviceNo()));
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -323,7 +388,6 @@
                 Integer requestId = resultHeader.getInteger("requestId");
                 if (requestType.equals("init")) {
                     Integer code = resultBody.getInteger("code");
-                    OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", code, device.getId(), device.getIp(), device.getPort()));
                     //灏忚溅澶嶄綅璇锋眰
                     ShuttleCommand initCommand = getInitCommand(requestId, code);
                     //鍙戝嚭璇锋眰
@@ -331,6 +395,9 @@
                     JSONObject requestResult = requestCommand(httpCommand);
 
                     removeIdx = i;//姝ゆ暟鎹凡缁忓鐞嗭紝浠庣粨鏋滈泦涓墧闄�
+
+                    log.info(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", device.getId(), code, device.getIp(), device.getPort()));
+                    OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", device.getId(), code, device.getIp(), device.getPort()));
                     break;
                 }
             }

--
Gitblit v1.9.1