From 26fd3d191987070dc1e2cc1e3fd67fee3d258ab4 Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Thu, 11 Jan 2024 10:40:27 +0800 Subject: [PATCH] =?UTF-8?q?rev:=E6=B5=B7=E6=9F=94=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agv/server/impl/NDCAgvServiceImpl.java | 8 +- .../java/org/nl/acs/device/wql/task_inst.xls | Bin 190976 -> 162816 bytes .../HailiangHrSsxDeviceDriver.java | 72 ++-- .../main/java/org/nl/acs/ext/wms/AcsUtil.java | 20 +- .../org/nl/acs/ext/wms/liKuData/Resp.java | 13 +- .../liKuData/a/QueryNodeReaderRequest.java | 3 + .../service/impl/AcsToLiKuServiceImpl.java | 86 +--- .../service/impl/LiKuToAcsServiceImpl.java | 372 ++++++++---------- .../service/impl/InstructionServiceImpl.java | 12 +- .../quartz/task/AutoCreateAgvOneInst.java | 2 +- .../nl/modules/quartz/task/QueryRobot.java | 6 +- .../modules/system/rest/ParamController.java | 2 +- .../main/resources/config/application-dev.yml | 8 +- .../resources/config/application-prod.yml | 8 +- .../src/main/resources/log/AcsToLk.xml | 8 +- .../src/main/resources/log/AcsToMes.xml | 4 +- .../src/main/resources/logback-spring.xml | 54 +++ .../device/driver/hailiang_hr_ssx_station.vue | 19 +- wcs/nladmin-ui/src/views/acs/task/index.vue | 2 +- 19 files changed, 341 insertions(+), 358 deletions(-) diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java index 6ef48991..22c00340 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java @@ -33,7 +33,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { private final ParamService paramService; private Map AGVDeviceStatus = new HashMap(); - @LokiLog(type = LokiLogType.AGV) + //@LokiLog(type = LokiLogType.AGV) @Override public void deleteAgvInstToNDC(Instruction inst) throws Exception { if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) { @@ -66,7 +66,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { } - @LokiLog(type = LokiLogType.AGV) + //@LokiLog(type = LokiLogType.AGV) @Override public void deleteAgvOneInstToNDC(Instruction inst) throws Exception { if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) { @@ -99,7 +99,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { } - @LokiLog(type = LokiLogType.AGV) + //@LokiLog(type = LokiLogType.AGV) @Override public void sendAgvInstToNDC(String agv_system_type, Instruction inst) { if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) { @@ -357,7 +357,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { } - @LokiLog(type = LokiLogType.AGV) + //@LokiLog(type = LokiLogType.AGV) @Override public Map findAllAgvFromCache() { return AGVDeviceStatus; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls b/wcs/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls index ad7e3b89a25599c030cf1325c3f2b215b9f6e6bf..bb9ebcafc73545bc504baf1c3f4f9ddcc3e93bcd 100644 GIT binary patch delta 53282 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 delta 59550 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 diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_old/hailiang_hr_ssx/HailiangHrSsxDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_old/hailiang_hr_ssx/HailiangHrSsxDeviceDriver.java index 88ba88fa..34f1d9b1 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_old/hailiang_hr_ssx/HailiangHrSsxDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_old/hailiang_hr_ssx/HailiangHrSsxDeviceDriver.java @@ -14,6 +14,9 @@ import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.basedriver.hailiang_one.IssuedDeviceOrderInfo; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.ext.wms.liKuData.Resp; +import org.nl.acs.ext.wms.liKuData.a.ContainerArrivedRequest; +import org.nl.acs.ext.wms.liKuData.a.NodeStates; import org.nl.acs.ext.wms.service.AcsToLiKuService; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.LiKuToAcsService; @@ -35,6 +38,7 @@ import org.nl.acs.task.service.dto.TaskDto; import org.nl.modules.wql.util.SpringContextHolder; import org.springframework.beans.factory.annotation.Autowired; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -82,6 +86,10 @@ public class HailiangHrSsxDeviceDriver extends AbstractOpcDeviceDriver implement private int instruction_finished_time_out; String device_code = null; + private long lastReadTime = System.currentTimeMillis(); + private long lastReportTime = System.currentTimeMillis(); + private long lastHasContainerTime = System.currentTimeMillis(); + @Override public Device getDevice() { return this.device; @@ -102,33 +110,15 @@ public class HailiangHrSsxDeviceDriver extends AbstractOpcDeviceDriver implement if (move != last_move) { message = null; requireSucess = false; - if (move == 1 && barcode.length() > 0) { - TaskDto vehicle_dto = taskServer.findByContainer(barcode); - if (vehicle_dto == null) { - instruction_require_time = new Date(); + if (last_move == 1 && move == 0) { + this.lastHasContainerTime = System.currentTimeMillis(); + } + if (move == 1 && barcode.length() > 0 && !requireSucess) { + String containerArrived = ObjectUtil.isEmpty(this.getDevice().getExtraValue().get("containerArrived")) ? "false" : this.getDevice().getExtraValue().get("apply_task").toString(); + if ("true".equals(containerArrived)) { + this.containerArrived(); } } - - -// if(move ==0 && barcode.length()>0 && !requireSucess ){ -// ContainerArrivedRequest containerArrivedRequest = new ContainerArrivedRequest(); -// NodeStates nodeStates = new NodeStates(); -// containerArrivedRequest.setSlotCode(device_code); -// containerArrivedRequest.setContainerCode(barcode); -// Date date = new Date(); -// SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss"); -// nodeStates.setLastHasContainerTime(Long.parseLong(dateFormat.format(date))); -// nodeStates.setLastReadTime(Long.parseLong(dateFormat.format(date))); -// nodeStates.setLastReportTime(Long.parseLong(dateFormat.format(date))); -// Resp containerArrivedResp=acsToLiKuService.containerArrived(containerArrivedRequest); -// JSONObject response1=JSONObject.parseObject(String.valueOf(containerArrivedResp)); -// int code=response1.getInteger("code"); -// String msg=response1.getString("msg"); -// if(code == 0) { -// log.info("请求成功 请求结果{}", code,msg); -// requireSucess = true; -// } -// } } if (error != last_error) { if (error != 0) { @@ -169,7 +159,7 @@ public class HailiangHrSsxDeviceDriver extends AbstractOpcDeviceDriver implement /** - * 申请出空框任务 + * 申请出空框任务 acs->lms */ public void applyEmptyTask() { JSONObject reqParam = new JSONObject(); @@ -184,6 +174,36 @@ public class HailiangHrSsxDeviceDriver extends AbstractOpcDeviceDriver implement } } + /** + * 容器到达通知 acs->ess + * + * @return + */ + public void containerArrived() throws Exception { + TaskDto vehicle_dto = taskServer.findByContainer(barcode); + if (vehicle_dto == null) { + instruction_require_time = new Date(); + ContainerArrivedRequest containerArrivedRequest = new ContainerArrivedRequest(); + NodeStates nodeStates = new NodeStates(); + containerArrivedRequest.setSlotCode(device_code); + containerArrivedRequest.setContainerCode(barcode); + Date date = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss"); + nodeStates.setLastHasContainerTime(Long.parseLong(dateFormat.format(date))); + nodeStates.setLastReadTime(Long.parseLong(dateFormat.format(date))); + nodeStates.setLastReportTime(Long.parseLong(dateFormat.format(date))); + Resp containerArrivedResp = acsToLiKuService.containerArrived(containerArrivedRequest); + JSONObject response = JSONObject.parseObject(String.valueOf(containerArrivedResp)); + int code = response.getInteger("code"); + String msg = response.getString("msg"); + if (code == 0) { + requireSucess = true; + this.setLastReportTime(System.currentTimeMillis()); + log.info("请求成功 请求结果{}", code, msg); + } + } + } + @Override public JSONObject getDeviceStatusName() { diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java index e19c94d8..67279d8f 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java @@ -20,33 +20,31 @@ import org.nl.modules.wql.util.SpringContextHolder; @Slf4j public class AcsUtil { - - @LokiLog(type = LokiLogType.ACS_TO_LK) public static String notifyAcs(String api, W requestParam) { - DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class);; ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); //判断是否连接立库WCS系统 String isConnect = paramService.findByCode("is_connect_liKu_Wcs").getValue(); if (StrUtil.equals("0", isConnect)) { + log.info("ACS请求ESS,请求路径:{},参数配置表中-is_connect_liKu_Wcs为:0", api); throw new BadRequestException("参数配置表中-is_connect_liKu_Wcs为:0"); } + log.info("ACS请求ESS,请求路径:{},请求参数:{}", api, JSON.toJSONString(requestParam)); String liKu_wcs_url = paramService.findByCode("liKu_wcs_url").getValue(); try { - logServer.extLog(LokiLogType.ACS_TO_LK.name(),"下发立库任务请求参数:{}"+JSON.toJSONString(requestParam) ); - log.info("下发立库任务请求参数:{}", JSON.toJSONString(requestParam)); - String body = HttpRequest - .post(liKu_wcs_url + api).setConnectionTimeout(3000) + String body = HttpRequest + .post(liKu_wcs_url + api) + .setConnectionTimeout(5000) .body(JSON.toJSONString(requestParam)) .execute() .body(); - log.info("下发立库任务返回参数:{}", body); + log.info("ACS请求ESS,请求路径:{},响应参数:{}", api, body); return body; } catch (Exception e) { JSONObject result = new JSONObject(); - result.put("result", "false"); result.put("code", "1"); - result.put("comment", e.getMessage()); - log.info("下发立库任务异常返回参数:{}", String.valueOf(result)); + result.put("msg", e.getMessage()); + result.put("data", new JSONObject()); + log.error("ACS请求ESS,请求路径:{},响应参数:{}", api, result.toString()); return String.valueOf(result); } } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/Resp.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/Resp.java index a16e111c..c10b5308 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/Resp.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/Resp.java @@ -13,25 +13,20 @@ public class Resp { /** * 成功返回true,失败返回false */ - public String result; + private String result; /** * 错误码(0表示成功)1代表入库目的位置有货,其他更多情况待定 */ - public String code; - - /** - * 错误信息,如果成功则为null - */ - public String comment; + private String code; /** * 报文携带的数据 */ - public T data; + private T data; /** * 成功返回true,失败返回false */ - public String msg; + private String msg; } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/a/QueryNodeReaderRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/a/QueryNodeReaderRequest.java index 004ea23e..b11faced 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/a/QueryNodeReaderRequest.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/a/QueryNodeReaderRequest.java @@ -1,5 +1,8 @@ package org.nl.acs.ext.wms.liKuData.a; +import lombok.Data; + +@Data public class QueryNodeReaderRequest { public String slotCode; } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToLiKuServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToLiKuServiceImpl.java index 13bd7dd1..a0d881bf 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToLiKuServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToLiKuServiceImpl.java @@ -28,94 +28,38 @@ public class AcsToLiKuServiceImpl implements AcsToLiKuService { private final AddressService addressService; - private String log_file_type = "log_file_type"; - private String log_type = "ACS请求立库"; - - @Override public Resp containerArrived(ContainerArrivedRequest requestParam) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("containerArrivedRequest-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("containerArrived").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("containerArrivedRequest-----输出参数{}", result); - return RespUtil.getResp(result, new JSONObject()); - } finally { - MDC.remove(log_file_type); - } + String api = addressService.findByCode("containerArrived").getMethods_url(); + String result = AcsUtil.notifyAcs(api, requestParam); + return RespUtil.getResp(result, new JSONObject()); } @Override public Resp create(CreateRequest requestParam) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("CreateRequest-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("createLikuTask").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("CreateRequest-----输出参数{}", result); - return RespUtil.getResp(result, new CreateResponse()); - } finally { - MDC.remove(log_file_type); - } + String api = addressService.findByCode("createLikuTask").getMethods_url(); + String result = AcsUtil.notifyAcs(api, requestParam); + return RespUtil.getResp(result, new CreateResponse()); } @Override public Resp cancel(CancelRequest requestParam) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("CancelRequest-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("cancelLikuTask").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("CancelRequest-----输出参数{}", result); - return RespUtil.getResp(result, new CancelResponse()); - } finally { - MDC.remove(log_file_type); - } + String api = addressService.findByCode("cancelLikuTask").getMethods_url(); + String result = AcsUtil.notifyAcs(api, requestParam); + return RespUtil.getResp(result, new CancelResponse()); } @Override public Resp robotQuery(RobotQueryRequest requestParam) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("RobotQueryRequest-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("robotQuery").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); -// String result="{\"code\":0,\"msg\":\"success\",\"data\":{\"robots\":[{\"robotCode\":\"AGVLK\",\"robotTypeCode\":\"RT_KUBOT\",\"pointCode\":\"POINT:1280:5070\",\"positionX\":1283,\"positionY\":5057,\"theta\":269,\"forkHeight\":679,\"forkLength\":4,\"forkTheta\":1,\"stationCode\":\"1\",\"locationCode\":\"LT_CONVEYOR_OUTPUT:POINT:1280:5070\",\"state\":\"IDLE\",\"hardwareState\":\" ROBOT_IDLE \",\"trays\":[{\"trayLevel\":0,\"containerCode\":null,\"taskCodes\":[],\"positionCode\":\"kubot-1#0\"},{\"trayLevel\":1,\"containerCode\":null,\"taskCodes\":[],\"positionCode\":\"kubot-1#1\"},{\"trayLevel\":2,\"containerCode\":null,\"taskCodes\":[],\"positionCode\":\"kubot-1#2\"},{\"trayLevel\":3,\"containerCode\":null,\"taskCodes\":[],\"positionCode\":\"kubot-1#3\"},{\"trayLevel\":4,\"containerCode\":null,\"taskCodes\":[],\"positionCode\":\"kubot-1#4\"},{\"trayLevel\":64,\"containerCode\":null,\"taskCodes\":[],\"positionCode\":\"kubot-1#64\"}]}]}}"; - log.info("RobotQueryRequest-----输出参数{}", result); - - return RespUtil.getResp(result, new JSONObject()); - } finally { - MDC.remove(log_file_type); - } + String api = addressService.findByCode("robotQuery").getMethods_url(); + String result = AcsUtil.notifyAcs(api, requestParam); + return RespUtil.getResp(result, new JSONObject()); } @Override public Resp locationQuery(LocationQueryRequest requestParam) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("LocationQueryRequest-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("locationQuery").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("LocationQueryRequest-----输出参数{}", result); - return RespUtil.getResp(result, new LocationQueryResponse()); - } finally { - MDC.remove(log_file_type); - } - } - - - public static void main(String[] args) { - JSONObject jo = new JSONObject(); - jo.put("code", 0); - jo.put("msg", "111"); - - UnloadContainerReqResponse unloadContainerReqResponse = new UnloadContainerReqResponse(); - unloadContainerReqResponse.setAllow(false); - JSONObject result = new JSONObject(); - result.put("code", "0"); - result.put("msg", "success"); - result.put("data", unloadContainerReqResponse); - log.info("放容器请求-----输出参数{}", JSON.toJSONString(result)); + String api = addressService.findByCode("locationQuery").getMethods_url(); + String result = AcsUtil.notifyAcs(api, requestParam); + return RespUtil.getResp(result, new LocationQueryResponse()); } } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java index 3746e55f..a59f4e02 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java @@ -47,8 +47,6 @@ import java.util.List; @RequiredArgsConstructor @Slf4j public class LiKuToAcsServiceImpl implements LiKuToAcsService { - @Autowired - private AddressService addressService; @Autowired private TaskService taskService; @Autowired @@ -62,17 +60,12 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { @Autowired private ParamService paramService; -// DeviceAppService appService= SpringContextHolder.getBean(DeviceAppServiceImpl.class); - - - private String log_file_type = "log_file_type"; - private String log_type = "立库请求ACS"; @Override public JSONObject queryConveyor(QueryConveyorRequest requestParam) throws Exception { log.info("查询输送线料箱状态-----输入参数{}", JSON.toJSONString(requestParam)); JSONObject result = new JSONObject(); - try{ + try { String conveyorCodes = requestParam.getConveyorCodes(); NodeStates nodeStates = new NodeStates(); List list2 = new ArrayList<>(); @@ -80,18 +73,21 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { Device device = deviceAppService.findDeviceByCode(conveyorCodes); QueryConveyorResponse queryConveyorResponse = new QueryConveyorResponse(); if (device != null && device.getDeviceDriver() instanceof HailiangHrSsxDeviceDriver) { - HailiangHrSsxDeviceDriver hailiangHrSsxDeviceDriver= (HailiangHrSsxDeviceDriver) device.getDeviceDriver(); + HailiangHrSsxDeviceDriver hailiangHrSsxDeviceDriver = (HailiangHrSsxDeviceDriver) device.getDeviceDriver(); if (!ObjectUtil.isEmpty(device.getDevice_code())) { conveyors.setCode(device.getDevice_code()); } if (!ObjectUtil.isEmpty(device.getLocation())) { nodeStates.setSlotCode(device.getDevice_code()); } - if (ObjectUtil.equals(hailiangHrSsxDeviceDriver.getMove(),"1")) { + if (hailiangHrSsxDeviceDriver.getMove() == 1) { nodeStates.setHasContainer(true); - }else { + } else { nodeStates.setHasContainer(false); } + nodeStates.setLastReadTime(hailiangHrSsxDeviceDriver.getLastReadTime()); + hailiangHrSsxDeviceDriver.setLastReadTime(System.currentTimeMillis()); + nodeStates.setLastReportTime(hailiangHrSsxDeviceDriver.getLastReportTime()); } list2.add(nodeStates); conveyors.setNodeStates(list2); @@ -101,55 +97,63 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { result.put("code", "0"); result.put("msg", "success"); result.put("data", queryConveyorResponse); - }catch (Exception e) { + } catch (Exception e) { + result = new JSONObject(); result.put("code", "1"); result.put("msg", "fail"); - result.put("data", new JSONObject()); - log.info("查询输送线料箱状态--------------:输出参数{}" , JSON.toJSONString(result)); + result.put("data", e.getMessage()); } log.info("查询输送线料箱状态,响应参数:{}", JSON.toJSONString(result)); return result; - } + } + @Override public JSONObject queryNodeReader(QueryNodeReaderRequest requestParam) throws Exception { - try{ - log.info("查询输送线点位状态-----输入参数{}", JSON.toJSONString(requestParam)); - String slotCode = requestParam.slotCode; + log.info("查询输送线点位状态-----输入参数{}", JSON.toJSONString(requestParam)); + JSONObject result = new JSONObject(); + try { + String slotCode = requestParam.getSlotCode(); QueryNodeReaderResponse queryNodeReaderResponse = new QueryNodeReaderResponse(); - JSONObject result = new JSONObject(); result.put("code", "0"); result.put("msg", "success"); result.put("data", queryNodeReaderResponse); - log.info("查询输送线点位状态-----输出参数{}", result); - return result; - } finally { - MDC.remove(log_file_type); + } catch (Exception e) { + result = new JSONObject(); + result.put("code", "1"); + result.put("msg", "fail"); + result.put("data", e.getMessage()); } + log.info("查询输送线点位状态-----输出参数{}", result); + return result; } @Override public JSONObject loadContainerFinish(LoadContainerFinishRequest requestParam) throws Exception { log.info("取容器完成通知-----输入参数{}", JSON.toJSONString(requestParam)); JSONObject result = new JSONObject(); - try{ - String slotCode = requestParam.slotCode; - String containerCode=requestParam.containerCode; + try { + String slotCode = requestParam.getSlotCode(); + String containerCode = requestParam.getContainerCode(); // LoadContainerFinishResponse loadContainerFinishResponse = new LoadContainerFinishResponse(); Device device = deviceAppService.findDeviceByCode(slotCode); if (device != null && device.getDeviceDriver() instanceof HailiangHrSsxDeviceDriver) { - HailiangHrSsxDeviceDriver hailiangHrSsxDeviceDriver= (HailiangHrSsxDeviceDriver) device.getDeviceDriver(); + HailiangHrSsxDeviceDriver hailiangHrSsxDeviceDriver = (HailiangHrSsxDeviceDriver) device.getDeviceDriver(); //下发输送线电气取货完成 - hailiangHrSsxDeviceDriver.writing("to_command","2"); + hailiangHrSsxDeviceDriver.writing("to_command", "2"); // JSONObject json = (JSONObject) JSONObject.toJSON(loadContainerFinishResponse); result.put("code", "0"); result.put("msg", "success"); result.put("data", new JSONObject()); + } else { + result.put("code", "0"); + result.put("msg", "success"); + result.put("data", new JSONObject()); } - }catch (Exception e) { + } catch (Exception e) { + result = new JSONObject(); result.put("code", "1"); result.put("msg", "fail"); - result.put("data", new JSONObject()); - log.info("取容器完成通知--------------:输出参数{}" , JSON.toJSONString(result)); + result.put("data", e.getMessage()); } log.info("取容器完成通知-----输出参数{}", JSON.toJSONString(result)); return result; @@ -160,15 +164,16 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { log.info("放容器请求-----输入参数{}", JSON.toJSONString(requestParam)); UnloadContainerReqResponse unloadContainerReqResponse = new UnloadContainerReqResponse(); JSONObject result = new JSONObject(); - try{ - String slotCode = requestParam.slotCode; - String containerCode=requestParam.containerCode; + try { + String slotCode = requestParam.getSlotCode(); + String containerCode = requestParam.getContainerCode(); Device device = deviceAppService.findDeviceByCode(slotCode); if (device != null && device.getDeviceDriver() instanceof HailiangHrSsxDeviceDriver) { - HailiangHrSsxDeviceDriver hailiangHrSsxDeviceDriver= (HailiangHrSsxDeviceDriver) device.getDeviceDriver(); - if (hailiangHrSsxDeviceDriver.getAction() == 2){ + HailiangHrSsxDeviceDriver hailiangHrSsxDeviceDriver = (HailiangHrSsxDeviceDriver) device.getDeviceDriver(); + hailiangHrSsxDeviceDriver.writing("to_command", "3"); + if (hailiangHrSsxDeviceDriver.getAction() == 2) { unloadContainerReqResponse.setAllow(true); - }else{ + } else { unloadContainerReqResponse.setAllow(false); } } @@ -176,10 +181,10 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { result.put("msg", "success"); result.put("data", unloadContainerReqResponse); } catch (Exception e) { + result = new JSONObject(); result.put("code", "1"); result.put("msg", "fail"); - result.put("data", new JSONObject()); - log.info("放容器请求--------------:输出参数{}" , JSON.toJSONString(result)); + result.put("data", e.getMessage()); } log.info("放容器请求-----输出参数{}", JSON.toJSONString(result)); return result; @@ -187,85 +192,79 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { @Override public JSONObject unloadContainerFinish(UnloadContainerFinishRequest requestParam) throws Exception { - try{ - log.info("放容器完成通知-----输入参数{}", JSON.toJSONString(requestParam)); - String slotCode = requestParam.slotCode; - String containerCode=requestParam.containerCode; - String containerAttribute=requestParam.containerAttribute; + log.info("放容器完成通知-----输入参数{}", JSON.toJSONString(requestParam)); + JSONObject result = new JSONObject(); + try { + String slotCode = requestParam.getSlotCode(); + String containerCode = requestParam.getContainerCode(); + String containerAttribute = requestParam.getContainerAttribute(); UnloadContainerFinishResponse unloadContainerFinishResponse = new UnloadContainerFinishResponse(); - JSONObject result = new JSONObject(); + Device device = deviceAppService.findDeviceByCode(slotCode); + if (device != null && device.getDeviceDriver() instanceof HailiangHrSsxDeviceDriver) { + HailiangHrSsxDeviceDriver hailiangHrSsxDeviceDriver = (HailiangHrSsxDeviceDriver) device.getDeviceDriver(); + hailiangHrSsxDeviceDriver.writing("to_command", "4"); + } JSONObject json = (JSONObject) JSONObject.toJSON(unloadContainerFinishResponse); result.put("code", "0"); result.put("msg", "success"); result.put("data", json); - log.info("放容器完成通知-----输出参数{}", result); - return result; - } finally { - MDC.remove(log_file_type); + } catch (Exception e) { + result = new JSONObject(); + result.put("code", "1"); + result.put("msg", "fail"); + result.put("data", e.getMessage()); } + log.info("放容器完成通知-----输出参数{}", result); + return result; } @Override public JSONObject moveContainer(MoveContainerRequest requestParam) throws Exception { - try{ - log.info("容器流动请求-----输入参数{}", JSON.toJSONString(requestParam)); + log.info("容器流动请求-----输入参数{}", JSON.toJSONString(requestParam)); + JSONObject result = new JSONObject(); + try { String slotCode = requestParam.slotCode; - String containerCode=requestParam.containerCode; - String direction=requestParam.direction; + String containerCode = requestParam.containerCode; + String direction = requestParam.direction; MoveContainerResponse moveContainerResponse = new MoveContainerResponse(); - JSONObject result=new JSONObject(); JSONObject json = (JSONObject) JSONObject.toJSON(moveContainerResponse); result.put("code", "0"); result.put("msg", "success"); result.put("data", json); - log.info("容器流动请求-----输出参数{}", result); - return result; - } finally { - MDC.remove(log_file_type); + } catch (Exception e) { + result = new JSONObject(); + result.put("code", "1"); + result.put("msg", "fail"); + result.put("data", e.getMessage()); } + log.info("容器流动请求-----输出参数{}", result); + return result; } @Override public Object taskstatusreporting(TaskstatusReportingRequest requestParam) throws Exception { - try{ - log.info("任务状态上报-----输入参数{}", JSON.toJSONString(requestParam)); - String inst_id = requestParam.getTaskCode(); + log.info("任务状态上报-----输入参数{}", JSON.toJSONString(requestParam)); + JSONObject result = new JSONObject(); + try { + String inst_code = requestParam.getTaskCode(); String eventType = requestParam.getEventType(); String status = requestParam.getStatus(); String carNo = requestParam.getRobotCode(); - Instruction inst = instructionService.findById(inst_id); + Instruction inst = instructionService.findByCodeFromCache(inst_code); if (ObjectUtil.isEmpty(inst)) { TaskstatusReportingResponse taskstatusReportingResponse = new TaskstatusReportingResponse(); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应指令"); + result = new JSONObject(); + result.put("code", "1"); + result.put("msg", "未找到对应指令信息,指令号:'" + inst_code + "',指令已完成或取消"); result.put("data", taskstatusReportingResponse); log.info("任务状态上报-----输出参数{}", result); return RespUtil.getResp(result.toString(), new TaskstatusReportingResponse()); } - if (!StrUtil.equals(inst.getInstruction_status(),"0") && !StrUtil.equals(inst.getInstruction_status(),"1")) { - TaskstatusReportingResponse taskstatusReportingResponse = new TaskstatusReportingResponse(); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应未完成的指令"); - result.put("data", taskstatusReportingResponse ); - log.info("任务状态上报-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new TaskstatusReportingResponse()); + if (StrUtil.equals(inst.getInstruction_status(), "0")) { + inst.setInstruction_status("1"); + inst.setCarno(carNo); + instructionService.update(inst); } - TaskDto task = taskService.findByCode(inst.getTask_code()); - if (ObjectUtil.isEmpty(task)) { - TaskstatusReportingResponse taskstatusReportingResponse = new TaskstatusReportingResponse(); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应任务"); - result.put("data", taskstatusReportingResponse ); - log.info("任务状态上报-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new TaskstatusReportingResponse()); - } - /** * eventType * task:上报任务状态 @@ -283,151 +282,110 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { * cancel:取消 * suspend:挂起 */ - - if(StrUtil.equals(inst.getInstruction_status(),"0")){ - inst.setInstruction_status("1"); - inst.setCarno(carNo); - } - - if( StrUtil.equals(eventType,"task")){ - if(StrUtil.equals(status,"success")){ - if (!StrUtil.equals(task.getTask_status(),"0") && !StrUtil.equals(task.getTask_status(),"1")) { - TaskstatusReportingResponse taskstatusReportingResponse = new TaskstatusReportingResponse(); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到未完成的对应任务"); - result.put("data", taskstatusReportingResponse); - log.info("任务状态上报-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new TaskstatusReportingResponse()); - } + if (StrUtil.equals(eventType, "task")) { + if (StrUtil.equals(status, "success")) { instructionService.finish(inst.getInstruction_id()); - } else if (StrUtil.equals(status,"fail") || StrUtil.equals(status,"cancel")){ + } else if (StrUtil.equals(status, "fail") || StrUtil.equals(status, "cancel")) { instructionService.cancel(inst.getInstruction_id()); - } else if (StrUtil.equals(status,"suspend")){ - + } else if (StrUtil.equals(status, "suspend")) { } - } else if ( StrUtil.equals(eventType,"tote_load")) { - inst.setExecute_code("2"); - instructionService.update(inst); - } else if ( StrUtil.equals(eventType,"tote_unload")) { - inst.setExecute_code("4"); - instructionService.update(inst); } - TaskstatusReportingResponse taskstatusReportingResponse = new TaskstatusReportingResponse(); JSONObject json = (JSONObject) JSONObject.toJSON(taskstatusReportingResponse); - JSONObject result = new JSONObject(); result.put("code", "0"); result.put("msg", "success"); result.put("data", json); - log.info("任务状态上报反馈-----输出参数{}", result); - return result; - } finally { - MDC.remove(log_file_type); + } catch (Exception e) { + result.put("code", "1"); + result.put("msg", "fail"); + result.put("data", e.getMessage()); } + log.info("任务状态上报反馈-----输出参数{}", result); + return result; } @Override public JSONObject abnormalreporting(AbnormarReportingRequest requestParam) throws Exception { - try{ - log.info("异常上报-----输入参数{}", JSON.toJSONString(requestParam)); - String eventType=requestParam.getEventType(); - String barcode = requestParam.getContainerCode(); - TaskDto dto = taskService.findByContainer(barcode); - if(StrUtil.equals(eventType,"location_abnormal") || StrUtil.equals(eventType,"robot_abnormal") ){ - //异常描述 - String message = requestParam.getMessage(); - if (StrUtil.equals(message,"TRY_ACTION_LOCATION_ALREADY_LOADING_CONTAINER")){ - // 判断是否为WMS下发的任务,如果是反馈任务状态给WMS - String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); - if (!StrUtil.startWith(dto.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { - JSONObject reqParam = new JSONObject(); - reqParam.put("task_id", dto.getExt_task_id()); - reqParam.put("status", StatusEnum.TASK_FULL_IN.getCode()); + log.info("异常上报-----输入参数{}", JSON.toJSONString(requestParam)); + String eventType = requestParam.getEventType(); + String barcode = requestParam.getContainerCode(); + TaskDto dto = taskService.findByContainer(barcode); + if (StrUtil.equals(eventType, "location_abnormal") || StrUtil.equals(eventType, "robot_abnormal")) { + //异常描述 + String message = requestParam.getMessage(); + if (StrUtil.equals(message, "TRY_ACTION_LOCATION_ALREADY_LOADING_CONTAINER")) { + // 判断是否为WMS下发的任务,如果是反馈任务状态给WMS + String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); + if (!StrUtil.startWith(dto.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { + JSONObject reqParam = new JSONObject(); + reqParam.put("task_id", dto.getExt_task_id()); + reqParam.put("status", StatusEnum.TASK_FULL_IN.getCode()); - HttpResponse httpResponse = acsToWmsService.reportAnomaly(reqParam); - if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { - log.info("反馈LMS半成品库任务状态成功"); + HttpResponse httpResponse = acsToWmsService.reportAnomaly(reqParam); + if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { + log.info("反馈LMS半成品库任务状态成功"); - JSONObject resp = JSONObject.parseObject(httpResponse.body()); - if (resp.getInteger("status") == 200) { - //获取lms返回的新货位,ACS更新任务,指令,调用下发任务接口(指令号相同,新目标点) - String point_code2 = resp.getString("point_code2"); - dto.setNext_point_code(point_code2); - taskService.update(dto); + JSONObject resp = JSONObject.parseObject(httpResponse.body()); + if (resp.getInteger("status") == 200) { + //获取lms返回的新货位,ACS更新任务,指令,调用下发任务接口(指令号相同,新目标点) + String point_code2 = resp.getString("point_code2"); + dto.setNext_point_code(point_code2); + taskService.update(dto); - Instruction insDto = instructionService.findByTaskId(dto.getTask_id(),""); - insDto.setNext_point_code(point_code2); - instructionService.update(insDto); + Instruction insDto = instructionService.findByTaskId(dto.getTask_id(), ""); + insDto.setNext_point_code(point_code2); + instructionService.update(insDto); - CreateRequest createRequest = new CreateRequest(); - List list = new ArrayList(); - Resp resp_hairou = new Resp(); - createRequest.setTaskType("tote_inbound"); - //list Describe 入库 - InTaskDescribe inTaskDescribe=new InTaskDescribe(); - inTaskDescribe.setContainerCode(insDto.getVehicle_code()); - inTaskDescribe.setFromLocationCode(insDto.getStart_point_code()); - inTaskDescribe.setLocationCode(point_code2); - inTaskDescribe.setContainerType(insDto.getVehicle_type()); + CreateRequest createRequest = new CreateRequest(); + List list = new ArrayList(); + Resp resp_hairou = new Resp(); + createRequest.setTaskType("tote_inbound"); + //list Describe 入库 + InTaskDescribe inTaskDescribe = new InTaskDescribe(); + inTaskDescribe.setContainerCode(insDto.getVehicle_code()); + inTaskDescribe.setFromLocationCode(insDto.getStart_point_code()); + inTaskDescribe.setLocationCode(point_code2); + inTaskDescribe.setContainerType(insDto.getVehicle_type()); - AGVTask agvTask1 = new AGVTask(); - agvTask1.setTaskDescribe(inTaskDescribe); - agvTask1.setTaskCode(insDto.getTask_id()); - agvTask1.setTaskPriority(insDto.getPriority()); + AGVTask agvTask1 = new AGVTask(); + agvTask1.setTaskDescribe(inTaskDescribe); + agvTask1.setTaskCode(insDto.getTask_id()); + agvTask1.setTaskPriority(insDto.getPriority()); - list.add(agvTask1); - createRequest.setTasks(list); - resp_hairou = acsToLiKuService.create(createRequest); - } - } - } - } -// if (StrUtil.equals(message,"TRY_ACTION_LOCATION_NOT_LOADING_CONTAINER")){ -// // 判断是否为WMS下发的任务,如果是反馈任务状态给WMS -// String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); -// if (!StrUtil.startWith(dto.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { -// JSONObject reqParam = new JSONObject(); -// reqParam.put("task_id", dto.getExt_task_id()); -// reqParam.put("status", StatusEnum.TASK_EMPTY_OUT.getCode()); -// -// HttpResponse httpResponse = acsToWmsService.washTask(reqParam); -// if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { -// log.info("反馈LMS半成品库任务状态成功"); -// } -// } -// } - - if (StrUtil.equals(message,"TRY_ACTION_LOCATION_CONTAINER_NOT_SAME_WITH_TASK") || StrUtil.equals(message,"NO_CONTAINER_CODE")){ - // 判断是否为WMS下发的任务,如果是反馈任务状态给WMS - String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); - if (!StrUtil.startWith(dto.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { - JSONObject reqParam = new JSONObject(); - reqParam.put("task_id", dto.getExt_task_id()); - reqParam.put("status", StatusEnum.TASK_CHECK_ANOMALY.getCode()); - - HttpResponse httpResponse = acsToWmsService.reportAnomaly(reqParam); - if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { - log.info("反馈LMS半成品库任务状态成功"); - //完成指令,任务 - Instruction insDto = instructionService.findByTaskId(dto.getTask_id(),""); - instructionService.finish(insDto.getInstruction_id()); + list.add(agvTask1); + createRequest.setTasks(list); + resp_hairou = acsToLiKuService.create(createRequest); } } } } - AbnormarReportingResponse abnormarReportingResponse = new AbnormarReportingResponse(); - JSONObject result = new JSONObject(); - JSONObject json = (JSONObject) JSONObject.toJSON(abnormarReportingResponse); - result.put("code", "0"); - result.put("msg", "success"); - result.put("data", json); - log.info("异常上报-----输出参数{}", result); - return result; - } finally { - MDC.remove(log_file_type); + + if (StrUtil.equals(message, "TRY_ACTION_LOCATION_CONTAINER_NOT_SAME_WITH_TASK") || StrUtil.equals(message, "NO_CONTAINER_CODE")) { + // 判断是否为WMS下发的任务,如果是反馈任务状态给WMS + String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); + if (!StrUtil.startWith(dto.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { + JSONObject reqParam = new JSONObject(); + reqParam.put("task_id", dto.getExt_task_id()); + reqParam.put("status", StatusEnum.TASK_CHECK_ANOMALY.getCode()); + + HttpResponse httpResponse = acsToWmsService.reportAnomaly(reqParam); + if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { + log.info("反馈LMS半成品库任务状态成功"); + //完成指令,任务 + Instruction insDto = instructionService.findByTaskId(dto.getTask_id(), ""); + instructionService.finish(insDto.getInstruction_id()); + } + } + } } + AbnormarReportingResponse abnormarReportingResponse = new AbnormarReportingResponse(); + JSONObject result = new JSONObject(); + JSONObject json = (JSONObject) JSONObject.toJSON(abnormarReportingResponse); + result.put("code", "0"); + result.put("msg", "success"); + result.put("data", json); + log.info("异常上报-----输出参数{}", result); + return result; } } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index 612f82f4..38f65ea2 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -372,7 +372,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu AGVTask agvTask1 = new AGVTask(); agvTask1.setTaskDescribe(inTaskDescribe); - agvTask1.setTaskCode(dto.getTask_id()); + agvTask1.setTaskCode(dto.getInstruction_code()); agvTask1.setTaskPriority(dto.getPriority()); list.add(agvTask1); @@ -388,7 +388,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu AGVTask agvTask = new AGVTask(); agvTask.setTaskDescribe(outTaskDescribe); - agvTask.setTaskCode(dto.getTask_id()); + agvTask.setTaskCode(dto.getInstruction_code()); agvTask.setTaskPriority(dto.getPriority()); list.add(agvTask); createRequest.setTasks(list); @@ -403,7 +403,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu AGVTask agvTask2 = new AGVTask(); agvTask2.setTaskDescribe(relocationTaskDescribe); - agvTask2.setTaskCode(dto.getTask_id()); + agvTask2.setTaskCode(dto.getInstruction_code()); agvTask2.setTaskPriority(dto.getPriority()); list.add(agvTask2); @@ -421,7 +421,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu AGVTask agvTask4 = new AGVTask(); agvTask4.setTaskDescribe(carryTaskDescribe); - agvTask4.setTaskCode(dto.getTask_id()); + agvTask4.setTaskCode(dto.getInstruction_code()); agvTask4.setTaskPriority(dto.getPriority()); list.add(agvTask4); @@ -436,7 +436,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu checkTaskDescribe.setCheckType("scan"); AGVTask agvTask3 = new AGVTask(); agvTask3.setTaskDescribe(checkTaskDescribe); - agvTask3.setTaskCode(dto.getTask_id()); + agvTask3.setTaskCode(dto.getInstruction_code()); agvTask3.setTaskPriority(dto.getPriority()); list.add(agvTask3); @@ -1072,7 +1072,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu if (flag) { if (StrUtil.equals(entity.getInstruction_type(), AgvTypeEnum.HAIROU_TYPE_1.getTaskType())) { CancelRequest cancelRequest = new CancelRequest(); - cancelRequest.setTaskCodes(new ArrayList(Collections.singleton(entity.getInstruction_id()))); + cancelRequest.setTaskCodes(new ArrayList(Collections.singleton(entity.getInstruction_code()))); acsToLiKuService.cancel(cancelRequest); } String currentUsername = SecurityUtils.getCurrentUsername(); diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateAgvOneInst.java b/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateAgvOneInst.java index 0bdd2c7a..7e40c36a 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateAgvOneInst.java +++ b/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateAgvOneInst.java @@ -32,7 +32,7 @@ public class AutoCreateAgvOneInst { * @throws Exception */ public void run() throws Exception { - List list = taskService.queryAll("task_status = '0' and agv_system_type = '2' "); + List list = taskService.queryAll("task_status = '0' and agv_system_type = '2' or agv_system_type = '3'"); for (int i = 0; i < list.size(); i++) { TaskDto taskDto = list.get(i); String link_no = CodeUtil.getNewCode("LINK_NO"); diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryRobot.java b/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryRobot.java index bc2ee441..2ff9ff7f 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryRobot.java +++ b/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryRobot.java @@ -20,6 +20,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; /* @@ -35,10 +36,9 @@ public class QueryRobot { public void run() throws Exception { RobotQueryRequest robotQueryRequest = new RobotQueryRequest(); - HashMap map = new HashMap(); - List list = new ArrayList(); + Map> map = new HashMap(); + List list = new ArrayList(); List devices = deviceAppService.findDevice(DeviceType.agv); - for (int i = 0; i < devices.size(); i++) { if (devices.get(i).getDeviceDriver() instanceof LiKuDeviceDriver) { list.add(devices.get(i).getDevice_code()); diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/system/rest/ParamController.java b/wcs/nladmin-system/src/main/java/org/nl/modules/system/rest/ParamController.java index fcad651d..56a522ec 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/system/rest/ParamController.java +++ b/wcs/nladmin-system/src/main/java/org/nl/modules/system/rest/ParamController.java @@ -32,7 +32,7 @@ public class ParamController { private final ParamService paramService; - @LokiLog + //@LokiLog @GetMapping @Log("查询系统参数") @ApiOperation("查询系统参数") diff --git a/wcs/nladmin-system/src/main/resources/config/application-dev.yml b/wcs/nladmin-system/src/main/resources/config/application-dev.yml index ae015635..f4870d7a 100644 --- a/wcs/nladmin-system/src/main/resources/config/application-dev.yml +++ b/wcs/nladmin-system/src/main/resources/config/application-dev.yml @@ -13,7 +13,7 @@ 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:hl_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:hl_one_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:hl_acs_old}?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} @@ -164,6 +164,6 @@ sa-token: # token 前缀 token-prefix: Bearer -loki: - url: http://10.211.55.3:3100/loki/api/v1 - systemName: acs +#loki: +# url: http://10.211.55.3:3100/loki/api/v1 +# systemName: acs diff --git a/wcs/nladmin-system/src/main/resources/config/application-prod.yml b/wcs/nladmin-system/src/main/resources/config/application-prod.yml index 3b2f44d8..7a3fe098 100644 --- a/wcs/nladmin-system/src/main/resources/config/application-prod.yml +++ b/wcs/nladmin-system/src/main/resources/config/application-prod.yml @@ -11,7 +11,7 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hl_acs_test}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hl_old_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} password: ${DB_PWD:123456} # 初始连接数 @@ -166,6 +166,6 @@ sa-token: # token 前缀 token-prefix: Bearer -loki: - url: http://localhost:3100/loki/api/v1 - systemName: acs +#loki: +# url: http://localhost:3100/loki/api/v1 +# systemName: acs diff --git a/wcs/nladmin-system/src/main/resources/log/AcsToLk.xml b/wcs/nladmin-system/src/main/resources/log/AcsToLk.xml index 7811ec5b..57abc4fd 100644 --- a/wcs/nladmin-system/src/main/resources/log/AcsToLk.xml +++ b/wcs/nladmin-system/src/main/resources/log/AcsToLk.xml @@ -3,14 +3,14 @@ - + ${LOG_HOME}/ACS请求立库/%d{yyyy-MM-dd}.%i.log 15 - 200MB + 100MB 2GB @@ -23,11 +23,11 @@ - + 512 - + diff --git a/wcs/nladmin-system/src/main/resources/log/AcsToMes.xml b/wcs/nladmin-system/src/main/resources/log/AcsToMes.xml index cc88a4d4..8c979c2e 100644 --- a/wcs/nladmin-system/src/main/resources/log/AcsToMes.xml +++ b/wcs/nladmin-system/src/main/resources/log/AcsToMes.xml @@ -10,7 +10,7 @@ 15 - 50MB + 100MB 2GB @@ -23,7 +23,7 @@ - + 512 diff --git a/wcs/nladmin-system/src/main/resources/logback-spring.xml b/wcs/nladmin-system/src/main/resources/logback-spring.xml index e5da1230..f5fffc33 100644 --- a/wcs/nladmin-system/src/main/resources/logback-spring.xml +++ b/wcs/nladmin-system/src/main/resources/logback-spring.xml @@ -77,6 +77,33 @@ https://juejin.cn/post/6844903775631572999 + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -96,5 +123,32 @@ https://juejin.cn/post/6844903775631572999 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wcs/nladmin-ui/src/views/acs/device/driver/hailiang_hr_ssx_station.vue b/wcs/nladmin-ui/src/views/acs/device/driver/hailiang_hr_ssx_station.vue index 937af41c..63f0b89b 100644 --- a/wcs/nladmin-ui/src/views/acs/device/driver/hailiang_hr_ssx_station.vue +++ b/wcs/nladmin-ui/src/views/acs/device/driver/hailiang_hr_ssx_station.vue @@ -85,13 +85,13 @@ - + - - + + @@ -118,6 +118,16 @@ + + + + + + + + + + @@ -277,7 +287,8 @@ export default { apply_empty: [], manual_create_task: true, is_pickup: true, - is_release: true + is_release: true, + containerArrived: false }, rules: {} } diff --git a/wcs/nladmin-ui/src/views/acs/task/index.vue b/wcs/nladmin-ui/src/views/acs/task/index.vue index 65752e2c..09da7120 100644 --- a/wcs/nladmin-ui/src/views/acs/task/index.vue +++ b/wcs/nladmin-ui/src/views/acs/task/index.vue @@ -102,7 +102,7 @@ /> - +