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