From fceece174b6da6ec1a8c59b1cf8c83ac59008939 Mon Sep 17 00:00:00 2001 From: yanps Date: Mon, 18 Mar 2024 09:12:01 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E6=B7=BB=E5=8A=A0=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- acs/nladmin-system/pom.xml | 18 ++- .../java/org/nl/acs/device/wql/task_inst.xls | Bin 308736 -> 308736 bytes .../agv/ndcone/AgvNdcOneDeviceDriver.java | 10 +- .../StandardOrdinarySiteDeviceDriver.java | 19 +++ .../task/service/impl/TaskServiceImpl.java | 1 + .../modules/quartz/task/AutoCreateInst.java | 135 ++++++++++++++++-- .../main/resources/config/application-dev.yml | 4 +- .../device/driver/standard_ordinary_site.vue | 21 ++- acs/nladmin-ui/src/views/acs/task/index.vue | 1 + 9 files changed, 194 insertions(+), 15 deletions(-) diff --git a/acs/nladmin-system/pom.xml b/acs/nladmin-system/pom.xml index 80f2473..e94f0c6 100644 --- a/acs/nladmin-system/pom.xml +++ b/acs/nladmin-system/pom.xml @@ -68,12 +68,28 @@ org.openscada.jinterop org.openscada.jinterop.core - 2.1.8 + 2.1.8 + + org.bouncycastle + bcprov-jdk15on + + org.openscada.jinterop org.openscada.jinterop.deps 1.5.0 + + + org.bouncycastle + bcprov-jdk15on + + + + + org.bouncycastle + bcprov-jdk15on + 1.50 org.openscada.utgard diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls b/acs/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls index 665ebb77d2f6d83b4b567710488c0372ec3c6f0d..64abf0a154022685d37a9d92ed8e025e2f10e0cc 100644 GIT binary patch delta 67 zcmZp8Bh>IlXhRMQyTaGnT*F%u9oZ=b=&lCd5DIlXhRMQyTjh6&mYO$++57Em64l+fx+L;HNex=*>$obTlnMvHooQ=Z0$4H R7=f4xh?%#~U}MQx4*&==7A*h( diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java index c0bd72c..cc060e1 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java @@ -186,6 +186,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic JSONObject resp = JSONObject.parseObject(httpResponse.body()); if (resp.getInteger("status") == 200) { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + inst.setExecute_status("1"); log.info("指令号:{},acs请求wms取货申请成功,wms允许agv申请取货,已反馈agv允许取货", inst.getInstruction_code()); } else { log.warn("指令号:{},acs请求wms取货申请失败,wms不允许agv取货,未反馈agv允许取货", inst.getInstruction_code()); @@ -195,6 +196,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } } else { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + inst.setExecute_status("1"); } } //取货完毕 @@ -255,6 +257,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic JSONObject resp = JSONObject.parseObject(httpResponse.body()); if (resp.getInteger("status") == 200) { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + inst.setExecute_status("2"); log.info("指令号:{},acs反馈wms取货完成离开成功,wms允许agv取货完成离开,已反馈agv取货完成离开", inst.getInstruction_code()); } else { log.warn("指令号:{},acs反馈wms取货完成离开失败,wms不允许agv取货完成离开,未反馈agv取货完成离开", inst.getInstruction_code()); @@ -264,6 +267,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } } else { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + inst.setExecute_status("2"); } } //到达放货点 @@ -321,6 +325,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic JSONObject resp = JSONObject.parseObject(httpResponse.body()); if (resp.getInteger("status") == 200) { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + inst.setExecute_status("3"); log.info("指令号:{},acs请求wms放货申请成功,wms允许agv申请放货,已反馈agv允许放货", inst.getInstruction_code()); } else { log.warn("指令号:{},acs请求wms放货申请失败,wms不允许agv放货,未反馈agv允许放货", inst.getInstruction_code()); @@ -330,6 +335,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } } else { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + inst.setExecute_status("3"); } } @@ -388,6 +394,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic JSONObject resp = JSONObject.parseObject(httpResponse.body()); if (resp.getInteger("status") == 200) { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + inst.setExecute_status("4"); log.info("指令号:{},acs请求wms放货完成申请成功,wms允许agv放货完成,已反馈agv放货完成", inst.getInstruction_code()); } else { log.warn("指令号:{},acs请求wms放货完成离开失败,wms不允许agv放货完成离开,未反馈agv放货完成离开", inst.getInstruction_code()); @@ -397,9 +404,9 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } } else { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + inst.setExecute_status("4"); } } - } //到达位置点 //(需要WCS反馈) @@ -431,6 +438,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic phase = 0; logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + Bytes2HexString(data)); log.info("{},{}", device_code, "agvphase:" + phase + "反馈:" + Bytes2HexString(data)); + instructionService.update(inst); OneNDCSocketConnectionAutoRun.write(data); } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java index 70654b0..71260a0 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java @@ -1,6 +1,7 @@ package org.nl.acs.device_driver.basedriver.standard_ordinary_site; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import lombok.Data; import lombok.RequiredArgsConstructor; @@ -24,7 +25,9 @@ import org.nl.acs.task.service.TaskService; import org.nl.modules.wql.util.SpringContextHolder; import org.springframework.beans.factory.annotation.Autowired; +import java.util.ArrayList; import java.util.Date; +import java.util.List; /** @@ -186,6 +189,22 @@ public class StandardOrdinarySiteDeviceDriver extends AbstractDeviceDriver imple } + + public List getExtraDeviceCodes(String extraName) { + String extraValue = (String) this.getDevice().getExtraValue().get(extraName); + if (StrUtil.isEmpty(extraValue)) { + return new ArrayList<>(); + } + String devicesString = extraValue.substring(1, extraValue.length() - 1); + List devicesList = new ArrayList<>(); + String[] devices = devicesString.split(","); + for (int i = 0; i < devices.length; i++) { + String s = devices[i].replace("\"", "").replace("\"", ""); + devicesList.add(s); + } + return devicesList; + } + @Override public JSONObject getDeviceStatusName() { JSONObject jo = new JSONObject(); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java index 42f5660..72bafcf 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java @@ -145,6 +145,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { if (!StrUtil.isEmpty(is_over)) { map.put("is_over", is_over); } + map.put("create", "DESC"); final JSONObject jo = WQL.getWO("QTASK_QUERY").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), ""); return jo; diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java index e575119..48994d2 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java @@ -1,12 +1,17 @@ package org.nl.modules.quartz.task; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; +import org.nl.acs.device_driver.basedriver.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; import org.nl.acs.route.service.RouteLineService; @@ -16,8 +21,9 @@ import org.nl.acs.task.service.dto.TaskDto; import org.nl.modules.wql.util.SpringContextHolder; import org.springframework.stereotype.Component; -import java.util.Arrays; -import java.util.List; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; /** * 自动创建指令 @@ -26,6 +32,8 @@ import java.util.List; @Component public class AutoCreateInst { + + /** * 根据任务状态创建指令、生成下一条指令 * 创建指令前需要判断是否条件具备:起始位置是否有货、目标位置是否有货 @@ -35,13 +43,120 @@ public class AutoCreateInst { InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class); DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); - - List list = taskserver.queryAll("task_status = '0'"); + List list = taskserver.queryAll("task_status = '0' ORDER BY create_time ASC"); + List list2 = taskserver.queryAll("task_status = '1' ORDER BY create_time ASC"); + Map> collect = list.stream().sorted(Comparator.comparing(TaskDto::getCreate_time)) + .collect(Collectors.groupingBy(TaskDto::getPriority)); + TreeMap> treeMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + return o2.compareTo(o1); + } + }); + treeMap.putAll(collect); + for (List value : treeMap.values()) { + list = value; + if(CollUtil.isNotEmpty(list)){ + break; + } + } for (int i = 0; i < list.size(); i++) { TaskDto acsTask = list.get(i); - if(StrUtil.equals(acsTask.getTask_type(),"7") && !StrUtil.startWith(acsTask.getTask_code(), "-") ){ + if (StrUtil.equals(acsTask.getTask_type(), "7") && !StrUtil.startWith(acsTask.getTask_code(), "-")) { continue; } + Device startDevice = appService.findDeviceByCode(acsTask.getStart_device_code()); + Device nextDevice = appService.findDeviceByCode(acsTask.getNext_device_code()); + StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; + if (i > 0 && acsTask.getTask_type().equals(list.get(i - 1).getTask_type())) { + if (startDevice.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) startDevice.getDeviceDriver(); + List link_device_code = standardOrdinarySiteDeviceDriver.getExtraDeviceCodes("link_device_code"); + Boolean flag = false; + for (String s : link_device_code) { + if (s.equals(list.get(i - 1).getStart_device_code())) { + flag = true; + log.error("当前任务号{},已创建同列起点导致创建指令失败,起点为{},终点为{}", acsTask.getTask_code(), acsTask.getStart_device_code(), acsTask.getNext_device_code()); + break; + } + } + if (flag) { + acsTask.setRemark("同列起点已存在,创建指令失败"); + taskserver.update(acsTask); + continue; + } + } else if (nextDevice.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) nextDevice.getDeviceDriver(); + List link_device_code = standardOrdinarySiteDeviceDriver.getExtraDeviceCodes("link_device_code"); + Boolean flag = false; + for (String s : link_device_code) { + if (s.equals(list.get(i - 1).getNext_device_code())) { + flag = true; + log.error("当前任务号{},已创建同列起点导致创建指令失败,起点为{},终点为{}", acsTask.getTask_code(), acsTask.getStart_device_code(), acsTask.getNext_device_code()); + break; + } + } + if (flag) { + acsTask.setRemark("同列起点已存在,创建指令失败"); + taskserver.update(acsTask); + continue; + } + } + } + Boolean flag2 = false; + if (CollUtil.isNotEmpty(list2)) { + for (TaskDto taskDto : list2) { + if (taskDto.getTask_type().equals(acsTask.getTask_type())) { + if (startDevice.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) startDevice.getDeviceDriver(); + List link_device_code = standardOrdinarySiteDeviceDriver.getExtraDeviceCodes("link_device_code"); + Boolean flag = false; + for (String s : link_device_code) { + if (s.equals(taskDto.getStart_device_code())) { + Instruction instruction = instructionService.findByTaskid(taskDto.getTask_id(), "instruction_status < 2"); + if (ObjectUtil.isEmpty(instruction) || (Integer.parseInt(StrUtil.isNotBlank + (instruction.getExecute_status()) ? instruction.getExecute_status() : "0") < 2)) { + flag = true; + log.error("当前任务号{},已创建同列起点导致创建指令失败,起点为{},终点为{}", acsTask.getTask_code(), acsTask.getStart_device_code(), acsTask.getNext_device_code()); + break; + } + } + } + if (flag) { + acsTask.setRemark("同列起点已存在,创建指令失败"); + taskserver.update(acsTask); + flag2 = true; + break; + } + } else if (nextDevice.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) nextDevice.getDeviceDriver(); + List link_device_code = standardOrdinarySiteDeviceDriver.getExtraDeviceCodes("link_device_code"); + Boolean flag = false; + for (String s : link_device_code) { + if (s.equals(taskDto.getNext_device_code())) { + Instruction instruction = instructionService.findByTaskid(taskDto.getTask_id(), "instruction_status < 2"); + if (ObjectUtil.isEmpty(instruction) || (Integer.parseInt(StrUtil.isNotBlank + (instruction.getExecute_status()) ? instruction.getExecute_status() : "0") <4)) { + flag = true; + log.error("当前任务号{},已创建同列起点导致创建指令失败,起点为{},终点为{}", acsTask.getTask_code(), acsTask.getStart_device_code(), acsTask.getNext_device_code()); + break; + } + } + } + if (flag) { + acsTask.setRemark("同列起点已存在,创建指令失败"); + taskserver.update(acsTask); + flag2 = true; + break; + } + } + } + } + if (flag2) { + continue; + } + } + acsTask.setRemark(""); String taskid = acsTask.getTask_id(); String taskcode = acsTask.getTask_code(); String task_type = acsTask.getTask_type(); @@ -92,14 +207,14 @@ public class AutoCreateInst { String type = routeLineDto.getType(); String[] str = path.split("->"); List pathlist = Arrays.asList(str); - int index = 0; + int index1 = 0; for (int m = 0; m < pathlist.size(); m++) { if (pathlist.get(m).equals(start_device_code)) { - index = m + 1; + index1 = m + 1; break; } } - next_device_code = pathlist.get(index); + next_device_code = pathlist.get(index1); if (StrUtil.equals(appService.findDeviceTypeByCode(next_device_code), "storage")) { next_point_code = next_device_code + "-" + acsTask.getTo_y() + "-" + acsTask.getTo_z(); @@ -151,8 +266,8 @@ public class AutoCreateInst { } //创建指令后修改任务状态 acsTask.setTask_status("1"); + acsTask.setRemark(""); taskserver.update(acsTask); - } } -} +} \ No newline at end of file diff --git a/acs/nladmin-system/src/main/resources/config/application-dev.yml b/acs/nladmin-system/src/main/resources/config/application-dev.yml index e9a67a5..112f764 100644 --- a/acs/nladmin-system/src/main/resources/config/application-dev.yml +++ b/acs/nladmin-system/src/main/resources/config/application-dev.yml @@ -13,11 +13,11 @@ spring: driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy # url: jdbc:log4jdbc:mysql://${DB_HOST:10.1.3.91}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:lzhl_one_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:wzgj_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lbkd_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: ${DB_USER:root} # password: ${DB_PWD:P@ssw0rd} # password: ${DB_PWD:Root.123456} - password: ${DB_PWD:password} + password: ${DB_PWD:123456} # 初始连接数 initial-size: 5 diff --git a/acs/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue b/acs/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue index 0cd0926..05b533f 100644 --- a/acs/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue +++ b/acs/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue @@ -102,6 +102,24 @@ + + + + + + + @@ -179,7 +197,8 @@ export default { station_manager: true, auto_clean_task: true, input_material: true, - reqWms: true + reqWms: true, + link_device_code: [] }, rules: {} } diff --git a/acs/nladmin-ui/src/views/acs/task/index.vue b/acs/nladmin-ui/src/views/acs/task/index.vue index 8302850..89d10eb 100644 --- a/acs/nladmin-ui/src/views/acs/task/index.vue +++ b/acs/nladmin-ui/src/views/acs/task/index.vue @@ -72,6 +72,7 @@