From ad1230b6bb190748793e3344906c70f7f62210f7 Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Thu, 23 Mar 2023 15:01:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agv/server/impl/NDCAgvServiceImpl.java | 32 +- .../run/TwoNDC2SocketConnectionAutoRun.java | 243 ---- .../run/TwoNDCSocketConnectionAutoRun.java | 299 ---- .../java/org/nl/acs/device/wql/task_inst.xls | Bin 195072 -> 189440 bytes .../HailiangEngravingCacheDeviceDriver.java | 10 +- .../HailiangSmartplcTestDefination.java | 61 - .../HailiangSmartplcTestDeviceDriver.java | 302 ---- .../hailiang_smart_plc_test/ItemProtocol.java | 248 ---- .../HailiangSmartplcTestDeviceDriver.java | 38 +- ...CoveyorControlWithScannerDeviceDriver.java | 746 +++++----- .../main/java/org/nl/acs/ext/wms/AcsUtil.java | 55 - .../java/org/nl/acs/ext/wms/RespUtil.java | 18 - .../data/ApplyLabelingAndBindingRequest.java | 18 - .../data/ApplyLabelingAndBindingResponse.java | 14 - .../org/nl/acs/ext/wms/data/BaseRequest.java | 49 - .../org/nl/acs/ext/wms/data/BaseResponse.java | 52 - .../acs/ext/wms/data/CancelTaskRequest.java | 30 - .../acs/ext/wms/data/CancelTaskResponse.java | 7 - .../acs/ext/wms/data/CreateTaskRequest.java | 112 -- .../acs/ext/wms/data/CreateTaskResponse.java | 6 - .../ext/wms/data/LiKuApplyTakResponse.java | 9 - .../ext/wms/data/LiKuApplyTaskRequest.java | 9 - .../nl/acs/ext/wms/data/PutActionRequest.java | 30 - .../acs/ext/wms/data/PutActionResponse.java | 7 - .../acs/ext/wms/data/UpdateLKTaskRequest.java | 44 - .../ext/wms/data/UpdateLKTaskResponse.java | 8 - .../ext/wms/liKuData/BaseResponseData.java | 24 - .../wms/liKuData/BaseStoreReportRequest.java | 44 - .../ext/wms/liKuData/BaseStoreRequest.java | 42 - .../ext/wms/liKuData/CancelTaskRequest.java | 37 - .../ext/wms/liKuData/CancelTaskResponse.java | 13 - .../ext/wms/liKuData/DeviceStatusData.java | 32 - .../ext/wms/liKuData/DeviceStatusRequest.java | 11 - .../wms/liKuData/DeviceStatusResponse.java | 14 - .../liKuData/EmptyVehicleOutStoreRequest.java | 13 - .../EmptyVehicleOutStoreResponse.java | 13 - .../wms/liKuData/InStoreReportRequest.java | 13 - .../wms/liKuData/InStoreReportResponse.java | 14 - .../acs/ext/wms/liKuData/InStoreRequest.java | 18 - .../ext/wms/liKuData/InStoreResetRequest.java | 12 - .../wms/liKuData/InStoreResetResponse.java | 12 - .../acs/ext/wms/liKuData/InStoreResponse.java | 12 - .../liKuData/InStoreTaskUpdateRequest.java | 33 - .../liKuData/InStoreTaskUpdateResponse.java | 7 - .../wms/liKuData/MoveStoreReportRequest.java | 10 - .../wms/liKuData/MoveStoreReportResponse.java | 12 - .../ext/wms/liKuData/MoveStoreRequest.java | 25 - .../wms/liKuData/MoveStoreResetRequest.java | 13 - .../wms/liKuData/MoveStoreResetResponse.java | 13 - .../ext/wms/liKuData/MoveStoreResponse.java | 13 - .../liKuData/MoveStoreTaskUpdateRequest.java | 32 - .../liKuData/MoveStoreTaskUpdateResponse.java | 7 - .../wms/liKuData/OutStoreReportRequest.java | 13 - .../wms/liKuData/OutStoreReportResponse.java | 12 - .../acs/ext/wms/liKuData/OutStoreRequest.java | 27 - .../ext/wms/liKuData/OutStoreResponse.java | 13 - .../org/nl/acs/ext/wms/liKuData/Resp.java | 32 - .../wms/liKuData/RoadWayIsLockRequest.java | 28 - .../wms/liKuData/RoadWayIsLockResponse.java | 13 - .../wms/liKuData/putEmptyPalletRequest.java | 14 - .../acs/ext/wms/rest/AcsToLiKuController.java | 114 -- .../acs/ext/wms/rest/AcsToWmsController.java | 54 +- .../acs/ext/wms/rest/LiKuToACSController.java | 68 - .../acs/ext/wms/rest/WmsToAcsController.java | 63 +- .../acs/ext/wms/service/AcsToLiKuService.java | 93 -- .../acs/ext/wms/service/AcsToWmsService.java | 50 +- .../acs/ext/wms/service/LiKuToAcsService.java | 40 - .../acs/ext/wms/service/WmsToAcsService.java | 53 +- .../service/impl/AcsToLiKuServiceImpl.java | 289 ---- .../wms/service/impl/AcsToWmsServiceImpl.java | 921 ++++++------ .../service/impl/LiKuToAcsServiceImpl.java | 304 ---- .../wms/service/impl/WmsToAcsServiceImpl.java | 1281 +++++++++-------- .../service/impl/InstructionServiceImpl.java | 207 ++- .../impl/ProduceshiftorderServiceImpl.java | 2 +- .../quartz/task/QueryLKDeviceStatus.java | 6 +- .../system/service/impl/ParamServiceImpl.java | 14 +- .../main/resources/config/application-dev.yml | 4 +- 77 files changed, 1804 insertions(+), 4847 deletions(-) delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/HailiangSmartplcTestDefination.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/ItemProtocol.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/RespUtil.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CancelTaskRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CancelTaskResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTakResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTaskRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/PutActionRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/PutActionResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/UpdateLKTaskRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/UpdateLKTaskResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseResponseData.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseStoreReportRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseStoreRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/CancelTaskRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/CancelTaskResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusData.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/EmptyVehicleOutStoreRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/EmptyVehicleOutStoreResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreReportRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreReportResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResetRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResetResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreTaskUpdateRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreTaskUpdateResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreReportRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreReportResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResetRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResetResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreTaskUpdateRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreTaskUpdateResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreReportRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreReportResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/Resp.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/RoadWayIsLockRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/RoadWayIsLockResponse.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/putEmptyPalletRequest.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToLiKuController.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/LiKuToACSController.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToLiKuService.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/LiKuToAcsService.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToLiKuServiceImpl.java delete mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java 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 652a45a9..d0c992d9 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 @@ -2,8 +2,6 @@ package org.nl.acs.agv.server.impl; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.acs.AcsConfig; @@ -11,27 +9,20 @@ import org.nl.acs.agv.server.NDCAgvService; import org.nl.acs.agv.server.dto.AgvDto; import org.nl.acs.auto.run.NDCSocketConnectionAutoRun; import org.nl.acs.auto.run.OneNDCSocketConnectionAutoRun; -import org.nl.acs.auto.run.TwoNDC2SocketConnectionAutoRun; -import org.nl.acs.auto.run.TwoNDCSocketConnectionAutoRun; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.impl.DeviceServiceImpl; import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.LokiLog; import org.nl.acs.log.LokiLogType; import org.nl.acs.log.service.DeviceExecuteLogService; -import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; -import org.nl.acs.opc.DeviceType; -import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.system.service.ParamService; import org.nl.modules.wql.util.SpringContextHolder; import org.springframework.stereotype.Service; import java.util.HashMap; -import java.util.List; import java.util.Map; @Slf4j @@ -72,17 +63,10 @@ public class NDCAgvServiceImpl implements NDCAgvService { (byte) indexhigh, (byte) indexlow, }; log.info("下发删除AGV指令--{}", Bytes2HexString(b)); - - - if (StrUtil.equals(inst.getAgv_system_type(),"1")){ - OneNDCSocketConnectionAutoRun.write(b); - } else if (StrUtil.equals(inst.getAgv_system_type(),"2")){ - TwoNDCSocketConnectionAutoRun.write(b); - } else if (StrUtil.equals(inst.getAgv_system_type(),"3")){ - TwoNDC2SocketConnectionAutoRun.write(b); + if (ObjectUtil.isNotEmpty(b)){ + NDCSocketConnectionAutoRun.write(b); + System.out.println("下发删除agv指令数据:" + Bytes2HexString(b)); } - - System.out.println("下发删除agv指令数据:" + Bytes2HexString(b)); } } @@ -194,11 +178,11 @@ public class NDCAgvServiceImpl implements NDCAgvService { log.info("下发AGV作业指令--{}", str); log.info("下发agv指令数据--{}", Bytes2HexString(b)); - if (StrUtil.equals(agv_system_type,"2")){ - TwoNDCSocketConnectionAutoRun.write(b); - } else if (StrUtil.equals(agv_system_type,"3")){ - TwoNDC2SocketConnectionAutoRun.write(b); - } +// if (StrUtil.equals(agv_system_type,"2")){ +// TwoNDCSocketConnectionAutoRun.write(b); +// } else if (StrUtil.equals(agv_system_type,"3")){ +// TwoNDC2SocketConnectionAutoRun.write(b); +// } } else { String instcode = inst.getInstruction_code(); diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java b/wcs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java deleted file mode 100644 index c79eaa70..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java +++ /dev/null @@ -1,243 +0,0 @@ -package org.nl.acs.auto.run; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.AcsConfig; -import org.nl.acs.agv.server.NDCAgvService; -import org.nl.acs.device.service.DeviceService; -import org.nl.acs.device_driver.basedriver.agv.ndctwo.AgvNdcTwoDeviceDriver; -import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; -import org.nl.acs.instruction.service.InstructionService; -import org.nl.acs.instruction.service.dto.Instruction; -import org.nl.acs.instruction.service.impl.InstructionServiceImpl; -import org.nl.acs.opc.Device; -import org.nl.acs.opc.DeviceAppService; -import org.nl.modules.system.service.ParamService; -import org.nl.modules.system.service.impl.ParamServiceImpl; -import org.nl.modules.wql.util.SpringContextHolder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.Socket; -import java.util.Date; - -import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString; - - -@Slf4j -@Component -public class TwoNDC2SocketConnectionAutoRun extends AbstractAutoRunnable { - - Socket s; - String ip = "192.168.46.225"; - int port = 1234; - static DataOutputStream dos; - static DataInputStream dis; - private int recordTimeOut = 10000; - private Date recordTime; - String[] ERROR = new String[]{ - "货叉尖部传感器触发", "S300传感器触发", "载货状态改变", "急停按钮触发", "触边开关出发", "需要复位", - "停在充电位", "取货失败", "放货失败", "轮子打滑", "没有动作码不能进入站点", "取货时有货", "丢失定位", - "抬叉停止"}; - boolean bConnected = true; - - boolean isReConnect = false; - - @Autowired - ParamService paramService; - @Autowired - AutoRunService autoRunService; - - - public TwoNDC2SocketConnectionAutoRun() { - this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); - } - - public String getCode() { - return TwoNDC2SocketConnectionAutoRun.class.getSimpleName(); - } - - public String getName() { - return "2楼2区域AGV系统"; - } - - public void autoRun() { - - try { - System.out.println("2楼2区域AGV系统链接开始"); - ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); - InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); - AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); - NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); - DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); - DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); - ip = paramService.findByCode(AcsConfig.AGVURL22).getValue(); - port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT22).getValue()); - byte[] b = new byte[1028]; - s = new Socket(ip, port); - System.out.println("2楼2区域AGV链接成功"); - dos = new DataOutputStream(s.getOutputStream()); - dis = new DataInputStream(s.getInputStream()); - - while (bConnected) { - int count = dis.read(b); - - if (count == -1) { - break; - } - - int[] arr = new int[count]; - StringBuffer bs = new StringBuffer(); - - for (int i = 0; i < count; i++) { - int temp = b[i]; - if (temp < 0) - temp += 256; - arr[i] = temp; - StringBuffer bs1 = new StringBuffer("0"); - bs.append(temp < 16 ? bs1.append(Integer.toHexString(temp)) : Integer.toHexString(temp)); - } - - System.out.println("收到请求参数:" + bs); - boolean flag = false; - if (arr[8] * 256 + arr[9] == 0x73) { - byte[] data = null; - System.out.println("接收agv上报信息:" + bs); - //执行阶段 - int phase = arr[16] * 256 + arr[17]; - // agv任务号 - int index = arr[12] * 256 + arr[13]; - //任务号 - int ikey = arr[26] * 256 + arr[27]; - //站点号 - int agvaddr = arr[18] * 256 + arr[19]; - //车号 - int carno = arr[20]; - Instruction inst = null; - if (ikey != 0) { - inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); - } - log.info("接收agv上报信息:" + bs); - log.info("接收agv上报信息:" + "phase--" + phase + " index--" + index + " ikey--" + ikey + " agvaddr--" + agvaddr + " Car--" + carno); - Device device = null; - String device_code = null; - String old_device_code = null; - String emptyNum = null; - if (agvaddr != 0) { - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, "-")) { - String[] point = old_device_code.split("-"); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, ".")) { - String[] point = old_device_code.split("\\."); - device_code = point[0]; - emptyNum = point[1]; - } else { - device_code = old_device_code; - } - device = deviceAppService.findDeviceByCode(device_code); - } - - AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver; - //开始任务 - if (phase == 0x01) { - if (!ObjectUtil.isEmpty(inst)) { - inst.setInstruction_status("1"); - inst.setAgv_jobno(String.valueOf(index)); - inst.setSend_status("1"); - instructionService.update(inst); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } - flag = true; - } - //任务完毕 - //(无车id及状态) - else if (phase == 0x14) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - break; - } - inst.setInstruction_status("2"); - instructionService.finish(inst); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } - //请求删除任务 - //(需要WCS反馈) - else if (phase == 0x30) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - break; - } - data = ndcAgvService.sendAgvTwoModeInst(0x8F, index, 0); - } - //任务删除确认 - //(需要WCS反馈) - else if (phase == 0xFF) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - break; - } - instructionService.cancelNOSendAgv(inst.getInstruction_id()); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } else { - //上报异常信息 - //(不需要WCS反馈) - if(phase == 0x67){ - device = deviceAppService.findDeviceByCode(Integer.toString(arr[27])); - } else { - device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); - } - if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { - agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); - agvNdcTwoDeviceDriver.processSocket(arr); - } - } - if (!ObjectUtil.isEmpty(data)) { - write(data); - } - - } else { - System.out.println("agv上报不是0073类型动作,不处理"); - } - } - - } catch (Exception e) { - - - } finally { - - - } - - } - - - @Override - public void stop() { - super.after(); - try { - s.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - public static void write(byte[] b) { - try { - log.info("下发agv数据:" + Bytes2HexString(b)); - System.out.println("下发agv数据:" + Bytes2HexString(b)); - dos.write(b); - dos.flush(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java b/wcs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java deleted file mode 100644 index 3e039c69..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java +++ /dev/null @@ -1,299 +0,0 @@ -package org.nl.acs.auto.run; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.AcsConfig; -import org.nl.acs.agv.server.NDCAgvService; -import org.nl.acs.device.service.DeviceService; -import org.nl.acs.device_driver.basedriver.agv.ndcone.AgvNdcOneDeviceDriver; -import org.nl.acs.device_driver.basedriver.agv.ndctwo.AgvNdcTwoDeviceDriver; -import org.nl.acs.device_driver.basedriver.standard_autodoor.StandardAutodoorDeviceDriver; -import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; -import org.nl.acs.instruction.service.InstructionService; -import org.nl.acs.instruction.service.dto.Instruction; -import org.nl.acs.instruction.service.impl.InstructionServiceImpl; -import org.nl.acs.log.service.DeviceExecuteLogService; -import org.nl.acs.opc.Device; -import org.nl.acs.opc.DeviceAppService; -import org.nl.modules.system.service.ParamService; -import org.nl.modules.system.service.impl.ParamServiceImpl; -import org.nl.modules.wql.util.SpringContextHolder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.Socket; -import java.util.Date; -import java.util.List; - -import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString; - - -@Slf4j -@Component -public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { - - Socket s; - String ip = "192.168.46.225"; - int port = 1234; - static DataOutputStream dos; - static DataInputStream dis; - private int recordTimeOut = 10000; - private Date recordTime; - String[] ERROR = new String[]{ - "货叉尖部传感器触发", "S300传感器触发", "载货状态改变", "急停按钮触发", "触边开关出发", "需要复位", - "停在充电位", "取货失败", "放货失败", "轮子打滑", "没有动作码不能进入站点", "取货时有货", "丢失定位", - "抬叉停止"}; - boolean bConnected = true; - - boolean isReConnect = false; - - @Autowired - ParamService paramService; - @Autowired - AutoRunService autoRunService; - - - public TwoNDCSocketConnectionAutoRun() { - this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); - } - - public String getCode() { - return TwoNDCSocketConnectionAutoRun.class.getSimpleName(); - } - - public String getName() { - return "2楼1区域AGV系统"; - } - - public void autoRun() throws IOException { - - try { - System.out.println("2楼1区域AGV系统链接开始"); - ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); - InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); - AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); - NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); - DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); - DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); - DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); - ip = paramService.findByCode(AcsConfig.AGVURL2).getValue(); - port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT2).getValue()); - byte[] b = new byte[1024]; - s = new Socket(ip, port); - System.out.println("2楼1区域Agv链接成功"); - dos = new DataOutputStream(s.getOutputStream()); - dis = new DataInputStream(s.getInputStream()); - - while (bConnected) { - int count = dis.read(b); - - if (count == -1) { - break; - } - - int[] arr = new int[count]; - StringBuffer bs = new StringBuffer(); - - for (int i = 0; i < count; i++) { - int temp = b[i]; - if (temp < 0) - temp += 256; - arr[i] = temp; - StringBuffer bs1 = new StringBuffer("0"); - bs.append(temp < 16 ? bs1.append(Integer.toHexString(temp)) : Integer.toHexString(temp)); - } - - System.out.println("收到请求参数:" + bs); - boolean flag = false; - if (arr[8] * 256 + arr[9] == 0x73) { - byte[] data = null; - System.out.println("接收agv上报信息:" + bs); - //执行阶段 - int phase = arr[16] * 256 + arr[17]; - // agv任务号 - int index = arr[12] * 256 + arr[13]; - //任务号 - int ikey = arr[26] * 256 + arr[27]; - //站点号 - int agvaddr = arr[18] * 256 + arr[19]; - //车号 - int carno = arr[20]; - Instruction inst = null; - if (ikey != 0) { - inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); - } - log.info("接收agv上报信息:" + bs); - log.info("接收agv上报信息:" + "phase--" + phase + " index--" + index + " ikey--" + ikey + " agvaddr--" + agvaddr + " Car--" + carno); - Device device = null; - String device_code = null; - String old_device_code = null; - String emptyNum = null; - //自动门 - StandardAutodoorDeviceDriver standardAutodoorDeviceDriver; - if (agvaddr != 0) { - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, "-")) { - String[] point = old_device_code.split("-"); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, ".")) { - String[] point = old_device_code.split("\\."); - device_code = point[0]; - emptyNum = point[1]; - } else { - device_code = old_device_code; - } - device = deviceAppService.findDeviceByCode(device_code); - } - - AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver; - //开始任务 - if (phase == 0x01) { - if (!ObjectUtil.isEmpty(inst)) { - inst.setInstruction_status("1"); - inst.setAgv_jobno(String.valueOf(index)); - inst.setSend_status("1"); - instructionService.update(inst); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } - flag = true; - } - //任务完毕 - //(无车id及状态) - else if (phase == 0x14) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - } else { - inst.setInstruction_status("2"); - try { - instructionService.finish(inst); - } catch (Exception e) { - e.printStackTrace(); - } - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } - //请求删除任务 - //(需要WCS反馈) - else if (phase == 0x30) { - data = ndcAgvService.sendAgvTwoModeInst(0x8F, index, 0); - } - //任务删除确认 - //(需要WCS反馈) - else if (phase == 0xFF) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - } else { - instructionService.cancelNOSendAgv(inst.getInstruction_id()); - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } else if (phase == 0x50) { - if (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { - standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); - - try { - standardAutodoorDeviceDriver.writing("to_open","1"); - standardAutodoorDeviceDriver.writing("to_close","0"); - } catch (Exception e){ - log.info("下发电气信号失败:"+e.getMessage()); - e.printStackTrace(); - } - if(standardAutodoorDeviceDriver.getOpen() == 1){ - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } - } - - } else if (phase == 0x51) { - if (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { - standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); - try { - standardAutodoorDeviceDriver.writing("to_close","1"); - standardAutodoorDeviceDriver.writing("to_open","0"); - } catch (Exception e){ - log.info("下发电气信号失败:"+e.getMessage()); - e.printStackTrace(); - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - - } - - } else { - //上报异常信息 - //(不需要WCS反馈) - if(phase == 0x67){ - device = deviceAppService.findDeviceByCode(Integer.toString(arr[27])); - } else { - device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); - } - if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { - agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); - agvNdcTwoDeviceDriver.processSocket(arr); - } - } - if (!ObjectUtil.isEmpty(data)) { - write(data); - } - - } else { - System.out.println("agv上报不是0073类型动作,不处理"); - } - } - - } catch (Exception e) { - - - System.out.println("TwoAgv链接异常"); - log.info("TwoAgv链接异常"); - log.error("agv连接出现异常:{}", e); - if(ObjectUtil.isNotEmpty(s)){ - s.close(); - } - System.out.println(e.getMessage()); - e.printStackTrace(); - - } finally { - - - } - - } - - - @Override - public void stop() { - super.after(); - try { - s.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - public static void write(byte[] b) { - try { - log.info("下发agv数据:" + Bytes2HexString(b)); - System.out.println("下发agv数据:" + Bytes2HexString(b)); - dos.write(b); - dos.flush(); - } catch (IOException e) { - // TODO Auto-generated catch block - log.info("下发agv数据异常:" + e.getMessage()); - e.printStackTrace(); - - } - - } -} 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 9a913ea95580988ff4bcd772d970fd1fc932dec1..aed1a2464bb800ac0bde998e1b26dba50c88c560 100644 GIT binary patch delta 59637 zcmdpf30zgx7Wdxg4qWDW7C8)hFUoKc5mb~5h(apjlw_r#pr8mSXlT~GmKm>lMPBvr z-m4^guc$0hGpS55EqM(}!!sLRp;_^oq?ulW-&%X`bGay#^@i_#-{p7D{-1UBUTf`X zt+n?#_h9?V-PYmWSg5NcgnXq$ZKnRaYZ~dDHHOWSmOiytCuyi|7A53>-BYvOumW=Z zc>er(`(rncws&jRd%-#T6xaX$xfxg6S7|p%=a<|6sa@vPc;j2?Gp>Gv+RlCkseP61 zad!hDGYWDG^K)}@?OFPH_Cmdvy-B~A_U`>bAE>oYbs0ik?S(GE_N(1p?L{u$)ECYI z?YFwS+t(PpwWG-a$-dGMV1L@()rUy*)+=YvNG1W~Z6c9iR_;?#ZZtcK@IWq}9+YH4 zNmO$av1fV&+uK}X?5=K!_6Iz?DY5VO7`pdUk5O7`vdg}~a4h!6W1(+ws0qq^ecp$V z$5uZrMGLhODi&VQUBABMy ziz9>WyCOmW+2mmRyAdIxL?|KkqJ-X4l<*mv1o){=hXFn$A z?VT4jM+#YQ2q5cWhW344CZ=a+2k(6=rq$cNKPB4!NXi)dt&r+QZ=|jE1*7ND6ZV6t zBWWibL-%UNtPHgN=|(IrQF_%Pd)oTgTKHkb{HDy(cuU&uZ zJfw9!$Z78t(E6xlNb@4Moj{s~mN!IS7r5{y;z2y$V!23NN$qkx4;TrCiD*ehRc+lL z4I$)@)L?Ht7i4#vHZksU-4dtDNW`0v9*Yjk>w9EKX@f-WgR>obS56Do*;{9ZxlD7x zOq2G$JkwocjU=?^8x0}R#HHsmNG0vUr#`tQwXv%9M6dtGo9{0PIZvJkI%>c_Rp%`e z!g`(o+J!mqf^JhkcLEp&U&}!s5@FVoM#xWos;7@!{=(EbB>|b=9`6miIV{I|-_c_k z(_;4Q8S~kT_cTnt*L6|hOuw*%x3~Dr%=xPDSny*jN}dWzShqs*T<)9aH`#i_6I+(d z48OJN(7V@s_~QBwOIQ8bw0FmTIR4zZcg}s((BWyR2%DCz+qpIB&SQ_}eRcK^v!id% zxM{uipMEcFs`R_%WOLs3m@ifyc_;hIJLAu<($TZlA&Vk31>3vRyZ+38dIX4;X+m4ALb zeRxHM&y&-y2n(JyWZasp87IDM|L&gqZ@6vg+x2hmzUmLQzx?UzyY9aGrFBnUzR5Ih zW!WpQq;KBb^!^ij_H6#zqsY4E>*rp*{r!&gAEY<#`bXWkk3%2J__#Q@efzsNKRr9< zzE1s@#~W)`U-ewvPK^UVHrDwQqd$ z?a;B?KTEs$o9|Nt{?JtR)u;#7rUz^u;dKmYXXcOULLdGN>j^G{2c zf7iUbZH#s7J;!DnUmoMJMS9<&ZK7f1p6ekoy|+7cR8UU%w~ISR75KNh*O1NUr~U2| zdg7|ruA!Rt0Lv@aOfGx;g}c^&vuaD_3nxB&Y|H~=TW;0ZEjLIFqiU09M2&rH-g8mk zRcAdq@1sx0l^^+O?8sqn9^H`rQRk5PF4vX~-D(`Q9`jshUGu}YV_qNm^?a8vQ_|*r z^U$c}w}f3CcIdJ{ji2}2(#mh1oBMu1{ReN{vf##soG+^Xc-5}gmhXD;;fDDc%UfLB z9?Yq&dHlu03!Zo=!|VEo*S-Ju+%L{O2U*@)ZBF~RK|1Sta;8hbD-XZpy=LO^KXm2YJ+bALRkL}vW;?XUju)Wp^I zezZa#PY@ArTIu$W8=agv@1;Yn zb^mZZ6k#aK`}l>1Gu8>$mVETLb>(R_FRY)x=Ut!Ue|k6M9`Ao-m_6pujMv{HC+;}- z^wY0?`upk!-dcUf!K=ykVLyGF{e5zCShwb*>dBApTsUON)l(n&W{%~!%kkTu2pxIP z>9OvAi>aEmw$kWbR{8ji=d_VDFSmVxZFkYbUp)Hkmp{&$u>A6OzA1}%%XXP9fOhE5 zYt}@+Ki(d8g~cUAo(GfkhP@?MoQaG86H&IJrfzLbNo8eO-NLHXD-1*n5dx{Ks9J6> zSsxIbLB7yvi4JMCGw0ZXtl!S2V6678U3;fQ*V=>E_1YurgYCZSCtA;wTd08)&m?di zOb?`YLF#uoAqTY(D?$1_q{ks$2PP|b9wDDY+70OzJs}?z5wgt%f|Dx4~|DkQ0zT18J2zAx&2kG6@8Zur46vB!EXCy~2}_#S01XhLG-i zNFRW-w3rYdsPNm6Hb6=i5wa8NwFpu#UtkL9wUCZkOvo8X+aN6kSJzoa$oc??8J7@J z9!SWFrG$hA5poRDT1cmq6Y?db)&~L14JJgcAml|z8zIdIfm$phWEZ5rgESR7f#%tpJX*0?m%>0XKafR>e z`pr*;+fQ!sa@)6&kkbu>++gz@la z*U&W~5C1`VKqou#a1q+tuW73F-ve!c#r;S)pgs6!|FJ38g(1NCf9S(o`|#e=e<-1S znf~OI$qAqS)2*R<3D)2sgyZp0+sFF;>^I#t(sOU$IeEPPyU{e=k3t5?GR2hpHAER@jc~|wGAQ?ULExLZBBoB)?ye3 zJc&^Tt1^W=PdfeSnV#4u&eSKNi&1}Us0-;h95nEK0-__}8O=`J;q(dUQY?hys9z!b zSNEoR_NR>5k#hlM(?yh%J1#60a^HoN`S+z-`*9YEgE8r^gP`LO94J3_*g$k_+JWfU zoPur@fVUX7$v_3b2n|RFqck8L$N4~fa9sDNFXV#3nq6>#)4`ezNC%@fARUZbf4cpX zKR-dK{r=_zH{(^8V_Nr11zx5Iw*dq#T3e$#tX3}3@J+lYAW zJ=yIiI5`hrLY2F7X_5Vodt&X|PnYaD`+_v#FpKih3|&~2zLt58{28ud9<0PM$6trt z@Zq)eul9`}&Zf`XPklH8j;8J$I99S_D?5G##~1AB|Hz>)+SmUhhQ4HPX2+xK*v*a} zAH~q)b~7Abw9kR#OZIwpyo(*%;dtDB7LG644Iksxcy=s=<8gZ(9FN$W;CR%2fE~No zQTqu}Ozb#~9cw;$04O1!B0U3+&)SPW{lb3+)NS97;BjHIV{Q~B?jz`4^Hcd=dmsJb z%>X(>`D`gQDy_b>UaB$dAK^!PXxs@h7rNjeEPk-jP7MCHKPQ0BrPfCvAF*(gMM*2M zL1}&_!Py2lqmmxXnT9+f=vuOiyo1~sUFV?d$!@ZS$wnXQ0`&fWUgUbojoChwX<#z7 zN^lUZppPgUf@m!yU-P6Qn9htu{x0yRFu5+^XCEO}#@`R9uF8f$>aRnG@QCvFV7l1z z5pun_Y7keI;t;9@u4N%~DawEXN*5=+A40DLQdTGphUAJ+mfXl@$+YEyVsQRr=@G277b{&SN_(-=tCf$TG+m>F zhtp7@pAPNjBg*t})*Oe!sTH*x!p`>bBrbxT-OUr@ORdO5? z5Y7ZhLO?hZpb-KvlHdZu`w0jqs(^4XczpuGxd4a=nSk+3zz`;2ybv&i3CIuvhByQa zVFEHm4Td-b4CyCe2oo?KjW0G)1``m$1WXVDBA9@QLO_H=Km-?{#Mjdp<%S3vG#fka|aA`&^*GJQ^G~_Umaeyrh=mfQ*k&MGq!6DMY0k+j3 zSEh0znvML&(f|Z0ZDufCPsCPFKBY0;?fJ6|9*PpoUx3KV@n%b-glC)RHTa z$dvFAN+dERe1#H;4kZ%%)iTkcL?Tl{^&E-3mPw+PQ&=sNm;gT^Ac+a^7Xp$T0+RaG zGRYwz$squ1nZ)`M2UAkNS|&Ma*+N>Z;LCYHViq;!ikLx>N6A{Dh#3@llw2beF@qwH z5@c)!MILqdNHZv+()C~{>mfh(rx_G^6wV)Y`r|T_iIrQ_JXZT;5ZXf43!%v%w1r$J zgeHT~7A7#&?IOy%n`oH(L5R@CFz$-7A%X^9nI?+zI693LJuQl+ zLD4(O892ick>;2`X-ru)v`cd+o7PX+G#(hG3jsbBtYJwyN{n|XF`k*Nk03w#!0{I;ab*Tv zLM3FTLjGMEzQ;0$Y);ZP!@UrS^-`aZ*<1P;^;9(7L;0-~9K2~0qb5HNxD z+UG*R1c!hLOn^GLCO8C4U;oAiA=zkM6upNgXkD#+bwjM zvN3`NT$w3K4QHh?S*fo?sZ3VtYdFJtXFAl%WNN9NG1H+|Wa^)|#QoniFCw#GJ zVY+=Ibh9wsz7@Jz9J*Qh^@+uyo26f$Sa_dgL2(qo*OOUHK(7#x#RPmO1Y|h`Wc3q} zuIsJMrhqx#!(`jV5nX#V4 zSpOtgPhzakD-Wl`Iy+E#E1kv-NoM(SSw1*06>?cVN)>r5ElL^1a!h79)Wz&%mP1|4 zPIf3cSv0`IV`SY`kvw_IE59|gUE3-$W@&lQ&?9hmE)*k$Y{nb zk8x8&?L5ZKK$S))m8yo;d5(_Fb95|rMxN*l9$M!yvvOQ{eH$flp~=x)<%_+S*_QzUyL=3jbQzPR#>tm4Not&Y znM2ZLOp+QWU*@RRWxQI-Q{$ln(-_04jG-DAPh||f=(Y@+7{j(cVJJ;?Sk$RZMK#== zs%{SzW>7;)I%7ADu~Q@5X^fp3;ZAetH;wD3+?qiru$?o$u`(SBKT6c-bvhJ&l&I0` zbSTVs&Za}*N5P5naXuX?r_wQK#1Vkwe>y0w($N>GN>2wj;JlyaWo2tUQv+(P(-C00I7jwf$&EGYB=KsJG{}P z26o~?sA8H#VK+?KK8c!!Ve|}@f;bqE^anh1eIJGhQt{&j@n(wh$s{^66uXRnQXy%B zUF7J6l=Lp++nxLGn@vXrxDv^W0%(ORw0Cu z$0(hv=>#RPng+y#f?PX%`KSto@>@xoU=j+sw~}<_d?X#O_*c^)W$PO1m${XU6&Y|# zZW|c~XV?LkxFx52u!g4Q-$hP?R8$qW-R^b-f4J>-kDzPe7PZ>zxb3FW^?+0Z6s~kF zr=iMq*HAy;sm6P_({>k8<2~GI<7IKDt&b<}w5fDwophr4N8SoLr>Z43B)-gZMl6_u`s4pFN&l&kUv z@XXvo)O|kOU)w^|eLmb@<7IJwt&eAT6QQcGo_cTr)l2mz9Qe2%ffBB@ydtmsmXV%qfPj3TsH2; zr9|Lxgr})QvqXb6-Qw7ziB`-v(7>1&s1y!-=S@3RRlaGLgPV3K!RSC@fY)}&%%g-D z;CHX`%5~J}&3j_U^C~6R^pZ!g>f}p9Q|4s~W6a`gR=Wd*OE6PdCHh zn0_PmOWo>-VJ>|KZmV)49+v642I{B00Zd>Df%j%TjQ)QsDNrI4z&>noxE|atUZ zQ1#vMF)K`yD>lO5nITx)J8ctj$#}?6vJ^8a#Thpsx_N>6ZN~YZ(lG4nCx`y3#I^*2U(3%fJxsLT?#Pa zTX89%R^Ps03UuXz$iRF93@WxVpE9hJl?j0SEB zgkXu}c6WG8isHSW24aKnZS1&=G$_e2Fl_F-jn1c|SZL;j8-36M7=RIQEu()=bGO}2 zOTEn3zRRBcuUYmXr2ALhPAwYx{r@R$fo~OzWo2enJK?7NA{00;}L~vfa!2lHn zoi)ntmtYap1lOa1rdR48rV0KAFfH&v8Y{%{DW&;g8f@*lfDeH(m=ziy9tktxv*5(Q zv1SNh6Jn5yv2vckL4cbC#;CHD=Lg$KNV}i|B&a9wr1(@xC(kp2;sXiY{Dk7;EYLGd z01ESQ!e*uTIU4L$h$P^F#maT8u2vhT!5t3JLtuRLrb86Z1ANMfF6)5+b;JB-fiZtE zVyN3tNNNNf?S7+Eo)#zE#`6y&sA~ref~LfcoyVcgUW0TR^aob?X*e%?et+anx{yXw zGCPB{0}Pmfk<$DK4YKBtEQs`z;V%t#JST(6GLx~epdSNhH0&Uzl1YHZ!f`C*L|PWf zg>N?GGeenVpy$Hhb>v!hJ{oc)L#a`W!z4IMg}hj9G~_fhUTJ_+0A-P}u}oA72+D=; z82Fn6l#?t!+rTq;%$@1~i`saBe( z4Bbs9Yl=56P-g4~1KGZtUana$`6w&*(9CU+o7$A>Jv0lUW~0=O^trS_iQG%G6vJL1 z-X_&3QG4lJO{3I-AX8}rvVNO{eaWO!gF^SvK>b}(y@RAzd>^C1+D?_A_&f%M)=AAU z!m*H9GPx*^KSpI*q}Eo2D+l+1i~-m~GaXbS z57I!5Wn;T?;z^pI3~8fb`Wqw*3{obCb}1{`Xq3vExL+#o3sm1E`M`YTsy6|1uK4-$ z>-wqQ=5Yag+NmtuPp1r|yt4qEhwm*?mvZZdbVPs|sMD1}KUG3{Xl{CMr}JFk1GEZ=cmEG=n@zMyB>itKX#PL$HxOlU1CWH(4seZ5S&OREDY5i z0f`y0jW=1b6Rvl{jRIp-*upUG!;29w%C;*tFF?S1%Bfhd6ZY}!6Jrt>gI^0`PzC2p zvA|e`a)CDjuIJbg3mA4{F+cna530d2{@|BbIJUBrJaGX96gp+9al-Wi7eF2xVw)@S z;jRI++EySK#@83-QTE$TJ6$R*rG%Kv^r8Ke&Jm3%>zinZ`kqE->CptQYuk zz-P+=-9ogiE&>8xESdh4DML=l$uA;zC^<%AAcnZRw-5) zd>0h$s~0pJjzcrj0b~E9bL=_>aGs!J9vjE*NN;eWw zF$iIcF-~X0p^;;m-06h7 zoiO{kgpIGJLn4&ZXJ}A~IRXj*4a*fe;c_Qz6W9y#GzpB8xWx&#I^i~fk!QPNeg*9? zlEA%Uu`Yqpu67HIcC}YvG<7x{2>quuivwDaF6?u=6Yg-rolf`^$5tH^EG}SQbPF5} zI6aaxod`*>z?i35V9e7aFb=p784jStC`j@I#>6J@{eYVVMthYPWrZUYxC|0o6vrr_ zQ{dr%Wt0MWFv$}bh1Cd*!kPt^0iP0h9pGN4JoPa^06q&KX%#pg?Y9rMD_p={w8Sbi z-+(Dt$lAJ}^`sJ9FBW;R)yg?$_N|6vy#?qtLC5^SDpx6f*Oaw_l@4)*?=F zGr^Sxjy=#UwsP!U1h`$$kwu6R4jT+Ub0Cp9_CR_)$INNjICe$L*T6B;x*2hQtE1Q9 zBy3R{|3+h0bcnn-{(1z)n){$~&^>5hLO6Co9n(2x7BG)vCcj8vHfROLW^U$~>C&pm zC&A#hnUp)x;CACBo2wp)Rt8aZZRR}7)K$_e3QvZ- zu-l9k)#Lcc6Bv7@MPM9s-5k5ffPK>707d}Inh`_U3`puZW(J{6x$1426qD3TUb|=)&v33InKaz-nOC%gZst02|_vhX+VLPT1sxEdu*N)*^ue0N12*BhlcL zx5Wv!JK<9Tqmk%AER2NDSdP(1gb0jA!Xz*niB^F_0H5NR4fGz4t<0(PI$a3C1{SkH z7PtVJB8CRRnOD#0I<)u=g3g2qJPYWj1fCDrJRS~Eb`B(s9OIY)P0X#o)?NNSYCYJjCss&J0l($IKA*2)YD$;O-Qb zWy?Q_Vzpj;j%0;A#V5I7Mq z+&E)-a15Fet44`qZj^W)4O~^ntWxzhjqqycnYfwCWoF8H3TO^9#S3CNR!}ul-JDKU zItXPZtB29K$zroYn6D7jPGGaZXtMGI#?~)p*j4%93@naqP6e8saGMkE6gUhDcOw>d z%fLeeigwFK;EjM~fnx!;Anre7*eb7+=drToVmCkG22EfT*6TzM!M;)LnZN}=GO<46 zyJz(Rqupv280}WCz-YIM^5NhJdYtT5E5E=(hAx58JjgiSVQiq?Di#>+R>)LNUj|8` zz}PtL9BTopV}SLLVHyyG-6}+Uf!%7F#_d)Mzt*qIaYD55^2~0vbIj~kr=VjV!*nhK z?UoP6%%0^T?%xZ{Ru+o<2Dn_zaT<&C%J~V4nOa096wrzo8Ux2v8>chd);XPrO+MHq zVrxt0m{}5=z+P~W7f?ugYojf-VEWGS+^RFJqv+e??mt5 zm|3?@#Gt1P$tjNY0Q*_DUQX9J(X*LZA;{U;tN0^^`9bjnkX7;wC@>n}rg=)#XEbPHJEyT3eM;a0xZWi&_O!VO4lq*D z>=km%^lL0qvc7=bg(jrgTwUO(&Lj^L;0~VG2g~(v%r;ZZR{&vy!3*_B=a|up1xC|Z zj@ZT~yo2XKAe|Ct1xFLcgR*Wk!D(C2$5{ay5J*VnhBGj;$VMI4R^O9ypn7A`=Sh;g}l_jwzeQ3;O1Q0k9f8 z_y7h0?6yz{Vlfp=PS_$aYq|wW=%+NB&5H&ndZQC=a>C65GMbtC83u^S~;dLON_| zvJ0h3);St9%23K^9ys=7frkRNaLn=+3p(mqUaFLQNu#YboW|xsgUE~Hw3TCjoCocK zj^#qi;IP5K=7G#Hn;-QYvw2|Sn9YL*fpH$R2#ox@Ip*`Am!EiG(mNz@p(>zFb%4BiMR3zxE=L8)Y z)i}``%DI1N6f^@|ZxJ{aaBDg94--yt8k-3{0^>~R6&OcQUIiS4e<NsSy1Idj@ey{A}6{{U`!eWJ_xv1V4MtX%i+*}qkDwM0-*Kq z3kHA=e}eTatb~K`5%t@^LnPY-1?NMP6K>;}&5cunj_P(P#b1Jp=;kCgHOLCa)W-u7 z6UWR&qzgJ0Yvh0nsd zCsY;~hlyz=50?r#jZKGgfeYYzjlk#_+6A5nxQk=f@bW6=7%n%hf(tO@5+Nz#n9YF( zK}S71IQB-_olf*##217`IQ&U1a}uF7wd}e(l2j*v^P*5`{|5GI8tT~Pi)H~?4Rqln zOslz%FmoF75qSdRoG5q7+aTy{K(FRLqKVVkL}(RxaUz`JnE8lqLC12IHB2^}2zeYc zAJNP)n+Po&vx(3uFiwO{fswz@HH;6R2r@tMz)4xiG4m1a9JBuD;FwK>PQdC!ICTww zJZ@nx?NuV-895hhNlLqw1>e!&A$W2%c^Q7oP|A)H`C6L?Vvw%f`5g@yq62(kj#DDX z{=?r5@#A zNZFQhW%G};YKxSRybRCa8h)Mtf%7I!g;LH`q{AXLM^LvekY)_8yr9&i>`_q4nTj>t zfBr|BOs)7%!~&3jKU7%^U;MEN{+I*lb0EC}zL&#y9(;@7i}d-BmcsWc_+Aa)1@ML6 zypm%0mcVxreDPI&MCXE8)8gzRTgeg2Gk>GQ_t_Rl~OizCYbrk|{$k zJpaV2N3ahLckcd_H2{%G4Yb!1$waD@+o&{Bhj5h=OQqR?%Mh}@z*W*tLZQ%n zr_LKj)<_a`VZHPOFw~Q8;X3A%2F)jv1#q2^kz^v2L?tdEzm*lRTzUbPKl@kapX8KZ z*RKLr3O`3wYszatFQ|dGUx9)1J6Aw+3Hcorm<3Iyzk~v64X}yf)sw^sjjc8@Kfemj zzkylbtt`<>Q>@K;KKXTIMQ!a$G*>w3i#3?yki(wEY3vRIhLSAHI%pzhG(iGt^>1q5Rs z^4EXv{cGnluYL3S$;XesdhXy^ELS7SRifdePeA9*n3a_?EmsG>y>_aol{IaaWwWq# zXsvhw4MFRrBV{P>f|kj$Y!UgFLr-==T~MJ@kYdvch2Cj9>Z}m^krMDx`E!M=7ilCE zYWkH5{n1IGLZJ};Zfl!Xh92h%rV9nNr0ubj&mk51f14J6M*}Z9hp$ZT0sGU;ni+8v z`7;bYr0rm7w&nhQUC^!JHFjlPzz6U)_A?yx4q7sIcCL&z4qJ35y#6zmw1ArK@IEQ* z&?w|=V)h&rK-X68f(-rOmuXM8?EaMZCDLs!${`miD749O{q?u^9qqf`s(j`m1&4O9 z%l=RtTmJPO&%eakb}2&*U`l(Hi3TY+3?umWKpUQ`y{l8?G8vR=gA^2Cf$Lvui`cP- z9UBZvR<;yk+$n00{*#;HB4`)Yk2(yLV#}6-GY7mRth5#$$onNGiLO$_uz{HvNh{NY z>(HvyxJtpUdl+vcc}Qt=l|u7XT``Z59Ax?$;r{~3P*#+K0`P<8gEukL!VL^wWz<8Q z3g^oFFe#iqv){{2N~2P*_x>sF(p3`t#OBYQQYQR(=B%e=^i}&6#DiusC^5uK3bj5X z`NBY;!~`OoyC1Wu^+zLFzzRLXYM@TJQkYU59?0wfQ<%?O#vJm2d%zDHO4u11$ahg= zRT4Cxz90a#LWcM-IcNtAz?$O+9+2aT49I{um&duD?xYYZj{j$gw{W{6drJwS7wN!Q z#FC@RPqLIU$e>UgN!0~C&47%QnkXsIS_t7iwyII6E)AHSGc`gB8OdW%;lBI>SJgTH zbB_FK4{|;o&})zRz(ou-(2!zl?ornJNM)fNtgk(Y94{MlW=xwqy}-yC_c`UCK2nlD zju2F3544zCF2h%vO*@oEUnw}^IVj#YNG{BI)E5TdW6BS{l2H^GGH?Oxq;7-a9VJEo zdm0-p0FD?Le&?xP%Jbo-Ax0&eDS*82Lb30v~R>ReM)7u(o|eoY^6WCQt!1jd8Mb zrLn!ZNPb-l*T>6@y8od->2I_M-DoMrA%xR=XTM<%lZQoieT~?kx5G^`FNsyC(eSF2 zYm^hirJxaoaE`%89;Dl}%`jNeHlVh`!9q#&py{rPw^0g`3SE_?5J<~il}tQ`2hkVe zd6TPBZIp&et**))K!-{8XowUnb-5~s;MCgdiaycD4cQ|*6Ch0Shg6v252rA#f%HB2 zah!oX|Kq{Gw|)Nn(*$NUfkt|f4PZ3&*od-8ZMME18N}wHwNW-^Oa6n*XWmo)W{=tv zDh1D0RX%_!Ko!t!V7gOO_&^I@CDz}A8F%t&71kIu&*|}5l3kKlLrOzg^EGt<y&wFI25)dK9i0H

I-7{+iFVDKml!lh8B)^)nbS~sPdmO!_!upBWF~`v$xjd4XZ9fRZ&# zGFhEX9lt7!ZEnFNIe+qaM?FL}`fLqML&(!7s80^(L*b3+&ZV6(w+_&rCa4wo0seuG z0nOzLGh(CfR5FHvRqWH&Ido(_EA)k|PLZ|R%h+>l<%${)EC8jRa@Vcm)k(SFh{WGMwKP4^mViml~!F7Fg|+l;mKkAn)gcfW95Eft@|xq+yL_VEbU>WH?7J z9|Gxn(8c1G6uVWqO>1GU7$Z;TxCA$>PI+*z-{Zl(zQL1wec6+F{jhYfLhr#lT;U(} zeader@r|xRPaX}Fd-7<&=EgSDiisZU-+dZXvR-P+#p`*iA^B^yN@YGYd zpQ@Z2Ck_4iwSVMn{2d|MUK#$dH3s*PztWR60%MF(e$9Tsf5nsGZH?4{oe-}gzj=ib z8h)_PTH)b5^j}ys{nCpvUj;>xMbSj%yuUQuXohp7n;;e4_343E@dotnw%2!Xktk~P zghBl+{-0yqGvIbu)f3y=If{j~?|<(!IIIDD>tYquiT$41b$9dWdVn5yk_u<*Z}kAJ zto*zRipNNm--c9 zc|(-p)1+bf1M*@s6j!Nen7twWxm@_aNo4YhvSr$!-s-}z;i51}jgpkFrolbFfu&(X zqw@H{R>Bw4{P!GQdIC!O*BxF@Jo5Ps4i8`Y!*_Fk_JIOrXMr@u{}p&<0K0rV8=h=6 zw%;pATKTVfyoM3H?QJ8t$18_(^mzEzrfu3T@IeE6ydodvd?7qDP~)Q{Es}y}HTdu~ zQL{+#WsJ(|WNI`u@4-u(Zq~z1$MjM(_BY6#C65OBeRxGpNxxsFL zr4-3H6i=D3Z}9R*?6UPEarq>>uhhaWe*(16;M;@OV9Vho^U+8UOhNZo%M(7l2)b zz5*BI=l6>)R&ek#{S|}_o-WW3jc~_s6o@r-gS}|=q2d17d2U{#CYHbJf|ij6RTd{I zY)!!jw=J+GH1Mp;AT_&4tl~FUS{NZp4O~dMeXca}XCHKU8>%Xkx0Sc&O2gdMX<-C{ z$K}$<3V!+4fBGky6*M z>w-p<$(!u>Haot46k}2mrR-$;)`Mr_IG9Yku6#6#8*DQ|`yzhfSnSB5f6Ehe*3b+AC5Y ze_qZcQj187{JEQ{@n>#EYVcPg=Sv~rQPSs2BR%_CLWZ~0-8({xRPLBB>BCjJ5gPRp zyh*u?<7ZHBlFlvqnryI9d*TG2Sdv%VEg3k)fz6^;1SVgFg< zyrQXR`G2DiGOJ6Pffpy>s-5rKg4loSispwUgRf{{ZLp%cv|`Cx=Y`iGTK26fe%*?u zed(`T(S(5E`5#=-U>uE(e7AntBVU}ezVSVUSR(i)LAh_qRxZ6fUyX}3rT7;5Ab z63pF=Ihe0#@`C>pE1Epm82p(PO$fU@xL3jdU-LidRsQoUnp5x~$R(|4{;zu#Gt<0K0UNZ(g`D0014|rAEWcur zgLO-X=h`qeLyA7f1S$F)eC`e2W5b?%!;}zuZl5x$Rx;1b$ucJ=r=`OGlr@jd8Iv#? z{+aBggt3#xX2E}h&C1QnHp4sglgH-fUUw~k(W8@7M~z8;_1#7;Q}&j)4EugzepN+XS4Bx>#kw<^S@RZG zbg@_Cd^G1Uy=mIy{C8<{)vD@ihH9!xSFadHJ>9mK-&sDv$10DJjqfde?A3kb%`va+ zJ@nA?2RcDTxGC19#^q$hHn->%WwoW77Tp_th(^P!lD5;CpL<5n z%Gp4TnVRS&Gq=+e-{`!}w8)T>InR(Y@2~m}T623NR7p1C+lDq64|n?P{?ya$S(oI* z*|BwNcl>e5ip^va{OjnNN!8a>O{>t>*7=%c+tV8-KfN$bXULco^s9||Kxw@Qhd+pjIA%v_Wo=4 zNpj@)L;K!*<*Bx=Z(jWR=%IY?V?K@M7iD91?6-7O;y>xlbVSPUsZrWn*0@79h1yLc z<>Z-$9P5EsU-LWlx4S*vMrKZsQ#@CN$zSfE%`bfS+M7O|ot|zl19kMRXX#R6{5)fH zXXlq0H-2u}li}$$ue_pFcE2M<9&eiO5|@}$R#;hCYx2>@x4R{h%S$R(m&q9ue~_a~ zOpW?6k9X=eG!;jESgotpRp>^=E!J6*bh<-lZ_2dl-pt+QcE4MuZsC!&*Cy$bbal;p zUP*e>J4v_jp6NSQASFpxeNEI~PyE5V*E{QlMY`lT??7$A_tvo0VX5AMu7R1l_vd>D z{-_TeovAYfV)m8G-2xA$B#E;`-Ix)&^P0e#0CT`h(lsWAemQC;SsYD!%w<*9(vtKP zB42M@^l4%FiQvDLJ?K(nPtM%rvd-33wCdrJHp}!CC8Vk}dv#r1brnheaUWTjQ(3Wi zxhal7hv%#+E2$%8>}4slXOd}b;#6mo>iXnFYy?s!kCbQU<>rz(`2~}5ix$oyS=rNa zXV1x+MdrlI$(~lX+$vHk!<_SUGm5wWc)HaTuBuo={zymA%_~TWkpAbY(S|d!tnHpb zQlBpyxq6iA>e5BTD`?e@RIjs>7L6KlCdGA3{ED@<#-^Hdue9lFJs%n~x?v1?5MR~v zY)IPJJE~?)nr(bHKiqR$VTvKtvSMy+nROMJT)k>Va$;VEzSMH3Z|VWba+Ezbia#DQN`jQxXE!=k%6@5%8LuKR(wsZPY`i_gxcbxBtGpu4L7Q zFmtqToMu{AS=G|I@~#=1U}OErebTMEoa&mj9)24$T+Xz7;^(&0gtmy(%UQK@eid}s z(y~?Ya_OR;I_uh+vOMYV9Pj9S^k~U~+R#mLX(rAtN`|4XY>#`=h81ZE`w`%H0$)d`#k`-lg zyKLP3>5=c-W1?dv`Chjr6_sVB3vb%tVx$XR-(h|JrTa9YOSS7tWtR<_S9csYA3gH@ z-r})0`Bl_ztXXc;Jb!He=NtS&m+I@*TC~w_@PZpntlMeNirT8xm6cJG^v54M^tUPc zig+R~icTSYnGAqAoc3n+u{0;K^+ITto-h;AR??l-= z?Ft{ww?nghZq`ON(=54w<^@}230~Vm)Zbj6f*)Pa4Y`5JTf)B$ODLtwhSD3{3TWH} zxn_Drsp)3-LmrQLjGQl>Q6rBsyV6_(J2iO)+=qcI%A6L0d_yVU7!3L}2{a$+dN>bf5oj!c7E!njHU( z+!g{4+ebH!7?FF;ByFU=JumtwWR28M`$qQFr%0w- z?ipDtUsGPz=q^>66DG_pEXQxm|aM^*4CHtj0 z%}XX2=Xe?4bwBE!=p)0ADD|>!hJU~Wt2s`Vd*pqt%sl*Bu_3c*yHqkjBN^y^hLyxx}S95q`)mkI$@eIgzqK6J~loW2H|) zb$gwhTVGMzT->_Rcjk~}dGgut8H<*!B(zqZcSHD*yv%T;%dABuA!IVVHDb2W+8%G5 z3->3yT}wUok2gH&Z`KS?nI9Nsst!HBSi8*gd2+hOuOdm>q1m|i{LMys^;N|WXkM0H zhnE!ZnV&g*@p#V?{pUkZ%s4S4UVbNK=<@L{o!WD{`187?>#Ad}JFi=LJo#z)Mo(YQ zW#P7&qc_$bDWBwReDMPde*`=27OU)2T2faMea{4WX;WF((R2;q2sGGl}qRg!_Av?uAst!y`dszV(mt=je-qrV()chqfnFq7e7R@d4#!@P+ zcL!1ja2&CAmepIdW~y!jq*N5^gigEoM3U&+f@zzGmKSEGZ@X z+=~j0H1j-JW6QSt9kWo&OVx-)HDI~uj zcS3$uRkdMKwp^B;lLwK-?A$pMR@W^_-!O&Fm^KaOa5n8(xTvD)UEQ7Qa^0hbYF3UK z4Ym(WpLx~nnbV4m8^QQlWMiD1Uoa~(hd}giWzoM!;vBO6uKB((R)Py9qxjPdW#ddo^l?_LRl7!;TTp|)(PetOtVmNiLw`9#u5 zY3-2EVturw!E1$!EYAfcRgxzMk%WscLmjYuphDJ@;xFKSW;kXA(Qb;xnzf>Z7HTXl)%? zUPnH#-dZeKX4kE%s9JiT$MZJv{+(j!dzpNGwYi3D2+Ioln@_WUtZX{$Kd-z{mQDAV zwolzYwP@kBJs-e*lGr(W3dPiR9lJsiLZBNaLi;4;g`)NY;>zUegZL5z= zn&*G8y!J2J*5&seJh)sJ&>pz#e0$=?MC+X~Q9jLD8_f%h3e5DO^A>A0+4|j`X6^Kf z7fVf3T&xB;dX-_(qLbVc7rP}`QfeYwP08`{F|A#b&{?)U%g<)G(QPJaotcnuZ`u!) zWyj}SC9QnQ8exq{kMMr6JlJzv2*}3WPQks|+x{2s#=aOk?4|8VBB?WWP=jK}r zJm$=x28d23&zeD|%McgNT9{8Th|it_H0Bs>m2-?nUJ4jxfw2LG7Ze%31^G`WVme74KlY}jX+A(%#m*s%GV~CMAr8l{ zFG2-yOfnNPu+m|eUSuk0EWq2R>9Ko^P3+NiLXauwrJ3-Tiw$TN-uVJr5X(cYRGbW#`?@m5R0C`g2(kSdBxsd`ef%cJTS)quUX$=vE-9B(M8ZKQLTpQ z(~DhQyWVRR?Ay@F9Na6#*LTg7Na%x@$|iOh3rq&O$TVda=M7XN&Kuy;feCe;J&Ad$ z1?9KAF@Bktmai*!u;r*pV{EKeEv(*$s1F8p%0*IS|E!q|VdzQ_qwzR7Ceh)}Dchu&@K4Pm@C5JpV(;1BRb_oR zq{(|Qq#|c5?jdoQoKv0yMq^02)l=ZIb5?<9$G&cU4-#qthUYDB=Ui2 zRwFC2g2~L%KVQ;b>teYemCh0sF84vp52oEV|Kx~ z4e0}k3iH{X(v1;zr>H-?Gd%rP(4@)dDu4J!IPl7%>jq6FlQow9doc`W%I1O_rd3Mz z?Py$Jtyx`ZDcuoMo%WKjCPw)o8>u)EGhkLKzX?bY^#3t#EMZ11!d*hF9kWB|a!tNB zIn`&YuuAxn1_>{OQ^V+OgJ*W#gXz;xD?TG{;t=n=+7-G%NDOQ>OP%4xVd2w%kH;xY zQP}Iz`;10qC;i7Aef~75!NAX&!#p<}+`Ut(hM1wmR&{11%jF#q<;+oiuSPO-4ISS{ z;bZOnN#A=@E4@|a~pQou>C^L643+=Sxr6=`@#_+`JA)Z)_o(mV4Y5q9;bMg|q4 zXX5<`=iG*qC-LpG0n5b15L828Yl0PQ1v;h&zkC*{FOOS}?t*n5w*Q2rHuSaoKTM)Tp7T zwoxux-XZ7^oD%Gm_mlnPWm1>q<8%2EloU1TGakpYnLh)R>*r_KXB&~)&_YD*w?wV< zXAbkxIUNzW`pY>Tyi>f4r7q#G!sv$l=W>G;X{^9FBA*}A!=n}OmKFB17&%aXq}yfEfBK6oqiazeur4Q>nSB+@R7-R z@)Cv5bck6$OKmWE?csD)ffHiZ-e`BoN_qPM7qWu6kd+Pz>C;5XceB33N;Q{?av|&S zGQv!|N7^3z$js%OT*$Iuvyw|V-63njnqG#d93-zicSl%mQ*-&IneK$J)zon{3N%VZ zy#K7#@z|D6d>l|et6i(094lA?e4$D!CRLY?{Bg!@({UOYSw}Q5ft>JWa~c?N4iQHM zn9l{8_urFJy(cG?e~FnXppAqpCrw7HW6Ti7uqxtl>3FyE;^u3pWf`$K&WI+0{&jLk zeys}a;pKqNhMW@)bp*=H?NHPscv&#uzo9Ooka)1?uoOE@4+D`}rtv^e+dm zpR>eavA-bOL^{JLr()y3>nk*cChaG-l4mk!IfqMYt*owgi^#3A+#<{2u~o7ZWjs^_ z*nvz<+1U}uWoa01j*LPXT#^Q{Vf)Ml@%9(Cks9We1?A>P$~PIFEzR{nmVMHd6L+w! zXEO&^Jxw<8w@s|fdfx~C>QfTl|GcUk4(DY0%n?~PeDERfe#aQ0 zM1Onn#V#7ZMDsgJFjQ2Kgc37m!U9L--L%#mJ9%&TGdyyg^-V3$0n|NUM&l zjs%_#T?tL*_l^!U&h|BS(#!P^@~7?44@)jJ&I+iPrJ(iIbEcQ%rTgjySqJ1%n)at6 zIh7OtEj2X&50S1GyKC%cvwcGQ1DFBteJ?g4*NH=gev?DxlKxTsqlm|zZy)+r*280~ zcO!gBa#GwBc%%gN2Ywugm7PS)rIv6DA@d6l-Eo*b3<8Hgv!tk{fm8Mdna+QJ-_P%J zYkCr^Egng~&Z@HQ&ugxx)vHQr(}S5=@}05`n7ZWG#rVl7CT|<^+adPh-{GCxi$WEA z{e3j`EfDoKtJ5RuwFjIBT#aa8d<$W9oXX`1_w97@7oX=%Q4U6MT7HWPQ=9T<1pj=4(M3(ah>6ff5oGagX@$; z>*`D1-QI?0$JdCm%1@lqhggCzc3XAa6J;YvVGr`$(ZY?kWH!bhj+0SWt@9z71 z=-EVpb(w{(T{=v=M+Ep;Hq+$eWqJZoi9GWD{wY2Kuv8R+zCYXk!kq{qr|(Y)0F~W6 z+m?HC)?7_&H!0@?z8jS9#}9XX{Jk5MM9?V14|gR_xoY_|K&2d5sd7I3<(dB%|G*4f zbF;IO;S2<~q|$rf8U7{y|A$Jyhp4o8P}wA8B^V|FdrUeOCL=PYM^%bOAH65;qYzC( zqo4u^nmV)b(HZ6Q%T$7lec27q0YN)fpg9Tl(gbw1em7C1gzSo&yFg9ZxE~I=WtQ5d zC~vE&+L^U4k_a&RD7y^?A{v2t$4wSel|Fq?XaMHxCT5B&VD8$8P(Syzgpy*@N_kL+`)3?a_g#MoU7+ z+ni03eDjlgXT6*PnK)i2j`})A%+7r~cah#pkDTJxzzSuU)P^t{UP=L=zd;_u%Q?`{ z8+F`m$Dnx@#PjgE^D&iBv1|?YS1=%)PjJGy_&Rwfl^*k3%!ap-FD{ee*eQ~MUxx&r zx6%WR0v|<5c1v7mKu4= z-IMX_FaUcvdO+s}b{9UG$W2e?X#FL|JNTEHwLwh!20r-|v!t;g&`c{LI9#t4X0aps zmn{4xNtz^$$NL1cX5aOiC2(oRt?<4B#@Z$RCBCjDy`}vUe-Cd$D1KS+0aO;H|59EP zmx-s+$;2L_6uAfzJ5xQ&`OWV2{IEn!YSib=m|>b(yqouVB>Hu&ZTCThPo8^niNw*+lNV4T&s97!52Q|h)~!?`^bgN@O@x0 zd%bS`$?o`?V8v!7K{O!&cstiX0D2-pBFhzyAY}xj&&@3^B?tY=DKbpJXb_KtZF=`6 zUB-zss?OoIU4+`l`AfiB0Rb!2)>+UT?blBJ zD6ACGQID6QFizbfw<81UHi90-u7K(G@HlJlP0t8b2bhB;@E`7&=^#@@vV%5`kZje zDP<8TGmy4HplzK|8+<|9!jykc8tdS+ZEO`Qs(F98j&5en^$j`H=0YbJBWQ%yj}CKl zY`f;_d5xAHd*IXLN~Tn%suByFIz8nT^_TL+gD3=8bW;)PmR#wgdPNgpk>IG zqZH8CO+_efc$}8t4)F0>Rcqi2B=8rXL;%t zsxUVeuNS(hc+i5M0C|jY?Rnbawiz79v|X?A1~_T#R>nafjr#-5380KAw7oIPqm0v` zeDQTW5=4d-7Lf%vvY~VVl?!A7y9L}9e7`ej$S?8uXkA>Unfb)eG%J zBn91GuF1t&K?QmFWBmuhOpoOLURYFE5->Hf+IN~Mc1-JlkkghcM5>uF_b9(MG}v7Z z!J$VV%96tzsRs_-_Gvv3)#e%z-_J%-vr%k1+CQ;JCd zcEHkKf_cuk+(ix^2EjhdYeK~+nQiW)Sn}KK>Bctz!AwQ}@?NjhD_)PsILfM?D;wrV zAOl}3xgjuJ6)qTj9dgJe#x*AQiD&SD=nx_#}cs{R!oz(xi# zlNR9x-#;*OM)W^4uNKEY;AlRO(3`!7F$mW1n-sV;)x+~KrF=Z-w}Za}KJ%RXF4(pp za9HfC`g)Xeh9iX`1gRs228n-ubVPW&VvYy21_THPVw7mC!i8fk3j!n!fqLCu3CDNW zQu!@`PkO(gqpiKIUl0-Y)&)U~2H(j!BHX$f&yhc&5{qq#ef@J}CFw}E|L`0+QU43b@T&Z24!Peieit@G^eCuFr7QILH$?D zkE|n--H}AepD0}!I<7Q^D+QpDD6&EYQG^;D^SzI0CU%c&MbUA%MLf?Lc4dP7@bhFW z)BUcg=~A}VdzA20{R)X#Pl(>A!{sQr97*U7_Sw1ElMsjsSCA!yH>3(+k>qpEKB6&O z>+Xnfk6D*n4P|B2=Ma7nAkyvadzp@nN>wyH%>@^E2{arLGVs;WVyt|B_`=)0Q+ogQ zUMCZaai_oerMz-q^48S%hUc!KA!w5nesDPPg;VN zJ{9lfk>z>hN=s!u`J*p#TM*#z0xUfNNp@BoP3g@|RNuAs`*o*Z&7p1Pv^K&Kp&?L) z!n5F=Z{5PoGH-X&br?h^M#TB~gLPCT@{rY1Yj%_MC}bfeHQd_wCE`-4Vq(Us!$;W{ z1(~*1)>!}HA-pCsGXtOGQC{E8y&$%_J`n^+ns|{P@W=~^13qO1(7MH1 z6AP+W*%Ha<#X~;u>0HC$3O3<-c+r>D*dn5MmSq)2;^?@W8MydURmI{DjKVe;xCSq% zBbzhx4O_%+JH>H+@|Re>xwrF-*`T!;zIl5i76=AN&M@&3z5EZahObp~=ng#;;u~kA z`zM&ciT(;>^6`vePR$#){WP^CsP&2WGft6+iBCvS)Tr|O?>)gz@!wW}AB}p!-M8~& zO|aU;)OcxfnG@nuw9DY7K?5N=o{p#H?PzLhx_6jfj!uN8s7Gu47`dz2b+>uBoX?+M zbC>thlc~hN_~_vp@Eye=W2y3h1yG|;88i;{k1pO{us`2RyEm{`Iyi%NG2yP3;g)9V zZp->`lW1*-fR$!yFGDf`x<0#(J*X}KU2iF&e5SUVDoJ2(Ut0-`Fbgl@|Hqa_>dBW?i9~i%sv=nO{yCv+~7La89mdr;@L*^Arxw z*|(gith3fOikq9GccU96l|BMk!d*bLs9V&`j<;@~XcX+Ug%{;HeTq_DHzO~G<$K@V z(c|q!_QQMvaCbTQ1N)ute#NPmtt5kdiDtK&hcLi$p%U!slHGq+vHzhu;T7{n-YlMI zK@K@E|Lv;c;qamP8cKs~4*tKi_XQo}>dA@Z7ijDl=n2^w(i!VS)5zYBWlME^oOP6b zbwcqIJB7&z$udrQX(}rO|L!e3pquERT{q}(edw&d}sB& zA19KD@YITI@$cVjiMK^bdDnJRiQc6IK6DkA4=h_|Ei1QlBs*liE|MA;eI$noGxE;v zk9b!0(O1VWMK7N^Xfca5=5R9-YfDk`C#u#nB!&}FxvPeV>ssPuH)R^WsDFC zJLKO19~hM{@)UtsPxTrTDbJyJNpzAZn?Fw?rW?*-Y(ijrQF6YQ?@Y7<90)1Y5uvNg zW=?%LK!;-v z%RvX2vq_d|eNx8ZW~h$AI{;XsA}=1(Y8P@jsGa^-928(d%RM1c@g4z>!z%! z6*5uz4tk|!m&Vgd#FdiR5zuT3@X6*w(n||~G~eDo{pu#6%~@%r7`>6yuzMAMk#&+C z=)Yv$IxgEKR($l#CNT;xM6;&VuE~JPG?g2&=v=$4{@tz)h*prBdpZpM z*)77lTidxaYxD>Obzdu|)h3~zyi}f-sFyhX`Tf-7T;8U3ApCCKcr zC~YLHnXT8?A+RFcnw!R@5r=?S3|@prtcY@<+ll}wvVvV!<>rnJ^Di4 zBQHTLl}VN_;$wZTt%T!T-4Eu+iZN!k)5#|_zO(`HZOs8=%Q(Bwvrs| zkXz{j?4%#QOf(0|Y0kMo06RD9kjGud%yfsl>ZcdSEGcLiAJj!ZyL^1$t6zwrzPy8*h6(-i+@5Np(lykVKTr} z@W;ZAq?M9w*v&9u6{o1-RIs4ra0U%pIt0?;*|tB81-*?60f_{Sx#mR14X2ydDoP3H z8RwHgDIQ91FY%nmt-*7w)ONv~O@VYA2dG9GZWU=+MnMtPm~7 z6=+>UDFCV=it;aK#T69qPYEcsvd395#iVeo!fsYIqywScE%3lAWaYY}fmf`@z+KT) zV5G((maAE@x8g}GiuKg2u)CY+$yYIM25&^mhAI@4d{cb|U+Uz!rIv5~=c6E}h{vjZ z!h#MKC*XPV1ZQeY#94){kb%IWOh|BgPD1q2ULyW1Eovap2>_S#WZbNdP0sGH+`UGc zopZ=vO)t9JnV_9^3U~Vw37ybnRO{_SgkS2`@;yyVK38* zCF#;$=-eIVjFs0?2l?mYZV7MTS=R#rTAj@u={bz$U2RmNL)R&C={76@YRR%4aVhVW zHu!U#l9z&G+S&%3k`RZg>rwY%PFeZm6^>_%(W2tgYN!c%Pz7Pts^_;7#Z`KMoV&wO zrR-hwL?|ngQR6ky-IoXRKaLPsO4rfgUc7;fo(TBGHNscC490u zT`EeJSr(Lxtw(J=?v@G*C%hteVj_%q(r;v$sg9&{X2XHQskdcuJ}WKl^&1$GMU*;L z7bmo#U|HFf_kz9XHwlQo|5NHp2jMl1HxO_3S`3L(mK#M(jhqu+#%IAs^^nLhDrQPc z%b*N3y>NIF?Rc}QnAP7q{-!msGf4Y`Y*tkq{RMIji)VrC8jKhm&8e>DRlayA&|3Fp z1+eI+^bKiAPnf*$$21u)GC{;UaJ$OiiZ7_ z+ZBM5fMzM2OXXZm%NapS-d=)(4=2)eNus>Z(FH|;$U0C|zNlP+_!hcx34R^Tl)oww528Xj*9h;!)qVIY zeF6|veL#R&;B?o0g1X!|On8#Kyj9eRQ5F$EO~Vk&mer5eGDIzr%zaBKW{4WXK%Dfp3oDX{ z^6(_W$5QRxeiA|ON(_HQ zEH4DvHO$#*dUnfI!vx{+>g(4dgu1KW6SMktR|P3oQO-cD=@jCcqc~GR z2u>`GY@kSmprA=L5IO-RKuP;A6?ycqOB{{#w66Yd5r)CoWN@6lv!?5Lpqc8dr)zO$3htbm7ns;d5>vxQ)*|Yz z^K{GV>v;yH-%|gTmQ|hG+@xxn8Yi@5+ZYMd;x3Vi|0S6yX96qyUnSEBrw06E&b4*d zOZD5ikc5tGp)mxcs$w){GX727yJtgycB?G6%|Kg_D~^7dU;`p1b|FI+k;)P~w$kje z{+FHY@eEEsyn=bA)j6gs{&a{wu*=8%{&Ko9IbtE^ z-q#$f#2N+TjCG8`BJVL~+2xl8NZeuBS`l^BmrydkFMLtHIO?6Hz6!Ok`qWR8rbjD_ zngj`Pwl09y@p3A=0PRMrFDC`rSCAwe<$f9=FYvc-=_ZZx0o_$R_$?&$) zh&ut;F2b)}{swtcNNj5Fa*~q?yReIN`O9gy)y92%xTPk&pXHj(odI z@==(5{y8#OaE}xq7${?3caA(}FF8-nq)0@J+%pi?0t=AiOvzGbW~LCLLRkHjH@9$pmyK7L zJwvOWuFM>hjh)38qmy6|rb450qO9fQ(uQT;gmJlA{q6clb>{L&r#FiZq%KjTBdlnP z6B&Y%QJQglcB;{ofX8dJ>8b>_#F&5}HP22+Ni(5wnaNp(v@{c?4|;zK=MvcFqx97D z@o9GY12TdsCDRkFtIIZ*2?8>l3Kk6}njkkG2$63{B+c7`W_X<@E*p~ztc&tZW#x5L zd4bcu$RC-U@09C1lF_fut{@a>Ft?}(?&ph?id~>$(n$ZtX?rOnASJuyE^){tr@j*e!fdNfL5 zs@EXo>?X1a(*Tkwo);m%>u5E7CHUZOPR-U8CFj63yvyoHt(&c9%0phHw69X3*Tqw= z9z>dhEx$XChAD`8@?d<4_l?~O1s!(~k--OrMN7(Ub05~Ta?sHrOcgn#<<3=e$u+{I zsAK>Zt1d;Khy29T{)1QTo9ygZ<~#q@{-wSVr%UkoWqABzEI&fQC2~nD>Wj1QO0+*p zw9I$zi$a&AB=LujejT0mqa-c$I|+B;l3bVkTs!6mi3m?HJYv|S$wAq^odi1(SR8#u zGaAV*(Aq0>QvA{jr~oBQI2INOH6{s~gRC>6$EB{9rLK{s2EYX)L(Eu&qW*PYt?W0x zUZ!E&QwF7d#Pk2;YsR|xE`GBldW?%dyEZQ6pOTb6Bq{&orySw75A%N(|G}5bcN^YO z?RM~d?e!m$bBSB_&psp-#H{uQAClkDUeNxFvQQqHiwf;OUM5#P=1at)`6vgiMexZ) zMl>E}L&j=ECIoLJ(jYBLhifTtClhRiPbzFNz-_o~X|Qb^Y)OW_2Kb5lS&i1CNVrWR zQrn4ZK$HN!*K-ut1xCe)i4D8Q>Yijt;{bYg% zR=b}L_ry&0J6Fh2cIh?p`v3j-wrBN`fzUF+Jtr-EjYDPdFlzhKJ~De0_dNcx85S&$ zBZKU&?L@GBun$hhY5dPy*n>YMC-`Lj*XA;Av+2J!AODop`(*#;=6#=$sswoZ;n#Vi zLIg{I;j0c_4u5!VIsbWUxYb?z?9a%wfGPjWu6uR|w=4I5+4YD0htJ3f_QB6dfBS+j z$oQQ#m2l!l58~CNy~a+2?5vT~2sYW@f&HZU;l^}w%EPNdd%zdul$|wWnb@`D>JZ3sAh8Pg;;X5?AK#vm6ULbjA0BhuimG*_-ltoH&cEZoCj|pm#moo)}lSv9NoPnfc=7 z51OCdy|Vk^j+k3_zAt-zhN<7BllqT^U* zqiwlu+EdbHRSzz{Ir-ss?h7WfBT*9;Z^njn#>zZ^36obIkYdOYV*j|1H`*>jPc8^J}tzq!<4FcaeSO zAc^g1gQPzxy4OB^5T@^wFS+cMH^{$H)&q~&V{Vd(1hPMJ6WVER723DJk7P)_{Y~x? z-lgwuk}tvT-M2_3T)cG)-ZO6NEx41_9`p@4kNQe<&%WXtxOE}2ALcHtsQv0UWE)9r zXq&2Ct)6`j}OpWH>|HGoKto%$U?PO++H)d;6jN>(_p8v2X#|S%8veJxd zO)_*4Wu<7i|JhpmsUOLo1sZicP8+YWzw#4#Wj7wC+Z%?+U9>1~rYS$yWHcfBm|w|p VB9zI?4vJtGY@jIS{eEY5_wL=h7s21}{ePbK|H-{M**j;>oHKLg%$c$?yC>fb zzOeb(TAwSXPiMtj`MV@g@iXAP@!O__D=JDi{PqI;T~bn_p(ij50IKx!|9}Q=B9CvO zzF4+#e7C2n3V?lm(On1OdteDga;tN-&@jpfaEepempmpgN!ipeCRepf;cm zpe~>upgzD32myow8UPvs8UY#ungGH8O#$J6W`GDlBp?b94Tu560-6I_09pcC0a^pv z0NMiD0onsP06GFX0XhS^0O9~$0X+aCVc3Upy$jG2a5tbApf{io;2uCn(r(C48qvScb z=7|)DxXn*BSd3=oP@!TEphr-YL*l1xSiCboqQj2%X%0BKh_o30nkN%)b(9TchqDG{tp&4 zE66|CwEMiBP%n#!2bWir<=$_s*QDZ2vya| zRvvA*J=%3=wCe=4xAzhAvaJHW(x8mY{Gqvdl>a&YKag26>lJ2QG4lV92f4&s$-U}<&)b&xaHWP#m+J#Zk7k++casU% zWQV#_;U4nws~>)|v^7wED=h?g>0DfLPwiOIe`1-ND4|W29+E291|cWeaF5JGJg$>) zrSr-bIg3RnW8ehc`P#a|v1B4POXSxFrE9CWYn7?2@K@0tHWamKb16rJ2R<1d@Z?j@ zf)8u0jD@v$vaUO=eNWct$y#oOx2m^)L;t_S$J)N`R6lo0@1jpH*H#~>)uRbt#RERr z5^qB*R_)V;j|~GGYkZ(3-V1{-)eE`sG1!|4-_iqpM@zg7gD0!}aA4&w*Tqf@a&Lv# z?L?=KP~Jd$X)XDCD_-Soec%HM&~@jbg=gx%DHp$TMSHj6U(croynSViIJbs2h-lCt zrUQPAh!j8T`P9Y07hSm?mz>}jJJLu{52Ip?XElPT7-M>b>iIN46=HO2q%d(2WNk2{ z#h^9C4#IG|5T9c2pa#|aI1!i_uM(0V?#lxLaE z&_Q{H4#cRJo~c>+4#ZYb_He!v+CK+z@?Uy7@FSJypj%rq`iZCQk*Lv;7%JH@m5Bf} z!1N>v5QCv)Qw&{_(OWq%#3xM{Lbpyc0%Hg zldBc~|3BkxG$Q>Y^@*k?^+0#Rk57G}e|LPO2Yk2(e3S=#Z4dZp5BLZV__`kOWj)|M z<;N5M7J?6_=E6>N{nYb-m-%t0m-%tWH}t?K)&st!z}LV;MYNaSMQ!1qtVd4Gtn9gp zhCeN4^Yu0QU{`!u4PVKLx8oa)| zmRJI__PuD7!7aACq@mDj|q>_kHnuAt6&%eNIlfR zNW&^WHP9bg;ag~Y^!C+E4#iN~VrWLLcZE$LAmCVDOl z+c;L69Bc!B^nJ@E;0(}Uz+#tkp|xZ@?gyPhSzC;rC#%kc)P5q4;o_a+!n^#Bf*`0@hZK;DZW zxk@kbcF%m;3SymJ@@M{C@eGOl&;g2%^kb4f#ErfJZl2f_@abr#x5lHTOZv7fG(qx5 zO99^94yB&m+i4w*Ub8D7X>aa$X(tkI)W5`Iatpcc{sb7y{78EDeCqUieuC_r*Pz3) zIpx5=^R<(Z@dQWma;obAYEC~N*cWqy8^>|xyJ=wXt z+&e87ILP|d^rp58Ox!H-xM>7D>d{0m`vv$tlfT7XG0BI9Cq72|5%ey2NiY0>%Q!@i zPmF$5&X-Xm;E(@WyYP|oWhWn7aGVlnSKRP4UMqaXV1?sAmEOr;<0Hp!PQ1p)jMw-W z$9u+d$$ZLk8QP=EI8c;V9XHB(y7Zp{&)j1?>4vWeJn}E`PX4a>cj8_1@5H<2U&=N5 zXF2{i;MM%N;nn=O;VsG~_*;}q;4R8!(5Ii&b3i0vLW(yI%U?zAwg+onZ5-Zm{~TAuRI(UjjRp!KrMua78$ zBV80vT~M77U`~&I?;q0B{JDh-NJz8Y zTi2T$Mc*DR2Qs&tUpXqhJ-)Jsx;@$scaVpUcR<_e4rn{y0d1FC(3<^7SI|1!D^_FO z+Ur|aZq;79-9px6Q$KkZXnjRLNk4F7hEtZm>KkUwnx*>&`Ww;-oO-h|(1^3kPZ=W) z^!&^SSYndh6IegJj}}Dgm_qYQTeoi2Wo!BA(xpp@cB53wkHD$2wfqR2V9MPKGT%m= zyHC9v)Y7i?GI|{2^m3ssfeY1qs{2@?H)x&pY1FZn|B~4@y`1jp`?{px=y1x?^i=ZQ zMnigY9rr_eXB`V2sO56esX7+Y@+9a?bu4hEI(F5mxsKx@Th=jk+NDd8t|vY3$JXn4 z*YabuFD*X;XR2d?17Ci$IyU0m>v#YtoxV#X)a%&X4hJIoR^tq66(5gd$b^4P&$)v$ zy?N}Bh{)T`>!5#>LPq*&p*4zPY@g2~vy#=jV*Xu#+v@2tNo%%x?_h?re{)g!| z-eG#PT|O+z>XKKFZD`XS%8E4g5s!FGUmo`6H6y^B;8Br4L^6lm;LQ(q(s)R)8L?hi zTL-t>OR(ji5}5V%1QM9+6BuU6-IjOU0qv7IEq&{{q9@S};bY17DMZ|E9-h7f+MRbm zyXy{UpSc6tXYYV^&mGV{cL%ipxdYng?|}A&JD@!+Xr&P!>nrAjz*yVEnLD68D`;KD ztcdn!+djD6v>aeF=8W811%uFJRDZDZ4R(sXNYIzyO)*OSYMv5Irc?vFo&>A4bihnkrdL?DBlg^!zmhTG* z{x(5aLbk!yY@1uK4Ygz|Cxd3Tm8{veuwdKRlC7LKn%P#iX4}$&ZMY@dmMFQq5~^6U zZ3VX707l(LS+Z>f5}tE_ZUY?YAN}}Ci8<$0twpfv%p#gwir^$x6%pu2zxmCFZX&8t zL`#c$cejxG5Mf1WrJU;4Y-u6poHwv!OAAqR?t857<(FP`%XtlJ5mwgH#8QN{wbZm` zYh^9XEZJIHOD$`*R@M@2$<}Bs$NIkb+1G9gsckKS)?#k#Ei6UQTHNit4%xQ8Eeo-O ztrext76Ry{=tJsSv$e92hL&uN7Sg=MM-Q%%3NeVNXD!0YLc%OX7%arVw!Sr6D+`IR zWNWYx16#W_TPq8Rv1DtskmfB`9sk5lAtBZxtSqFZr3izC=sEXMLTCGytO}^(>hyel zOT3ktMScmV$AeT^?G=c12efGajCJc)1=MmS_O4Lkr7%X424R=Bk0h0yRXr1V#S$Mu z&R8u;BWDsCQG_W;u%1MAKK>ZB`umi0*?#ad=xMcA5RSj`nA@CYLOt+*tVO zEIhGk=E{ajy)_#{do$!F!j%mbeQP#`_GMrb>B@%f>eg)7p4{DG6x)zgZ3~4Z*I>0* z2u??1JCRkSlPDOTRM&1xk(!ni>#Q+0N6$58Xo7~qHFxrCEqLClaFW8kaKSjut!Iry zx2`csVa2AUE1O%_7};3YSSwdHx2`d=v8u5k^hkPRXnRZ5%B6YNL0B+OzUn&R<^;AU z&vqjztaQ@WmCdbHOE%Vxp`9z6TdS6AtX13ImCdbHOE%W3?ch{xyIZPO-pMelwxcr_ z?fy}uW=)IxtUBgxpG@WzMMpYX;A`(&Q?w%wi8Vf3ni#;8GZl^>gT zO>`=ZaaXyI(tWm%dpG3kgA`4c+D4HBJF6bE{Xu1SOzyy=f>d2)tp6l?OsZre4ty_f}xrdgcSuGn}%lFf>Awya=WJt?~3^5yb zGaDBdy|c2(=mn05ac;vFuT~J{jMu6{D>ZwLUTlNui~9_c3|xB-n^#%%^;)bkImZ{w zL2u@O2Bj&Yy-5)@kOOBt?a5dNn$~#}#!pmwpV{81bkk7C*BjaBp4hLyU&5LPWtICV z_ssSKWkXkazJ4YCI;E?L^reY-t%!_Y6+kacHu7V$)q#mH#%S)mucKvkBkudq-20Km z>g6{Ex?5RQuwabQ%49`JyW(%BmC2B?dby3vNJ(+=Qk(tD#6_x zEyujuqgmFS8@P|se|Dg|a=ikf+@D7tT>NA4ydt9?3BoZfn2~dN$Ye%7by0s>tY$`9 z1E3WSbS7urm?xYedUE5mO;HXF=qE~SWR>7#MOSWS)ktSWH;(G$0t)U0J+v>$ja8zP z72UbHP)&7K23HQIa*i5=hjr*Wp&K{nBvMaK7p~?6W_i!kZ@J}Uu#*+pm|4Z@tT?_? zS>dM9^#^;JSOwz2DTx0%>z$SEHe3cq#TeSK=B`R`J4rJn-U@QsuncK7EJKl9$L+ge$UDcW)aZx)-+I_d|0iFn3NmeKB{zZS=@$hJ9=c9BCQ9E-s%=Tt(iW0d9gLCvDpF#Y2hneOBTw z#@i-`+)G?}<=L~udD}7;hR&#(LhjAK5L8M*YW{eJo3vvte3Z^72c|N_07+}y;hRR|8;t^T8KI!%^0t>x^h-~!kB(bCBE#45#*s0INS>Vi+8+jT@{cxn(2oQO&q7ohBqdZRK{5{#Wb4b5lg9cXV zeC7C(E{}Z}mely~V@n{+=ciZiuCpU@;i4u>yS+H^o{QZc=zcir>-F*5U;Sg#wmD12eKPr@ zXGheWzxAQtHg4Q_Z0gHH?hk7}(Q)j(w#`FhkLIVQhJ06Z_xIl}-CpYe%t<^R}06zy|;Z-+N$xde)(76zVaW|8hz%sw)IZ7^q-Ql ztk+)`zxv~@4-0R`JU^-4$cKjSZ?CN3Ts&T5maL|6;{o4>dm5?6;!2$NKeX(QL}u0TsSXTyXh9R?XG>^9E0;@mJ5^ z-r2YK%kxY3j@t3!ccXL82K&BU`RT{XzrB6v{`%if-`L{S7MCIh*Yip7{&Mw|S=T=- zdL!Dm?ed*9>n$EMcJhgvUMDMTQ=Zx$-DUEsz2CH$bo1@vW%&n+F3x=T^<@ni4k>sRW&vGKvW?bcN4{p;~f{oab+|7fSL`fZrq|(LwGgDVRa-(%*+~vP|Z8*QS z$EF$k?)~;u`;2olKAt{&&-scc9y(v+hd)AppZRE|3wz5e9lNZ)*nLakj;5!coc3$B z_XpKWrft4iaX`=rzi)HzdU;6u+;UM%BZ}5^A5~#v-TW3qI=-Ht{^Z@C%=`I+`0tN= zkmWbaZ@Q0t{_MI++OtD0P0UK#bY<Wrvc=(d3Fbcmiq;?Fz;^%+6$aoKPyqYmzm%HxLul*Iz+u$K zV@@4o>^&Ssj;!1X_Iol5?CH6A_O25qWM!tM7G&n;;8xC>QDKFDPCq~M#?ZLQO3JCk zo*6HU!>pgd&C~n}usFl1;ObEs3*VnPZybWX^6W~)IJLbi1+}QZE7OkE?~1VcV2-KNh_)vz%fZiUpazip=?e#hVvvQ`{3a z8)v$;aCevd_>EO;F|u&;iZ&$oj=z$4DgH!!#I%oxgvaM&w(h{UKv7bTCOzCgWc+T& zreWnuCOF<*85BR@K_{2y;3CD%D;k>o{CEmg*50?MaK*x8Z7w~pXxq#U$>mCj4=apG zkd&NdUtfG8UZe8O8JrjyAGqRdV!4tzNgK!Ay&@)Ib5`KEfI(g>WQuYn*B1v5VntEP z%kjeoolLtiutnkZ#a=Pa9JN4>-W{*RhYQYH1^Om78?=1X^+a0?a~U+~>J<6Q7Bgx@ zlhL*q=EfE?t9aWeTTIu1FD;%r)fV%?rpFg|93bi5O}o0>7E^83%H=QQ*+zf3JQj=C z;qgpcuB2#SWPG_2Esm+$$4{LaP!beBepsME<1LZ1{DI5jHOhHK<~orzGj(dM5{*l_ zl8lAzr(9ahT(^(UNw2knzsi*?9az7x;+Twq84G)0y`-;l&A}2%I;SqQnyw|dB&PIB zkbGF1k`HUW){4W+$xXw~E0R3Te3~m}K0o$v=Wy~N4-MnaqZLXYF^%;it&TSLX3Dg6 zv^gcd??V2soZ{u~%Fu5g`{H?OFUojJaNCjP_XONn*ufoZ$eIK~-qP7SmHH@}3{qoRtPxV8e9 zu`sH5$soUkjD>6+703LMJga|Lp_8f|sP3CGX8fZGGnR)Hh7Elp!8ZDuBPgEXKa$ss zqW<7`+QJ_Nu9&h8Kgnyaqe2Rn`=Zku4+4fXv^5NrdUZ|gWy5o>F{m4G5B~M*hfq9z z^kk?<50DJK>#lon>DRAEkFuIeI6qU-TN+!VU2$^=(j}y!>8Ii;kBf)0g60*mc~X4X zP&6fJJO|lhi^7G?DNwOx<6*J+Vg>KU(1>wtQSh^T+;l3QY0E`J4UMI( zu~KAzQRS!LX~S8Vj-+Lz=7q&J4N?NJqM5cKnKb1}VzAAz zF>0BGh*YA}eK8Buh}$%+;!3=6UEUnobQkxZlf)+ocE^|7vH4|EA#jQ#HBaNwvMIU% zr?`Sq=zQ{1NRgeJQ;=czSMVTik+n8WeIc3BD=C5AhAbA03K&OPZ+%Ga;`c265gAl$%%z(+oRIj;eRatYZ5T}&QBSeTHqj8JOH35 zHBTs_d8?*Sk{W6rhG2-RLY%6I#oczPib$~LEq${v-hgkZR2Xs1(K>+@MB%l?RcgIO z^QM8uN~WipSJWXss@NCWLl*U1HFahYnL-v}Wy|7&M=XnHr5v9!uZWggZPxWftiz*V znQ3XcV;u$#tz0;?YFfc4w_FKF5VFxs9#}a(tdQK8<8n%XP0NKnta(gR)`by?+{83x zxyl+SHA1uyXT31P8B?w&I!i(_7iGsZ#f}tXiZ)}|o>?rqMcZUU+7_;95v*!VJ1n`g zojoizCI-!03pW>GXW>K;qpSzl2cq3m6?8w-ro-dqr(}+W zM!mG8DybjppU0`35t1k0woz78f}Wr`M5D>)r)1@%W;+Z*Tbc62a3vHxiJ6#HEDLSx zUkjNjSF*s7j;k$(JKK6s6K0e;c5I#_KOYX!SSicmV}`~J?L7^T!7!Gdm8T&@R*m{# zp<-a{CPw~AUuTK7ot~NHaB2^h)~c0@HW@Y)j6pamW3y+44^9k^U*Ncg4uJoI1~pTz zES;AkJdx%^CZ%VNt?6p}tPQ5_nq78kZ;VUImGIZ5Ttz%iMZw5;4QFrKX3oN>gIcWp>l5)WmB&Y(`&9M}+K z7ovj55kDsg3mXA_@ zvL-9f8kP*M^4{qLPa{x{dFQR;@R(B{hUC~Yde9RI*BlZ*uPAOz;5cS4Y-nWsuf^R) z3?IM{C6p^6B?r)){%~Lz6fgP7X)lI{gTe|W#yL#q0K*nTX)WWgIWiWqDc>I-H-;nL zc|{ou855l@G6wl!Ew*|B<8d3r8JnAzoyx_N@c5UJuwzD>j0!0T(mZ70uTD{eKh2>ogvBwI!z7fO zKRFABvg9-zKjb`IjpRfeKeahDe$t>XE?U9W8*QG2+*8AH!UnuHJM&k3crzzIC7azl zcS_V0Z!Q83pFk}(EjOF(%VT`L>@UpmXkL=L6>~f~R7P@?oL`WdJ;9uOsS?B~03M8L zTB(r}Gp*ff&6D%}0<=E4A0q(c-N2G1gC>djS3n78nU}_Wu{f}#Vf?h|W;6dI89j!c zma3N%y%jm-N~Cptusk}Qs|_^$n=80V5bdy~8ToLXg?yw$S01Fb_je4emGs6;TBI=@ zS3y_?Iv?`AYhYpuYyHnzrxsrtIcZ?Ik`%EPm6$So!1sAar;>I>j+|3Bh1+QX=mO{m zhzBeIm{qCPWKK#ZyzV$hp2v8#GcdZ=gL)MEX+2?>CGT5H!IgoIXYX; z>C8#XXvN9!pgJ+2QX7cgpt7wSObz(6_{|B&6Bn+}SXeQpD<nC!se(lG|j&C{~ZRWwf7fCrDf0x{tSJ(&;>Mv{vbQ9I$rC>8_} zX?YIRdkTx9rcfia6f)xY$}@{Y#!ujcKhIH+H$`yDNA*lvdNgV8gns>*FIb?IKOq+_ zQRGggII!41i4?&a#aKsCW}4JJNPaBx&(N5lf62iJDaC~c2{axR#c+%y1|~ijpP)Nc zr$u>=?9{yR!ZuasuBw$ofk38*VpG!!GK*mGXdY7M_JpwyYLR0dSq?S_e~buiRG05; z4(z0|#&Fz3q^ev^hj8_ku~vsqWWRoqJ$l$PGTLWnx6jW953ZC79)%Ow&{6~sB2^wL zn%zYelq2m+^ry}?(i^^ylkfz*HI462>#g($CKz`-1t~2bqg@mWyU_9qQLtP%LwGKE zS_;f$^_VDV`Q<>vi4JID3%?z7HIZr_J^$<7q%wn4eJ|8^Hu@8X>!pN@8uzNX&JsR8j^3pu5bx^$walMnV|JV9J)7rDD0bi?unM zGO;i+fd!My-BMk#;F#;curL-FjrbU#wq!jUXa8? z6QhQG+0ArzG+C;(S9TeV48yAOvdfrIXl%k}A_E_-S(`~JIQbYX&`gC>5v$VRqto+p zvr{G`R6RipO+l#J2rV>K?ID>j(7EQ>5QkJAN)VGBY^i#OU+5i&K;YXj`elgi_=Nb_#{U2OpWR9(wARP z#Jn&qH7_R@?7HHl!4O67_EN_crQDl4CMOpIoU-w!5@od71LZr=g7l_)Woc~TUPrGC zT8*%Zyj-^Z30cSy4W|t17;6_~ZS+f8-yIx-mg(bcnd~0rmUp>!%e6Pr1oXBmI#4#p zAVi@tEgcv#{`%r>Sz?VK&oQwOqvn*oVDy7HKtoq~ zeC4|={%RzFOXjR4(#@dv1;we_vil_G)nPFiS3bM2+Au{qfC)(= zu7BeC9*EUwSunuPlh<5Cr+0@emfaNUk;#u!DZi1FP8 zTo>Z%GgeWah9RfpS{|!G@8dcR*Y*xY`2yEha2<rPw;V^?THOgE0wa7v zSeqD~gPo*!`1&unK7{L>Ttx}5gLD&+4%cb8HmHkoPei$KeG%7`df=Z2{@8KaHXmie z^-o;yhrat4DauFKk@dhNMX3sXPo0cIA<*;MDR{Ff^t^s5@(4XI$MN=B&~sWqH2@N- z9~4FXJQ&ca+=GS~q6ggLjn|}dW}_$}$~T`?I9P&Tbs(=YuF2iy-Nuwbu*&?AQIoT? zo?dx0{`HuOcU|xG*W62yeKzii3uyGsoWsiwZ<&7R?ez_-9r<9-_Q8K%@B7}MZco^& zWkr10;`*iz7xVVl_kaHNbsM+$dFJPC%^H4J`|goj&$sFS;m#q8?yFU!W9rrl>wbOt zz$;;G7R>IwXhXu*X_qIA>$|7ZvK4vtS3LgSjkaD#TNO2)eRFpC3;5#_Y1r04(s&er9aj+{9?s_UhdL5{^>s51Li(=Xw~WOpZKHak!szd-r3vax2VUP zE!uoM>9s+B)ZG2`C`YSPt)BSI{&U$Sm0sUnZc)m+u|pH0eo<R9}%B~?cM*5&KU?;o3$JPR5r!46qheQiCv{i{RJQ)`>T4Jt}Xo+B$iI*R}2 zEr0jk*JH{pxH5nL+*30KzV~{KMn%zES9FhlY=-iA*sP4u+8@{c?&JQ4{mSeMnD_XV z>pMFAy=(CwpRf7KUTwpZey@Mgz01*z&x<-8oHggj{KvO93P_$j;r_>_ef)gND+5kF z*70~OBr1R7oH36jz$!55l;?$D38FI5!Z0Y7*+MJgt!Lb}MiT?)gaeqz2wWop zQGjSb3?LTJ9MA&5!_%z*tpRNSZ2|27?Ey^R5!X(D&VVj}I6zlGH$Znl55Qf3o`Aan zy#T!deE>|~7uSA(ctC%^0Kh;%0w57E2rw8h1TYjZ43GpE4q*BbxQ+zCLy2=)qj60I zi~*zp#sVCGbig=31_0hffd>)k;VE!$8}1DNZ-D6#+ztRO9$OW$wgV^x6amo66|`_n zn$Xk%ls_HU8GxC9S%BGqxaPj+GEW>2-abkB)K;bAP{j+o%7L#9Ybb}Sarf!hu+1A@ zK;lu5*KzRyz<%Oh$MybDZ}C#_#mR|O&24{d)w~tO4ldu~>Vs^Wx)MsO27wb zW%B8Zs~MAq-wOdR;J1wtf?B)EV{r`K*@vc#3<&e5=`#oX*wAyy5S3|zYP#cIY--Nf zZiNK}xjC^BcKpRe*!v~+#GU5+2)j!()86tUv)d0wC&iIiJ=v!g?z|qB6#v`*Yj5rK zLQHX`3JX8%|4PEHZevd!srX)>yFP9?rs1sZD<`I$tG{kj%?qvjzW-abgmZ01?^^!E zk&@?Lk2$uf|Esf}iMVu^PfnXPeKWrtv-yeWi;4SJJmGlqbiI?$zx2o1o2VLhM>l@T zgVpAuj1K_l4GJee9cWT%ELuDyGuWZKMYBli6rllt|FfZkI+D*x@!du^eaZy#>C z^rKflO`Vn5DK6pjf+aQk_wKMRxaNrS)2}}~escFW8-@g&-Ja+D;@n|7veKp`-5;~$ zQq@f>t6Xk8qT#StpIZ3fVXykOPv=EGbNb%#M+3KI&Q920FzG(?=c{J$?6>$q!@_&WRxph9B=aYyW3WGls-no4B&*#j{Vh8ZmwT-`~zTwljYF`&pOv4BO&2 zwtnrhzyJ2p@U-!7zFK?5n{BFJU3y~3i~BBL2zvXAbJecid}`6^zsZhVmjnCf8tM=oCmQO}a|LwOX2WR~ea^r^&hd#4u`sKq% z!~g#3O6MEj9PWQJuGiMRJ)*nJx^eWE?a>E+|NUI=WPfi!sgakKJ~rYI0`7i4U}@Ug74Z2kQR%L(TLL=6+Z4+??w^Ybw>h`qr=a zHMnZ8mUvgED!Feh^8Vz~#=@7b4*z`H<-xJPOxVzK=H)TN-~1tM`qvjfeRIdf^Pjbx zdvBi^4fn-PeB+a}wu9S-HXYdO-JiU>b^Pel?WdppE-J`(?er}tXFSk;-PC@~A8*iP z!{x5LAK3a`48PWCiW2g`sd_^@{~k4|MUR7X>ra^aq`R>|| z9h!t+%Y12d;mb$gT=(~%M}KX-Y1=fP=4lh3nVP)y{E%-hbV=FT|L9jopE>?ZUb*7o zljgthXY2iwzj)z`Yr7|Zp|st+B#mC5h@=VGN79-CO-ua$3pSffiJk&8bc_*Ki@ zc@tJ1N)M_uVn*EHjteLH?VSE;!JjLS^}f53W5jDo@0FXDIey!OIs>jX{OI(!D#_g& z4%s(7Yr)XpCQPi-^hk{zq4_^Y*4TNk*H?}grnYKQ=H;7J(+eX{@7;T5X~wpW?LX;L z{QRQh-_-3p>Pf%3TU%{@x9iEe_Z6SJ(Ce9`*MkFEG(TJPV(0Krw(K0$*9f0Se12}=#!a8c9y#<~!ix{CyK6%Is^O`x|9xz1 z>!i-t)1Mk}tlymWpDY=+FFNe|)A#l5_54ytR`=KYUJ5ysaQw(S2jBB~Zq$Qbo9->> z+;qsfkQ#r-Ha)a#*Z3o2yLB5}SmfyO@reVMx31}5HF)mi>GOJKg9~y8a&+ehuLMT=0DLbsqgCtW>TwYrVAX`ZeXvir;SA@TKF>h4{A~`E%2_lVR`mi*I#) zW1k^E?r-h?_m3wIH*OJj>1^uzC#zhGzN_WgybksEeHIaY?XxFCr;hn7z10Ixw_RFu z$wYQYpRlMSF??3BT4SDX7yMDdD z{g;0ZNDiL<@yR#rS@tK_W?j6m;J*LNZIH3?`$vNs_j~8t;z=)lbnlz#Gn!_f{=~P@ z`N~lzS3P|AeD#(^A8y?H{l*cm^iBJ!T2WT^;rLdqCSM!-z-uQTZ~I=2!|S3m&-5QP z{a2;V{-CwdiQ66zZ2bF@Mlrvh^sfBmioYIwEa~Mxv9SJ(M;*l57!PQ0|-o(_= z$*GCx`V4)wI#uac=CznA^RCaC6p)+y{>v3tHvV+s$(^UY=Y82KsCAcy1HbofPQefUV_wC111W;|Idp#3++6F0n?{nGc#;u5OGFZ!^<*xjS&EX!^4L)CFB z?+NSIxM4zARP4IE@=f}z-gxqXL4VBN)%LOFL%s}sY+Kj2_nqu@y>P~(KRsld{$|7d zV=7KNqttwGz=o3NZnmwpXk2vtY9s$1*fsyd`MzOW-a2-n!9!2>^?4`x<(J<$kAleo zip?t$Cs91jT|s8}Sj=Px+~dl?JehN*j)6W6Q#*4)^WeytuqMXDZleu@`puloBNZp7 zvsRqMxW&xFYy?go2Qeo!=H?bAG2k9w4462q_Ekor^e>lT=pj65=pn<{7!k@6;Fg$h zYw;}KwFcZ*O8TxbQ?uHAR=mF3jfX#|M`nRYr}$M=hW9`2e*`z2{Xk#Vs|Ll00X^r5 zA1wyS3PpKs73Z(GDUF$p7iL=(#P4AI=Ug^G`D@2d@AVrqpi7FthYNf&@qdoM%oa0Z za>hK>i*u8;-bvIUO1G}Cbv!Hnaof*FUAxf_o23^QF_ z3mjJ^%yjiFaCQq^hy^axgu97#6izW;1YqeCQwVI5QC>2A0}xX~=-wRj5^9q?SO70;05!TQ-Ntd#k{aThmA$%A#~i3jU$uP70DV3(mArR2f-wBm69 zPM7sM$>r-O%2*ToAtnngu*5Zy>)B#zPTjEHUDGgxJuO~5fyX$esg3+h5xSBgFXd%5 zuaywzjS#<*kIX0S#1miIi{x8Z@TG2<|GLnj79%m9KMHYx6;aA7l%|yxa&a5$*_x(Sg390r;5PN<#}ASM$tt zjV*8-Wti#0EO1RNaN!oXW)`>z3tXfHj;o8tywI*#Ua98>LeK1ZsAoP&-m3no3oAX7 z7j+_eH4?nI;7eYOJn*8vJn^F5B(Eld7uz*?HSxfUI-ROa6W{5I_LcTe-D();RmM@r zGd!fDuATJSFWDZc^XZ~JMj(It#Og8g7lHh}V)#x+`(@i^eP|q}Bd0U5PB}}BW4%lV z4|BS6u*?x-uBD>;D9TR1Wv?4sKUfV-tz z4S>s}YYc!psxA1{74F1WxdKXg4CG}Sx1}kG84gE5^Kp2#$T&leF^=J4pmz_sKyN(| zq6GP&t3AI)QLb$Ge`yfJLTZB_?dp#K(7zc3L3ipPh=U@W&Q@yraR^A$E{86ojFN5$ zm*t%p&};GKK$Bj^8Actt463MQ>R8?)p_7!q&y#@?rw*#vZ3meKS|l*zI8X>uo+G)Q z7XI0d&esCR0fLzyEzgXjEtzrbK+HHgJ2Q?>%Z#J*G2>|IW?Xp-90#XnI%?40q$}QT zGUF;);5axj)3Gg>alBn+#&K=ejH_;e<0QjK$AJbv`^62i1LC%r4I$@O4sKYf2gMCE z(r~bU(D3yW4xBb$nnpyQ-nnDLbB4LBff$Q=-&vIrf3#WD@;#wv{uC=106JaX`X zy%&l+%TPIls6}$1m6?frCtP2yo%RmSe>MyP^#o0tE*SHOV2+g#)d}okJDSSmW8=tmxV1tnh4iR(Q5O zD?Hnu6`pO-3eR?Eg{Ku+;n^Oo@NAP-cv_DYo^8_#&-Q7?pTo`Jbui}(wuZRfTm!d^ zyD08}PC**BDblaNbyYcuw*g-fX0RHM9vcF@yh-cRm2$ekZP=7qwlLh*K4`O{-Qo$_ zu&plMd?eZIxtwy`HK_Ra5>^;IS7=BS6Nr2yV+@Bhytnq{p(3qL#fz*Ih2AD3_~S$VYACShekA!*+I@QYv#Ff z&M=Okx(ubbI(QlM>=rl_<7tY^;ZAzEcekMy>w(=bnt(dg@>jO7chrYV>}LHH*WnjU z-XD#hbc#A8VuR{>?bLelw14-;ATn zH{ARS`Al?-`dzfu!59b2t2IF9yM%mPLcT5`N(e_fN?=Q*ga9Fd zr|r{~W-3p-02=AI?m&5*d>ccQ;EbaLXNVFak&Y7Bt|_6Skia$8abnjQdGZ)^%4kgqO64;fG6T9Tdg&lZ?*e@qTl+aR@fa6RqAxdz@Q9>(K0zDWd)DaT!_#ecz zR=ETU32pQcCA8H;l;Dh`1ZRj6+JTZ~V9TNeyO6*(G*@|7<-+!nDfafU476oq2=BWv z#QC~}SkoO;3G}X%5Go|#*e~`by{}3r3kgYLXhI2PMSJL^$FV(d*dpWD9-JXc=!`g) zfxem&8VU&YSMag=bE9-;(ih!T1tjuP09P(qlHfG4>r3zXApy7EH8-Fk>+ z=%t4!!5K#h&JZQ^1|=o1SE7V)A)$hh@Q%ubBY`BPj~=3gd-M<`IO8b68KQ)~pri!$ zag-1tBvgciWn#!ny;O851Mi19%fLHf&RpXyEG{8R=%-3xk4XtpLIR#gg^ky5BTNar z%Q#%@9F-w&g!=1oJ}z;-E+IecBOL%rmVtc>CBz5`Ts&ByyrpufB+4*Q53vjhdWdC6 z)I%(TGsH4*cuonNtWiR&kife-!^ECe=DM;d11Baj#4-%kLo9Fn#Qcu{CG*e8BPFyD67bwW#En$B zR234ma#t0#tZAsKsAXrIQA1Uc|8%iymlCR}5?Trg)ga+M<*+KDnvjs9hggQudWdC6 z)kBov3{k=u#8E)zLPB*>hBP%@bs>SVtb^*J3=Ta+3F&%>5}YAQ7>77Y;CzNW zS_=s{-;V|E3^iR1NEk0-DWL`=j2F9-Wyl91jb{zC1!Kq$TryP&9Gy`@8zG@4Bsj!A zW^$JD9gaH9woFD5^6!ha^)k0DWR5-kfnzx zAzKeof-{a1oFPic0VTD>ks~Fv6B2kw(INI-Qv#Rlhl(B8GDHazRSDcXZH%LY33?nQ zmf>T#!-SZ zLjID8U(`g!zc01nPtm;)H}yQHJ}~bfH4R0zJesEYw4+&+qa}KXWmu|*SO#Z^5|$y35*p&lGISMX zXb1@t;FToLhLA8(S)qr#;RROeAs?5JFV1tU(&PNFe771QN?`4?3{nE`AWu-%sFb`d zIZ-LrLzM8K9-;(ih!WQ7ag?wQp>r4sz2QX(&UWxUMjse~UFDe0t}cAq@LTC+1K#^; z41V7B!Y9)Bf?h8Eam*J7;JBF|kBfhF?wnND!q;Zg7XLWlksnUbNa1PGul2uL^y6Sf ze!Own`aTZRocV8F@aw18?L4$JK(S-cn~Dl{pvwE;e*rK9@H-dRei+n~q8}!T%`ugW zRDbdL3;fu8y!}2=9=CTdneC5NH)TWFmH}g--3rPuFD^(7^P)DoiYcK;@W1fSrt;vG zby^uecyHUxx<~K$!J*3NGOv{Ty7GYF%>m|kW0*rZ^GB28r$=ZQBBTxR>iW^b+Et5{ zVKY{XHDAeHlc2@jZd#4L^m=C+xD)-3E`yC0{RVOF2q!oIq0&#O21+$hs)14slxm<< z1Em@$)j+8R{=Ejiu8fCC3?9&n3mcO+{_x?ueZ0EX@xOYdagS4*52dXQ_;yIeUW0l* z`^~ylm&T@cD_poIEIgz^$B#m`480n-Wz=hF6;8H#xljL-J8mp}`h`EX@9&W?v&+%8 z7juh>s*RoX+`b2I#tr-C>zIf^g}wjy%kTFQ+4sD#zt1zzyzt15Y@Z8TtG{_5uENzH z$GkOZ+Ol8M&z#x$%8`xR>b=%Der55hSFcq#)_+#nS+lmBa13eo!+)L{-*d;HC(qn{ z;H}vGCk{*t>NJ1KGk*-?7Z{&x?5XtIO?fb}JJc{QUAM*HeG~ zt$F!p7q>X_PP?Xmwmn?2%FmUK_Bzox^v3yPC7UkSUD#*Apy?yF7FT|8=H}A}bAOsz zl90IKc)OkfEk2mDYwS((snHvIB{g=w$6H{|@rYR^}GWKa9#Ixl>AU*X>STfOyV`{x_&c|b{66}07t&h0{P zIAXIGymn;i)sMF9ueYZ#D`s;2z2(=OxpeWDHM3g1bUNn3?%xYq-FPym=csL0{C=)5 zJi14A@#%i$@g_6z`SKg@Kj!9f^{4bxs)14slxm<<1Em@$)j+8RN;Ocbfl>{WYM@jD zr5Y&JK&b})OEl0?8FME$MgL23{r_4v_$Z%1Y@(5O{JpSeVwjh9dR@EP{`JwTbYJID zDN49p(|J^iN3Sm9an{^L!J||>#L>dvNzbEKHLE(~dGsp1k~7SsS2YbsvG}t0%dMR8 zJbpL3f-@Y*?GlDZ3$doSKSVy0fZN~X?=1ppJOy7y`Hnk*6b;85moc37=4Lg1-cr`% zKOYW3QE$0@<=JBz^vQ|2iXq8v6gVfxXCKUxXB97WV+)`R!F05 zvN|AIdmQB5YLiu0 z2=s73v(>-at3~UOp9Z)bJqPQ*fQKc2{@=V`%lyDE?5=Wq)05<_8ymEUT@+^7@ycoj8Uf2ty+nrwC-@?l`Kw55gHXgur zeSjRf`zv?*kk07k{guZVrQ^Ku+q`L-iOe|U(GBNkfn%P`X#*^9ffl$j7Pzt&xN;V_ zAPZc13tR;YTty39um!G?1+KCMu8IY&ss*l^1+KaUj{eoG)0!5zS{At47PvYVxVjd& zdKS3)CY*Dm@EBsW1GvVKg7X0GQQ>5?1GvY~q~-TGEMATP@U{w<(Lu6sN!sWjSvV&d z@&@I0NR%NTgy^tj$QL2HE*bJeh)#?fxM}Sp0L}xrCxmk&r8oTaNa5yW$Qy@_=v4eBlyu>lAjM!jS`NN{5TR!L5$=_ z58&j-mPUR7f*%jqN`5?CJ5sn^^5fy!(ZT`qNi%qd4vu8;EAzybNgfpi5AM*GJa~L| zq;T2f!N)d?7S5YIn0F%&wq)|CB6#qStmMH1vLl7NCl9^>ceHT)T5(;yEXfi>oXo`O8;2p$~4oD>@6A=i%{wmo=bVpyM3^X-`-2IGBhLL0%y2m)qx0oBj8k?mFKuGg9uBW21j|Vk2w*Pq zH(jfoZ1Hq8aTW2XEMBW(GR>>?g9h9Es|gs*N`6@3AK^_dKGkhXOc<^h75?`=C8zYz zj8<>FCK?0kZ!uQKZ+7VNqhT15w#KXLM+<9LEmnrjSS{9kC3j7N7I(X8HTu%)ooV1s z^g9}(n$klvcc$M`>QW7qYM@jDr5Y&JK&b{wHBhPn&l)fvnmO9%^|&g27rG4TF>&+B ztq+BMed3Eo3)`&uU{K_iw_Z3o|K*CcpWQO#=?|iQ==KJV&Gbmwa!>t3J722$$f4q? zja$~58dCP2{lAvHR?v9$`o`JstUvN=yMT2A$M2|LYee>{1J`EH-v0EF2aA^Zb^dtA zC$r0U8TrzWXFJ?Cslu6qufMpx%g)eezUp^k$Ilg8Pnh>~!`jI~ZM)oze5Itv&U=;) z8M62LWi_`ZeAD85g+bT934gKQ(7Np&`K3e3{)szA?XOikXx*@`<(^tqsaI&!V_B8P zuSy)h?$vvKYTWtH_t)b5%#iIPdcV23-jTVNdVcovv?)QAZ@JNAVc3zu}F}iAT|KL^a2X~$uIVE6P zrHAw5Z|&;2p6Q&#n?!Oye` z8NBPo-*@6IjRhS(8NXz7nTL9{Yj&*h*~izcxVf?NQ@>Q&_e+fh%XYuoz~Py!zZ{PCa$s+9Mx-_S$~O@#vbTUK)IH=OPr5pXoD{c5fC& zd$xnpm{JXtYM@jDr5Y&JK&b{wHBhR7QVo=9pi~2;8YtC3sRl|l@PAhWrH5wz@9I}_ z|G#@^MhSdOh~c3a?kIS!>f>TR4a3|XpI&9F9u|jY42NjARZMOv2qD^r%u9KM-b9Go`PjPF0_0Y0FO;HKoZBEJeMYfz0kJaV4NBI& z4EZ4LGlaMuo39F9tK$9ei*?U8rhCCltTlbh>s!R10hN4%65r9ZOPLAvk~g=A@4{;U zC2xAFr&PQTwu);qxjkIN`(ev>A?W2B=ly|q{Yshi5R@t3sl+Yh#o}xVWpW$&N^!D9 zZZBt9C7$K{5UC_yE2j_qp|hMm9?MA&M49p}OWbB&EY87@H+MT0ixV;A&8_BACbyY8 zWzrLCc*AQOXP2U};LC_7lA z#;YL2ytwOuzKrrib@c|cgo=i8>7_QvBJ8eS_i<@0z2J)+b(4@y|+oIN+?%eO`G_`wrO zo~m>11m3PpROR!1R8mfmkgxf#AYFbC%D+SRUqK#q&XECS%J)a{IKvZ4zABS%sM@X+ zs4~mzGRq5@jgg9VQC^o>UYE%-msiWogECbRvMzH4Rla}Cf{haUKy#% zWfz&1 zb=%^*u$+BkWsfpB;-pOZ9xLwKFIG}i-SSOY#mZ<^hkPlxY(sq2x6^O(wcQ$CYs1tn zUzhEwSxvXJILef7w&JmvVkK3T$#-Y16c3MJIr;7^$(!%ZDpvf|yj0a?@|{`EzOkxD znH)1wW-H;JdCaC*J*UbyZLyp;5lflXbeYv$%E{hd=B1j8%xWHGazsv<^6ghVwo|P9 zjWFwz@7F38CuAv;@7I#NtGmdouFI_MBD1l<&jh`HNyDP1P;mxK*r-RdvWW zZb_LnTx9ZXTN>V|+ZrBaaz;U!@(o!$R#dDwRGEAS*GeT_mC1K-N#1<_meYo6>N5H6 zEoXh!^eB@v7Rr?G%;GVnJ<5HmOum(CkFr3O$#*wDBXnL1GI!~Iuoh%$c#d5)KUfPg zpD}%oWO{E~m`ey3E=rr&DHak1{#qqD=W- zEgqx7F-uh@-`uqeFRGDt%Qtt)^6;%)PMLgbmxedWtm9E8XLOV)-?YVJS-TW3RVLr% zwM+31eg^&nH)P(8?W z+E6{n)bK_dst1|Yeuy(tmQ%jXipR$GDDzaAeBaj|Wxgtt@B5Ox>$}LTugk3OVz>1z zW%3wW9y+ruua-E#HyN+X(Y_0n+4wzM{m)-ojMY^;hGv{i6BmNAm~o*NxCR!uh8DO+ z7C4S#%rcr-;KD3$O)YTY7Pw{>xCjeeqy;X@0vBz8i?P7PTHu;n;96MVT3X;*S>Re* z;M!Q=+FIb+S>W1R;5rE0ZrCn9>Z(~sfpdLuLMIDcXA_QNAvUQLoGze>;x&4$@jn&E1gxD zA-c>E7nvb?+YE7$8RAhU+X~95zPF8M9gCGNs?1O!GftHms>=*@kr}GX40Vwi>QN@! zB6Ta@v&MJDId#i-#T6^#RGAHQnGIZIHqd1@aFN--qfEASmecw6xMD@qE#DqjtYoM% z8|pF}y2xy(%WUW(v!O?s^d&53w>Z`y-zVqPZ6hHwQJ#G_35T9#AF40F+Kn2_01l^LeX40DkgrppX-ks0PuCVe@}*+Z1GDP-BQ%A~UE-b8^a)KNQ^Om_B~2mIdi=${g5{Jl!-dQTRGHyI z=2BH=xGpo?MP|4zGaTh~j=#b^%4A=}a^5A%*-Xe>tjcUAWG+)>Hq&J`bCKChm)Xok zW;2g6+1Ih0Qf7pUZX<-u<*LjGU1o%f%m`g(gp14wk22YpvYb6dIU`+k8!2S2P-RBy zG9z7NM(Q#nU1Uajl*zuD<&-j`Tyz^HWUf?YM(Hx6Tx3S+GNW8%MtPJOt(Nm{QO;<{ zELQG?6xwYxWELyqRhiL{DaU-#kXfu`>3FR#i-t_+TqPPZt;d-hYp|SBW{i-TsLG5H zGP70QF}lncAyZqki9tDKUSeEi#(0#;u?*|8mndhfkeQ>(j1@9-{||fb0vA_x?T_yn z1{eqg5|fA;%?XLlkOvtaNr*9Kcn0zy1W1C>+d#rZFa!`t#8(|ODy?nBNFse)McZp> zn^rVN(ON?^t$Rqjd-Gr4{Wy=|OhSCL+RNc{W-r!Rd#|-$ zYp=b}K5I*!X*$m|3(qv2XPSj)T3DX2m5@)tGoABnlswZp&!FU)uJcT{@J!cvrdxQX zhvf-d4EZeL`OM%v$teJ@&kW8pQu55ud1i2)Q953gZH9$sMp&M(^^i}&Gn4a-mOL{# zPq$1vQ|Fn+K;BpKyf5NBCrX}+I8PjKio7h+c`mZ#eUZ*{k}9P|jtfbSy=;e+<3f^SFE7&zNshhxTFiwchr&nE zTK`oTV&bXrZi24ivP>j=3^{)?{)8NuS3OL57jj%ga_nc{lX6@{a_nc{m+4+a za_r}FTtss0*X6i~04Cyr^1_gE+L+eg!~Dfm=_|Sg6GA=^Hugk$@603`6~O7E3?6s+u+vP;MUpT*4yAJY;c#@;5OLcF6B65r3BjEPq z=oWiYawtc;xnEK6%b^_Y<{n1Hf3TCMNLg|yN5-C%9LkXxLv#4}0y_tKJ%@5*Z!4q6 zfv?z;lFRwNN&kXVF6TQ$|3OdZQb~%mb9J6i(!uSyoM&k2>fIB1FVYwLPx5&BZ_)oq zKabKk_MhbG>F4qEl`Wp9=PA#Ur@XLvf_4B;vHv8W^E@hf=JP!Ln*Kwc@^zm17M}S! z&wS2P*#`Mxc|!Yur`Uf|z97UG$DALQLNS6csrzmV4V3YvQWIwnp=RAic&*i+{-;+F->pYip zo~nH>*Lg0t)cf+VJTVG^r`U(Gg7f^N{FCIliu3$X@?53! zTxF@xRXWdAmik;3mM2DO@SMf#vzYTdE_oJno`04+i*=sG7M{gA&tePD;;=kn1%Rj6 zW3rm_{EOtdn)CdtEiO#>oQnw{x^9+jyJjEW9HJs=FN}g*t&lB_?`sx~; z=Nb#oH9F5V7M^Ru@`S|%o??$lDd$N)JfEeUr+T+rs`D(h@GRANmRfk0hUE#13_Qgi zlQPazz1uD0Jk`71GM#6cg=d-0v&_P?EG$o0eBdeen3Qv#YK^9x^Hggz)f&xOo#$H4^8$*6dS0vZT+4aFc0n6n%Xuox zXf1EUYK>;C?Kl8S7P8Fe?Rg!SMXk}SnyUY(`8v_k!78fMYNf97FpKW z%CcU{BKD-L=d!3Zn)O^3wMMgEmt{SdMXk}S*JXjrSYwaT`ml8Y3my3vdr~SmPqju< z!Fj4RnhKp~1?Q>8hYFo%h0YUoRKa;dFI4cnt2LSm+q_>Q=ptloThiQjy92`w_8_TeQICz8s8JI9T}Dzcw$b&Yh6>lDs$v2;Pj&n~9Fs3_$e z7aIb_HJ+036F8nby~W}p9Sh;WhGJG$69}}VeN3mfIh5WJ+ErUbZw!{w?)<9Ak^b4TyX+8OUnPTv+C zUp48$e&-Lh`1r5xcsA$I?EjA0dDpR*A_l+w!&c|)Z)N<>S37^-9e?@DiEsRW*S_<@ z8^8MIf<;%o^QScD%(~0(KPT#%IImo+^+`>ekXZhP~N!b=z2 zapzs{yu0m7@0Xr2;eYD?a^SoF)i(9F58eFqQypjhVp7KI^_kt}?>_4K!-4BoK7Q7( zrXEfD>4oe5{i3_~T=p*=Py8e`zj^z?CFkAvrJi4Zket5pk6(T9$f5702?N5&UDRAWF!`qj=_v)3KGWPsy)5U+TNfy_A{)TmLG+r^*%*RS#tOUkN zV5|hjN?@!6#!6tU1jb5WtOUkNV5|hjN?@!6#!BEbQ37L5Z~q?E@aZ|dg@ekBm;}Br zhB?Rc%wU%aKDs%TlUd`#3w)@9eHIDKio?#1(2sXqHgwp^6H13Y6`|=x+u*QiBZ0Mp zJ#D!#JDIiO=ym*v^v2oX;yBLw@lL!A4rN6$BRe`@lv$|E^cB zk_`@<%0l^0vB8~bgTuzi(70#W;Lf(eonwQ8%cIcr;F2g5cb*My8pj!BfUSYJe#s`$ z)(hoi_Lua3xIghh5B6#7vN)ODWpOgQ%i?5qm&M8KE{l`dT^1*^yGRDHS<^w==5|?} z%mi~K6|8E@q_q6_B9Q}7l|1X~YL)$>U9kdH=m&M8Ko%FJ8qJM|BGoU{qBQ+N0ZC$pV0P83n0?(snaoXmEH{E3Z+=)vGCKInmy z*-qWLEu74DvLSj1Dd1%GPC8^>{b%M2N3()&1ZkQ(b!S}>Vfmt4fv@<`2aaYt*_kqj za5US=lITBdU~~~*kv1G~cj_NWx^$j!G;8D)j%Mxi3M~YlhND@-AtfBm8V)JpX!d(N z*Kjo3qn9rn%__XvAtfBmelLWpC|_tf@Dv~Vz|m|cJ4@yhj%GXA*)pGSG%NCnJRA9h z+gpVWd!EqJ z;AuFT?PTXlo^UkV$N*4M($`y3;_n&J&JijW*;C%M;&ef~WX^2To->*)+)$ zPGvipCV9fCtl$Z!vPRj$sjR}AdBUkITy2{3D(VyZ3Otkj=o7+`>~zT!J#`ODmOQPF zWDQ4Xp^jwL#&zLHmXhWlU%)-D9e<2y;BR&+J45n^Q`tRirsQvRD%-{Iz6t%w&Z#VP zgm5Zr&T%JcC~T?6hzXvCBU!_#DICduon0V#!jY_SFbYSqhEr2Gl2v%KQ&TvSg;P`W zpWulR89c?uJa8UsI5may*sn9MlotnaV?AIw};m9?f%Gu0a z-@SLFYgcDhVC!EOI^MpkPo`w_IPBu@LE%uCe>W*vSL{{*G6WMR- zj%z3CJmEyv;0Y(P_B_v!JPjwZoh)7QgcI3LmLcmCPGkj7IFU8-2`91&Z{`Unvi3Y- zQ6is)6WLCdDS5()Y$uy9dBTaTNE=RM4c!bUvI=kJ2`94lJYlhdr})4JPGmcEhpuoU zi`0ZZf)iPhHk`;Bx*1Mn72eDfPGs$Q!XgGw@gWbK$ad-uU10-t>JDAuL{_8?C$a`l zIFVI&Gfy~?wdVR__pwe{ws0c5kL{9W3n#K7Z8(uNc*2RS!kc-*iL5DS5()tVkP9WDTBhBCGIbo^T>-&l7eZcp6S*JE{7FEeI#F zow}n_IFS`;!-=fH6Ha6m-pmtDWbJukMgpFO6WLDP(J7qBcCrOBpKu~8(uNaRgD0HG zD!iE|oXFab@0js`r{P3)AKN4I2`94qSeN7pC$b`KIFU7Y!ilWHn|Z>CY$rKIG3Qn2 zTg<4yb1`p2a3Z^p-6eU#iR?c1b;%P>WJTI=B5Ux36Iq2f^Mn&wd!CrFfv4d_b~jrn zdBTb8Zhq_x#w$3H6(91$iL7DAz=^EFn;mVziL8CuVnzs_h7;M{Y?0&%C$f9kg)*NX z#fhvvPs}*M({LjDE%p}u59fD>7Tk0MBYR0b!q=DGwt zp23N1DGg@IiLBX;ta2P14EdnS__WG^3@5VI6_@EGd+1C%nd6LEHR8^&!OgV6oo|D? zzy{~B!Fg?PDI8~&d6o^`Y#X{cHn_PqaZ_#R=GowUHgVHz=+bR)88$e4!4$fRHQxq@ zPXj~g@TFO3y=B?ZEwZ7z(1vcY4GzwZLU}B)p}W|IZfOV(cE3hA^c};o?6>rTS>Raq zTl&E)a4akO2pr2AeMijjuGeFu(ZNA?}?MEeF$Ki7rRNf#Oivk1qs@6c1|rBKJR zzt!g`S0D*-qVACLGHuyjlOkv8+8$ z^iSl|a4g%YJ9&j;*-qVoE*#5>wBcCR;0edF3UB5K$FlZ3(f^T8!?7%-<`B9Nj%7QU zpZ-JH!m+GK8;)fSo^ULy@MfNHENjmb`UUyS;q?i}visQGk|!L??qlDOJmFYYqz%Wi z22VJaRd_Q`IF_~N3H^n93Z8H*yN}%?dBU;mKK4z?6OLs?+Hfpu@PuPog*WqrV_AEi z(2vNc;aGMb>y|v>Sau)#mgEV?vLbCbmNj_7v8=+IdBU-*Jx}OgENeI?hGW^?EJyN$V_9Jzz_Bd36Q)>bTW~C^@XBrwc;pk~atfc5 zzd-bu7pK_Hi!r7k?}oEk!(lO;&F*HoQVuwq75w0A){q0vW))t^0SyFav-eQyVjX4{ z$#Soy{DsYi@eAc(IG)|d{#BMe9M5(#<-8b$N^`x3a{iqIlvh$%0aA1&#}ld$5s}M z)hH9QliGV_nZQYHCo7P30w=YCC!Ew8vcO5L!kcA*lUk!r=8`PCiO%>FbppEpWnnn1 zHFOOe*6w5XN&awHEBL@+t-&7-YZYGcN1ec7t*Db!OF5+4mIG`Nl!M{K*3dt2V!Mxh zTgm|^wt^p=*cx)o)8&8@Td}TyI)M{gqfX{oWSM6x3v3{iiQ(M#Azd%Qx$Qpo9VrW( z+X`9W+}4l<&TSRmEDN058g=3$S$;%x#-FGY*jp%zLazUXquXV~5&ayFZaZ0_eGAmk9vZ;PZHaDLm#mP`g?mvWziRa?L*`hxpB?G)_Fksksler}XjO1|d!N1%ouh=Wf$^%+O7O!wt#$oJQuctr@af?k!=~X5#)0vug{O_ z!dCD!T-YL?izuIPEj5xSW;@8I;0brNyV)w)Q{k?5H!GHH2<~dd2o86(#%c)M)e4>$ zQvWerfWuv_Jx|Q0kWa&1?QXVO@`StE-K<3Ngu7b76Ygpao^V$ycrLc^gu7aMo|vs6 zpN4DN-E58I3D>l{S*hd+*R+BsT+mtJTV(YK8tyM!Zoeo3K*_w zzpuLjhHF~!rW3Ad4Y#~-P20nD#S-FaxB`Z2+V9z}Zeg~Gdl3bN?_#}{KQZbomHAxF^SP9GKE&>qJeLyBhuFVKo=b`6 z13W)ViKlTa(^BH8@Md?oONr+L7LL7g)#pci)yG)DQ4kIfYA5Hn#_ttj*MAI$xYiYv zY|4*$W)EAyFUwWr(NB5&5o?rr^z%FhWgh*M$6lUCza@`;%A>+Zu?Kb6#(v79wN#Nu z@Pr&_KP9|evx(<^_Fc&nj#M9FJ(4FJsXokk!inlb`f3`Ss4Bd?tE zN^ugoA~L%dDlxkkYW)cAg(yxW<%7EyqSP5LO$zuG*1gaLBo0kt$Rr@h{TmwMNH%^6 zheGF%a43{{3Wq{6`ae8aM?PP(KZX=ISr!g>aAEs_-Q{nb+xu9_|8ubXc_K6sm9ZK+ zYc)XCoMFO_9>gnIyr#zMamX;5m`)-}h!T|L#J`p`v-PZjHLFj`pJ05e{q( zz-!~t^2e)&-(vp_T}J*f!8-M9^XYt>;660fLC|6<)oQNlWGs*MX^*o;n+2 znhyJf!SFAK~|ZpToAj2yCQU65Y-?n7RV{(MKvQkh4(H5WIoq3C8n(sNUgOG3 zOwVnoZ*ey@)V1x&ZP>PrRn=GLY;S34NUTqrqcMk%epZzgG&F5%p0hxUO<-RxA%B8? zt<1H3({1r-8*}Sw+2*a@l=#@S&8|R`V_I5jSxtlgs`%La`s%hb<9lM`W2a0@Pneb- zKaGm%G%v>#>SJiUFHwcOg2)u2sQ({@b7lWSgKvH1M{nZE41(L~euQA5q(Dsw9!oV- z{C_%EA`ycbR56A@q>0PnKm!ESN+IBrUV{Cqe3bx*m2g7XH|76HItwKJkGQ-f+sVfR zdVUckLmtA92Wd1VG&H^$8qIhhiW6KM4nHIc(XT$>NWTg?Rj$VWO1~ln#24kQG^9a~ z=i(_K>vb}`N>RiJM~SD37iegF7QsjRg*p_;S=*mr0b1Bprn)wz@kYH=$SRNbLe z5PQ(AR8RvE3Kdkxqzc**;hZQ{P;C^cpa?AD*2Z>Nugc&w`u~5>i^Z}2AJX%U`Db_?tIFCg z#QfWwq#aEt4vVg8{%P>Xa{lRGABF!4Vx#!4rMZ8AtoQ=5)SK8gdbxCZ7q-!!ZvKBs zERIA88^g#yUZI@+h53IxMZ>HHa*QU0ONmJ3-z@v-!DISgl^4of!RAoah1Iq*Q|#L}o5 zwoWg^oP(A~gKqv-jmMR668@1emSYrLDB+nDR&v-_nl&%ehQinZ*iLs&TO42R?c;IX zE;oh!Cit)k9^h~cU&2M+X}Oov58B|dmNx`^o7+8+f?)y20d~V`Yjelpm6ImmM0~B{ zlQ3i`kuWVlvI4dcar_MPB%FxPUpYB#B4*Sk6ZJfD0vzJXQ*r^JwZF6&8iC9b}7`%KE25FXnIWNC}Ij=$iyFgPRVJ^R;Sy2z+IfgqBZvET({awjdZ^&9&?E=O~JT_4Acfgy^4UVd<#75;n%x%AAKt5b#+9EuyCjDc!l0MkehTNTYZe^y{OPG6~9{w8Vw{(7RdsK2qCxvE^N* zUs5<}b2l36sjhSQ8#`+7JN=e)(EM6U!gcoB!3D_gzDY9KSVy1704=guCtY+a%V*t{Dv_2%WU!3qfq%V^CMqA z^IWO?#7(%yiGf3vgUY`t>l{?i6<*OHv`_bo&O~~k;wgF+Uxn(q`F}-gpYDy$nva<- zUa+dmD2H2|{U0-3*+qELM!H{iCJ{rGPn9>tUxn(q`F}-gUk+b$Hh#=>Va%z^khjx$ z_+zGPo&p%@raLv-SfTQ%@}~H!P(3&QuW0SlZFLUQ+j138(W>|=RL|A_tx^`?)mVUM zov{Ass=X*kG$&uZq*Qd3f4ZM9l$4%JjtfZGks$NuzrmEnedam%t zWL*P)jY3j*s(N$N4E(cEZ_nGdZ~xBER=@R!^xIR{XS>r!exg);A;e{>A`XV)`eYjb z{#Fz5sp@l(;(a#i^M!xX`s{Ef(#IsKz7XOvRgrCdw#zmE+ENoS+!5glXAglM^;x-d zz*3%Syr|syQW*Rz7Q8W^v)WAt{?#z_gJJNmhrz!Q25;4OhWu8$#=u+cAOrs^+w}cA zpS0kOemN8d|F$hYZo)3-Fs%-v+)*zGaRD}8p|~2^CV*dKA{?vV&szQNaSlv6{rW9D z!)Oa-WA%H&=#QVZ`t8#DHL3~y5tpgTI2elaPBv(-FcFXS-_KV4V(<7ddMlz)9ia|~ z20E6(k02;bz#1(_QTp5v;S6Oue&7j4Iu(M3AR#j30Uk?akY^SJ?Gna2y*^1_ zNHCVWKm&XtE$=9LELSOf31CW-USF|FiN`zXpos=cLyEpf(nJ0}2@}YR6X}>?q%$bv zf__-Sc>k7&4?##as$u2>Y>rEKFQKvojSC)3Dot>Q3GO$+ST3VmBxwK-3mSs-^hLu&w$1X7682LxcSv0I-nB3UADTYuw1jBXd(=wM zQ=37V*AT4I;iAwF=-W;7U4q^P`fd|_AMiv^s|u{&L_Z+tdHPt!Qt1y%dZd5cM9*J5 zOL-D0F-7l1!jwKP-sUAQEPtrH_(3D%7MkK#nrLbSjSE4ei6#gHr3vlQPOwU|8+d91 z!1oB)&HJpx10FQthb110$4ygwC4VBpq4E<(&kNE|A{xcl2YSgjOTe6OiNu3%jR_x= zc<}8aSn=%!-lp7o2(NhciMSD{i+%}1{|rbNSsEf(r8x|INScJv^J0dP&T*nomitPu ze1Uw;q974)P?W9T1Xq~gMhQcAwR6~{_hj5|fj9au;h`(~Oz8}o;9(Q&rs+3i0KEp7 zWJ7oLOBi`Cl<-c1D+KJGN$`+_(HGq4=xy$Ch^v`kuY{4l&x9{A!4(oNCYnmX<~=M_ z&fwK6@brx*wKoZGAQ(#(sEcw6It0u+iRvRL=VOxQLV}Y}Aw+*M1r-v0gy1d-XAxXN zQzOt^K|#BO3kW_gVAQ_SljC*}>__EL-VwJCa4^Q8F~dXy(J@`K(9k{_R0%&=!kl-) zqdg~*DNpHhnj`_oEFhFu;z3g>;Bmm$nDE_ztz)GNGV}- z{l_UtlJJcL4@&rJ1XoU>pI{7{s;U<*!?3`c`9>kl?#@uFrR(%1WsxJo~G>W*qy|s$C=DOqdQaj<*7}OzX^mNqt(k0SyplrK2jhnuX zr+k^uf_qGGuLK5^9j6zKude}15at93=0L!$BPmHNBId~De+E%yCpt{;2slxSi+FuIN%Wdd?BIS z=hF|3kDQl)dEYMqO#K&ayF%dkSk@@;BgV2`LBq$gen}76G!(WR3%r2MGFV|3Jyqr4 z!nl?t;>LOjt`RWb=i4FRgbKoUOFVcT7jR-Z!OTN9?Vkm{LcrV}s1$GvRB(-ed47X{ zt#uTMF5NEhkpv3af-zA#Om&1}?UCuAi4RB^2=z-$`jz+yFAwx7~LC<&v%w@}x zFz*)B!b?kQ=0oDa**&Y3AYOxBONne6RgIL4v{_| zJGyvWq4Rr8aK8y2lrZ|&Fo#V#oW={Z88;M(96P)w*l&U>Bn=!f)d0fIf33e|M zG&3pakZ=;geFElsazMgJbI^o8Zi0D7mpagm3ZyzhyQ%<8?Gxi^jl^?a5-uftpM*CM zoVb{NC~i3gjRLmR9fr)qk_OR^OBn4l3k`wdK0-mOgppO>5`n*hf*J{<{R|4&-0yh1 z(vTSCB@gs~&28HZ6Ak)8Zzzq_tNj8$LiY}c^ttXG6tEM``k2IXJ+_n(ls@oY0rT;_ z60nW#t&#N5y{&?VAfwHrjRge_w{N=y%?Q0ZC}_A|JtpZPPobZFq+TrnZ0%o08IsJX zqe{>aJ=#(SV5{EadbJ05vJcTt1_T_JL-3G*x&HKK6GE|)Jpym^YjZtXW#c-kcO*R@oBDvKd@ZM7K+st7j{d756V~(%8YyR%pfTj3 zG-pz@3gD>>&qES|hOdou3p`&N=@&59)dLdmB>Eu%^R$`xsX#tYaio7C05 zk$7GXl_GA`REkz3;VlHW3wl;h@UVmn39iheAIc+!mL3VG5yBs@)}w+{=vL*Yp_uEPg7Ug+>46MWnRCn7_n z&(XiU5=PzmIXqH_S4x^Gh-QMjOmMG+&nB9~fTa#UCgE5@4NG_@!EBkJnMpxAV5@%M z>l?k22KwQ!fQ4?CFnA4`@W)LsL&Z{?ET+H>nCch2DkNMAl!T$f2PF(0o>hd0CL5UI zLO*l}JRdgtB@Fe)(6NXHI@~W|=30C8vO?SI5_qoLdj)=kZXXsjT(|QNGD+tkok~uWn#k86;BaMVPLt>{UJMC(vz%s_=l!^#G3Sww7fC2oN{8zl z-Vx<~1A*t`MNq(eyy%d4$k{DmK3?=lcs$_;1qt>3|H4o_m2ExYdjy`VnrSwB< z!g!Dc*qnZNn2#fV85jDb!UVSpnEOTOl6cf(H{f6l)Q0K{aXL&gOrd{z1bsZps$Zr9 zqGJM{h$1^K@kp}-nQL=TLier^a3b)%0_J7dC*YW=gzuN|MFbB?80l;OLO&#fj{={B zp=T-u%*UDm0Smn?UtR9TMw>qlSnjWIf5Ct?3G?zd!G055Xo5>j zaD@r3G{H3{xX}c+n&6;>(XZPjoJ4T9iKY)Q_01p!{St_o=+-}16N*H~)53sp^k!|w^ zp}dt__GyBTnc!g)eB1<+mv-VS$6phiXo8bWux5h25=LM4 zNf>>(&_q)SSdP&(5{8_|B#b^dEMVT3-8F(9b&(`t&}ahYG+8E^LWu`Wi3wi=*xHYH zUv88%ZhG7<;h6+?jHKs%xlhpWF?vA4=*xo=MjQ6l(vKXY3kA&Ux*f1p2HuxD1U{Oc z>U}4b;C>O8_v>K+^LFS%gQ7kKIkN;T+NXpO)JXVAf(Ipx{@b;cenQ6OFA!=#;N1l3 zG9Z0l9sN+B!h;IH=Drpl=KZ=-#zkLlHNjm1=KZ=);!(f-fWxIJ`}JW#&-?X|Oec<_ zxwp|zo12fzNdo5MZ=-;Dziu_*2L#N^ZBW3xUk^zb{hAy2a;?vgL6~Gfzb=t5f}nu; zxI8RiUf0J3%=!K#lZf`-};`gjtj7k%7og8dTa^m6~ zZZyHICOBw<+f8tX3GOn%-4aG0?~yS2c)y8e5U?Dtha?O+D;otKeX~Zuy#EFz9&Mn* zMAK!W={3>xOFYs!Y{Cx#w)QXH$B#)G-ng$M8j=ld+YQ)C&-=Jf(C|K9DB)rvEs-$B z>uw2OOmM$|dA*Zg+!1NcB9t3=YCowIWC@t}>l%qi-g^X`0NHv?_(8ztenIJ=OAn32 z^Rc_6nbVILyL~MjA4R`|!;2@uli@4N=ClV?Vc#?yk*2nTex&W~6)^An zK>_nV-Y#I?$2%m9KHe)~q(3a_eFU?s=q7ofVtfMTeY{)1ysmo$%=>sR!D{U813pY2 zAH$E-duVeG$6+e9e_=1uS$oy|*U3I`Q91G}6kiDJd5&NxzJt(vsY!(52YD*Mf8f#_ zjLv62pH{}6`=2NO{lPyx((}@9_8E;a+;?VWrN;SOlxyl+HA^ z+!;wHz&jlpD|R{@c)piyX1gdnPB*Z?&7`x}oD{Q!(!iw=q>bXO<6mLq7j$$p`9i z@*!Qw2XBmuuOVL~+t%ECWgT%w$&FsVoYRsI)Zyf-B)K48ML7Ac{wVV0otAu{4kur~ zEWbVqL(30xcN1Qtwt%`c+7H@gp%c%8gs-Jgwf{J_?}O)_`0)crp6dVMfj`niy7su> zYE8834ua6Wdt}%z!$BDiQ@EGfm4_8LkCKnY2~700hhN_R`hu7C9r*rpPso0;&gpcB zexMPp#=hX3PQEm!vrSI)2V8gx{P~1;u<3LLu*RyLIsPs5AFiX!Nh`2g(H1Rxb4%@x zfIO9DYpVE{PHG6Wq|%vDI5H}Pfl-((=@HNzB2u_Zf6gqI)vkQ|LaE z?j*X;qWf&R&!KxN-RIJM9^KRE*65y2cQV~G=$=XU`E*}Ew});o-6?d>qI)*obLgH+ zcPicU==RZ_Mt3^h8FXjTJ)iCcbT6bE3TzSG7t+0$?u+PNLifdVFQwa0cQ)NQbm!8Y zM|VEm1$5)6>O#7U=w41Yj!a%jHx8u5F|;@&wuEjR+*(RE4mK^PdoA7T=w44Zz6!mB z!b|C{r~5Lxzd$$e8!4=&yNd2jbZ@2`_yC0sbYD()4c)bLUqSa)y6foPMt3FM&2%@? zeI?yZbhprb72VtE-a&UO-AM0h3a_F2TKPYrEEly42YsQaX>=GDHMWuc>@n(D+XBti zo0!IGOzjhTe|_GH5G?erla=Ngv`Bvnql3dXHRLq3rl)3CR~NMewrR<0a+5_n5A(cG zJck}%U7DS{GGAj?gz(SHNhkhhtQhCw*mIA){4{#`!GQ<=04|K^>Z!j~JH4!q`tB@t zCVTC7j~_Yk$5;11_l&l(wz;K<_lsBe3v%9%1$`s+dXa99DIaAmSJTk4MBB2BLwQXN zjd=}M)gvVhmnTf}&{ZfMFB9nsxvn@(xj=8omBe~q6zrZo_Uh9we1HGzFa5ahPtSjF z=ztifMLwD+-$_)PTmi`ZL5?P#KOq;=75^V4IVUq5A=eTpTeDL03cWE~OG`m5+ z)Td9p{K}xRB=%Cf@URNbYdp6{U|;9CXgGbQ-0Fyv^oz2g-i5^cdMshaMyC z>Cj{3Q}mIiklzs^ziSlqX89vVL2s5nY83QJew43+jiXwoWC9>Fhy;ss?qw;?CD zphP^l)Ep_Ni{kB+@dhGAzjCqarfST1>DuFh%S`)t?J`~$#oOcRmvlIu@+)Xs{NnkS z=_ayg|FZAdfu~;i6KwsL-+l7ehzA#!NdF2dziNk}Z-qr=E!S*+htt8+HRvN4^susE zL+N)(de~#|5&(IQQFxS6k@Ebi?~qv@{@wqm<=JzZ@^qQxsg&|mNO@eW@8MT}#jami9M;BXLmakz9 zKzZ+F@ifc%4oNkR>`5FhI-REs;{X@zQFtLZN^28t_LH6m{~+oO_yHaN>W5GK&A=bi z@vptH|B!)av>uCeTx7RC{Z}LXB#u9W(nmeKcHeWq5Pada;3(}MjpO*2?|b3U(|_If zGb3Ihe?Fe#J@?F`??DC;uae{AWqQ#60^iE?;rT3z{A@CS>61%pZ^Zhueii~ zubA|`gLz4(z&6Jv=4%)q)=?cOJK8!vK&xWbiL%A-$!MdfRL<4uPfmF*jdADF*fSbA zJbd_>b&^RW9VoX9j>b4p5!R%Mr7qOHik#B1bR zl*i*dS02_!dEd)nYuZMRCC3Bc=&(o-$1!n~lbP% z?p*5N$=Yl!x2DOPmZ8S~aco5>T{4k}nT&+d>mjKM{^hK(sdk%?K|v%3FBbXJ9B9#+ zTbf{*kemXz?mEpgM>7?h=2;vnHqYOxkDk6@?;V*i%5A2#JT?U`udUar=pfzN&9-u6 zSm`x!L~m1o=4dUs4cqHm00b@%G>yy#&&R@W@nwPRsA}3=Q`O|nq~n8ALehY|y`k|n z4dtr1FYz`9>H?cvw9SykJ1a%o($ug`YreXp?r<5BUU@s?L+5(XqkWW|)%=O=dD6kzZ9#LBwB=Vf29|irJt2Za?zE9|7Zt!l z6{WVsm!fIqh55ziLPxynk@2WLk>#@TQqhz=xuyBp<@s89b`H%rkdKi9rjE>BNa0eS z20yudLyMN*N;8aRZ<(l>G_62Z$?8p4P*pW+ z>v?5}g#iyAQJ!>8AT4ti^Jv*r1t?ans9y7W$~<#CYdt9`q&X~O5VQ~@O#xk$z%)yN zXr>gQk4MHdG_HqqFVcCE>o#Q{RAc;)1HO;zEwyeV_>soO#koLpM-ZL8e#e>-|&2;nPA*qTE&fV5i%26_hDNDR?5Ejr9Hm@jbG1 zoVKw=Otc*j>m?Ztdi&Zi(?6xti&lrYNaqlZQ%DPQHnGmD@iFgGM$I}Pn{@ul{M>Sl znsn*vRoa&Njdj%0Nhbto=%{X_`E{VF7jmVC_SVr>~uGc4HkP(7uDlQ=I;lxh#v7UAAlT2ON6#WDPz2I z(TcccNr>zKeIyg*hjk14dhoD^csjyLeaJbJ{fx9GtmTpwhP4bn(X@)CDYI~i4#7Z7 zhJ3;{HuOvn*GbR@u%dbXX?~;;Jeo1Wm~V)5k>kfnQlx_!ok+v5x9xLhXg)sv(Tp4X zk-HSlT$(~gl&5&^qUVcAGZ^+i%6UDFa<&DKqU9GaD=N-kQdD2xke8!ZWNu-0X<2^x zlI<;9vJB+vl`F~A;mD1fYU|1Hko8y-E`5xx>aw?BG_u}`io+OA8}qWuvqMa0@$Q(wTdbbn=Vy$bm-*Ea&*mg!O2)%YP?eLFT zf3W7WkMfCp!=`~ihhl8nJgJ`VNFTPU0qD+W|KS`W!uQjcxGK~vP)Csi{>9HJ(}a&)1jS*Z&$*~ zQvKo7?aE3&`gUcF7p`5w9)`TDdA>&5sIphC+{oL9YF9>MQO(L!Q}%7eDj!*bblEkQ z&@#5ho5ABDE-s_dSQb0DEMk>j%yCmq(qU$6$3v8hT*DQ~YiL9xYh6fWj1b}1OZv_+ z)+6lKO%j=8#RKqDn$CXCjyGk{R`)w$k5*9nLT-v>y7+=B&-3WkQqX^3hq!rqVtvQF zo+9!Zesx2vlwi(M&&)PI(#1Po56!KReh+O|4Zkj<-tvu(+h<{22A&d8{--l^FOhO0^oXUf|>L zp!d&E`I4EVX`g50xDE{`>g9Y3J=VLua6>jP&A~A*gqL-@ zc`v-I3%qsS3y*(b9!{%PIaR^->#}OUz=YV76=XJ{uIqe1Ym;P#JHsZKM@)p2g+FJZ8j8Y@0Yn z{*rk-nME;(;w6@48e^5pL2fdQoRCeu*sj)8`SF!eN?u&{?L@q^wohfGKDK)wj8g*a z=QT5#;*Bs2e+~H=?FjhT|D}{`t;^5)XylU znr|PY(OC3*vNJ8|tCoCvsk4xIQ9GrNb{Lc)Mt{NYWc~ev-!t zqC&@8=Mgwj2H*hZ!oD!?Gj@=bu6Fo7 zPyG+?87I?f zq3Pt6t}c;pE@?`bUr|(6UdFf7SoTy~_oWE?ZfeMWU5bu6tB6wetmf;q$VeGHD6w zZ8Y<;k@G$Ce#!xIUt{PWVabf9tOaY#Mu>_UDP2CcfPh zc|*O`kQV#M7S7oINn_9OY44vj_arkMX8w1foc~d1v^(Ryk)QB<{zu^+S0&AK?B{#O z>51KZFOk*(1>QQ}!%3?GZ=LV?B|db%hf`ON($}(y?9o>by#45_5B|aW9cUwe9)8}} z&YzE*_jPmp$a!BM$B&%%4G{hV*D?M}(^AX<=~rC;H|BjWknUISm;TZ7zp;57S&HH2 ziLfFy+OKOhlBw>XpU38Le~<4p$L4XL^?6)n2FATlZXTD&)BEW2xPf#-o=@|=Sq<^| zXPOt{RKS0Rd7+p|VT3jI6k={=o-biO*F)|s#XRx!zN@oKU%flSysw1PMf!ylj%L1y z6Cn{ViPO7S8T;wLBS-KJ%D}Ogz7JcC#-Qp=ja5x8wfI<7+jO;7Q`KDKt*uVcT5Rx} zLLM}08H`AJMoMC*4$` zL-GgTS|UAqj~P}j>^l`yv}^sOR4%?h6*d;VcMT~Y^=33YC$UG{_%{0Fc}$?0povAZ z@m*$kDbWs5Cb&>8TB>M==9$LlasH0eSU-vRdm>Ng^xvZn&Jp}Emp=LTkQaZ<`8!(C z3$*hcZG5plXGeXG&D-@Q3w%k7-KLgz8W=DApON>rIK3JDubV=eo2xX0z= zb5y(io;~#BC~Z=8Gx*9K7BBC)!EC46Sld69owM-MyVI_N!{@;;*Iv5I~271xpSg^v>|-y0+!>i5_M z;D>z1Qa+VGIy-8SpFU3iMo77YUulPar!P6^g1$!?Mug3mJy-OzQl0{>Fj##cQQvCN zT_g#QNZXqOO&jUm+{Vofb=$YqE00Lxzl~1Rm=xjNbR zl<-%qu|X;?v9DCC-D2HX+5(rrp*cq^Ir&O{YLXQ zW#;e6DrTa*UZ?VMP>9mS_xM6$F}|E^KVG=+s*v6%{aw}TTtD{AQ1X6~-&KkFf&M6@ z^bz`XK6bn5RDB|!`aWchy!mh^4O;ECZGq}q@*XQ&(TH7dD!%X!W%%n5`?SROB5zPV zXf*QRcaZ_DcP_a`>h)0F)9xewXHE?jRBkEqu3km znkxIz*&7v{KD@n=MbDiMXf6l+e%|a2yKhsJwSjW_`1VH9G^B$O;InCOw4SH(IXZiz zkkkLY?TwY_9pa6KGUQL`fzfJkd{j$glCm^5nNxt~6IMo&`jVw(Q-}vg&=`A=$+LG# zN{H6=klto=eRO+dhA0GFP(-#Hj|O841f9PXk}*l(w@Q>GhjY1BL5|NeH0i@{8>j)jXPJuUj;iXj3hhO8E$^Od;KZR-qY@|IEKCZP7dze}u zIn2MC*Vjj+e|$S?ssA|r-`igKXI&pjqZdP;%=!qe8fS1tETfgmEG}wYkkB`>l7#-T1w+~2i{x2?ii+U zk86NNYkRw+ko1_{`bedYx7r=8gonM*A;TUS_RDZkhQl&+ll}+2Cc`WlmdLP%LOZ)7 z$nhiXjxNG~9@j@|=>3(j`9^1VWO4fNb_aHWetzwaPk(&``-4ZbKJt&YJ4(2mqqjRW zPXG6|JN~b(lbp&fF~%6nrdZ3X8}n+7b(Mr{l~t!}t3Z#R{`;JSF!stPw@w0oO`ndv z^69LTz$2BA_tRM?X{Gcr9yjWIPGzrrp4Ukn%zqjyB`6ns|BtYQLadV%QV4s+Pa#gr z#P|OQ8FRe9pJlhSG}Ug}-ogUfx}1%4(h31fwB)tT0oGK|(6lWrIX*cyHkeb@>6v+R zGcy*l%(zV^`U&e8biFjW;d0Gj1TH-HeSX5E<1oldK)AsnB{MN>#hUS1{`~+WlU>j?!qt|nJ zfhJe&jy)4|w>P&mxVP0_b6Z|s?KX{-Us9645k9TFX+GZ^Ej@+&`!;K3?2-D*UGcHE zB=AEyZ_Gb?!m2VlI_H~-&P%!y%L?=J%ZnI%2gA{8aAkg3d3I@eTRtli2N`M10~gzL zY%Wu0R5N)5WCSlkAG zy>@w^C6CpV2kBfJZ}p~@pd&5XKS!$$M*ZBC5?>dqF_v9W+wNHwS-tt^{Gp^!FoO4wBOvDUFegvKAIzyaNed2~0U!38(^vxOfUHImV z?p@E!IC1N^r8B3`2r&AMOquzcXE_Ir&(fR(t;K+KNl(eDMbV zn{T-TEpM^Np5Hw1o!)&+os8_JqmjS+!?Nw0G{?;!Y%Hp$ovT$tb+y+7yhFD*zc=F- zL;N7nS>I`k2;5mv^rmBAYg5Bj=S9?4Z{K#IBR=*>;9y`$qP9TuoDrbYJ()Tf`G&T* zJKfGp0_*0vrn|b=XFD3J<)Ox`pdDABHq{OeKnQe^6X-#*oOXY`e>KRV(g&-HYi^FbU=H$E`o5}#xL z)cw;Nqj$%q?}_bC<_FonIPHMLmrQ5Z-s5;LKDqR{+%|`2X+-jxdmI@P{xi97m!ra+ zvEJQW{%lnAVMq6E9h520bC0=Re!9(r<7BCw{xmu*l}>$q=`PonZMzsh`ZXxee$6J& zYVzpUN`AC#w&SJ?UX9(q$dxlRwK}(0jA+&EfbHktZVeorwH%WP0lVM*e18 z#=GNYzdP>TaoX=9Gv1B#^g3TGOAyDoGIgHo8;1@QB|MY(;u=rR%nu!V(^LQAxYd#I zRfi|NcUPeQ9?g5FceYkleDfU(JQ2A#lr{33dGWEcmoCvVn$FfDW^||ht2l`DP<-r* zgw6c5<8t=4=e>*Q2-f#6de8sRMMLqi>uYLzwc9ha#ZK>rXmJwfq-Jko)SUiUI*OCg zS)AHM7i-BUs=OUhTlNh^KDfJbdP8JGl*w;nN=T%u5R1>>?zpxaDkbX<-fZX&ZCvYByiAH7%$`mswqfSd_?TOFradsz)Aw-8t3NwlkpBDR>G^NpT=pVsZ>efJILWtZ zTuMa$%0T_)Ej8NmTb#E#9N%`{7Ma`7c=cBnTzzQ4w&r)gc;8*l2<QixiRepA)#pghsgP5+si*UQxLi>ztuCazdDoD|>u?S(0+y*O1j=oorE zrFtMub0=%rZ0(6CZ*8RZYFbS+I(70;inh8*J23tS<7Y&F_s|l@+3%z;(WXuC_Rlyk z&6RZ1v}||(-9`0f6I+G~=V(8TnWH5iy7x){q>DA*^Lw?Z6Te;3rbWkeJF>N6N8y>8 zlis$8V=Vi{IhJdaZgkXZo#%XbcD3V*^BgzE7PmQ4mT0SLtG&05d-*`z!*R1UUy}D- z$B^T~1Ks22vI{pRmL|^C>e5oO&OAH8Gb3RQyI>e6Qa)93-JmaIN!qo-@e z?U4^gdd{4Zu$%R|%cD0j%zr`b96T@e!1#BkTpkgfFs{X+X;sk;sh(k+MA#U8B%>|jY;VMK7hRbs4j-Ia z+uU8*yK~J{I;L&Hug{@V2bqHo9lYwsbDl0-dXA@bQ&kcx(3m=1@VbtZKt<#J;_ssbi^0 zvn=4}QZpJ1X}5ezvYS-7gJB$qE861njZ2~~PgYQ}Cz*YLdL*k2wRLW6VfXVRQKS1O zrKdO^_C!9sr8W>-H+N^oxEv^#{s7G^0%=iSj+!_jc5BfVIt_?=XfT;{FsWeIvkvFm zq-#jkG*7*CvDmPJ^4!=Az^D91H?GY0%yE3f{ROr_YYR>h$LQTOKH{dYu{d#lULPHx$C`sB z@syYIgYuB0`>xPWrQ1{OxHPUx>+xw?LfZSU_#X6BRkPd2Rg`$zv=eMcuqb$*=hEM% z>@2_IVE<1UuR7A)PX^eQl08MyIV+AnJKz2GliuvCZ^ys$?oE$pJ1&Uw9e8_ckiE^O zpL4_bs#_N3Pmb5xikENwQd}~*yy+Kbw*_u^I&OzHE&k>^vm)c0TKlhUKHu+4tG`y$ z{v$Cje~2H*c2C;<_eCZ=ef|{xEf~QLJKEY0?2EhM+b_g@f6w%BvsP;>68_|QWqiS2 z?a-uw^+nEayY_vXEsLG4{eH)nT%MoLx^-ykS0W=5pwL;y;(LnPiZZJ&nh{@lVNt!S ztc87Zj?TK z`_mR)aLcp{0=fN>TkhX|=t*JCDRa z9bdW4;U|M3V&dxD3q0HvLl&K-uEpHp_&2Ynb;DfvTbJXSdnX*siGaaysLS!xJ#7>I zm75BG?QlgLat(ZirU_(nF?FhTM2llrx#q#ggBjUT<&KuC2O{5g_77DL{NjFR{r29J zr=2gflR2>6LB_y$SnkYa{=}6H^_S;4n$K-vTU*#Ww^cgJTAJLo^_PD;4wLLg9As7L z)YyCf;=8AjwVi$CieDynpP_jVo^fb>O$mJ+@4aWm>ZjhXSaI)}TK3R0H$>bJQF8u` zY3HuyM!?4Cg%3R2d*sKZDbuGwR$etK<-xPc28rHjJ?%aD9)&*WDKXI9J;}2IKE&JV` zv!1UxbHZ-+*4xoI$mvMrk;vyGukMZ5f9T5jUmJHrRIf9yUmVGF#5t`!VrYH$<>J_- zgf@2M(rHnNQ8?!%xpYk(9jvs5&P2|l(fLT=-5uGRa`F@UcN~d164M`Z-+m`qE#f>I zY7{uO$vdlG9FyeGoIzT6z~Q88%a}SNiK#=9B3O`Rii3}sewqy(7sL+>W~9-%LU*t! zIN+F$N(#!el3bTXX|69MR`AcQm{gtd&RECY!i7vCPU4P?p<$-Y`KUPShW*gt?2)G; zIg4lcg?BTiPCfen+xrr@Ca(3-Gn2^*gdGtOh9D%!mX$?C5<(E%Sk>BMNr0dz5Fp@E z7lOF9E?BjD1zc)tYt_2+_I4p4-E6C9wch^ky#<%mL`(0ZFYXv>hq2FihS(3(+W8cXrptAIqq)9CezFpsQ_EBpQJK{fIewr zwx{`hf4Yl~Y{wt>>3aCh_D23AtJ-&L6Vn$Sp5{UApgEjO;$b!*HIenO6I0kQrT}u( z*?l5DM>f0S&5<-sJkqj!UIlum!hS-b|3FI^Xh6r=fA%&jnd_riJ-o7v@Cj1t5tS6R@_5+eQ?&5i$wLiv6XPW=XNH zFfP-#>{-W(WXi)nYOaSgy@YB)&v7j2?Y-geh7(1yutaWR;t#uIoxEsCncv>XY`xjn za)~;QnhAUG^w#9e{G?x2CHKWk>|47_SBKk$y{Tf4`5r+kx_HES^m*$pU zxpFU%!Cp;7U;%nOw$Ycc&s6R_NWbl`3{cFEo**rLD1mc<)FI=3{q!d7GWP2u=a)_V zVL4{fA+BxT{_Hn0JIL3`8Zw8RLME(T@oJm*6ED#LFLk_B+bqrXyozT3dZd_BsS7>g zxgY)Od74b{?mTu9JUSG~#MB3zRO=dOhQEK@_Czz1 z>skp%NCYFkQ=%QlM^W>Q)o302zss*9eNQHNjSgwtvV(IRAv3_~6v^AGF_2SZ!^?X;{dHZ>?#80VqTF!ByM^eNBM8f?m`Wj9#tOV>riB%F z5u-|kXP#9Ez%wrZsTY9;TM_Njsf;JcOIY~=d^V~y1Dg#PmJ_oYEdVwfq+7baPNsJ3v=BF#)Zy;n2*RPk#Ia1?SPv%UbAN!s*ps%37^Lok!|VIIPF-Z z6JI`W>s_ z=xeELHZ-Z$RBx%ODE<2+8dz%QJEN{w*ShKn5_2{=@ec-a_+lz;0VB5BfHGpSHPn-j zcA(rhLl~izhEL1Wr8-(R21T>4yjksx*cxvmRy@(hyzr(SQ*CP-pnRUX2S|R`Zu?yP z4FoM5vCQR%h)=q-8;i*Mmw~0-m^FEKX+ND~lExa@8X`l;Mb7N;o=R6G+98Djs79X{H z&>F&BsrNLD_TEVV?RCAr=7qmmT1Emra5vQ(?``wJ_nJC}x z7fjyt=eyk7MhQG5l1%Li%7%KM+kfc$aEh^c7fTq zWF#kOCu$37)i>#vCw=OHN|BBKjo*UE=m8uZDSV}rN7I{ltt(E4C$Hi)KD=UffRQ>a z{baT-T0~8b_bsNGG*W{vO%@OP>A< zWEydWpQ`kRH)9<43OYxn35vH|m8A*Jhwk=woaY6F9YTW|P)UEmndDDjCR-nMjCNcZ{b`YRNUwjN`y`3VbJoczN`W=p8}a z_w>tOcwX)1+ALcTebVEgXk|bN`mi_PQ~)jQB%)8Yng~x%->{HPyKTEMv)5cw*t&v= zr=I4=@8k9I&avVPAvZZ+Z<`>qK9$pAq2vooDZ{jW{B2>+RW#?MZ=Q1fsIwbDwNwD_U+B6FQt_*xB2FC1&?e#Y3IGm&61uE$8yU$ z8IK;nwMWO`d6Jb_K)bAc7u2;?i~D$>baqNFKC}%`e*0eY)Ws89+S_&;FM!-qbE^Kj z?k}+@Xvb11(Z1-U`!RQ`?ui;!9bFx-HmEUKsf{{i!4;gIhk^&|YW11z>=H@0c zibhVVLHA&)f%d9aj@!V{jc?{n^P6ZiklHX#R|$0k-AJTJrv~($d7uGJ@{BnepbwRu z@bjKDM9WE4l>TEfC>YG8$n~8bFkLiMGlXKixy~zLQt3o7rCne`b)|Dnm{2SNN>S`- zdtIAn7?p}-&R3<$(oUchm{1@~6%BgLiW2uKOeqdxLLoBSfl|DTMWlX1zD(M=1PH}z zNaK3PsMHTE*L2;x6c7r;*g`;5kb$hwmmw+R7B05em>G3vfL$I4v_iY4ITA<(JYDz` zv7f|VNb)|9X~o4%AQi}fKQ0HP;%`$7bZ6jY-}wE(X)z~T z%r4iuX^~yj9x!i|G!zUMwy;tTEqxz-=9C_&zMjbajPP&_-HW)GShNwH_j$=ARf}mq z&}14J;!}Jf{etFOYE<;9*N_ig=1Gsq^7vIEiHb2%CXgaZGFxLhnqti2^H!U#S)6ezbgV^P~#EdOYR(x0+j1v5%sPB3wP2_y#A=Zv~x=@Ej`6MW-2`x zKW+MyDUrfb-ajzyu&h%C0_`9-q+!}23IAk-c~yfT!(e9x3$h?V{BwdhmVShvH~lBK z&3=j`M}zwnBu6HmJhNrJ&hsR%xA)P1JbIG1l{+?sexCnc6&^8{IoJC*Kw-uN_3~=c8pVy`Uyk2b<3@X}IefTV*mEGl%OT|ZKydv8 zUIMT4-hX!gO$-#qI3FlXhr4o0e&qa7oK|uR$%dP?rDj)SjoS=4!e4bRFchYGHPky5 zZUwn(u)fW>gEqvb?rYb@Y3-4nNZDnm~7TK!V9ta)R?Q;n1^@nAG%%f$+cmtCx{_^NC0vOI%>|y&&Vw3JJ9kYP$k=i`s)Xe#nz0Jtd$bP zO2p4`|6K2`d$NznsE~K$hWdsgCslew3{=Tq+%^kq(zu{X3-_Ym0M!gaj5_T@1nM^6 z-!m#u6=vdrhaa%Sk-t!dY}6|OMBGC6;3!-WHkA#T>I)*}qzB5-co15UlV%-Ce~XG| zw71IRHqgG|CaE#*^^3`0Q9S0?!g*t`;6lZo*h_Vs<$_rNjByBa{n!|{!ixMWfO;qp z-^MCzDv^gk0YIC~`GrlKjA@cBVl`GE+nm7w>{(5iCSg(Lo#}r8nuJNxF-(#;`Xz2a zm9Xi}DZcy~IlTBnVDY78#9nX(;ZyXD;!6kLou=DmyTw?1k>da!wkD(3t>TLvrB7qU z7o&f*Hg8aTIiI?MbD;ofu=tWkF9+#`rAa{1Sen$v=&u->gj^qZEA0iM1T+b41e!Ep zew&DiQg|p!laTAvY(`zWizXFgqBKa8v`d-K1R!w?j}~FFgsBpTB}1&260a4oXk~ZkG=UF=AICHvI^V1o(=(e)zC(HVI;Yh~|QeNa6&I)P?PnDbYg}d5Us)m^l=}@&-74=Wf6h-11MHs zTu1#XJe!uE7**941-xdEZUEO}tq8H=tSh>t_e_i+p6CjOZ)kUwGn_;8Y#+ zVPXMDJKxX3y0E3DQb+WD|8{?WL0`1gfkx{dGtKt*Ph5ncH58iog<&)C-3MB#uHrz^J|6f2|Rhm3+Rv zWHEBZ0nCDzjT#AA$$G+i4TAk`;WkS5AKrO*TlOpcsghZ7*aj%z=exsx|l_kTe<{?Z#B{I>}-cjc+vFhy04i%yP=)k~hBGg&=bQV_{zXkMW|MjzLa_ ze+F_g`~wo zH66&})O8bt%K3>dj(9;x68rw~0KxV%%Q%VAdn15Qw*aLcho;2PqQg(xQhkrpHup{7 zxiHgBB^+V5O0jv}bd`Xfd4^Me8=&s^@gKWGdZ97^-=Pni@PZMOxw= zP;OSBkrf`uL(#;yTfxc8?1dGGgpjd>xjWsJWI(wQMceACOdu`gfHADnEC2@|eJ4glIs26lTD;)q||#}4q1^y1}-pFHj&@@u-Z9n z1*hpg>}2!H+oC9r*4VU?!-hngNX1)?i93n5a0N=0WY}2^*Sb9Ia?t(NGoniG6dboFCp zZ*kCQPKEz$>RN53`n zf9*{BmnMS_rmVT{KW*xEcOyByDA5ySG!W4cHnL&{k^c}$2edHanF%xsm>ZBuNK45U zpmiXieF3)r18&iO$;smiXa6vf>?^7+?hm_Mv`wIM|4sP|zay!W97p~gdAWs;a+ILW zL7ijlXfoMz%5%QwsTz)?e=>?Vao*J9t}urEWJJnRr20E}P&My?Wnp>E)pth1o(}E5NuoXYaIz7Nm;Wt9L)lIe4O}+nNH$v28 zUXwA;Q&{0Cq!yTbN*MtJv3QDAmhod&yMv=d6D4L5)fz#()n2LRX!Q!>{vjF{_li>Y z2kp&RH4jc>W=1vN&uUzVh7Y!`6%l|o^QK_l7CAL8@(_9SI=AL9axsV;r}P}4qHnLZ z5^K`e3cxK_yBe#hzN$VZq&aI+^WB;Sycd44jegMI{J4MD)^+|9-B$W%0kzbVG)=iV z&846q14r<9Z34z-2+$dW&04!AQDVV|TFTZz&$G{-)sGI)-Dzw~rzRjel4ooIN zV06*4me%wTD{<^&*1~EyS6tspKze;avb7~k?5lo_i)-8P&h%rW z+WkjUUFeGKX~1~K?P;=T+1tB2j)}4-MUZ`Cibd%n`7Y(prZEc1`ndD{#lla=amQai zP(lbxQD2hU=+PVIm35WpzPZcpW|(W->2bmEwFh!VBi!_`s-5>-^gaP#x$rZ;v?jiN zzmgkkOYIc)rgF=dt0MVlM(I-xeo>_)Y2}&I+b=8~Vk!yWHAL3XvZfL{XyaY+0sZEh zwa-;+u@;PV@@w_q=x+~syNjotWBd*R6Mrjw%jz8-4dTa63WSfT^84%7@r_GLEZRlN zUk=S^;zqaL`;+J2y~@%{P^pcRPF9rD+H7k{>H)xd^~U>(X?i1-s5+=H^XSd~qsvlh zE&C#vZx$Wg>67LbZz9HeLioPV%DTvevF3V9f|*_@>r2i<*Og!3P6(;bMgG9)6Jm{NotKlL~M?ceAb)de;pTT{r z#$L7=-00p@lrkV;hK9T#NUa@TAVjXu=4y3}og!T`fCF12&TWraB$WG0TLL9U{{wPI z3$rEj9>Kf#ar61 zbcg)SQ_K}#K4<-&zI=|R&wqS+f8RfUAX+b<+p(sf&^`@kXbbUM<>hm^eI-E_>f*RY zqL#RP`CKiv=`37v`5b!x^0~%-N;>B9xpVt2pL@yo^0^EL=c9GuxshLflsdY*)^S$$ z8z=prYVNutHjI%OrW|49h*cQ`XD;9s>}-XY7n^BGsF|~oKZ74f%>Yy*%ufirG=W)0Uj-6%)UJ&rAO~g?T*n7$N70Ik31vwo& zZbUyT^Esmtu&y?&)Cc?{90RM9#XkaIxgLCx27UgeN+n7G8bK3hc_Aj78-s&JKamhK zhDPIM0p1-pc%5X_ytC< zY23ChtpMRB4~!+5`fvZX&F|=%Yh}fG@%`hba@-YbG1EDjLMNKWT_oA^X59U zme)>D#nsxSj0e*-P|r8|Rr|FCck$ZhE;qHUzfe~#+CiGuHOZt)qsJ|f_r>XgyU?X5 z@R%#7`_|W!L8%H*Xw}mPy#&wSLkm=%rr9Nd4;+ICx zk&#EyG_MyuMCVaKg8-N`@=?Q99FEVQ$}4nK$27T6dgR;5X6YwTOGWrYptMtv8xhb&E` z5vwJvll5aKht{P>PNkhqJL?FVo_01*Q8L=-wZ77{v&c8?>=?x)j?rJd*Gv7Tr7#b3U;H@I7SXb=~>c;W*b83J6) zST&K^>EwduJDpq*!vzE0L-^GWE3jRlDUlDjrh{;(l=LyknzNEPK=5>ED}#4NZ&x%? z;O2?n`S8vSCknx&sYbQd0#sWGXbVh?JPG2(nn3lepDV6gv!W@ciNIC2)H&2BR|DzKgxj8}|V!+uiVZyM5HjuGqst+JG+aRJseb``pYvN#^Ip(Y@gby*KHp}Zs+bcw-$x?%kstbQeCm`a zY2nKEsS80(z%>afD``8pcA8838^FhV=Mw)7bn>3X#Pn3B^Y&7BLHbecV;sU*s^LWK z)5WTdPqq0ejv?hSbVBvK#FP3E9-dZW3-Mmw=vuM)fL}#9=AQn=uus~oyaa0-H8K!m zFZsPJ_DTlq6^6oyU;_PTySov?zO36RYE#yNB3XlP3B%pJ^QuVa7JC=o4l-Yjl~0Hz&UwEcz;95kfyUXJq! z+(UN5d3bXjkAg%b0M64gne5##NoPJjhc}$Zrf&TGy?pkZ>$=;OWNT+@#bprcWp{t> z_qXGCv~hI=0ig?+)FS5|rs~-Pw~Ju_?77xluaS6&L|>#+5Wt{bz61!RT`5mi%Ht4C z3B-EjM}`oi<#Kf*1R_}K3PjM&1R{9Y8Hk`vf7?I=&$|K<2p|xFUkHRDr~!8qCJaFZ zZvi>_;dC5_pvt}C0V;!|{KNYv0yqfuLoxhyh%>l2?D3s{4Es1Zhc`SLi_S#BTss^Q zkX{RL6w>UX#HAsFxoU7>;G8?(Ag~p}jd20^0Ju)P-8lYuE`E1oo1bcMRe%e-I>&al z*LfT`&;;AipZzUB;35xy^+@r%J-gjWF+5!m{Rz32+3m^=&7Thkz0Ro_Y+pUJ$Q`Gl z{ToK&PA*(Br2S$v1EnJ!Dn{^51j<2^kOApY;hj{&lnMG1?U%!PjD}F1cq;=>qB=JD zr+x*0qWy=UrOg!E+@D=H4u=dX_z(Wa)-qV;|1JK905<;< z@&ETCJQe@J|2HhvCRmay0Ga_-0;~d94X_3PlgV`e4+3DWYCY^X0Bi)<1keJo8Q@`n zEdW~qwgEf>@F>7z0FMJa0q`UM4ypSz0IsVQ_6Gpk0d@fF1lR?z8{ip$Jpj)FJO{8B z;CX--0QLdA2(TXj*K-i|F993^I1F$E;3&Y$0Dl2^1>mm$uL9umuRHf0u(tzr0(1f3 zbKS6i6W}f9@jI}87vMO+djRhPd;o9);3Pl~z$t*!03QOJ0XPeQ>%#CiNPi6QUjTmx z_y@p00r0tA*!KaPcOGAa{Uv};0X_rx9N-IpF9E&+_!{6FfNuf51Hg6kJNJ!0ON6nvK? zWJbC!w@z!B2flz@(A5MYi|mW7^Rz4yc3_O4h+ zmTDy%qUgt;jYx=GQG=9YJ~ASAs&H0>~K})*6wB&0qq_J$Q8Rcoyj2-qIP7Kg9-?bH$Z&hL!u^LtK|jj|OVA zQBW3~@0g%JV-2`j#tjk9M5Y-LK~)&NjEGB>)kDq)myC#_Dj*!(cMFWjmvY^uGvXNz zc%~`ErLmvEqAMLnZKPj9-!*+7v>PbtY9v|7HZS5xg3*VO6Z5hn`c);M`zQRWuxO5kw!WG{0E`9Y^I= z%mEXH%o&8tQUwEp(!rAeM;rq!>aTG7LNukqTF-R-Y97-OtTGPTfRl{R@ukVoeF{tN z&-^wW!p2i6xXmz>2o_?J8b3fYATeyI{lWi z$!ytKi}1X%Wv4ENqF+SZQZ$7vT5$lc7H75j83k>R-cnMM!cFCIizlES7Cy! zw!aCh6yZ1Fu|4OR0(?{eLkZEZ>Oa31PZ}Jt@vnaChFfKdvd7nz_=a#OthZosauE1A zPF{{zBFvoREUYKW=?=NM53lqGAo~!Ej(}nv=Bv!>U~Yw!Gl)!WK2 zqh`MELYz~-cv>-jtk~Cg_d_oTYMu!mBp${3z~2K;8bMj-L6(rM9Q(o;J@CR}+yKUY ziIWiCrn2l;6}}19nhS*#$LsJZ2#{hmYecx3`6W;dA34oxKiY>a`%%wWREX?WfMpRhLWch8U0Y-Zn4Hw6k{u1tatzN0ib(<( z6fg2luL*@VK!r+T)ry4V!0%|1g5M~T3%}7&k00y@w*<)dLsv*13PnGVeE4$ZPox08 zJ(&dUjzB3;PcRw>^@N~QsArV(+8{*3T@VcW4~hTZw+PS=K|CVpw1Lsu)I&-S%m7%l zK!bysg29b|Dm!i@QYVdNyWE z1_%9*Qvzt22M-ekOO*r+0Skvwg|Z!De=X(p5YrXj<};TSvFQR!Wtw@ZQ(>Y{GQzt#8qNL8WzHTwZU?l<&-$p_NDeNO+ov;##37~XvqkC+1 zs0vw;$_AVlBA>}nYm^3?K@n$wP`89!po>dJRGeIyh~&w7b%s1WU8MFZuyPABrz+*a zQ>5vmXnXPdQ3+_=b$F@Xj>ypFdD*o(Dyz0lE?*WQPp^%zyYIB2?HW0H-X`2&M}#g= zqfY`q$qb}{=($Q|oEphh8F4zf4onJ~#B@zYih)klXmpyjiHwh+wW!)s0(@L$MR|RZ zt_Ia$4}zj87VP&^#3-eU42yuMCC9Ip+seq4c=MvNwPwEm1bc)HosTzoYy$ULuT}A+ zaed%ax5LDTdUd|JJl9ZGQO}u|Z-1=Z4;k!lRA}ugw6xhK?w+hvYZOUj)iTPSmdcJqd*TJ}&Lk7c zdm&MdTC{<6-GRwSqf;j*rK{tpOto>OIynVm3hR`aiE+wg4TSzmQ7h#s>OkGHh_?cp zAuD-hN}{)NM!KPBmo%qDv0;Qwtc4Y7iUXnBevHT@`jF>}$JYvx?*-75k0e`c402L| z)7IVs+eWiZQQu|`dX}?S`64Ief+%YTQjkyGdkyUgl@Lv2Y>E5D!YvXB6|)14+#x7L zE*4P>5eO%O?!t%G zbV?PSLVNAuRM9V_Acu!Z{{BxM%5Od9DZj)!rNg5n{_DLbehg0h)+6yt5BPm1(cy8y zN`)25(t-cA>`6U=Z5A#PeUg4y~tY`OE6_;&a4xp2ER9SEN_J-$-^?4iESQ#*JLUO&(8d(qE4FE9Mu-{nThP?o!w`zW}K(qaUSP%N%u8R$f2 zgMK0pAFvxI|DxOGO((pcz6dIj$$!ZsR)Y?PXekEy=e-l}gXX{+$_Y5|vzeHRkPLka z{ShJr0un+QOdTT!c}{p#1BK{)(-DMG0|m%J2v6&?9DF^y5r92NL=$6B5ds;e>=zJ?roeA zaD6;8Qt~?*t>MNb2gatH>A4y19@8re+(8joJO=X>U{NiCnY{|QIGc#KFN|174jB-#3ng_Y1%uGyy7E7QtJR6H|7^m0JaH~oMb^Py)lalF01k~bM zRUmT19F@V{E@V~`NZzoA*zK^IRImbzm?L~1uQhyqJ)}zDdJxFr{_(6gKptLygL6Lg zR%8P+u7tIe2^MV-%3*!$;Z8KLjxwQ!IG8~>Ksuz-;k*IPu=lBhv-o*Y!ylWkghxMu z=}9u|2k+$n*7K1AJUhrC6)+W^pd1(p*OM{a>?+@c042V@lvrQ$lOFgq|5QIgDsJq+FwhM{ID^Zk~VZE%ToVs~h9A z-@jiL2Vky-hSGPl)(JF-6Ex80B<5a{V07^sP&2Dg$)x0v&VUqN5g73LNrZdTKyC_* zN+P5*a7J^Rdxf{RVGTpXWmwhKuwo&&5gcQDh4Eq$T#4~l2D6S$a6ARdU`$pCX$bWU zE4&6$gU@v`bDu>pKA5Y+I1t}|Jd|7nPt@>OVX)lYjuYmV8OF-RR{>jv(6u4!1V1NA zX00e-6#sYd1jeVB`V6j<-+Q|LX#M{_K7}9@FnR_U_iPyD!BuuQ(!`~KQNYiE4#prE zMgXt+IH+3<&j}t6oSVYn9Ua_VCajk@*yAg(O*;k7<8_YrI%WmkItoKq5WWuAhiSr{ ztsG2g4N#iBGnbS!xL)q&j{m#JPnZ%cIwM5x4A;SWQm8-}mIF_d2!C>TQt+=5o*FDV z-&oG!xVXhhOYri)1`L?P5eUm_^OmlRoF4><{pl_p(-U*_4Ns+Qz&cr zsuG#1F#fx_s?-~*N`$JuuVbq+4p!xZTua%7kQ7XXxVoDwOdy9V?QrZ1Wvg9;tHqMT zjpL?aDoh%t!YeoQPy^RRZfC1%8SLTEDPa4SJWN$T+)$MQs={7OczbsEs?@?QA6LHS^6EsoSv76b`+xbe?%1+LuKe+nzS_NR6*>8@KaD&wqVn>0 zuKef`TNhsG`6;9MqHma z(|f{!4W^XC1%-Gy)-A2329(9BuRuX8WKI*P*Z{ig2GCIlete5%g8i<^{7aose89}5 zi2evGqYG|DljyECKSY3cExY;L?n*<#fmd=rCg?5ferU1sp$C5=O)=iRt{$-3(m$#O zBjYNVX1rP0-Jkx&?PIlzF97bvomA8Yh2C+tPXK3zWy>0;W%^XBENH#E+vxPx~6nCtMppq780etMyBD2f+V$>>|lo`(F@64!VHqHqG) zAPdjI3wU`gx(A`-tf~qa82yLpkuCa8-AWcpuE-wH8S%|02Xy!qrjQBZHH!b zn!(^%hSyfpIy~wt7fe}uwZH&#wFfHt<7;`$wfM>d=I!@<`_QKapuR*o_(q}K;pf@a z?%=iG<)oPLwRnB~{&h@^kfE|k>*P&b!{)mEN#Yk7E{Kx9Q=?z*Wz%Alrt146ZY zI60*M_)reOyScmy#vm7*6>)_yHb24rLK0ruLV#pg1w9}6qba5mb0zczFGRNNXl87n zoDCxfJdOgefV%Aac&zOV)6JHH`?I-08QcdUlw<74P~X2t+*ltjhaVh#Zz3qin4qED zY;RY&!9IdjgXtq4XE#?Lm5UU(k2l{xMxMBw`_1>CSb)M4Ty+o5x2Lnb$Ia!FV&|Ms zag`rjOBli8F%S<~ORD;M%lt4`*}=LoAiQ-rQ>L=Q zTwR}Ku9!2o9v6Zb9*lh?lcB!wA=BIT^L8hI|F}WqxLvuS`ES5Mq;ooMeCuK%a6)&t z`2qifmjcF_!_DDvwH<>@?30VP8{22|?&jAE+Q(=Op4dBX|7|Gy5XPOb-PnF5D0%K~ zgZsbh@&5>#NOU$s(+Wj$qJ~{T%<7n8hQ-cocm=74o+`A|uxDW5(6mYgD;DTfdARd#37k@$XHj$ zA(?>n*i1|#U6*4T!8-R0$;2ELlc^Yz2}qpHR1e9-DDzIY?2J^&k_>}Eqg3b&aY^80 z0ACn3WX7ea6O-Z+Gt$y8>h$m0yjNl8u=l$m%F3Ic=$j$8Ullhx{aySGX)q#4$S;D!bUy1<-E{GD?t zzjIFcJLfdNb58L)=hQcx!!B&8l0ktTMlZ`;S%aN2!2Ju4x*W1#wOV0O1MgD_A$X$~rYCEAXVti%g|8uAG_Z(ck+DZSx zl^J9=?AyWm2xNohvK)GVZH>d*+XtFv5;AA|L2z`Z?SBGgFFC8>f`o;wptuiaXuJL{ z`;+`9=7kFYn0Ocfi=p^@ z769fwK~iP%ieQgLt{MO=R;~rWV&hf-EEcu_U_Ipv02u2$3u`bG_PCC+#S57WksYD`Ahv0t;vOK9&OD zF<1$J<%abDcx><(;d}oQVCdN3yi#~2BCeqtzmx;23%q$Tb>bAR8*ex7L!mLOUI5V@ zy?o)=XG{lAbRRkL-jQQhnFCk!Q0Cz9zq`Kf-r4g3bIrkT-@AJHI&*2g$vU4&R8(8* zkvmk1JBKF)SN_Vbb5{?3%k&8!UV?FOtwwzRc#R~(557bTd)#+CUU z(phM+R9Xw*Ri^5k>QXb)e>}&N3v$5RQr1vfpWaYWSq97+b4$2Wt{0dlHdK@i%r_nn z7>T1<2Tti+&jrqLJp=Ph)n+YT4DqG#X%aRckJWpZU;X>br`hp@!@dudHMd-k$4)8N zDB&%wctyNCJ`wmC$YSc2vF8*@b-6MQgfU>@OO+*YDW&QXaOYL46s4t!WhLb$xctrA zQ2hlhz_SD@CgvAqVoP!0O%E;&jH!xtE*w1Z=@sSW$&4DEd9c~QQt`>?F7+5}lmGes I?=}Me3skl^f&c&j diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java index 94fe4286..5d936a40 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java @@ -401,11 +401,11 @@ public class HailiangEngravingCacheDeviceDriver extends AbstractOpcDeviceDriver dto.setNext_point_code(next_device_codecode); dto.setUpdate_time(now); dto.setCreate_time(now); - - WQLObject wo = WQLObject.getWQLObject("acs_task"); - JSONObject json = (JSONObject) JSONObject.toJSON(dto); - - wo.insert(json); + try { + taskserver.create(dto); + }catch (Exception e){ + return false; + } requireSucess = false; return true; } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/HailiangSmartplcTestDefination.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/HailiangSmartplcTestDefination.java deleted file mode 100644 index 73e03b4c..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/HailiangSmartplcTestDefination.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_smart_plc_test; - -import org.nl.acs.device.device_driver.standard_inspect.ItemDto; -import org.nl.acs.device_driver.DeviceDriver; -import org.nl.acs.device_driver.defination.OpcDeviceDriverDefination; -import org.nl.acs.opc.Device; -import org.nl.acs.opc.DeviceType; -import org.springframework.stereotype.Service; - -import java.util.LinkedList; -import java.util.List; - -/** - * 海亮迅捷plc测试 - */ -@Service -public class HailiangSmartplcTestDefination implements OpcDeviceDriverDefination { - @Override - public String getDriverCode() { - return "hailiang_smart_plc_test"; - } - - @Override - public String getDriverName() { - return "海亮-西门子plc测试"; - } - - @Override - public String getDriverDescription() { - return "海亮-西门子plc测试"; - } - - @Override - public DeviceDriver getDriverInstance(Device device) { - return (new HailiangSmartplcTestDeviceDriver()).setDevice(device).setDriverDefination(this); - - } - - @Override - public Class getDeviceDriverType() { - return HailiangSmartplcTestDeviceDriver.class; - } - - @Override - public List getFitDeviceTypes() { - List types = new LinkedList(); - types.add(DeviceType.conveyor); - return types; - } - - @Override - public List getReadableItemDtos() { - return ItemProtocol.getReadableItemDtos(); - } - - @Override - public List getWriteableItemDtos() { - return ItemProtocol.getWriteableItemDtos(); - } - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java deleted file mode 100644 index 2c79764a..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java +++ /dev/null @@ -1,302 +0,0 @@ -package org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_smart_plc_test; - -import lombok.Data; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.agv.server.AgvService; -import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; -import org.nl.acs.device.service.DeviceService; -import org.nl.acs.device_driver.DeviceDriver; -import org.nl.acs.device_driver.RouteableDeviceDriver; -import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; -import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; -import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; -import org.nl.acs.instruction.service.InstructionService; -import org.nl.acs.instruction.service.dto.Instruction; -import org.nl.acs.log.service.DeviceExecuteLogService; -import org.nl.acs.opc.Device; -import org.nl.acs.opc.DeviceAppService; -import org.nl.acs.order.service.ProduceshiftorderService; -import org.nl.acs.order.service.dto.ProduceshiftorderDto; -import org.nl.acs.route.service.RouteLineService; -import org.nl.acs.task.service.TaskService; -import org.nl.modules.system.service.ParamService; -import org.nl.modules.system.service.impl.ParamServiceImpl; -import org.nl.modules.wql.util.SpringContextHolder; -import org.openscada.opc.lib.da.Server; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * 海亮清洗机储料仓 - */ -@Slf4j -@Data -@RequiredArgsConstructor -public class HailiangSmartplcTestDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver { - protected ItemProtocol itemProtocol = new ItemProtocol(this); - @Autowired - DeviceAppService deviceAppservice = SpringContextHolder.getBean(DeviceAppService.class); - @Autowired - InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); - @Autowired - DeviceService deviceservice = SpringContextHolder.getBean(DeviceService.class); - @Autowired - TaskService taskserver = SpringContextHolder.getBean(TaskService.class); - @Autowired - RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class); - @Autowired - AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); - @Autowired - ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); - @Autowired - DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); - @Autowired - ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); - @Autowired - AgvService agvService = SpringContextHolder.getBean(AgvService.class); - - String container; - String container_type_desc; - String last_container_type_desc; - String last_container; - //放货准备锁 - String putReadyLock = null; - //有货标记 - protected boolean has_goods_tag = false; - - int heartbeat = 0; - int mode =0; - int error =0; - int error_num =0; - int open_time =0; - int close_time =0; - int ready_time =0; - int running_time =0; - int error_time =0; - int voltage =0; - int temperature =0; - int current =0; - int material =0; - int lack_material =0; - int full_material =0; - int storage_qty =0; - int feeding_qty =0; - int blanking_qty =0; - int qualified_qty =0; - int unqualified_qty =0; - int finish =0; - int task =0; - int noload_electricity_consumption =0; - int prod_electricity_consumption =0; - int gas_consumption =0; - int water_consumption =0; - int oil_level =0; - int monthly_electricity_consumption =0; - int pause =0; - - - int last_mode =0; - int last_error =0; - int last_error_num =0; - int last_open_time =0; - int last_close_time =0; - int last_ready_time =0; - int last_running_time =0; - int last_error_time =0; - int last_voltage =0; - int last_temperature =0; - int last_current =0; - int last_material =0; - int last_lack_material =0; - int last_full_material =0; - int last_storage_qty =0; - int last_feeding_qty =0; - int last_blanking_qty =0; - int last_qualified_qty =0; - int last_unqualified_qty =0; - int last_finish =0; - int last_task =0; - int last_noload_electricity_consumption =0; - int last_prod_electricity_consumption =0; - int last_gas_consumption =0; - int last_water_consumption =0; - int last_oil_level =0; - int last_monthly_electricity_consumption =0; - int last_pause =0; - - - Boolean isonline = true; - int hasGoods = 0; - String message = null; - Boolean iserror = false; - - - boolean hasVehicle = false; - boolean isReady = false; - protected int instruction_num = 0; - protected int instruction_num_truth = 0; - boolean isFold = false; - private String assemble_check_tag; - - private Date instruction_require_time = new Date(); - private Date instruction_finished_time = new Date(); - private Date instruction_apply_time = new Date(); - private int instruction_require_time_out = 3000; - //请求成功标记 - Boolean requireSucess = false; - //申请指令成功标记 - Boolean applySucess = false; - String inst_message; - - private int instruction_finished_time_out; - - int branchProtocol = 0; - //备注 - String remark; - //数量 - String qty; - - //当前指令 - Instruction inst = null; - //上次指令 - Instruction last_inst = null; - - - //暂定 0就绪 1请求取货 2取货完成 3请求放货 4放货完成 5取货完成离开 6放货完成离开 7请求进入区域 8请求离开区域 - int flag = 0; - - - int agvphase=0; - int index =0; - - String device_code; - - @Override - public Device getDevice() { - return this.device; - } - - - @Override - public void execute(){ - device_code = this.getDeviceCode(); - heartbeat = this.itemProtocol.getItem_heartbeat(); - mode = this.itemProtocol.getItem_mode(); - error = this.itemProtocol.getItem_error(); - error_num = this.itemProtocol.getItem_error_num(); - open_time = this.itemProtocol.getItem_open_time(); - close_time = this.itemProtocol.getItem_close_time(); - ready_time = this.itemProtocol.getItem_ready_time(); - running_time = this.itemProtocol.getItem_running_time(); - error_time = this.itemProtocol.getItem_error_time(); - voltage = this.itemProtocol.getItem_voltage(); - temperature = this.itemProtocol.getItem_temperature(); - current = this.itemProtocol.getItem_current(); - material = this.itemProtocol.getItem_material(); - lack_material = this.itemProtocol.getItem_lack_material(); - full_material = this.itemProtocol.getItem_full_material(); - storage_qty = this.itemProtocol.getItem_storage_qty(); - feeding_qty = this.itemProtocol.getItem_feeding_qty(); - blanking_qty = this.itemProtocol.getItem_blanking_qty(); - qualified_qty = this.itemProtocol.getItem_qualified_qty(); - unqualified_qty = this.itemProtocol.getItem_unqualified_qty(); - finish = this.itemProtocol.getItem_finish(); - task = this.itemProtocol.getItem_task(); - noload_electricity_consumption = this.itemProtocol.getItem_noload_electricity_consumption(); - prod_electricity_consumption = this.itemProtocol.getItem_prod_electricity_consumption(); - gas_consumption = this.itemProtocol.getItem_gas_consumption(); - water_consumption = this.itemProtocol.getItem_water_consumption(); - oil_level = this.itemProtocol.getItem_oil_level(); - monthly_electricity_consumption = this.itemProtocol.getItem_monthly_electricity_consumption(); - pause = this.itemProtocol.getItem_pause(); - - if (mode != last_mode) { - this.setRequireSucess(false); - logServer.deviceItemValue(this.device_code,"mode" ,String.valueOf(mode)); - logServer.deviceExecuteLog(this.device_code,"","","信号mode:" + last_mode + "->" + mode); - - } - if (error != last_error) { - logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); - logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); - } - - if (finish != last_finish) { - logServer.deviceItemValue(this.device_code,"finish" ,String.valueOf(finish)); - logServer.deviceExecuteLog(this.device_code,"","","信号finish:" + last_finish + "->" + finish); - if(finish == 1){ - ProduceshiftorderDto deviceInfo = produceshiftorderService.findOrderByDeviceCode(this.device_code); - deviceInfo.setOrder_status("2"); - produceshiftorderService.updateByOrderCode(deviceInfo); - } - } - last_finish = finish; - } - - public boolean exe_error() { - if (this.error == 0) { - return true; - } else { - log.debug("设备报警"); - return false; - } - } - - protected void thingToNothing() { - log.debug("从有货到无货 清理数据"); - logServer.deviceExecuteLog(this.device_code,"","","光电信号切换,刷新请求标记:"+this.requireSucess); - - this.setRequireSucess(false); - this.setApplySucess(false); - this.set_last_container(container, container_type_desc); - } - - public void set_last_container(String barcode, String type_desc) { - this.setInst_message(null); - this.setContainer(null); - this.set_last_container(barcode); - this.set_last_container_type_desc(type_desc); - } - - public void set_last_container(String barcode) { - } - - public void set_last_container_type_desc(String type) { - } - - - public boolean exe_business() { - return true; - } - - protected void executing(Instruction instruction) { - this.executing(1, instruction, ""); - } - - public void executing(int command, Instruction instruction, String appendMessage) { - - } - - public void executing(Server server, Map itemMap) { - ReadUtil.write(itemMap, server); - } - - public void writing(int command) { - - } - - public void writing(String key, String value) { - String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() - + "." + key; - String opcservcerid = this.getDevice().getOpc_server_id(); - Server server = ReadUtil.getServer(opcservcerid); - Map itemMap = new HashMap(); - itemMap.put(to_command, value); - ReadUtil.write(itemMap, server); - } -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/ItemProtocol.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/ItemProtocol.java deleted file mode 100644 index ecc8e3d3..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_smart_plc_test/ItemProtocol.java +++ /dev/null @@ -1,248 +0,0 @@ -package org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_smart_plc_test; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.device.device_driver.standard_inspect.ItemDto; - -import java.util.ArrayList; -import java.util.List; - -@Slf4j -@Data -public class ItemProtocol { - - public static String item_heartbeat = "heartbeat"; - public static String item_mode = "mode"; - public static String item_error = "error"; - public static String item_error_num = "error_num"; - public static String item_open_time = "open_time"; - public static String item_close_time = "close_time"; // - public static String item_ready_time = "ready_time"; // - public static String item_running_time = "running_time"; - public static String item_error_time = "error_time"; - public static String item_voltage = "voltage"; - public static String item_temperature = "temperature"; - public static String item_current = "current"; - public static String item_material = "material"; - public static String item_lack_material = "lack_material"; - public static String item_full_material = "full_material"; - public static String item_storage_qty = "storage_qty"; - public static String item_feeding_qty = "feeding_qty"; - public static String item_blanking_qty = "blanking_qty"; - public static String item_qualified_qty = "qualified_qty"; - public static String item_unqualified_qty = "unqualified_qty"; - public static String item_finish = "finish"; - public static String item_task = "task"; - public static String item_noload_electricity_consumption = "noload_electricity_consumption"; - public static String item_prod_electricity_consumption = "prod_electricity_consumption"; - public static String item_gas_consumption = "gas_consumption"; - public static String item_water_consumption = "water_consumption"; - public static String item_oil_level = "oil_level"; - public static String item_monthly_electricity_consumption = "monthly_electricity_consumption"; - public static String item_pause = "pause"; - - - - public static String item_to_heartbeat = "to_heartbeat";// - public static String item_to_command = "to_command";// - public static String item_to_feeding = "to_feeding";// - public static String item_to_task = "to_task";// - public static String item_to_pause= "to_pause";// - public static String item_to_clear = "to_clear";// - public static String item_to_finish = "to_finish";// - public static String item_to_open = "to_open";// - public static String item_to_close = "to_close";// - public static String item_to_material = "to_material";// - public static String item_to_qty = "to_qty";// - - - private HailiangSmartplcTestDeviceDriver driver; - - public ItemProtocol(HailiangSmartplcTestDeviceDriver driver) { - this.driver = driver; - } - - public int getItem_heartbeat() { - return this.getOpcIntegerValue(item_heartbeat); - } - - public int getItem_mode() { - return this.getOpcIntegerValue(item_mode); - } - - public int getItem_error() { - return this.getOpcIntegerValue(item_error); - } - - public int getItem_error_num() { - return this.getOpcIntegerValue(item_error_num); - } - - public int getItem_open_time() { - return this.getOpcIntegerValue(item_open_time); - } - - public int getItem_close_time() { - return this.getOpcIntegerValue(item_close_time); - } - - public int getItem_ready_time() { - return this.getOpcIntegerValue(item_ready_time); - } - - public int getItem_running_time() { - return this.getOpcIntegerValue(item_running_time); - } - - public int getItem_error_time() { - return this.getOpcIntegerValue(item_error_time); - } - - public int getItem_voltage() { - return this.getOpcIntegerValue(item_voltage); - } - - public int getItem_temperature() { - return this.getOpcIntegerValue(item_temperature); - } - - public int getItem_current() { - return this.getOpcIntegerValue(item_current); - } - - public int getItem_material() { - return this.getOpcIntegerValue(item_material); - } - - public int getItem_lack_material() { - return this.getOpcIntegerValue(item_lack_material); - } - - public int getItem_full_material() { - return this.getOpcIntegerValue(item_full_material); - } - - public int getItem_storage_qty() { - return this.getOpcIntegerValue(item_storage_qty); - } - - public int getItem_feeding_qty() { - return this.getOpcIntegerValue(item_feeding_qty); - } - - public int getItem_blanking_qty() { - return this.getOpcIntegerValue(item_blanking_qty); - } - - public int getItem_qualified_qty() { - return this.getOpcIntegerValue(item_qualified_qty); - } - - public int getItem_unqualified_qty() { - return this.getOpcIntegerValue(item_unqualified_qty); - } - - public int getItem_finish() { - return this.getOpcIntegerValue(item_finish); - } - - public int getItem_task() { - return this.getOpcIntegerValue(item_task); - } - - public int getItem_noload_electricity_consumption() { - return this.getOpcIntegerValue(item_noload_electricity_consumption); - } - - public int getItem_prod_electricity_consumption() { - return this.getOpcIntegerValue(item_prod_electricity_consumption); - } - - public int getItem_gas_consumption() { - return this.getOpcIntegerValue(item_gas_consumption); - } - - public int getItem_water_consumption() { - return this.getOpcIntegerValue(item_water_consumption); - } - - public int getItem_oil_level() { - return this.getOpcIntegerValue(item_oil_level); - } - - public int getItem_monthly_electricity_consumption() { - return this.getOpcIntegerValue(item_monthly_electricity_consumption); - } - - public int getItem_pause() { - return this.getOpcIntegerValue(item_pause); - } - - Boolean isonline; - - public int getOpcIntegerValue(String protocol) { - Integer value = this.driver.getIntegeregerValue(protocol); - if (value == null) { - setIsonline(false); - } else { - setIsonline(true); - return value; - } - return 0; - - } - - public static List getReadableItemDtos() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(item_heartbeat, "心跳", "VW0")); - list.add(new ItemDto(item_mode, "模式", "VW2")); - list.add(new ItemDto(item_error, "故障", "VW4")); - list.add(new ItemDto(item_error_num, "故障次数", "VD6")); - list.add(new ItemDto(item_open_time, "开机时间", "VD8")); - list.add(new ItemDto(item_close_time, "关机时间", "VD12")); - list.add(new ItemDto(item_ready_time, "待机时间", "VD16")); - list.add(new ItemDto(item_running_time, "生产时间", "VD20")); - list.add(new ItemDto(item_error_time, "故障时间", "VD24")); - list.add(new ItemDto(item_temperature, "温度", "VD28")); - list.add(new ItemDto(item_voltage, "电压", "VD32")); - list.add(new ItemDto(item_current, "电流", "VD36")); - list.add(new ItemDto(item_material, "当前生产产品编号", "VD40")); - list.add(new ItemDto(item_lack_material, "生产缺料信号", "VD44")); - list.add(new ItemDto(item_full_material, "生产满料信号", "VD48")); - list.add(new ItemDto(item_storage_qty, "储料斗数量", "VD52")); - list.add(new ItemDto(item_feeding_qty, "上料数量", "VD56")); - list.add(new ItemDto(item_blanking_qty, "下料数量", "VD60")); - list.add(new ItemDto(item_qualified_qty, "当前生产合格品数量", "VD64")); - list.add(new ItemDto(item_unqualified_qty, "当前生产不合格数量", "VD68")); - list.add(new ItemDto(item_finish, "生产完成", "VD72")); - list.add(new ItemDto(item_task, "任务号", "VD76")); - list.add(new ItemDto(item_noload_electricity_consumption, "空载电能耗(未生产时)", "VD80")); - list.add(new ItemDto(item_prod_electricity_consumption, "生产电能耗", "VD84")); - list.add(new ItemDto(item_gas_consumption, "气压能耗", "VD88")); - list.add(new ItemDto(item_water_consumption, "水流量能耗", "VD92")); - list.add(new ItemDto(item_oil_level, "当前液压油位", "VD96")); - list.add(new ItemDto(item_monthly_electricity_consumption, "本月总电能耗", "VD100")); - list.add(new ItemDto(item_pause, "设备暂停", "VD104")); - - return list; - } - - public static List getWriteableItemDtos() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(item_to_heartbeat, "心跳", "VW200")); - list.add(new ItemDto(item_to_command, "下发命令", "VW202")); - list.add(new ItemDto(item_to_feeding, "下发命令", "VW204")); - list.add(new ItemDto(item_to_task, "任务号", "VW208")); - list.add(new ItemDto(item_to_pause, "生产暂停", "VW212")); - list.add(new ItemDto(item_to_clear, "当前产量清零", "VW216")); - list.add(new ItemDto(item_to_finish, "强制完成", "VW220")); - list.add(new ItemDto(item_to_open, "设备开机", "VW224")); - list.add(new ItemDto(item_to_close, "设备关机", "VW228")); - list.add(new ItemDto(item_to_material, "当前任务生产物料", "VW232")); - list.add(new ItemDto(item_to_qty, "当前任务生产数量", "VW236")); - return list; - } - - -} - diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java index 7cf39de5..5aab9b89 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java @@ -149,15 +149,15 @@ public class HailiangSmartplcTestDeviceDriver extends AbstractOpcDeviceDriver im log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); }else { //向LMS发送请求,发送终点和托盘类型 - jo.put("type", "1"); - jo.put("point_code", device_code); - jo.put("vehicle_num", "1"); - jo.put("vehicle_type", container_type); - String result = acsToWmsService.applyTaskToWms(jo); - JSONObject res_jo = JSONObject.parseObject(result); - if (res_jo.getString("status").equals("200")){ - requireSucess = true; - } +// jo.put("type", "1"); +// jo.put("point_code", device_code); +// jo.put("vehicle_num", "1"); +// jo.put("vehicle_type", container_type); +// String result = acsToWmsService.applyTaskToWms(jo); +// JSONObject res_jo = JSONObject.parseObject(result); +// if (res_jo.getString("status").equals("200")){ +// requireSucess = true; +// } } } break; @@ -169,16 +169,16 @@ public class HailiangSmartplcTestDeviceDriver extends AbstractOpcDeviceDriver im log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); }else { //向LMS发送请求,发送起点 - jo.put("type", "2"); - jo.put("point_code", device_code); - jo.put("vehicle_num", "1"); - jo.put("vehicle_type", container_type); - jo.put("qty", number); - String result = acsToWmsService.applyTaskToWms(jo); - JSONObject res_jo = JSONObject.parseObject(result); - if (res_jo.getString("status").equals("200")){ - requireSucess = true; - } +// jo.put("type", "2"); +// jo.put("point_code", device_code); +// jo.put("vehicle_num", "1"); +// jo.put("vehicle_type", container_type); +// jo.put("qty", number); +// String result = acsToWmsService.applyTaskToWms(jo); +// JSONObject res_jo = JSONObject.parseObject(result); +// if (res_jo.getString("status").equals("200")){ +// requireSucess = true; +// } } } break; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java index 2d3b52be..6076a7e0 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java @@ -18,8 +18,6 @@ import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.ScannerDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; -import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; -import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; @@ -291,10 +289,10 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe } if (move > 0 && !StrUtil.isEmpty(newBarcode) && !requireSucess) { - instruction_require(newBarcode.trim()); +// instruction_require(newBarcode.trim()); } if (move > 0 && !StrUtil.isEmpty(newBarcode) && !applySucess) { - instruction_apply(newBarcode.trim()); +// instruction_apply(newBarcode.trim()); } break; case 5: @@ -312,7 +310,7 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe } // 申请贴标 if (move > 0 && !StrUtil.isEmpty(newBarcodes) && !requireSucess) { - applyLabeling(newBarcodes); +// applyLabeling(newBarcodes); } break; } @@ -435,9 +433,9 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe this.control(itemMap); } - public boolean instruction_require(String container_code) { - return instruction_require(container_code, WcsConfig.task_container_type_default_desc); - } +// public boolean instruction_require(String container_code) { +// return instruction_require(container_code, WcsConfig.task_container_type_default_desc); +// } public synchronized boolean instruction_apply(String container_code) { Date date = new Date(); @@ -498,307 +496,307 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe /** * 请求指令 * 定点任务时请求这里 - * @param container_code - * @param container_type + * @param + * @param */ - public synchronized boolean instruction_require(String container_code, String container_type) { - Date date = new Date(); - if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) { - log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); - return false; - } else { - this.instruction_require_time = date; - //container_code - TaskDto taskdto = taskserver.findByContainer(container_code); - if (!ObjectUtil.isEmpty(taskdto)) { - if (!ObjectUtils.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))) { - logServer.deviceExecuteLog(this.device_code, "", "", "申请任务时该载具号"+container_code - +"已存在对应任务,不再请求"); - Instruction instdto = instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()); - if(!StrUtil.equals(instdto.getStart_device_code(),this.device_code)){ - message ="当前载具号"+container_code+"查找对应指令起点与当前设备不符"; - logServer.deviceExecuteLog(this.device_code, "", "", "申请任务" - +"当前载具号"+container_code+"查找对应指令起点与当前设备不符"); - return false; - } - this.setIserror(false); - if (ObjectUtil.isNotEmpty(instdto)) { - List list = new ArrayList(); - Map map = new HashMap(); - - if (StrUtil.isNotEmpty(taskdto.getTo_z())) { - if (StrUtil.equals(taskdto.getTo_z(), "01")) { - map.put("code", "to_target"); - map.put("value", "102"); - } else if (StrUtil.equals(taskdto.getTo_z(), "02")) { - map.put("code", "to_target"); - map.put("value", "201"); - } else if (StrUtil.equals(taskdto.getTo_z(), "03")) { - map.put("code", "to_target"); - map.put("value", "301"); - } - } - list.add(map); - Map map2 = new HashMap(); - map2.put("code", "to_task"); - map2.put("value", instdto.getInstruction_code()); - list.add(map2); - Map map3 = new HashMap(); - map3.put("code", "to_command"); - map3.put("value", "1"); - list.add(map3); - this.writing(list); - message = "下发电气任务号成功"; - logServer.deviceExecuteLog(this.device_code, "", "", "申请任务时该载具号"+container_code - +"已存在对应任务,下发电气信号"); - requireSucess = true; - applySucess = true; - } else { - message = "任务号:" + taskdto.getTask_code() + "未找到指令"; - } - return true; - } else { - //需要判断指令中的指令 再次请求不能生成 - if (!ObjectUtils.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code(),"1"))) { - { - Instruction instdto = instructionService.findByTaskcodeAndStatus(taskdto.getTask_code(),"1"); - if(to_task != Integer.parseInt(instdto.getInstruction_code())){ - List list = new ArrayList(); - Map map = new HashMap(); - if (StrUtil.isNotEmpty(taskdto.getTo_z())) { - if (StrUtil.equals(taskdto.getTo_z(), "01")) { - map.put("code", "to_target"); - map.put("value", "102"); - } else if (StrUtil.equals(taskdto.getTo_z(), "02")) { - map.put("code", "to_target"); - map.put("value", "201"); - } else if (StrUtil.equals(taskdto.getTo_z(), "03")) { - map.put("code", "to_target"); - map.put("value", "301"); - } - } - list.add(map); - Map map2 = new HashMap(); - map2.put("code", "to_task"); - map2.put("value", instdto.getInstruction_code()); - list.add(map2); - Map map3 = new HashMap(); - map3.put("code", "to_command"); - map3.put("value", "1"); - list.add(map3); - this.writing(list); - message = "下发电气任务号成功"; - requireSucess = true; - applySucess = true; - return true; - } else { - logServer.deviceExecuteLog(this.device_code, "", "", "申请任务时该载具号" + container_code - + "已存在对应任务"); - requireSucess = true; - applySucess = true; - return true; - } - - } - } - } - - String taskid = taskdto.getTask_id(); - String taskcode = taskdto.getTask_code(); - String vehiclecode = taskdto.getVehicle_code(); - String priority = taskdto.getPriority(); - String start_point_code = taskdto.getStart_point_code(); - String start_device_code = taskdto.getStart_device_code(); - String route_plan_code = taskdto.getRoute_plan_code(); - String next_device_code = ""; - - /** - * 开始平均分配 - */ - String this_coevice_code = taskserver.queryAssignedByDevice(device_code, taskdto.getNext_device_code()); - if (StrUtil.isEmpty(this_coevice_code)) { - List shortPathsList = routeLineService.getShortPathLines(start_device_code, taskdto.getNext_device_code(), route_plan_code); - RouteLineDto routeLineDto = shortPathsList.get(0); - - String path = routeLineDto.getPath(); - String type = routeLineDto.getType(); - String[] str = path.split("->"); -// if (!StrUtil.equals(type, "0")) { +// public synchronized boolean instruction_require(String container_code, String container_type) { +// Date date = new Date(); +// if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) { +// log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); +// return false; +// } else { +// this.instruction_require_time = date; +// //container_code +// TaskDto taskdto = taskserver.findByContainer(container_code); +// if (!ObjectUtil.isEmpty(taskdto)) { +// if (!ObjectUtils.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))) { +// logServer.deviceExecuteLog(this.device_code, "", "", "申请任务时该载具号"+container_code +// +"已存在对应任务,不再请求"); +// Instruction instdto = instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()); +// if(!StrUtil.equals(instdto.getStart_device_code(),this.device_code)){ +// message ="当前载具号"+container_code+"查找对应指令起点与当前设备不符"; +// logServer.deviceExecuteLog(this.device_code, "", "", "申请任务" +// +"当前载具号"+container_code+"查找对应指令起点与当前设备不符"); // return false; // } - List pathlist = Arrays.asList(str); - int index = 0; - for (int m = 0; m < pathlist.size(); m++) { - if (pathlist.get(m).equals(start_device_code)) { - index = m + 1; - break; - } - } - next_device_code = pathlist.get(index); - } else { - next_device_code = this_coevice_code; - } - //校验路由关系 - List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); - if (ObjectUtils.isEmpty(shortPathsList)) { - throw new RuntimeException("路由不通!"); - } - - Device startdevice = deviceAppservice.findDeviceByCode(start_device_code); - Device nextdevice = deviceAppservice.findDeviceByCode(next_device_code); - String next_point_code; - if (StrUtil.equals(deviceAppservice.findDeviceTypeByCode(next_device_code), "storage")) { - next_point_code = taskdto.getTo_x() + "-" + taskdto.getTo_y() + "-" + taskdto.getTo_z(); - } else { - next_point_code = next_device_code; - } - - if(!StrUtil.equals(taskdto.getStart_device_code(),this.device_code)){ - message ="当前载具号"+container_code+"查找对应指令起点与当前设备不符"; -// List list = new ArrayList(); -// Map map = new HashMap(); -// map.put("code","to_target"); -// map.put("value","1011"); -// list.add(map); -// Map map2 = new HashMap(); -// map2.put("code","to_command"); -// map2.put("value","1"); -// Map map3 = new HashMap(); -// map3.put("code","to_task"); -// map3.put("value","0"); -// list.add(map3); -// this.writing(list); -// this.setRequireSucess(true); -// this.setApplySucess(true); - return false; - } - Instruction instdto = new Instruction(); - instdto.setInstruction_id(IdUtil.simpleUUID()); - instdto.setRoute_plan_code(route_plan_code); - instdto.setRemark(taskdto.getRemark()); - instdto.setMaterial(taskdto.getMaterial()); - instdto.setQuantity(taskdto.getQuantity()); - instdto.setTask_id(taskid); - instdto.setTask_code(taskcode); - instdto.setVehicle_code(vehiclecode); - String now = DateUtil.now(); - instdto.setCreate_time(now); - instdto.setCreate_by("auto"); - instdto.setStart_device_code(start_device_code); - instdto.setNext_device_code(next_device_code); - instdto.setStart_point_code(start_point_code); - instdto.setNext_point_code(next_point_code); - instdto.setPriority(priority); - instdto.setInstruction_status("0"); - instdto.setExecute_device_code(start_point_code); - try { - instructionService.create(instdto); - } catch (Exception e) { - e.printStackTrace(); - log.error("指令创建失败!",e.getMessage()); - return false; - } - //创建指令后修改任务状态 - taskdto.setTask_status("1"); - taskserver.update(taskdto); - - - List list = new ArrayList(); - Map map = new HashMap(); - - if(StrUtil.isNotEmpty(taskdto.getTo_z())){ - if(StrUtil.equals(taskdto.getTo_z(),"01")){ - map.put("code","to_target"); - map.put("value","102"); - } else if(StrUtil.equals(taskdto.getTo_z(),"02")){ - map.put("code","to_target"); - map.put("value","201"); - } else if(StrUtil.equals(taskdto.getTo_z(),"03")){ - map.put("code","to_target"); - map.put("value","301"); - } - } - list.add(map); - Map map2 = new HashMap(); - map2.put("code","to_task"); - map2.put("value",instdto.getInstruction_code()); - list.add(map2); - Map map3 = new HashMap(); - map3.put("code","to_command"); - map3.put("value","1"); - list.add(map3); - this.writing(list); -// if(task != Integer.parseInt(instdto.getInstruction_code()) ){ -// this.writing(list); -// logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发电气信号"); +// this.setIserror(false); +// if (ObjectUtil.isNotEmpty(instdto)) { +// List list = new ArrayList(); +// Map map = new HashMap(); +// +// if (StrUtil.isNotEmpty(taskdto.getTo_z())) { +// if (StrUtil.equals(taskdto.getTo_z(), "01")) { +// map.put("code", "to_target"); +// map.put("value", "102"); +// } else if (StrUtil.equals(taskdto.getTo_z(), "02")) { +// map.put("code", "to_target"); +// map.put("value", "201"); +// } else if (StrUtil.equals(taskdto.getTo_z(), "03")) { +// map.put("code", "to_target"); +// map.put("value", "301"); +// } +// } +// list.add(map); +// Map map2 = new HashMap(); +// map2.put("code", "to_task"); +// map2.put("value", instdto.getInstruction_code()); +// list.add(map2); +// Map map3 = new HashMap(); +// map3.put("code", "to_command"); +// map3.put("value", "1"); +// list.add(map3); +// this.writing(list); +// message = "下发电气任务号成功"; +// logServer.deviceExecuteLog(this.device_code, "", "", "申请任务时该载具号"+container_code +// +"已存在对应任务,下发电气信号"); +// requireSucess = true; +// applySucess = true; +// } else { +// message = "任务号:" + taskdto.getTask_code() + "未找到指令"; +// } +// return true; +// } else { +// //需要判断指令中的指令 再次请求不能生成 +// if (!ObjectUtils.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code(),"1"))) { +// { +// Instruction instdto = instructionService.findByTaskcodeAndStatus(taskdto.getTask_code(),"1"); +// if(to_task != Integer.parseInt(instdto.getInstruction_code())){ +// List list = new ArrayList(); +// Map map = new HashMap(); +// if (StrUtil.isNotEmpty(taskdto.getTo_z())) { +// if (StrUtil.equals(taskdto.getTo_z(), "01")) { +// map.put("code", "to_target"); +// map.put("value", "102"); +// } else if (StrUtil.equals(taskdto.getTo_z(), "02")) { +// map.put("code", "to_target"); +// map.put("value", "201"); +// } else if (StrUtil.equals(taskdto.getTo_z(), "03")) { +// map.put("code", "to_target"); +// map.put("value", "301"); +// } +// } +// list.add(map); +// Map map2 = new HashMap(); +// map2.put("code", "to_task"); +// map2.put("value", instdto.getInstruction_code()); +// list.add(map2); +// Map map3 = new HashMap(); +// map3.put("code", "to_command"); +// map3.put("value", "1"); +// list.add(map3); +// this.writing(list); +// message = "下发电气任务号成功"; +// requireSucess = true; +// applySucess = true; +// return true; +// } else { +// logServer.deviceExecuteLog(this.device_code, "", "", "申请任务时该载具号" + container_code +// + "已存在对应任务"); +// requireSucess = true; +// applySucess = true; +// return true; +// } +// +// } +// } // } - requireSucess = true; - applySucess = true; - } else { - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - message = "申请任务中..."; - JSONObject apply = new JSONObject(); - apply.put("vehicle_code", container_code); - apply.put("device_code", device_code); - apply.put("type","1"); - logServer.deviceExecuteLog(this.device_code, "", "", "申请入库,请求参数:"+apply.toString()); - String str = acsToWmsService.applyTaskToWms(apply); - JSONObject jo = JSON.parseObject(str); - logServer.deviceExecuteLog(this.device_code, "", "", "申请入库,返回参数:"+jo.toString()); - if (ObjectUtil.isEmpty(jo)) { - message = "接口不通"; - List list = new ArrayList(); - Map map = new HashMap(); - map.put("code","to_target"); - map.put("value","1011"); - list.add(map); - Map map2 = new HashMap(); - map2.put("code","to_command"); - map2.put("value","1"); - Map map3 = new HashMap(); - map3.put("code","to_task"); - map3.put("value","0"); - list.add(map3); - this.writing(list); - requireSucess = true; - applySucess = true; - message = "申请任务失败接口不通下发退回"; - } else { - if (jo.getInteger("status") == 200) { - message = "申请任务成功"; - requireSucess = true; - applySucess = false; - } else { - if (jo.get("message")!=null){ - message = jo.get("message").toString(); - } - - List list = new ArrayList(); - Map map = new HashMap(); - map.put("code","to_target"); - map.put("value","1011"); - list.add(map); - Map map2 = new HashMap(); - map2.put("code","to_command"); - map2.put("value","1"); - list.add(map2); - Map map3 = new HashMap(); - map3.put("code","to_task"); - map3.put("value","0"); - list.add(map3); - this.writing(list); - message = "申请任务失败下发退回,"+message; - requireSucess = true; - - } - } -// requireSucess = true; -// message = "申请任务成功"; - } - } - return true; - } - } +// +// String taskid = taskdto.getTask_id(); +// String taskcode = taskdto.getTask_code(); +// String vehiclecode = taskdto.getVehicle_code(); +// String priority = taskdto.getPriority(); +// String start_point_code = taskdto.getStart_point_code(); +// String start_device_code = taskdto.getStart_device_code(); +// String route_plan_code = taskdto.getRoute_plan_code(); +// String next_device_code = ""; +// +// /** +// * 开始平均分配 +// */ +// String this_coevice_code = taskserver.queryAssignedByDevice(device_code, taskdto.getNext_device_code()); +// if (StrUtil.isEmpty(this_coevice_code)) { +// List shortPathsList = routeLineService.getShortPathLines(start_device_code, taskdto.getNext_device_code(), route_plan_code); +// RouteLineDto routeLineDto = shortPathsList.get(0); +// +// String path = routeLineDto.getPath(); +// String type = routeLineDto.getType(); +// String[] str = path.split("->"); +//// if (!StrUtil.equals(type, "0")) { +//// return false; +//// } +// List pathlist = Arrays.asList(str); +// int index = 0; +// for (int m = 0; m < pathlist.size(); m++) { +// if (pathlist.get(m).equals(start_device_code)) { +// index = m + 1; +// break; +// } +// } +// next_device_code = pathlist.get(index); +// } else { +// next_device_code = this_coevice_code; +// } +// //校验路由关系 +// List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); +// if (ObjectUtils.isEmpty(shortPathsList)) { +// throw new RuntimeException("路由不通!"); +// } +// +// Device startdevice = deviceAppservice.findDeviceByCode(start_device_code); +// Device nextdevice = deviceAppservice.findDeviceByCode(next_device_code); +// String next_point_code; +// if (StrUtil.equals(deviceAppservice.findDeviceTypeByCode(next_device_code), "storage")) { +// next_point_code = taskdto.getTo_x() + "-" + taskdto.getTo_y() + "-" + taskdto.getTo_z(); +// } else { +// next_point_code = next_device_code; +// } +// +// if(!StrUtil.equals(taskdto.getStart_device_code(),this.device_code)){ +// message ="当前载具号"+container_code+"查找对应指令起点与当前设备不符"; +//// List list = new ArrayList(); +//// Map map = new HashMap(); +//// map.put("code","to_target"); +//// map.put("value","1011"); +//// list.add(map); +//// Map map2 = new HashMap(); +//// map2.put("code","to_command"); +//// map2.put("value","1"); +//// Map map3 = new HashMap(); +//// map3.put("code","to_task"); +//// map3.put("value","0"); +//// list.add(map3); +//// this.writing(list); +//// this.setRequireSucess(true); +//// this.setApplySucess(true); +// return false; +// } +// Instruction instdto = new Instruction(); +// instdto.setInstruction_id(IdUtil.simpleUUID()); +// instdto.setRoute_plan_code(route_plan_code); +// instdto.setRemark(taskdto.getRemark()); +// instdto.setMaterial(taskdto.getMaterial()); +// instdto.setQuantity(taskdto.getQuantity()); +// instdto.setTask_id(taskid); +// instdto.setTask_code(taskcode); +// instdto.setVehicle_code(vehiclecode); +// String now = DateUtil.now(); +// instdto.setCreate_time(now); +// instdto.setCreate_by("auto"); +// instdto.setStart_device_code(start_device_code); +// instdto.setNext_device_code(next_device_code); +// instdto.setStart_point_code(start_point_code); +// instdto.setNext_point_code(next_point_code); +// instdto.setPriority(priority); +// instdto.setInstruction_status("0"); +// instdto.setExecute_device_code(start_point_code); +// try { +// instructionService.create(instdto); +// } catch (Exception e) { +// e.printStackTrace(); +// log.error("指令创建失败!",e.getMessage()); +// return false; +// } +// //创建指令后修改任务状态 +// taskdto.setTask_status("1"); +// taskserver.update(taskdto); +// +// +// List list = new ArrayList(); +// Map map = new HashMap(); +// +// if(StrUtil.isNotEmpty(taskdto.getTo_z())){ +// if(StrUtil.equals(taskdto.getTo_z(),"01")){ +// map.put("code","to_target"); +// map.put("value","102"); +// } else if(StrUtil.equals(taskdto.getTo_z(),"02")){ +// map.put("code","to_target"); +// map.put("value","201"); +// } else if(StrUtil.equals(taskdto.getTo_z(),"03")){ +// map.put("code","to_target"); +// map.put("value","301"); +// } +// } +// list.add(map); +// Map map2 = new HashMap(); +// map2.put("code","to_task"); +// map2.put("value",instdto.getInstruction_code()); +// list.add(map2); +// Map map3 = new HashMap(); +// map3.put("code","to_command"); +// map3.put("value","1"); +// list.add(map3); +// this.writing(list); +//// if(task != Integer.parseInt(instdto.getInstruction_code()) ){ +//// this.writing(list); +//// logServer.deviceExecuteLog(device_code, "", "", instdto.getInstruction_code() + "再次下发电气信号"); +//// } +// requireSucess = true; +// applySucess = true; +// } else { +// if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { +// message = "申请任务中..."; +// JSONObject apply = new JSONObject(); +// apply.put("vehicle_code", container_code); +// apply.put("device_code", device_code); +// apply.put("type","1"); +// logServer.deviceExecuteLog(this.device_code, "", "", "申请入库,请求参数:"+apply.toString()); +// String str = acsToWmsService.applyTaskToWms(apply); +// JSONObject jo = JSON.parseObject(str); +// logServer.deviceExecuteLog(this.device_code, "", "", "申请入库,返回参数:"+jo.toString()); +// if (ObjectUtil.isEmpty(jo)) { +// message = "接口不通"; +// List list = new ArrayList(); +// Map map = new HashMap(); +// map.put("code","to_target"); +// map.put("value","1011"); +// list.add(map); +// Map map2 = new HashMap(); +// map2.put("code","to_command"); +// map2.put("value","1"); +// Map map3 = new HashMap(); +// map3.put("code","to_task"); +// map3.put("value","0"); +// list.add(map3); +// this.writing(list); +// requireSucess = true; +// applySucess = true; +// message = "申请任务失败接口不通下发退回"; +// } else { +// if (jo.getInteger("status") == 200) { +// message = "申请任务成功"; +// requireSucess = true; +// applySucess = false; +// } else { +// if (jo.get("message")!=null){ +// message = jo.get("message").toString(); +// } +// +// List list = new ArrayList(); +// Map map = new HashMap(); +// map.put("code","to_target"); +// map.put("value","1011"); +// list.add(map); +// Map map2 = new HashMap(); +// map2.put("code","to_command"); +// map2.put("value","1"); +// list.add(map2); +// Map map3 = new HashMap(); +// map3.put("code","to_task"); +// map3.put("value","0"); +// list.add(map3); +// this.writing(list); +// message = "申请任务失败下发退回,"+message; +// requireSucess = true; +// +// } +// } +//// requireSucess = true; +//// message = "申请任务成功"; +// } +// } +// return true; +// } +// } public void writing(String param, String value) { @@ -812,76 +810,76 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe } // 申请贴标 - public synchronized void applyLabeling(String newBarcodes) { - Date date = new Date(); - if (date.getTime() - this.require_apply_labeling_time.getTime() - < (long) this.instruction_require_time_out) { - log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); - return; - } else { - this.require_apply_labeling_time = date; -// String vehicle_code = ""; - if (weight == 0) { - logServer.deviceExecuteLog(device_code, "", "", "申请贴标电气设备重量:" + weight + "异常"); - message = "申请贴标电气设备重量:" + weight + "异常"; - throw new RuntimeException("重量为空!"); - } -// if (task > 0) { -// Instruction instruction = instructionService.findByCodeFromCache(String.valueOf(task)); -// if (ObjectUtil.isEmpty(instruction)) { -// instruction = instructionService.findByCode(String.valueOf(task)); -// } -// vehicle_code = instruction.getVehicle_code(); -// } else { -// logServer.deviceExecuteLog(device_code, "", "", "申请贴标电气设备任务号:" + task + "异常"); -// message = "申请贴标电气设备任务号:" + task + "异常"; -// throw new RuntimeException("任务号为空!"); +// public synchronized void applyLabeling(String newBarcodes) { +// Date date = new Date(); +// if (date.getTime() - this.require_apply_labeling_time.getTime() +// < (long) this.instruction_require_time_out) { +// log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time_out); +// return; +// } else { +// this.require_apply_labeling_time = date; +//// String vehicle_code = ""; +// if (weight == 0) { +// logServer.deviceExecuteLog(device_code, "", "", "申请贴标电气设备重量:" + weight + "异常"); +// message = "申请贴标电气设备重量:" + weight + "异常"; +// throw new RuntimeException("重量为空!"); // } - if (StrUtil.isEmpty(newBarcodes)) { - logServer.deviceExecuteLog(device_code, "", "", "申请贴标电气设备载具号为空!"); - message = "申请贴标电气设备载具号为空"; - throw new RuntimeException("载具号为空!"); - } - ApplyLabelingAndBindingRequest applyLabelingAndBindingRequest = - new ApplyLabelingAndBindingRequest(); - JSONObject device_json = - WQLObject.getWQLObject("acs_storage_cell") - .query("storage_code ='" + this.device_code + "'") - .uniqueResult(0); - String start_point_code = null; - if (!ObjectUtil.isEmpty(device_json)) { - start_point_code = - (String) device_json.get("parent_storage_code") == null - ? this.device_code - : (String) device_json.get("parent_storage_code"); - } - applyLabelingAndBindingRequest.setDevice_code(start_point_code); - applyLabelingAndBindingRequest.setType("1"); - applyLabelingAndBindingRequest.setVehicle_code(newBarcodes); - applyLabelingAndBindingRequest.setWeight(String.valueOf((float) weight / 100)); - ApplyLabelingAndBindingResponse applyLabelingAndBindingResponse = - acsToWmsService.applyLabelingAndBindingRequest(applyLabelingAndBindingRequest); - logServer.deviceExecuteLog(this.device_code, "", "", "申请贴标,请求参数:"+JSON.toJSONString(applyLabelingAndBindingRequest)); - - if (applyLabelingAndBindingResponse.getstatus() == 200) { - message = "申请贴标成功"; - List list = new ArrayList(); - Map map = new HashMap(); - map.put("code", "to_command"); - map.put("value", "5"); - list.add(map); - this.writing(list); - this.writing(list); - message = "申请贴标下发电气信号成功"; - logServer.deviceExecuteLog(this.device_code, "", "", "申请贴标,返回参数:"+JSON.toJSONString(applyLabelingAndBindingResponse)); - requireSucess = true; - } else { - message = "申请贴标失败," + applyLabelingAndBindingResponse.getMessage(); - logServer.deviceExecuteLog(this.device_code, "", "", "申请贴标,返回参数:"+JSON.toJSONString(applyLabelingAndBindingResponse)); - - } - } - } +//// if (task > 0) { +//// Instruction instruction = instructionService.findByCodeFromCache(String.valueOf(task)); +//// if (ObjectUtil.isEmpty(instruction)) { +//// instruction = instructionService.findByCode(String.valueOf(task)); +//// } +//// vehicle_code = instruction.getVehicle_code(); +//// } else { +//// logServer.deviceExecuteLog(device_code, "", "", "申请贴标电气设备任务号:" + task + "异常"); +//// message = "申请贴标电气设备任务号:" + task + "异常"; +//// throw new RuntimeException("任务号为空!"); +//// } +// if (StrUtil.isEmpty(newBarcodes)) { +// logServer.deviceExecuteLog(device_code, "", "", "申请贴标电气设备载具号为空!"); +// message = "申请贴标电气设备载具号为空"; +// throw new RuntimeException("载具号为空!"); +// } +// ApplyLabelingAndBindingRequest applyLabelingAndBindingRequest = +// new ApplyLabelingAndBindingRequest(); +// JSONObject device_json = +// WQLObject.getWQLObject("acs_storage_cell") +// .query("storage_code ='" + this.device_code + "'") +// .uniqueResult(0); +// String start_point_code = null; +// if (!ObjectUtil.isEmpty(device_json)) { +// start_point_code = +// (String) device_json.get("parent_storage_code") == null +// ? this.device_code +// : (String) device_json.get("parent_storage_code"); +// } +// applyLabelingAndBindingRequest.setDevice_code(start_point_code); +// applyLabelingAndBindingRequest.setType("1"); +// applyLabelingAndBindingRequest.setVehicle_code(newBarcodes); +// applyLabelingAndBindingRequest.setWeight(String.valueOf((float) weight / 100)); +// ApplyLabelingAndBindingResponse applyLabelingAndBindingResponse = +// acsToWmsService.applyLabelingAndBindingRequest(applyLabelingAndBindingRequest); +// logServer.deviceExecuteLog(this.device_code, "", "", "申请贴标,请求参数:"+JSON.toJSONString(applyLabelingAndBindingRequest)); +// +// if (applyLabelingAndBindingResponse.getstatus() == 200) { +// message = "申请贴标成功"; +// List list = new ArrayList(); +// Map map = new HashMap(); +// map.put("code", "to_command"); +// map.put("value", "5"); +// list.add(map); +// this.writing(list); +// this.writing(list); +// message = "申请贴标下发电气信号成功"; +// logServer.deviceExecuteLog(this.device_code, "", "", "申请贴标,返回参数:"+JSON.toJSONString(applyLabelingAndBindingResponse)); +// requireSucess = true; +// } else { +// message = "申请贴标失败," + applyLabelingAndBindingResponse.getMessage(); +// logServer.deviceExecuteLog(this.device_code, "", "", "申请贴标,返回参数:"+JSON.toJSONString(applyLabelingAndBindingResponse)); +// +// } +// } +// } public void writing(List list) { Map itemMap = new HashMap(); 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 deleted file mode 100644 index 39f2037a..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java +++ /dev/null @@ -1,55 +0,0 @@ - -package org.nl.acs.ext.wms; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.log.LokiLog; -import org.nl.acs.log.LokiLogType; -import org.nl.acs.log.service.DeviceExecuteLogService; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.system.service.ParamService; -import org.nl.modules.system.service.impl.ParamServiceImpl; -import org.nl.modules.wql.util.SpringContextHolder; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * ACS连接外部系统工具类: - */ -@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)) { - throw new BadRequestException("参数配置表中-is_connect_liKu_Wcs为:0"); - } - 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) - .body(JSON.toJSONString(requestParam)) - .execute() - .body(); - log.info("下发立库任务返回参数:{}", 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)); - return String.valueOf(result); - } - } -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/RespUtil.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/RespUtil.java deleted file mode 100644 index 354547fb..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/RespUtil.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.nl.acs.ext.wms; - -import com.alibaba.fastjson.JSONObject; -import org.nl.acs.ext.wms.liKuData.Resp; - -/** - * @author: geng by - * @createDate: 2022/11/24 - */ -public class RespUtil { - public static Resp getResp(String result, T t) { - JSONObject jsonObject = JSONObject.parseObject(result); - Resp resp = new Resp<>(); - resp.setData(t); - resp = JSONObject.toJavaObject(jsonObject, Resp.class); - return resp; - } -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingRequest.java deleted file mode 100644 index 65c5bb58..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import lombok.Data; - -@Data -public class ApplyLabelingAndBindingRequest extends BaseRequest { - private String vehicle_code; - private String device_code; - /** - * 1:贴标申请 - * 2:捆扎申请 - * 3:烘箱 - */ - private String type; - - private String weight; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingResponse.java deleted file mode 100644 index cf20c9c1..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import com.alibaba.fastjson.JSONObject; -import lombok.Data; - -import java.util.HashMap; -import java.util.Map; - -@Data -public class ApplyLabelingAndBindingResponse extends BaseResponse { - - private Map data = new HashMap(); - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseRequest.java deleted file mode 100644 index 4533d4e4..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseRequest.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import lombok.Data; - -import java.util.HashMap; -import java.util.Map; - -@Data -public class BaseRequest { - private Map parameters = new HashMap(); - private String systemCode; - private String houseCode; - - public String getSystemCode() { - return this.systemCode; - } - - public void setSystemCode(String systemCode) { - this.systemCode = systemCode; - } - - public String getHouseCode() { - return this.houseCode; - } - - public void setHouseCode(String houseCode) { - this.houseCode = houseCode; - } - - public BaseRequest() { - } - - public Map getParameters() { - return this.parameters; - } - - public void setParameters(Map parameters) { - this.parameters = parameters; - } - - public Object getParameter(String key) { - return this.parameters.get(key); - } - - public void putParameter(String key, String object) { - this.parameters.put(key, object); - } -} - diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseResponse.java deleted file mode 100644 index 0920b034..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseResponse.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import com.alibaba.fastjson.JSONArray; -import lombok.Data; - -import java.util.HashMap; -import java.util.Map; - -@Data -public class BaseResponse { - - private Integer status = 0; - private String message; - private JSONArray errArr = new JSONArray(); - private Map parameters = new HashMap(); - - public BaseResponse() { - } - - public Integer getstatus() { - return this.status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getMessage() { - return this.message; - } - - public void setMessage(String message) { - this.message = message; - } - - public Map getParameters() { - return this.parameters; - } - - public void setParameters(Map parameters) { - this.parameters = parameters; - } - - public Object getParameter(String key) { - return this.parameters.get(key); - } - - public void putParameter(String key, String object) { - this.parameters.put(key, object); - } - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CancelTaskRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CancelTaskRequest.java deleted file mode 100644 index e2aea4c8..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CancelTaskRequest.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import lombok.Data; - -import java.util.Map; - -@Data -public class CancelTaskRequest extends BaseRequest { - - /** - * 任务标识 - */ - private String ext_task_id; - - /** - * 任务编号 - */ - private String task_code; - - /** - * 载具号 - */ - String vehicle_code; - - /** - * 扩展属性 - */ - Map params; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CancelTaskResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CancelTaskResponse.java deleted file mode 100644 index 7a24424d..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CancelTaskResponse.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.nl.acs.ext.wms.data; - -public class CancelTaskResponse extends BaseResponse { - - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskRequest.java deleted file mode 100644 index 5ec4d374..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskRequest.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import lombok.Data; - -import java.util.Map; - -@Data -public class CreateTaskRequest extends BaseRequest { - - /** - * 任务标识 - */ - private String ext_task_id; - - /** - * 任务编号 - */ - private String task_code; - - - /** - * 取货点1 - */ - String start_device_code; - - /** - * 放货点1 - */ - String next_device_code; - - /** - * 取货点2 - */ - String start_device_code2; - - /** - * 放货点2 - */ - String next_device_code2; - - /** - * 烘箱对接位 - */ - String put_device_code; - - /** - * 优先级 - */ - String priority; - - /** - * 载具号 - */ - String vehicle_code; - - /** - * 载具类型 - */ - String vehicle_type; - - /** - * 路由方案 - */ - String route_plan_code; - - /** - * 1、生箔; - * 2、分切 - * 3、普通任务 - * 4、叉车任务 - * 5、输送任务 - * 6、行架 - * 7、立库 - * 任务类型 - */ - String task_type; - - /** - * 立库任务类型 - * - */ - String dtl_type; - - /** - * Agv系统类型 - * 1:1楼叉车系统 - * 2:2楼1区域AGV系统 - * 3:2楼2区域AGV系统 - */ - String agv_system_type; - - /** - * 备注 - */ - String remark; - - /** - * 烘箱时间 - */ - String oven_time; - - /** - * 烘箱温度 - */ - String temperature; - - /** - * 扩展属性 - */ - Map params; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskResponse.java deleted file mode 100644 index 40a39188..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskResponse.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.nl.acs.ext.wms.data; - -public class CreateTaskResponse extends BaseResponse { - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTakResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTakResponse.java deleted file mode 100644 index 73855488..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTakResponse.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import lombok.Data; - -@Data -public class LiKuApplyTakResponse extends BaseResponse { - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTaskRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTaskRequest.java deleted file mode 100644 index 5eca1953..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTaskRequest.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import lombok.Data; - -@Data -public class LiKuApplyTaskRequest extends BaseRequest { - private String vehicle_code; - private String device_code; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/PutActionRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/PutActionRequest.java deleted file mode 100644 index 4f2ddf2b..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/PutActionRequest.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import lombok.Data; - -import java.util.Map; - -@Data -public class PutActionRequest extends BaseRequest { - - /** - * 设备号 - */ - String device_code; - - /** - * - */ - String code; - - /** - * - */ - String value; - - /** - * 扩展属性 - */ - Map params; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/PutActionResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/PutActionResponse.java deleted file mode 100644 index 9fd64b94..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/PutActionResponse.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.nl.acs.ext.wms.data; - -public class PutActionResponse extends BaseResponse { - - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/UpdateLKTaskRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/UpdateLKTaskRequest.java deleted file mode 100644 index 16dc6e64..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/UpdateLKTaskRequest.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import lombok.Data; - -import java.util.Map; - -@Data -public class UpdateLKTaskRequest extends BaseRequest { - - /** - * 任务标识 - */ - private String ext_task_id; - - /** - * 任务编号 - */ - private String task_code; - - /** - * 载具号 - */ - String vehicle_code; - - /** - * 立库任务类型 - */ - String dtl_type; - - /** - * 类型 - */ - String type; - - /** - * 原库位 - */ - String srcLocation; - - /** - * 新库位 - */ - String destLocation; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/UpdateLKTaskResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/UpdateLKTaskResponse.java deleted file mode 100644 index 3f28cf75..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/UpdateLKTaskResponse.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.nl.acs.ext.wms.data; - -import java.util.Map; - -public class UpdateLKTaskResponse extends BaseResponse { - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseResponseData.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseResponseData.java deleted file mode 100644 index 01732d7e..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseResponseData.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 响应 data 公共基础类 - * 1、入库任务下发 - * 2、出库任务下发 - * 3、空托盘出库任务下发 - * 4、移库任务下发 - * 5、入库任务调整 - * 6、移库任务调整 - * 7、入库任务上报 - * 8、出库任务上报 - * 9、移库任务上报 - * 10、任务取消 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class BaseResponseData { - public String orderId; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseStoreReportRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseStoreReportRequest.java deleted file mode 100644 index ed5e9574..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseStoreReportRequest.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 任务上报请求参数基础类 - * 1、入库上报 - * 2、出库上报 - * 3、移库上报 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class BaseStoreReportRequest { - /** - * 任务编号 - * WCS内部任务编号,本次任务的唯一标识 - */ - public String orderId; - /** - * 托盘条码信息 - */ - public String palletCode; - /** - * 原库位号 - * 托盘的存储库位编号。具体库位编号需要双方商定 - */ - public String srcLocation; - /** - * 目的库位号 - * 托盘的目的存储库位编号。具体库位编号需要双方商定 - */ - public String destLocation; - /** - * 入库任务上报 1 已接收 2 开始执行 3执行完成 4 阻挡 5 空洞 - * 出库任务上报 1已接收任务,2开始执行,3执行完成 - * 移库任务上报 1 已接收 2开始执行3 执行完成 4 起点库位有货被阻挡 5目的点库位无货被阻挡 - */ - public String state; - - public String robotId; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseStoreRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseStoreRequest.java deleted file mode 100644 index 0c6842a8..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/BaseStoreRequest.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 任务下发请求参数基础类 - * 1、入库任务下发 - * 2、出库任务-批量下发 - * 3、空托盘出库任务下发 - * 4、移库任务-批量下发 - * 5、入库任务调整 - * 6、移库任务调整 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class BaseStoreRequest { - /** - * 任务编号 - * WCS内部任务编号,本次任务的唯一标识 - */ - public String orderId; - /** - * 楼层编号 - */ - public int floorNo; - /** - * 托盘条码信息 - */ - public String palletCode; - /** - * 原库位号 - * 托盘的存储库位编号。具体库位编号需要双方商定 - */ - public String srcLocation; - /** - * 目的库位号 - * 托盘的目的存储库位编号。具体库位编号需要双方商定 - */ - public String destLocation; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/CancelTaskRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/CancelTaskRequest.java deleted file mode 100644 index bea5ccea..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/CancelTaskRequest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 取消任务请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class CancelTaskRequest { - /** - * 任务编号 - * WCS内部任务编号,本次任务的唯一标识 - */ - public String orderId; - /** - * 托盘条码信息 - */ - public String palletCode; - /** - * 原库位号 - * 托盘的存储库位编号。具体库位编号需要双方商定 - */ - public String srcLocation; - /** - * 目的库位号 - * 托盘的目的存储库位编号。具体库位编号需要双方商定 - */ - public String destLocation; - /** - * 任务类型 - * 1 入库,2 出库,3 移库,4 空托盘入库,5 空托盘出库 - */ - public int taskType; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/CancelTaskResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/CancelTaskResponse.java deleted file mode 100644 index b89f4f11..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/CancelTaskResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 取消任务响应参数 Data类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class CancelTaskResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusData.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusData.java deleted file mode 100644 index a2b5c347..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusData.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -@Data -public class DeviceStatusData { - - String deviceId; - - String x; - - String y; - - //楼层 - String mapId; - - //电量 - String power; - - //托盘 - String pallet; - - //有无货 - String load; - - //报警 - String alarm; - - //任务号 - String taskId; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusRequest.java deleted file mode 100644 index 006bbaa7..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -@Data -public class DeviceStatusRequest { - - String deviceId; - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusResponse.java deleted file mode 100644 index b50b15be..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/DeviceStatusResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -public class DeviceStatusResponse { - - String result; - - String code; - - String comment; - - DeviceStatusData data; - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/EmptyVehicleOutStoreRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/EmptyVehicleOutStoreRequest.java deleted file mode 100644 index 207894bc..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/EmptyVehicleOutStoreRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 空托盘出库任务下发 请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class EmptyVehicleOutStoreRequest extends BaseStoreRequest { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/EmptyVehicleOutStoreResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/EmptyVehicleOutStoreResponse.java deleted file mode 100644 index d189f410..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/EmptyVehicleOutStoreResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 空托盘任务下发响应参数Data类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class EmptyVehicleOutStoreResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreReportRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreReportRequest.java deleted file mode 100644 index 70493dcd..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreReportRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 入库任务上报请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class InStoreReportRequest extends BaseStoreReportRequest { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreReportResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreReportResponse.java deleted file mode 100644 index e12fb501..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreReportResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 入库任务上报 响应参数Data类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class InStoreReportResponse extends BaseResponseData { - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreRequest.java deleted file mode 100644 index 9d72850b..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 入库任务下发请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class InStoreRequest extends BaseStoreRequest { - /** - * 任务类型 - * 1代表正常载货托盘入库,2代表空托盘入库 - */ - public int type; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResetRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResetRequest.java deleted file mode 100644 index 2d276a21..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResetRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 入库任务调整请求参数类 - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class InStoreResetRequest extends BaseStoreRequest { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResetResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResetResponse.java deleted file mode 100644 index 525c1424..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResetResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 入库任务调整 响应参数Data类 - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class InStoreResetResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResponse.java deleted file mode 100644 index fb409f6f..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 入库任务下发响应参数 Data类 - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class InStoreResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreTaskUpdateRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreTaskUpdateRequest.java deleted file mode 100644 index 30a2060f..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreTaskUpdateRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -@Data -public class InStoreTaskUpdateRequest extends BaseResponseData { - - /** - * 任务编号 - * WCS内部任务编号,本次任务的唯一标识 - */ - public String orderId; - /** - * 托盘条码信息 - */ - public String palletCode; - /** - * 原库位号 - * 托盘的存储库位编号。具体库位编号需要双方商定 - */ - public String srcLocation; - /** - * 目的库位号 - * 托盘的目的存储库位编号。具体库位编号需要双方商定 - */ - public String destLocation; - - /** - * 楼层 - */ - public int floorNo; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreTaskUpdateResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreTaskUpdateResponse.java deleted file mode 100644 index 8dcb1ea7..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/InStoreTaskUpdateResponse.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - - -public class InStoreTaskUpdateResponse extends BaseStoreRequest { - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreReportRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreReportRequest.java deleted file mode 100644 index 93f933c5..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreReportRequest.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -/** - * 移库上报请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -public class MoveStoreReportRequest extends BaseStoreReportRequest { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreReportResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreReportResponse.java deleted file mode 100644 index d338bc65..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreReportResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 移库上报响应参数 Data类 - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class MoveStoreReportResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreRequest.java deleted file mode 100644 index e2873c63..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreRequest.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -import java.util.List; - -/** - * 移库任务下发请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class MoveStoreRequest { - /** - * 任务组编号 - * WCS内部任务组编号,本组任务的唯一标识 - */ - public String groupId; - - /** - * 任务信息,可批量下发 - */ - public List orderInfos; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResetRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResetRequest.java deleted file mode 100644 index 48c6ef13..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResetRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 移库任务调整请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class MoveStoreResetRequest extends BaseStoreRequest { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResetResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResetResponse.java deleted file mode 100644 index 39b81e31..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResetResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 移库任务调整响应参数Data类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class MoveStoreResetResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResponse.java deleted file mode 100644 index 514303ae..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 移库任务下发响应参数Data类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class MoveStoreResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreTaskUpdateRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreTaskUpdateRequest.java deleted file mode 100644 index 20b73d8d..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreTaskUpdateRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -@Data -public class MoveStoreTaskUpdateRequest { - - /** - * 任务编号 - * WCS内部任务编号,本次任务的唯一标识 - */ - public String orderId; - /** - * 托盘条码信息 - */ - public String palletCode; - /** - * 原库位号 - * 托盘的存储库位编号。具体库位编号需要双方商定 - */ - public String srcLocation; - /** - * 目的库位号 - * 托盘的目的存储库位编号。具体库位编号需要双方商定 - */ - public String destLocation; - - /** - * 楼层 - */ - public int floorNo; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreTaskUpdateResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreTaskUpdateResponse.java deleted file mode 100644 index 248ac3df..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/MoveStoreTaskUpdateResponse.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - - -public class MoveStoreTaskUpdateResponse extends BaseStoreRequest { - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreReportRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreReportRequest.java deleted file mode 100644 index d0557059..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreReportRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 出库任务上报请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class OutStoreReportRequest extends BaseStoreReportRequest { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreReportResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreReportResponse.java deleted file mode 100644 index e22ec421..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreReportResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 出库任务上报响应参数Data类 - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class OutStoreReportResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreRequest.java deleted file mode 100644 index 3fefe797..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreRequest.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -import java.util.List; - -/** - * 出库任务下发请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class OutStoreRequest { - - /** - * 任务组编号 - * WCS内部任务组编号,本组任务的唯一标识 - */ - public String groupId; - - /** - * 任务信息,可批量下发 - */ - public List orderInfos; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreResponse.java deleted file mode 100644 index b1500618..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/OutStoreResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 出库任务下发响应参数Data类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class OutStoreResponse extends BaseResponseData { -} 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 deleted file mode 100644 index 2e9aee84..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/Resp.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 调用立库接口统一返回参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class Resp { - /** - * 成功返回true,失败返回false - */ - public String result; - - /** - * 错误码(0表示成功)1代表入库目的位置有货,其他更多情况待定 - */ - public String code; - - /** - * 错误信息,如果成功则为null - */ - public String comment; - - /** - * 报文携带的数据 - */ - public T data; -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/RoadWayIsLockRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/RoadWayIsLockRequest.java deleted file mode 100644 index 7e6852ec..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/RoadWayIsLockRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 巷道锁定解锁请求参数类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class RoadWayIsLockRequest { - /** - * 楼层编号 - */ - public int floorNo; - /** - * 是否锁定 - * true代表锁定,false代表解锁 - */ - public String isLock; - /** - * 巷道编号 - * 需要解锁或锁定的巷道编号。具体巷道编号需要双方商定 - */ - public String roadwayNo; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/RoadWayIsLockResponse.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/RoadWayIsLockResponse.java deleted file mode 100644 index 6770a9bc..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/RoadWayIsLockResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -/** - * 巷道锁定解锁响应参数Data类 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Data -public class RoadWayIsLockResponse extends BaseResponseData { -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/putEmptyPalletRequest.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/putEmptyPalletRequest.java deleted file mode 100644 index 2d921b86..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/liKuData/putEmptyPalletRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.nl.acs.ext.wms.liKuData; - -import lombok.Data; - -@Data -public class putEmptyPalletRequest { - - String deviceId; - - String orderId; - - String type; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToLiKuController.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToLiKuController.java deleted file mode 100644 index 494393c0..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToLiKuController.java +++ /dev/null @@ -1,114 +0,0 @@ - -package org.nl.acs.ext.wms.rest; - - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.ext.wms.liKuData.*; -import org.nl.acs.ext.wms.service.AcsToLiKuService; -import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.modules.logging.InterfaceLogType; -import org.nl.modules.logging.annotation.Log; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -/** - * @author ludj - * @date 2021-07-21 - **/ -@RestController -@RequiredArgsConstructor -@Api(tags = "立库接口") -@RequestMapping("/api/liku") -@Slf4j -public class AcsToLiKuController { - private final AcsToLiKuService acsToLiKuService; - - @PostMapping("/inStore") - @Log(value = "下发立库入库任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("下发立库物料入库任务") - public ResponseEntity inStore(@RequestBody InStoreRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.inStore(requestParam), HttpStatus.OK); - } - - @PostMapping("/outStore") - @Log(value = "下发立库出库任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("下发立库出库任务") - public ResponseEntity outStore(@RequestBody OutStoreRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.outStore(requestParam), HttpStatus.OK); - } - - @PostMapping("/emptyVehicleOutStore") - @Log(value = "下发立库空盘出库任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("下发立库空盘出库任务") - public ResponseEntity emptyVehicleOutStore(@RequestBody EmptyVehicleOutStoreRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.emptyVehicleOutStore(requestParam), HttpStatus.OK); - } - - @PostMapping("/moveStore") - @Log(value = "下发立库移库任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("下发立库移库任务") - public ResponseEntity moveStore(@RequestBody MoveStoreRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.moveStore(requestParam), HttpStatus.OK); - } - - @PostMapping("/inStoreReset") - @Log(value = "下发立库入库任务调整",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("下发立库入库任务调整") - public ResponseEntity inStoreReset(@RequestBody InStoreResetRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.inStoreReset(requestParam), HttpStatus.OK); - } - - @PostMapping("/moveStoreReset") - @Log(value = "下发立库移库任务调整",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("下发立库移库任务调整") - public ResponseEntity moveStoreReset(@RequestBody MoveStoreResetRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.moveStoreReset(requestParam), HttpStatus.OK); - } - - @PostMapping("/roadWayIsLock") - @Log(value = "下发立库巷道锁定或解锁",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("向立库下发巷道锁定或解锁") - public ResponseEntity roadWayIsLock(@RequestBody RoadWayIsLockRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.roadWayIsLock(requestParam), HttpStatus.OK); - } - - @PostMapping("/cancelTask") - @Log(value = "取消立库任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("取消立库任务") - public ResponseEntity cancelTask(@RequestBody CancelTaskRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.cancelTask(requestParam), HttpStatus.OK); - } - - @PostMapping("/queryCarStatus") - @Log(value = "查询四向车状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("查询四向车状态") - public ResponseEntity queryCarStatus(@RequestBody DeviceStatusRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.queryCarDeviceStatus(requestParam), HttpStatus.OK); - } - - @PostMapping("/queryTsjStatus") - @Log(value = "查询提升机状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("查询提升机状态") - public ResponseEntity queryTsjStatus(@RequestBody DeviceStatusRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.queryTsjDeviceStatus(requestParam), HttpStatus.OK); - } - - @PostMapping("/querySsxStatus") - @Log(value = "查询提升机状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LK) - @ApiOperation("查询提升机状态") - public ResponseEntity querySsxStatus(@RequestBody DeviceStatusRequest requestParam) { - return new ResponseEntity<>(acsToLiKuService.queryTsjDeviceStatus(requestParam), HttpStatus.OK); - } - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java index 35965e4a..b1f50492 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java @@ -8,10 +8,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; -import org.nl.acs.ext.wms.data.LiKuApplyTaskRequest; import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.modules.logging.InterfaceLogType; import org.nl.modules.logging.annotation.Log; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -35,43 +32,50 @@ public class AcsToWmsController { private final AcsToWmsService acstowmsService; @PostMapping("/applyTask") - @Log(value = "ACS向WMS申请任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) - @ApiOperation("ACS向WMS申请任务") - public ResponseEntity applyTaskToWms(@RequestBody JSONObject jo) { - return new ResponseEntity<>(acstowmsService.applyTaskToWms(jo), HttpStatus.OK); + @Log("向WMS申请任务") + @ApiOperation("向WMS申请任务") + public ResponseEntity applyTaskToWms(@RequestBody String device_code, String container_code, int height, int weight) { + return new ResponseEntity<>(acstowmsService.applyTaskToWms(device_code, container_code, height, weight), HttpStatus.OK); } @PostMapping("/taskStatusFeedback") - @Log(value = "ACS向WMS反馈任务状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) - @ApiOperation("ACS向WMS反馈任务状态") + @Log("向WMS反馈任务状态") + @ApiOperation("向WMS反馈任务状态") public ResponseEntity feedbackTaskStatusToWms(@RequestBody Map whereJson) { JSONArray data = JSONArray.parseArray(String.valueOf(whereJson)); return new ResponseEntity<>(acstowmsService.feedbackTaskStatusToWms(data), HttpStatus.OK); } + @PostMapping("/pointStatusFeedback") + @Log("向WMS反馈点位状态") + @ApiOperation("向WMS反馈点位状态") + public ResponseEntity feedbackPointStatusToWms(@RequestBody Map whereJson) { + return new ResponseEntity<>(acstowmsService.feedbackPointStatusToWms(whereJson), HttpStatus.OK); + } + @PostMapping("/feedbackAgvStatus") - @Log(value = "反馈AGV设备状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) + @Log("反馈AGV设备状态") @ApiOperation("反馈AGV设备状态") public ResponseEntity feedbackAgvStatus(@RequestBody String device_code, String error, String error_message) { return new ResponseEntity<>(acstowmsService.feedbackAgvStatus(device_code, error, error_message), HttpStatus.OK); } @PostMapping("/feedbackAgv") - @Log(value = "反馈AGV设备信息",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) + @Log("反馈AGV设备信息") @ApiOperation("反馈AGV设备信息") public ResponseEntity feedbackAgv(@RequestBody JSONArray from) { return new ResponseEntity<>(acstowmsService.feedbackAgv(from), HttpStatus.OK); } @PostMapping("/feedbackDeviceStatus") - @Log(value = "反馈设备状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) + @Log("反馈设备状态") @ApiOperation("反馈设备状态") public ResponseEntity feedbackDeviceStatus(@RequestBody String device_code, String code, String value) { return new ResponseEntity<>(acstowmsService.feedbackDeviceStatus(device_code, code, value), HttpStatus.OK); } @PostMapping("/feedbackOrderStatus") - @Log(value = "ACS强制完成向WMS反馈",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) + @Log("acs强制完成向wms反馈") @ApiOperation("acs强制完成向wms反馈") public ResponseEntity feedbackOrderStatus(@RequestBody JSONObject param) { return new ResponseEntity<>(acstowmsService.feedbackOrderStatus(param), HttpStatus.OK); @@ -79,30 +83,30 @@ public class AcsToWmsController { @PostMapping("/applyInCacheLineTask") - @Log(value = "ACS申请缓存线入库任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) + @Log("ACS申请缓存线入库任务") @ApiOperation("ACS申请缓存线入库任务") public ResponseEntity applyInCacheLineTask(@RequestBody JSONObject param) { return new ResponseEntity<>(acstowmsService.applyInCacheLineTask(param), HttpStatus.OK); } @PostMapping("/applyOutCacheLineTask") - @Log(value = "ACS系统申请出库任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) + @Log("ACS系统申请出库任务") @ApiOperation("ACS系统申请出库任务") public ResponseEntity applyOutCacheLineTask(@RequestBody JSONObject param) { return new ResponseEntity<>(acstowmsService.applyOutCacheLineTask(param), HttpStatus.OK); } - @PostMapping("/applyLabelingAndBindingRequest") - @Log(value = "ACS系统申请贴标、捆扎",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) - @ApiOperation("ACS系统申请贴标、捆扎") - public ResponseEntity applyLabelingAndBindingRequest(@RequestBody ApplyLabelingAndBindingRequest param) { - return new ResponseEntity<>(acstowmsService.applyLabelingAndBindingRequest(param), HttpStatus.OK); + @PostMapping("/feedDeviceStatusType") + @Log("向wms反馈设备状态") + @ApiOperation("向wms反馈设备状态") + public ResponseEntity feedDeviceStatusType(@RequestBody JSONObject param) { + return new ResponseEntity<>(acstowmsService.feedDeviceStatusType(param), HttpStatus.OK); } - @PostMapping("/liKuApplyTaskRequest") - @Log(value = "立库申请任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) - @ApiOperation("立库申请任务") - public ResponseEntity liKuApplyTaskRequest(@RequestBody LiKuApplyTaskRequest param) { - return new ResponseEntity<>(acstowmsService.liKuApplyTaskRequest(param), HttpStatus.OK); + @PostMapping("/feedOrderRealQty") + @Log("向wms订单实时数量") + @ApiOperation("向wms订单实时数量") + public ResponseEntity feedOrderRealQty(@RequestBody JSONObject param) { + return new ResponseEntity<>(acstowmsService.feedOrderRealQty(param), HttpStatus.OK); } } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/LiKuToACSController.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/LiKuToACSController.java deleted file mode 100644 index e140f01b..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/LiKuToACSController.java +++ /dev/null @@ -1,68 +0,0 @@ - -package org.nl.acs.ext.wms.rest; - - -import cn.dev33.satoken.annotation.SaIgnore; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import jdk.nashorn.internal.ir.annotations.Ignore; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.ext.wms.liKuData.*; -import org.nl.acs.ext.wms.service.AcsToLiKuService; -import org.nl.acs.ext.wms.service.LiKuToAcsService; -import org.nl.modules.logging.InterfaceLogType; -import org.nl.modules.logging.annotation.Log; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author wangs - * @date 2021-07-21 - **/ -@RestController -@RequiredArgsConstructor -@Api(tags = "立库接口") -@RequestMapping("/api/likuToACS") -@Slf4j -public class LiKuToACSController { - private final LiKuToAcsService liKuToAcsService; - - @SaIgnore - @PostMapping("/inStoreReport") - @Log(value = "立库反馈入库任务状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LK_TO_ACS) - @ApiOperation("立库反馈入库任务状态") - public ResponseEntity inStoreReport(@RequestBody InStoreReportRequest requestParam) throws Exception { - return new ResponseEntity<>(liKuToAcsService.inStoreReport(requestParam), HttpStatus.OK); - } - - @SaIgnore - @PostMapping("/outStoreReport") - @Log(value = "立库反馈出库任务状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LK_TO_ACS) - @ApiOperation("立库反馈出库任务状态") - public ResponseEntity outStoreReport(@RequestBody OutStoreReportRequest requestParam) throws Exception { - return new ResponseEntity<>(liKuToAcsService.outStoreReport(requestParam), HttpStatus.OK); - } - - @SaIgnore - @PostMapping("/moveStoreReport") - @Log(value = "立库反馈移库任务状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LK_TO_ACS) - @ApiOperation("立库反馈移库任务状态") - public ResponseEntity moveStoreReport(@RequestBody MoveStoreReportRequest requestParam) throws Exception { - return new ResponseEntity<>(liKuToAcsService.moveStoreReport(requestParam), HttpStatus.OK); - } - - @SaIgnore - @PostMapping("/putEmptyPallet") - @Log(value = "立库请求放空盘",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LK_TO_ACS) - @ApiOperation("立库请求放空盘") - public ResponseEntity putEmptyPallet(@RequestBody putEmptyPalletRequest requestParam) throws Exception { - return new ResponseEntity<>(liKuToAcsService.putEmptyPallet(requestParam), HttpStatus.OK); - } - - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java index b004859c..2e7479db 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java @@ -2,15 +2,12 @@ package org.nl.acs.ext.wms.rest; -import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.ext.wms.data.CreateTaskResponse; import org.nl.acs.ext.wms.service.WmsToAcsService; -import org.nl.modules.logging.InterfaceLogType; import org.nl.modules.logging.annotation.Log; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -32,73 +29,73 @@ public class WmsToAcsController { private final WmsToAcsService wmstoacsService; @PostMapping("/task") - @Log(value = "ACS接收WMS任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) + @Log("接收WMS任务") @ApiOperation("接收WMS任务") - @SaIgnore public ResponseEntity createFromWms(@RequestBody String whereJson) { - return new ResponseEntity<>(wmstoacsService.crateTask(whereJson), HttpStatus.OK); + return new ResponseEntity<>(wmstoacsService.createFromWms(whereJson), HttpStatus.OK); } @PostMapping("/cancelTask") - @Log(value = "WMS取消任务",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) + @Log("WMS取消任务") @ApiOperation("WMS取消任务") - @SaIgnore public ResponseEntity cancelFromWms(@RequestBody String whereJson) throws Exception { return new ResponseEntity<>(wmstoacsService.cancelFromWms(whereJson), HttpStatus.OK); } @PostMapping("/updateDeviceGoodsFromWms") - @Log(value = "WMS修改点位状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) + @Log("WMS修改点位状态") @ApiOperation("WMS修改点位状态") public ResponseEntity updateDeviceGoodsFromWms(@RequestBody String whereJson) { return new ResponseEntity<>(wmstoacsService.updateDeviceGoodsFromWms(whereJson), HttpStatus.OK); } @PostMapping("/areaControl") - @Log(value = "区域控制",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) + @Log("区域控制") @ApiOperation("区域控制") public ResponseEntity areaControl(@RequestBody JSONObject whereJson) { return new ResponseEntity<>(wmstoacsService.areaControl(whereJson), HttpStatus.OK); } @PostMapping("/action") - @Log(value = "WMS下发点位信号",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) - @ApiOperation("WMS下发点位信号") - @SaIgnore + @Log("下发动作") + @ApiOperation("WMS修改点位状态") public ResponseEntity putAction(@RequestBody String whereJson) throws Exception { return new ResponseEntity<>(wmstoacsService.putAction(whereJson), HttpStatus.OK); } @PostMapping("/querydevice") -// @Log(value = "WMS查询设备状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) - @ApiOperation("WMS查询设备状态") - @SaIgnore + @Log("查询设备状态") + @ApiOperation("查询设备状态") public ResponseEntity queryDevice(@RequestBody String whereJson) throws Exception { return new ResponseEntity<>(wmstoacsService.queryDevice(whereJson), HttpStatus.OK); } + @PostMapping("/order") + @Log("wms下发acs工单") + @ApiOperation("wms下发acs工单") + public ResponseEntity actionOrder(@RequestBody String whereJson){ + return new ResponseEntity<>(wmstoacsService.actionOrder(whereJson), HttpStatus.OK); + } + + @PostMapping("/orderStatusUpdate") + @Log("工单状态变更") + @ApiOperation("工单状态变更") + public ResponseEntity orderStatusUpdate(@RequestBody String whereJson){ + return new ResponseEntity<>(wmstoacsService.orderStatusUpdate(whereJson), HttpStatus.OK); + } + @PostMapping("/queryDeviceDBValue") - @Log(value = "WMS查询设备DB值",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) - @ApiOperation("WMS查询设备DB值") - @SaIgnore + @Log("查询设备DB值") + @ApiOperation("查询设备DB值") public ResponseEntity queryDeviceDBValue(@RequestBody String whereJson){ return new ResponseEntity<>(wmstoacsService.queryDeviceDBValue(whereJson), HttpStatus.OK); } - - @PostMapping("/putPlusPullAction") - @Log(value = "WMS下发插拔轴动作",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) - @ApiOperation("WMS下发插拔轴动作") - @SaIgnore - public ResponseEntity putPlusPullAction(@RequestBody String whereJson){ - return new ResponseEntity<>(wmstoacsService.putPlusPullAction(whereJson), HttpStatus.OK); + @PostMapping("/replaceDevice") + @Log("工单更换设备") + @ApiOperation("工单更换设备") + public ResponseEntity replaceDevice(@RequestBody String whereJson){ + return new ResponseEntity<>(wmstoacsService.replaceDevice(whereJson), HttpStatus.OK); } - @PostMapping("/updateTask") - @Log(value = "WMS更新任务点位状态",isInterfaceLog = true,interfaceLogType= InterfaceLogType.LMS_TO_ACS) - @ApiOperation("WMS更新任务点位状态") - @SaIgnore - public ResponseEntity updateTask(@RequestBody String whereJson){ - return new ResponseEntity<>(wmstoacsService.updateTask(whereJson), HttpStatus.OK); - } } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToLiKuService.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToLiKuService.java deleted file mode 100644 index 60c427e7..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToLiKuService.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.nl.acs.ext.wms.service; - -import com.alibaba.fastjson.JSONObject; -import org.nl.acs.ext.wms.liKuData.*; -import org.nl.acs.instruction.service.dto.Instruction; - -/** - * @author: geng by - * @createDate: 2022/11/24 - */ -public interface AcsToLiKuService { - - - public Resp sendInst(String type, Instruction inst); - - /** - * 入库任务下发 - * @param requestParam - * @return - */ - public Resp inStore(InStoreRequest requestParam); - - /** - * 出库任务下发 - * @param requestParam - * @return - */ - public Resp outStore(OutStoreRequest requestParam); - - /** - * 空托盘出库任务下发 - * @param requestParam - * @return - */ - public Resp emptyVehicleOutStore(EmptyVehicleOutStoreRequest requestParam); - - - /** - * 移库任务下发 - * @param requestParam - * @return - */ - public Resp moveStore(MoveStoreRequest requestParam); - - - /** - * 入库任务调整 - * @param requestParam - * @return - */ - public Resp inStoreReset(InStoreResetRequest requestParam); - - - /** - * 移库任务调整 - * @param requestParam - * @return - */ - public Resp moveStoreReset(MoveStoreResetRequest requestParam); - - /** - * 巷道锁定与解锁 - * @return - */ - public Resp roadWayIsLock(RoadWayIsLockRequest requestParam); - - - /** - *取消任务 - * @return - */ - public Resp cancelTask(CancelTaskRequest requestParam); - - /** - *查询小车设备状态 - * @return - */ - public Resp queryCarDeviceStatus(DeviceStatusRequest requestParam); - - /** - *查询tsj设备状态 - * @return - */ - public Resp queryTsjDeviceStatus(DeviceStatusRequest requestParam); - - /** - *查询ssx设备状态 - * @return - */ - public Resp querySsxDeviceStatus(DeviceStatusRequest requestParam); -} - - diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java index 62c53390..8f95b8d1 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java @@ -3,14 +3,15 @@ package org.nl.acs.ext.wms.service; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import org.nl.acs.ext.wms.data.*; + +import java.util.Map; public interface AcsToWmsService { /** * ACS向WMS申请任务 */ - String applyTaskToWms(JSONObject jo); + String applyTaskToWms(String device_code, String container_code, int height, int weight); /** * 向WMS反馈任务状态 @@ -19,9 +20,35 @@ public interface AcsToWmsService { */ public HttpResponse feedbackTaskStatusToWms(JSONArray arr); + /** + * 向WMS反馈点位状态 + * + * @param jsonObject 条件 + * @return Map + */ + Map feedbackPointStatusToWms(Map jsonObject); + + /** + * 向WMS获取设备状态 + * + * @return + */ + JSONArray getDeviceStatusToWms(); + + /** + * 请求信号交互 + * + * @param + * @return + */ + public HttpResponse requestSignalInteraction(String device_code, String vehicle_code, String action); public String requestTaskAgain(String address, String task_id, String vehicle_code); + public String apply_InEmpty(String device_code, String type, String quantity, String pallet); + + public String apply_OutEmpty(String device_code); + /** * 反馈AGV设备状态 * @@ -91,19 +118,12 @@ public interface AcsToWmsService { HttpResponse applyOutCacheLineTask(JSONObject param); /** - * 申请捆扎、贴标 + * 向wms反馈设备状态 * * @param param * @return */ - ApplyLabelingAndBindingResponse applyLabelingAndBindingRequest(ApplyLabelingAndBindingRequest param); - - LiKuApplyTakResponse liKuApplyTaskRequest(LiKuApplyTaskRequest liKuApplyTaskRequest); - - UpdateLKTaskResponse updateLKTaskRequest(UpdateLKTaskRequest updateLKTaskRequest); - - // 输送线有货变成无货时向lms请求 - HttpResponse shipDeviceUpdate(JSONObject param); + HttpResponse feedDeviceStatusType(JSONObject param); /** * 向wms订单实时数量 @@ -112,12 +132,4 @@ public interface AcsToWmsService { * @return */ HttpResponse feedOrderRealQty(JSONObject param); - - /** - * 向wms反馈设备状态 - * - * @param param - * @return - */ - HttpResponse feedDeviceStatusType(JSONObject param); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/LiKuToAcsService.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/LiKuToAcsService.java deleted file mode 100644 index b7394808..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/LiKuToAcsService.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.nl.acs.ext.wms.service; - -import org.nl.acs.ext.wms.liKuData.*; - -/** - * @author: wangs - * @createDate: 2022/11/24 - */ -public interface LiKuToAcsService { - - /** - * 入库任务上报 - * @param requestParam - * @return - */ - public Resp inStoreReport(InStoreReportRequest requestParam) throws Exception; - - /** - * 出库任务上报 - * @param requestParam - * @return - */ - public Resp outStoreReport(OutStoreReportRequest requestParam) throws Exception; - - /** - * 移库任务上报 - * @param requestParam - * @return - */ - public Resp moveStoreReport(MoveStoreReportRequest requestParam) throws Exception; - - - /** - * 移库任务上报 - * @param requestParam - * @return - */ - public Resp putEmptyPallet(putEmptyPalletRequest requestParam) throws Exception; - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java index 7890352d..506b7b32 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java @@ -3,28 +3,25 @@ package org.nl.acs.ext.wms.service; import com.alibaba.fastjson.JSONObject; -import org.nl.acs.ext.wms.data.CancelTaskResponse; -import org.nl.acs.ext.wms.data.CreateTaskResponse; -import org.nl.acs.ext.wms.data.PutActionResponse; import java.util.Map; public interface WmsToAcsService { - /** * 创建任务 - * @param whereJson + * + * @param jsonObject 条件 * @return */ - CreateTaskResponse crateTask(String whereJson); - + Map createFromWms(String jsonObject); /** * 取消任务 * * @param jsonObject 条件 + * @return Map */ - CancelTaskResponse cancelFromWms(String jsonObject) throws Exception; + Map cancelFromWms(String jsonObject) throws Exception; /** * 修改设置有无货属性 @@ -48,7 +45,7 @@ public interface WmsToAcsService { * @param jsonObject 条件 * @return Map */ - PutActionResponse putAction(String jsonObject) throws Exception; + Map putAction(String jsonObject) throws Exception; /** * 查询设备状态 @@ -58,6 +55,20 @@ public interface WmsToAcsService { */ Map queryDevice(String jsonObject) throws Exception; + /** + * wms下发工单 + * @param whereJson + * @return + */ + Map actionOrder(String whereJson); + + /** + * 工单状态变更 + * @param whereJson + * @return + */ + Map orderStatusUpdate(String whereJson); + /** * 查询设备DB值 * @param whereJson @@ -65,31 +76,11 @@ public interface WmsToAcsService { */ Map queryDeviceDBValue(String whereJson); - - /** - * ACS系统在获取空的托盘号 + * 工单更换设备 * @param whereJson * @return */ - Map querydevice(String whereJson); - - - /** - * 下发插拔轴动作 - * - * @param whereJson 条件 - * @return Map - */ - Map putPlusPullAction(String whereJson); - - - /** - * 更新任务点位状态 - * - * @param whereJson 条件 - * @return Map - */ - Map updateTask(String whereJson); + Map replaceDevice(String whereJson); } 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 deleted file mode 100644 index 1bdb2e8e..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToLiKuServiceImpl.java +++ /dev/null @@ -1,289 +0,0 @@ -package org.nl.acs.ext.wms.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.AcsConfig; -import org.nl.acs.device.address.service.AddressService; -import org.nl.acs.ext.wms.RespUtil; -import org.nl.acs.ext.wms.AcsUtil; -import org.nl.acs.ext.wms.liKuData.*; -import org.nl.acs.ext.wms.service.AcsToLiKuService; -import org.nl.acs.instruction.service.dto.Instruction; -import org.nl.modules.system.service.ParamService; -import org.nl.modules.wql.util.SpringContextHolder; -import org.slf4j.MDC; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -/** - * 立库WCS接口 - * - * @author: geng by - * @createDate: 2022/11/24 - */ -@Service -@RequiredArgsConstructor -@Slf4j -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 inStore(InStoreRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - String api = addressService.findByCode("inStore").getMethods_url(); - log.info("inStore-----输入参数{}", JSON.toJSONString(requestParam)); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("inStore-----输出参数{}", result); - return RespUtil.getResp(result, new InStoreResponse()); - } finally { - MDC.remove(log_file_type); - } - - } - - @Override - public Resp outStore(OutStoreRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("outStore-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("outStore").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("outStore-----输出参数{}", result); - return RespUtil.getResp(result, new OutStoreResponse()); - } finally { - MDC.remove(log_file_type); - } - - } - - @Override - public Resp emptyVehicleOutStore(EmptyVehicleOutStoreRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("emptyVehicleOutStore-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("emptyVehicleOutStore").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("emptyVehicleOutStore-----输出参数{}", result); - return RespUtil.getResp(result, new EmptyVehicleOutStoreResponse()); - } finally { - MDC.remove(log_file_type); - } - - } - - @Override - public Resp moveStore(MoveStoreRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("moveStore-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("moveStore").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("moveStore-----输出参数{}", result); - return RespUtil.getResp(result, new MoveStoreResponse()); - - } finally { - MDC.remove(log_file_type); - } - } - - @Override - public Resp inStoreReset(InStoreResetRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("inStoreReset-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("inStoreReset").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("inStoreReset-----输出参数{}", result); - return RespUtil.getResp(result, new InStoreResetResponse()); - } finally { - MDC.remove(log_file_type); - } - - } - - @Override - public Resp moveStoreReset(MoveStoreResetRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("moveStoreReset-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("moveStoreReset").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("moveStoreReset-----输出参数{}", result); - return RespUtil.getResp(result, new MoveStoreResetResponse()); - - } finally { - MDC.remove(log_file_type); - } - - } - - @Override - public Resp roadWayIsLock(RoadWayIsLockRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("roadWayIsLock-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("roadWayIsLock").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("roadWayIsLock-----输出参数{}", result); - return RespUtil.getResp(result, new RoadWayIsLockResponse()); - - } finally { - MDC.remove(log_file_type); - } - - } - - - @Override - public Resp cancelTask(CancelTaskRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("cancelTask-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("cancelTask").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("cancelTask-----输出参数{}", result); - return RespUtil.getResp(result, new CancelTaskResponse()); - - } finally { - MDC.remove(log_file_type); - } - - } - - @Override - public Resp queryCarDeviceStatus(DeviceStatusRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("queryCarDeviceStatus-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("queryCarDeviceStatus").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("queryCarDeviceStatus-----输出参数{}", result); - return RespUtil.getResp(result, new DeviceStatusRequest()); - } finally { - MDC.remove(log_file_type); - } - } - - @Override - public Resp queryTsjDeviceStatus(DeviceStatusRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("queryTsjDeviceStatus-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("queryTsjDeviceStatus").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("queryTsjDeviceStatus-----输出参数{}", result); - return RespUtil.getResp(result, new DeviceStatusRequest()); - } finally { - MDC.remove(log_file_type); - } - } - - @Override - public Resp querySsxDeviceStatus(DeviceStatusRequest requestParam) { - try { - MDC.put(log_file_type, log_type); - log.info("querySsxDeviceStatus-----输入参数{}", JSON.toJSONString(requestParam)); - String api = addressService.findByCode("querySsxDeviceStatus").getMethods_url(); - String result = AcsUtil.notifyAcs(api, requestParam); - log.info("querySsxDeviceStatus-----输出参数{}", result); - return RespUtil.getResp(result, new DeviceStatusRequest()); - } finally { - MDC.remove(log_file_type); - } - } - - @Override - public Resp sendInst(String type, Instruction dto){ - AcsToLiKuService acsToLiKuService = SpringContextHolder.getBean(AcsToLiKuService.class); - ParamService paramService = SpringContextHolder.getBean(ParamService.class); - - Resp resp = new Resp(); - String instSendLk = paramService.findByCode(AcsConfig.INSTSENDLK).getValue(); - - try { - if(StrUtil.equals(instSendLk, "1")){ - if(StrUtil.equals(type,"1")){ - InStoreRequest request = new InStoreRequest(); - request.setFloorNo(Integer.parseInt(dto.getTo_z())); - request.setType(1); - request.setPalletCode(dto.getVehicle_code()); - request.setOrderId(dto.getInstruction_code()); - request.setSrcLocation(dto.getStart_point_code()); - request.setDestLocation(dto.getNext_point_code()); - resp = acsToLiKuService.inStore(request); - //空托入库 - } else if (StrUtil.equals(type,"2")){ - InStoreRequest request = new InStoreRequest(); - request.setFloorNo(Integer.parseInt(dto.getTo_z())); - request.setType(2); - request.setPalletCode(dto.getVehicle_code()); - request.setOrderId(dto.getInstruction_code()); - request.setSrcLocation(dto.getStart_point_code()); - request.setDestLocation(dto.getNext_point_code()); - resp = acsToLiKuService.inStore(request); - //出库 - } else if (StrUtil.equals(type,"3")){ - OutStoreRequest outStore = new OutStoreRequest(); - BaseStoreRequest baseReq = new BaseStoreRequest(); - List list = new ArrayList(); - baseReq.setOrderId(dto.getInstruction_code()); - baseReq.setSrcLocation(dto.getStart_point_code()); - baseReq.setDestLocation(dto.getNext_point_code()); - baseReq.setFloorNo(Integer.parseInt(dto.getFrom_z())); - baseReq.setPalletCode(dto.getVehicle_code()); - list.add(baseReq); - outStore.setOrderInfos(list); - outStore.setGroupId(dto.getInstruction_code()); - resp = acsToLiKuService.outStore(outStore); - //空托出库 - } else if (StrUtil.equals(type,"4")) { - EmptyVehicleOutStoreRequest emptyVehicleOutStoreRequest = new EmptyVehicleOutStoreRequest(); - emptyVehicleOutStoreRequest.setOrderId(dto.getInstruction_code()); - emptyVehicleOutStoreRequest.setFloorNo(Integer.parseInt(dto.getFrom_z())); - emptyVehicleOutStoreRequest.setSrcLocation(dto.getStart_point_code()); - emptyVehicleOutStoreRequest.setDestLocation(dto.getNext_point_code()); - emptyVehicleOutStoreRequest.setPalletCode(dto.getVehicle_code()); - resp = acsToLiKuService.emptyVehicleOutStore(emptyVehicleOutStoreRequest); - //转库 - } else if (StrUtil.equals(type,"5")) { - MoveStoreRequest moveStoreRequest = new MoveStoreRequest(); - BaseStoreRequest baseReq = new BaseStoreRequest(); - List list = new ArrayList(); - baseReq.setFloorNo(Integer.parseInt(dto.getFrom_z())); - baseReq.setPalletCode(dto.getVehicle_code()); - baseReq.setOrderId(dto.getInstruction_code()); - baseReq.setSrcLocation(dto.getStart_point_code()); - baseReq.setDestLocation(dto.getNext_point_code()); - list.add(baseReq); - moveStoreRequest.setGroupId(dto.getInstruction_code()); - moveStoreRequest.setOrderInfos(list); - resp = acsToLiKuService.moveStore(moveStoreRequest); - } - } else { - resp.setCode("0"); - resp.setResult("true"); - resp.setComment("ACS模拟下发成功"); - } - - } catch (Exception e) { - resp.setCode("1"); - resp.setResult("false"); - resp.setComment(e.getMessage()); - } - - return resp; - } - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java index 7416fb50..e4f5e580 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -14,18 +13,23 @@ import org.nl.acs.AcsConfig; import org.nl.acs.device.address.service.AddressService; import org.nl.acs.device.address.service.dto.AddressDto; import org.nl.acs.device.service.DeviceService; -import org.nl.acs.ext.wms.data.*; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.order.service.ProduceshiftorderService; import org.nl.acs.order.service.dto.ProduceshiftorderDto; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; +import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.system.service.ParamService; +import org.nl.modules.wql.core.bean.WQLObject; import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import java.util.Map; + @Service @RequiredArgsConstructor @Slf4j @@ -47,37 +51,44 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Autowired DeviceExecuteLogService logServer; - /*@Value("${acsTowms.token}")*/ +// @Value("${acsTowms.token}") public String token; - - private String log_file_type = "log_file_type"; - private String log_type = "ACS请求LMS"; + private String log_file_type="log_file_type"; + private String log_type="ACS请求WMS"; @Override - public String applyTaskToWms(JSONObject jo) { + public String applyTaskToWms(String device_code, String container_code, int height, int weight) { try { MDC.put(log_file_type, log_type); - log.info("applyTaskToWms-----输入参数{}", jo); String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); AddressDto addressDto = addressService.findByCode("applyTaskToWms"); String url = wmsurl + addressDto.getMethods_url(); + JSONObject param = new JSONObject(); + param.put("height", height); + param.put("weight", weight); + String parent_device_code = ""; + JSONObject jo = new JSONObject(); + JSONObject device_json = WQLObject.getWQLObject("acs_storage_cell").query("storage_code ='" + device_code + "'").uniqueResult(0); + if (!device_json.isEmpty()) { + parent_device_code = (String) device_json.get("parent_storage_cell") == null ? device_code : (String) device_json.get("parent_storage_cell"); + } + jo.put("device_code", parent_device_code); + jo.put("container_code", container_code); + jo.put("param", param); + log.info("applyTaskToWms-----请求参数{}", jo.toString()); HttpResponse result2 = null; try { + //{"status":400,"timestamp":"2021-10-22 16:32:22","message":"业务类型不正确!"} result2 = HttpRequest.post(url) .header("Authorization", token) .body(String.valueOf(jo)) .execute(); -// ////System.out.println(result2); + System.out.println(result2); } catch (Exception e) { String msg = e.getMessage(); - log.info("applyTaskToWms-----输出参数{}", msg); //网络不通 -// //System.out.println(msg); - } - if (ObjectUtil.isEmpty(result2)) { - log.info("applyTaskToWms-----输出参数{}", "返回结果为空"); - return null; + System.out.println(msg); } String type = ""; if (result2.getStatus() == 200) { @@ -87,16 +98,13 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } log.info("applyTaskToWms-----输出参数{}", result2.body()); return result2.body(); - - } finally { + }finally { MDC.remove(log_file_type); } - } @Override public HttpResponse feedbackTaskStatusToWms(JSONArray data) { - try { MDC.put(log_file_type, log_type); String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); @@ -118,16 +126,13 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { result2 = HttpRequest.post(wmsurl + methods_url) .header("Authorization", token).body(String.valueOf(data)) .execute(); -// //System.out.println(result2); + System.out.println(result2); } catch (Exception e) { String msg = e.getMessage(); //网络不通 -// //System.out.println(msg); - log.info("feedbackTaskStatusToWms-----输出参数{}", msg); - + System.out.println(msg); } - String type = ""; if (result2.getStatus() == 200) { type = "info"; @@ -138,7 +143,104 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONObject jo = JSONObject.parseObject(result2.body()); log.info("feedbackTaskStatusToWms-----输出参数{}", jo.toString()); return result2; - } finally { + }finally { + MDC.remove(log_file_type); + } + + } + + @Override + public Map feedbackPointStatusToWms(Map jsonObject) { + try { + MDC.put(log_file_type, log_type); + AddressDto addressDto = addressService.findByCode("feedbackPointStatusToWms"); + String methods_url = addressDto.getMethods_url(); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + String url = wmsurl + methods_url; + + JSONObject json = new JSONObject(); + json.put("task_uuid", jsonObject.get("device_code")); + json.put("task_code", jsonObject.get("point_status")); + json.put("task_status", jsonObject.get("point_mode")); + json.put("point_error", jsonObject.get("point_error")); + log.info("feedbackPointStatusToWms----请求参数{}", json.toString()); + try { + String result2 = HttpRequest.post(url) + .body(String.valueOf(json)) + .execute().body(); + System.out.println(result2); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + + } + + JSONObject resultJson = new JSONObject(); + resultJson.put("status", HttpStatus.OK); + resultJson.put("message", "操作成功"); + resultJson.put("data", new JSONArray()); + log.info("feedbackPointStatusToWms----输出参数{}", resultJson.toString()); + return resultJson; + }finally { + MDC.remove(log_file_type); + } + + } + + @Override + public JSONArray getDeviceStatusToWms() { + try { + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + AddressDto addressDto = addressService.findByCode("getDeviceStatusToWms"); + String methods_url = addressDto.getMethods_url(); + String url = wmsurl + methods_url; + String result = ""; + try { + result = HttpRequest.get(url) + .execute().body(); + System.out.println(result); + log.info("getTaskStatusToWms----返回参数{}", result); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + JSONArray jsonArray = JSONArray.parseArray(result); + return jsonArray; + }finally { + MDC.remove(log_file_type); + } + } + + @Override + public HttpResponse requestSignalInteraction(String device_code, String vehicle_code, String action) { + try { + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + JSONObject json = new JSONObject(); + json.put("device_code", device_code); + json.put("vehicle_code", vehicle_code); + json.put("action", action); + + AddressDto addressDto = addressService.findByCode("requestSignalInteraction"); + String methods_url = addressDto.getMethods_url(); + String url = wmsurl + methods_url; + HttpResponse result = null; + log.info("requestSignalInteraction----请求参数{}", json.toString()); + try { + result = HttpRequest.post(url) + .body(String.valueOf(json)) + .execute(); + System.out.println(result); + log.info("requestSignalInteraction----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + + } + return result; + }finally { MDC.remove(log_file_type); } @@ -147,433 +249,396 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override public String requestTaskAgain(String address, String task_id, String vehicle_code) { - String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - String device_code = deviceService.queryDeviceCodeByAddress(Integer.parseInt(address)); - JSONObject jo = new JSONObject(); - jo.put("task_id", task_id); - String result2 = null; - - AddressDto addressDto = addressService.findByCode("requestTaskAgain"); - String methods_url = addressDto.getMethods_url(); - String url = wmsurl + methods_url; - log.info("requestTaskAgain----请求参数{}", jo); - try { - result2 = HttpRequest.post(url) - .body(String.valueOf(jo)) - .execute().body(); - //System.out.println(result2); - log.info("requestTaskAgain----返回参数{}", result2); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - //System.out.println(msg); + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + String device_code = deviceService.queryDeviceCodeByAddress(Integer.parseInt(address)); + JSONObject jo = new JSONObject(); + jo.put("device_code", device_code); + jo.put("task_id", task_id); + jo.put("vehicle_code", vehicle_code); + String result2 = null; + AddressDto addressDto = addressService.findByCode("requestTaskAgain"); + String methods_url = addressDto.getMethods_url(); + String url = wmsurl + methods_url; + log.info("requestTaskAgain----请求参数{}", jo); + + try { + result2 = HttpRequest.post(url) + .body(String.valueOf(jo)) + .execute().body(); + System.out.println(result2); + log.info("requestTaskAgain----返回参数{}", result2); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result2; + }finally { + MDC.remove(log_file_type); } - return result2; + + } + + @Override + public String apply_InEmpty(String device_code, String type, String quantity, String container_code) { + try { + MDC.put(log_file_type, log_type); + + + if (StrUtil.isEmpty(container_code)) { + log.info("apply_InEmpty----空盘入库申请校验失败,{}{}", device_code, "设备条码为空"); + throw new BadRequestException("地址对应设备未找到"); + } + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + JSONObject jo = new JSONObject(); + jo.put("device_code", device_code); + jo.put("type", type); + jo.put("quantity", quantity); + jo.put("container_code", container_code); + + String result2 = ""; + + AddressDto addressDto = addressService.findByCode("apply_InEmpty"); + String methods_url = addressDto.getMethods_url(); + String url = wmsurl + methods_url; + log.info("requestTaskAgain----请求参数{}", jo); + + try { + result2 = HttpRequest.post(url) + .header("Authorization", token) + .body(String.valueOf(jo)) + .execute().body(); + System.out.println(result2); + log.info("requestTaskAgain----返回参数{}", result2); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result2; + }finally { + MDC.remove(log_file_type); + } + + } + + @Override + public String apply_OutEmpty(String device_code) { + try { + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + JSONObject jo = new JSONObject(); + jo.put("device_code", device_code); + String result2 = ""; + + AddressDto addressDto = addressService.findByCode("apply_OutEmpty"); + String methods_url = addressDto.getMethods_url(); + String url = wmsurl + methods_url; + log.info("apply_OutEmpty----请求参数{}", jo); + try { + result2 = HttpRequest.post(url) + .header("Authorization", token) + .body(String.valueOf(jo)) + .execute().body(); + System.out.println(result2); + log.info("apply_OutEmpty----返回参数{}", result2); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result2; + }finally { + MDC.remove(log_file_type); + } + } @Override public HttpResponse feedbackAgvStatus(String device_code, String error, String error_message) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - - JSONObject json = new JSONObject(); - json.put("device_code", device_code); - json.put("error", error); - json.put("error_message", error_message); - - AddressDto addressDto = addressService.findByCode("feedbackAgvStatus"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - HttpResponse result = null; - log.info("feedbackAgvStatus----请求参数{}", json); - try { - result = HttpRequest.post(url) - .body(String.valueOf(json)) - .execute(); - System.out.println(result); - log.info("feedbackAgvStatus----返回参数{}", result); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - //System.out.println(msg); - } - return result; - } + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - @Override - public HttpResponse feedbackDeviceStatus(String device_code, String code, String value) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - - JSONObject json = new JSONObject(); - json.put("device_code", device_code); - json.put("back_time", DateUtil.format(DateUtil.date(), "yyyyMMddHHmmssSSS")); - JSONArray ja = new JSONArray(); - JSONObject jo = new JSONObject(); - jo.put("code", code); - jo.put("value", value); - ja.add(jo); - json.put("data", ja); - AddressDto addressDto = addressService.findByCode("feedbackDeviceStatus"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - HttpResponse result = null; - log.info("feedbackDeviceStatus----请求参数{}", json); - - try { - result = HttpRequest.post(url) - .body(String.valueOf(json)) - .execute(); - System.out.println(result); - log.info("feedbackDeviceStatus----返回参数{}", result); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - //System.out.println(msg); - } - return result; - } - - @Override - public HttpResponse feedbackAgv(JSONArray from) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - - AddressDto addressDto = addressService.findByCode("feedbackAgv"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - HttpResponse result = null; - log.info("feedbackAgv----请求参数{}", from); - - try { - result = HttpRequest.post(url) - .body(String.valueOf(from)) - .execute(); - System.out.println(result); - log.info("feedbackAgv----返回参数{}", result); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - //System.out.println(msg); - } - return result; - } - - @Override - public HttpResponse applyOpenOrCloseDoor(String device_code, String status) { - String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - JSONObject jo = new JSONObject(); - jo.put("device_code", device_code); - jo.put("status", status); - HttpResponse result = null; - log.info("applyOpenOrCloseDoor-----请求参数{}", jo.toString()); - - AddressDto addressDto = addressService.findByCode("applyOpenOrCloseDoor"); - String methods_url = addressDto.getMethods_url(); - try { - result = HttpRequest.post(wmsurl + methods_url) - .body(String.valueOf(jo)) - .execute(); - System.out.println(result); - log.info("applyOpenOrCloseDoor-----返回参数{}", result); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - //System.out.println(msg); - } - return result; - } - - @Override - public HttpResponse queryDoorsStatus() { - String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - - HttpResponse result = null; - log.info("queryDoorStatus-----请求"); - AddressDto addressDto = addressService.findByCode("queryDoorsStatus"); - String methods_url = addressDto.getMethods_url(); - try { - result = HttpRequest.get(wmsurl + methods_url) - .body("") - .execute(); - log.info("queryDoorStatus-----输出参数{}", result.body().toString()); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - //System.out.println(msg); - - } - return result; - } - - @Override - public HttpResponse feedbackOrderStatus(JSONObject param) { - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - String ext_order_id = param.getString("ext_order_id"); - String status = param.getString("status"); - String type1 = param.getString("type"); JSONObject json = new JSONObject(); - json.put("ext_order_id", ext_order_id); - json.put("status", status); - json.put("type", type1); - AddressDto addressDto = addressService.findByCode("feedbackOrderStatus"); + json.put("device_code", device_code); + json.put("error", error); + json.put("error_message", error_message); + + AddressDto addressDto = addressService.findByCode("feedbackAgvStatus"); String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; + String url = wmsurl + methods_url; HttpResponse result = null; - log.info("feedbackOrderStatus----请求参数{}", json); + log.info("feedbackAgvStatus----请求参数{}", json); + try { result = HttpRequest.post(url) .body(String.valueOf(json)) .execute(); - String type = ""; - if (result.getStatus() == 200) { - type = "info"; - } else { - type = "error"; - } - - log.info("feedbackOrderStatus----返回参数{}", result); + System.out.println(result); + log.info("feedbackAgvStatus----返回参数{}", result); } catch (Exception e) { String msg = e.getMessage(); //网络不通 - //System.out.println(msg); + System.out.println(msg); } return result; - + }finally { + MDC.remove(log_file_type); } - return null; + + } + + @Override + public HttpResponse feedbackDeviceStatus(String device_code, String code, String value) { + try { + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + + JSONObject json = new JSONObject(); + json.put("device_code", device_code); + json.put("back_time", DateUtil.format(DateUtil.date(), "yyyyMMddHHmmssSSS")); + JSONArray ja = new JSONArray(); + JSONObject jo = new JSONObject(); + jo.put("code", code); + jo.put("value", value); + ja.add(jo); + json.put("data", ja); + AddressDto addressDto = addressService.findByCode("feedbackDeviceStatus"); + String methods_url = addressDto.getMethods_url(); + String url = wmsurl + methods_url; + HttpResponse result = null; + log.info("feedbackDeviceStatus----请求参数{}", json); + + try { + result = HttpRequest.post(url) + .body(String.valueOf(json)) + .execute(); + System.out.println(result); + log.info("feedbackDeviceStatus----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; + }finally { + MDC.remove(log_file_type); + } + + } + + @Override + public HttpResponse feedbackAgv(JSONArray from) { + try { + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + + AddressDto addressDto = addressService.findByCode("feedbackAgv"); + String methods_url = addressDto.getMethods_url(); + String url = wmsurl + methods_url; + HttpResponse result = null; + log.info("feedbackAgv----请求参数{}", from); + + try { + result = HttpRequest.post(url) + .body(String.valueOf(from)) + .execute(); + System.out.println(result); + log.info("feedbackAgv----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; + }finally { + MDC.remove(log_file_type); + } + + } + + @Override + public HttpResponse applyOpenOrCloseDoor(String device_code, String status) { + try { + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + JSONObject jo = new JSONObject(); + jo.put("device_code", device_code); + jo.put("status", status); + HttpResponse result = null; + log.info("applyOpenOrCloseDoor-----请求参数{}", jo.toString()); + + AddressDto addressDto = addressService.findByCode("applyOpenOrCloseDoor"); + String methods_url = addressDto.getMethods_url(); + try { + result = HttpRequest.post(wmsurl + methods_url) + .body(String.valueOf(jo)) + .execute(); + System.out.println(result); + log.info("applyOpenOrCloseDoor-----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; + }finally { + MDC.remove(log_file_type); + } + + } + + @Override + public HttpResponse queryDoorsStatus() { + try { + MDC.put(log_file_type, log_type); + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + + HttpResponse result = null; + log.info("queryDoorStatus-----请求"); + AddressDto addressDto = addressService.findByCode("queryDoorsStatus"); + String methods_url = addressDto.getMethods_url(); + try { + result = HttpRequest.get(wmsurl + methods_url) + .body("") + .execute(); + log.info("queryDoorStatus-----输出参数{}", result.body().toString()); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + + } + return result; + }finally { + MDC.remove(log_file_type); + } + + } + + @Override + public HttpResponse feedbackOrderStatus(JSONObject param) { + try { + MDC.put(log_file_type, log_type); + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + String ext_order_id = param.getString("ext_order_id"); + String status = param.getString("status"); + String type1 = param.getString("type"); + JSONObject json = new JSONObject(); + json.put("ext_order_id", ext_order_id); + json.put("status", status); + json.put("type", type1); + AddressDto addressDto = addressService.findByCode("feedbackOrderStatus"); + String methods_url = addressDto.getMethods_url(); + String url = wmsurl + methods_url; + HttpResponse result = null; + log.info("feedbackOrderStatus----请求参数{}", json); + try { + result = HttpRequest.post(url) + .body(String.valueOf(json)) + .execute(); + String type = ""; + if (result.getStatus() == 200) { + type = "info"; + } else { + type = "error"; + } + + log.info("feedbackOrderStatus----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; + + } + return null; + }finally { + MDC.remove(log_file_type); + } + } @Override public HttpResponse applyInCacheLineTask(JSONObject param) { - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - // TODO 还没向地址表中添加 applyInCacheLineTask地址 - AddressDto addressDto = addressService.findByCode("applyInCacheLineTask"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - HttpResponse result = null; - log.info("feedbackOrderStatus----请求参数{}", param); - try { - result = HttpRequest.post(url) - .body(String.valueOf(param)) - .execute(); - String type = ""; - if (result.getStatus() == 200) { - type = "info"; - } else { - type = "error"; - } + try { + MDC.put(log_file_type, log_type); + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + // TODO 还没向地址表中添加 applyInCacheLineTask地址 + AddressDto addressDto = addressService.findByCode("applyInCacheLineTask"); + String methods_url = addressDto.getMethods_url(); + String url = wmsUrl + methods_url; + HttpResponse result = null; + log.info("feedbackOrderStatus----请求参数{}", param); + try { + result = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute(); + String type = ""; + if (result.getStatus() == 200) { + type = "info"; + } else { + type = "error"; + } - log.info("applyInCacheLineTask----返回参数{}", result); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - //System.out.println(msg); + log.info("applyInCacheLineTask----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; } - return result; + return null; + }finally { + MDC.remove(log_file_type); } - return null; + } @Override public HttpResponse applyOutCacheLineTask(JSONObject param) { - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - // TODO 还没向地址表中添加 applyOutCacheLineTask - AddressDto addressDto = addressService.findByCode("applyOutCacheLineTask"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - HttpResponse result = null; - log.info("feedbackOrderStatus----请求参数{}", param); - try { - result = HttpRequest.post(url) - .body(String.valueOf(param)) - .execute(); - String type = ""; - if (result.getStatus() == 200) { - type = "info"; - } else { - type = "error"; - } - - log.info("applyOutCacheLineTask----返回参数{}", result); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - //System.out.println(msg); - } - return result; - } - return null; - } - - @Override - public ApplyLabelingAndBindingResponse applyLabelingAndBindingRequest(ApplyLabelingAndBindingRequest param) { try { MDC.put(log_file_type, log_type); - ApplyLabelingAndBindingResponse applyLabelingAndBindingResponse = new ApplyLabelingAndBindingResponse(); if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - AddressDto addressDto = addressService.findByCode("applyLabelingAndBinding"); + // TODO 还没向地址表中添加 applyOutCacheLineTask + AddressDto addressDto = addressService.findByCode("applyOutCacheLineTask"); String methods_url = addressDto.getMethods_url(); String url = wmsUrl + methods_url; - log.info("ApplyLabelingAndBindingRequest----请求参数{}", param); + HttpResponse result = null; + log.info("feedbackOrderStatus----请求参数{}", param); try { -// String result = ""; - String result = HttpRequest.post(url) - .body(JSON.toJSONString(param)) - .execute().body(); - JSONObject jsonObject = JSONObject.parseObject(result); - log.info("ApplyLabelingAndBindingResponse----返回参数{}", result); - applyLabelingAndBindingResponse = JSONObject.toJavaObject(jsonObject, ApplyLabelingAndBindingResponse.class); - } catch (Exception e) { - JSONObject map = new JSONObject(); - map.put("status", 400); - map.put("message", e.getMessage()); - return JSONObject.toJavaObject(map, ApplyLabelingAndBindingResponse.class); - } - } - return applyLabelingAndBindingResponse; - } finally { - MDC.remove(log_file_type); - } - - - } - - @Override - public LiKuApplyTakResponse liKuApplyTaskRequest(LiKuApplyTaskRequest param) { - try { - MDC.put(log_file_type, log_type); - LiKuApplyTakResponse liKuApplyTakResponse = new LiKuApplyTakResponse(); - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - AddressDto addressDto = addressService.findByCode("liKuApplyTask"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - log.info("LiKuApplyTaskRequest----请求参数{}", param); - try { - String result = HttpRequest.post(url) - .body(JSON.toJSONString(param)) - .execute().body(); - JSONObject jsonObject = JSONObject.parseObject(result); - log.info("LiKuApplyTakResponse----返回参数{}", result); - liKuApplyTakResponse = JSONObject.toJavaObject(jsonObject, LiKuApplyTakResponse.class); - } catch (Exception e) { - JSONObject map = new JSONObject(); - map.put("status", 400); - map.put("message", e.getMessage()); - return JSONObject.toJavaObject(map, LiKuApplyTakResponse.class); - } - } - return liKuApplyTakResponse; - } finally { - MDC.remove(log_file_type); - } - - } - - - @Override - public UpdateLKTaskResponse updateLKTaskRequest(UpdateLKTaskRequest param) { - try { - MDC.put(log_file_type, log_type); - log.info("updateLKTaskRequest-----输入参数{}", param); - UpdateLKTaskResponse updateLKTaskResponse = new UpdateLKTaskResponse(); - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - AddressDto addressDto = addressService.findByCode("liKuApplyTask"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - try { - String result = HttpRequest.post(url) - .body(JSON.toJSONString(param)) - .execute().body(); - log.info("UpdateLKTaskResponse----返回参数{}", result); - - JSONObject jsonObject = JSONObject.parseObject(result); - updateLKTaskResponse = JSONObject.toJavaObject(jsonObject, UpdateLKTaskResponse.class); - } catch (Exception e) { - JSONObject map = new JSONObject(); - map.put("status", 400); - map.put("message", e.getMessage()); - return JSONObject.toJavaObject(map, UpdateLKTaskResponse.class); - } - } - - return updateLKTaskResponse; - } finally { - MDC.remove(log_file_type); - } - - } - - @Override - public HttpResponse shipDeviceUpdate(JSONObject param) { - try { - MDC.put(log_file_type, log_type); -// log.info("shipDeviceUpdate-----输入参数{}", param); - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - AddressDto addressDto = addressService.findByCode("shipDeviceUpdate"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - return HttpRequest - .post(url) - .body(param.toString()) - .execute(); - } - } catch (Throwable ignored) { - - } finally { - MDC.remove(log_file_type); - } - return null; - } - - @Override - public HttpResponse feedOrderRealQty(JSONObject param) { - try { - MDC.put(log_file_type, log_type); - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { - String order_code = param.getString("order"); - ProduceshiftorderDto produceshiftorderDto = produceshiftorderService.findByCode(order_code); - if (ObjectUtil.isEmpty(produceshiftorderDto)) { - return null; - } - if (!produceshiftorderDto.getOrder_status().equals("2") || !produceshiftorderDto.getOrder_status().equals("3")) { - String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - // TODO 还没向地址表中添加 feedDeviceStatusType - AddressDto addressDto = addressService.findByCode("feedOrderRealQty"); - String methods_url = addressDto.getMethods_url(); - String url = wmsUrl + methods_url; - HttpResponse result = null; - log.info("feedOrderRealQty----请求参数{}", param); - try { - result = HttpRequest.post(url) - .body(String.valueOf(param)) - .execute(); - String type = ""; - if (result.getStatus() == 200) { - type = "info"; - } else { - type = "error"; - } - log.info("feedOrderRealQty----返回参数{}", result); - } catch (Exception e) { - String msg = e.getMessage(); - //网络不通 - System.out.println(msg); + result = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute(); + String type = ""; + if (result.getStatus() == 200) { + type = "info"; + } else { + type = "error"; } - return result; + + log.info("applyOutCacheLineTask----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); } + return result; } return null; - } finally { + }finally { MDC.remove(log_file_type); } + } @Override @@ -612,4 +677,48 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } } + + @Override + public HttpResponse feedOrderRealQty(JSONObject param) { + try { + MDC.put(log_file_type, log_type); + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String order_code = param.getString("order"); + ProduceshiftorderDto produceshiftorderDto = produceshiftorderService.findByCode(order_code); + if (ObjectUtil.isEmpty(produceshiftorderDto)){ + return null; + } + if (!produceshiftorderDto.getOrder_status().equals("2") || !produceshiftorderDto.getOrder_status().equals("3")){ + String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + // TODO 还没向地址表中添加 feedDeviceStatusType + AddressDto addressDto = addressService.findByCode("feedOrderRealQty"); + String methods_url = addressDto.getMethods_url(); + String url = wmsUrl + methods_url; + HttpResponse result = null; + log.info("feedOrderRealQty----请求参数{}", param); + try { + result = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute(); + String type = ""; + if (result.getStatus() == 200) { + type = "info"; + } else { + type = "error"; + } + log.info("feedOrderRealQty----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; + } + } + return null; + }finally { + MDC.remove(log_file_type); + } + } + } 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 deleted file mode 100644 index 5cd3f9c8..00000000 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java +++ /dev/null @@ -1,304 +0,0 @@ -package org.nl.acs.ext.wms.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.device.address.service.AddressService; -import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; -import org.nl.acs.ext.wms.AcsUtil; -import org.nl.acs.ext.wms.RespUtil; -import org.nl.acs.ext.wms.data.UpdateLKTaskRequest; -import org.nl.acs.ext.wms.data.UpdateLKTaskResponse; -import org.nl.acs.ext.wms.liKuData.*; -import org.nl.acs.ext.wms.service.AcsToLiKuService; -import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.acs.ext.wms.service.LiKuToAcsService; -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.task.service.TaskService; -import org.nl.acs.task.service.dto.TaskDto; -import org.nl.modules.wql.util.SpringContextHolder; -import org.slf4j.MDC; -import org.springframework.stereotype.Service; - -/** - * 立库WCS接口 - * - * @author: wangs - * @createDate: 2022/11/24 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class LiKuToAcsServiceImpl implements LiKuToAcsService { - - private final AddressService addressService; - - private final TaskService taskService; - - private final InstructionService instructionService; - - private final AcsToWmsService acsToWmsService; - - private final AcsToLiKuService acsToLiKuService; - - - private String log_file_type="log_file_type"; - private String log_type="立库请求ACS"; - - //入库任务状态反馈 - @Override - public Resp inStoreReport(InStoreReportRequest requestParam) throws Exception { - - log.info("入库任务状态反馈-----输入参数{}", JSON.toJSONString(requestParam)); - String inst_code = requestParam.getOrderId(); - String status = requestParam.getState(); - String carNo = requestParam.getRobotId(); - Instruction inst = instructionService.findByCodeFromCache(inst_code); - if (ObjectUtil.isEmpty(inst)) { - InStoreReportResponse inStoreReportResponse = new InStoreReportResponse(); - inStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应指令"); - result.put("data", inStoreReportResponse ); - log.info("入库任务状态反馈-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new InStoreReportResponse()); - } - TaskDto task = taskService.findByCodeFromCache(inst.getTask_code()); - if (ObjectUtil.isEmpty(task)) { - InStoreReportResponse inStoreReportResponse = new InStoreReportResponse(); - inStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应任务"); - result.put("data", inStoreReportResponse ); - log.info("入库任务状态反馈-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new InStoreReportResponse()); - } - // 1 已接收 2 开始执行 3执行完成 4 5 取消 - if(StrUtil.equals(status,"1") || StrUtil.equals(status,"2") ){ - task.setTask_status("1"); - taskService.update(task); - inst.setInstruction_status("1"); - inst.setExecute_device_code(carNo); - inst.setCarno(carNo); - instructionService.update(inst); - } else if(StrUtil.equals(status,"3")){ - inst.setInstruction_status("2"); - instructionService.finish(inst.getInstruction_id()); - } else if(StrUtil.equals(status,"4")) { - - // 5 取消指令 - } else if(StrUtil.equals(status,"5")) { - - instructionService.cancel(inst.getInstruction_id()); - } - InStoreReportResponse inStoreReportResponse = new InStoreReportResponse(); - inStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "true"); - result.put("code", "0"); - result.put("comment", ""); - result.put("data", inStoreReportResponse ); - log.info("入库任务状态反馈-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new InStoreReportResponse()); - - } - - @Override - public Resp outStoreReport(OutStoreReportRequest requestParam) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("出库任务状态反馈-----输入参数{}", JSON.toJSONString(requestParam)); - String inst_code = requestParam.getOrderId(); - String status = requestParam.getState(); - String carNo = requestParam.getRobotId(); - Instruction inst = instructionService.findByCodeFromCache(inst_code); - if (ObjectUtil.isEmpty(inst)) { - OutStoreReportResponse outStoreReportResponse = new OutStoreReportResponse(); - outStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应指令"); - result.put("data", outStoreReportResponse ); - log.info("出库任务状态反馈-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new OutStoreReportResponse()); - } - TaskDto task = taskService.findByCodeFromCache(inst.getTask_code()); - if (ObjectUtil.isEmpty(task)) { - OutStoreReportResponse outStoreReportResponse = new OutStoreReportResponse(); - outStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应任务"); - result.put("data", outStoreReportResponse ); - log.info("出库任务状态反馈-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new OutStoreReportResponse()); - } - // 1 已接收 2 开始执行 3执行完成 4 阻挡 5 空洞 - if(StrUtil.equals(status,"1") || StrUtil.equals(status,"2") ){ - task.setTask_status("1"); - taskService.update(task); - inst.setInstruction_status("1"); - inst.setExecute_device_code(carNo); - inst.setCarno(carNo); - instructionService.update(inst); - } else if(StrUtil.equals(status,"3")){ -// inst.setInstruction_status("1"); -// instructionService.finish(inst.getInstruction_id()); - - if(StrUtil.equals(task.getTask_type(),"7") && StrUtil.equals(task.getStorage_task_type(),"4")){ - inst.setInstruction_status("2"); - instructionService.finish(inst.getInstruction_id()); - } else { - inst.setRemark("立库已反馈完成,待输送上报任务号"); - instructionService.update(inst); - } - - } else if(StrUtil.equals(status,"4")){ - //5 取消指令 - } else if(StrUtil.equals(status,"5")){ - instructionService.cancel(inst.getInstruction_id()); - - } - OutStoreReportResponse outStoreReportResponse = new OutStoreReportResponse(); - outStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "true"); - result.put("code", "0"); - result.put("comment", ""); - result.put("data", outStoreReportResponse ); - log.info("出库任务状态反馈-----输出参数{}", result); - - return RespUtil.getResp(result.toString(), new OutStoreReportResponse()); - } finally { - MDC.remove(log_file_type); - } - - - - - } - - //移库任务上报 - @Override - public Resp moveStoreReport(MoveStoreReportRequest requestParam) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("移库任务上报-----输入参数{}", JSON.toJSONString(requestParam)); - String inst_code = requestParam.getOrderId(); - String status = requestParam.getState(); - String carNo = requestParam.getRobotId(); - Instruction inst = instructionService.findByCodeFromCache(inst_code); - if (ObjectUtil.isEmpty(inst)) { - MoveStoreReportResponse moveStoreReportResponse = new MoveStoreReportResponse(); - moveStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应指令"); - result.put("data", moveStoreReportResponse ); - log.info("移库任务状态反馈-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new MoveStoreReportResponse()); - } - TaskDto task = taskService.findByCodeFromCache(inst.getTask_code()); - if (ObjectUtil.isEmpty(task)) { - MoveStoreReportResponse moveStoreReportResponse = new MoveStoreReportResponse(); - moveStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", "0"); - result.put("comment", "未找到对应任务"); - result.put("data", moveStoreReportResponse ); - log.info("移库任务状态反馈-----输出参数{}", result); - return RespUtil.getResp(result.toString(), new MoveStoreReportResponse()); - } // 1 已接收 2 开始执行 3执行完成 4 阻挡 5 空洞 - if(StrUtil.equals(status,"1") || StrUtil.equals(status,"2") ){ - task.setTask_status("1"); - taskService.update(task); - inst.setInstruction_status("1"); - inst.setExecute_device_code(carNo); - inst.setCarno(carNo); - instructionService.update(inst); - - } else if(StrUtil.equals(status,"3")){ - inst.setInstruction_status("2"); - instructionService.finish(inst.getInstruction_id()); - } else if(StrUtil.equals(status,"4")){ - - - } else if(StrUtil.equals(status,"5")){ - instructionService.cancel(inst.getInstruction_id()); - } - MoveStoreReportResponse moveStoreReportResponse = new MoveStoreReportResponse(); - moveStoreReportResponse.setOrderId(inst_code); - JSONObject result = new JSONObject(); - result.put("result", "true"); - result.put("code", "0"); - result.put("comment", ""); - result.put("data", moveStoreReportResponse ); - log.info("移库任务上报-----输出参数{}", result); - - return RespUtil.getResp(result.toString(), new MoveStoreReportResponse()); - } finally { - MDC.remove(log_file_type); - } - - } - - - - - //请求放空盘 - @Override - public Resp putEmptyPallet(putEmptyPalletRequest requestParam) throws Exception { -// try { - MDC.put(log_file_type, log_type); - log.info("请求放空盘-----输入参数{}", JSON.toJSONString(requestParam)); - String device_code = requestParam.getDeviceId(); - String type = requestParam.getType(); - DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); - Device device = appService.findDeviceByCode(device_code); -// SiemensConveyorDeviceDriver siemensConveyorDeviceDriver; -// JSONObject result = new JSONObject(); -// result.put("code", "0"); -// if (device.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { -// siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) device.getDeviceDriver(); -// if(StrUtil.equals(type,"1")){ -//// if((siemensConveyorDeviceDriver.getMode() ==2 || siemensConveyorDeviceDriver.getMode() ==7 )&& siemensConveyorDeviceDriver.getMove() ==0){ -//// result.put("result", "true"); -//// result.put("comment", ""); -//// } else { -//// result.put("result", "false"); -//// result.put("comment", "当前设备光电信号:"+siemensConveyorDeviceDriver.getMove()+",工作模式:"+siemensConveyorDeviceDriver.getMode()); -//// } -// } else if(StrUtil.equals(type,"2")){ -//// siemensConveyorDeviceDriver.writing("to_command","3"); -//// siemensConveyorDeviceDriver.writing("to_command","3"); -// -// result.put("result", "true"); -// result.put("comment", ""); -// } -// -// } -// log.info("请求放空盘-----输出参数{}", result); -// return RespUtil.getResp(result.toString(), new DeviceStatusResponse()); -// } finally { -// MDC.remove(log_file_type); -// } - return null; - - } - -} diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index 4cb0efb0..8abd1072 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -1,9 +1,8 @@ package org.nl.acs.ext.wms.service.impl; -import cn.hutool.core.util.IdUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -11,32 +10,41 @@ import lombok.extern.slf4j.Slf4j; import org.nl.acs.AcsConfig; import org.nl.acs.common.IDriverService; import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_engraving_machine.HailiangEngravingMachineDeviceDriver; +import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_packer_station.HailiangPackerStationDeviceDriver; +import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_special_device.HailiangSpecialDeviceDriver; +import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_stacking_station.HailiangStackingStationDriver; +import org.nl.acs.device_driver.basedriver.standard_autodoor.StandardAutodoorDeviceDriver; +import org.nl.acs.device_driver.basedriver.standard_conveyor_control.StandardCoveyorControlDeviceDriver; +import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_plcscanner.StandardCoveyorControlWithPlcScannerDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; +import org.nl.acs.device_driver.basedriver.standard_inspect_site.StandardInspectSiteDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; -import org.nl.acs.ext.wms.data.*; -import org.nl.acs.ext.wms.liKuData.Resp; -import org.nl.acs.ext.wms.service.AcsToLiKuService; +import org.nl.acs.device_driver.basedriver.standard_scanner.StandardScannerDeviceDriver; import org.nl.acs.ext.wms.service.WmsToAcsService; 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.DeviceExtraManageDto; +import org.nl.acs.order.service.ProduceshiftorderService; +import org.nl.acs.order.service.dto.ProduceshiftorderDto; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.system.service.ParamService; +import org.nl.modules.system.service.impl.ParamServiceImpl; +import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.exception.WDKException; import org.nl.modules.wql.util.SpringContextHolder; -import org.slf4j.MDC; import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.HashMap; +import java.math.BigDecimal; import java.util.List; import java.util.Map; @@ -52,26 +60,152 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { private final DeviceService deviceService; private final DeviceAppService deviceAppService; private final RouteLineService routeLineService; - private final AcsToLiKuService acsToLiKuService; - - - private String log_file_type="log_file_type"; - private String log_type="LMS请求ACS"; + private final ProduceshiftorderService produceshiftorderService; @Override - public CancelTaskResponse cancelFromWms(String param) throws Exception { - ParamService paramService = SpringContextHolder.getBean(ParamService.class); - InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); - JSONArray datas = JSONArray.parseArray(param); - CancelTaskResponse response = new CancelTaskResponse(); - JSONArray errArr = new JSONArray(); - for (int i = 0; i < datas.size(); i++) { - String data = datas.get(i).toString(); - CancelTaskRequest request = JsonUtl.format(param, CancelTaskRequest.class); + public Map createFromWms(String param) { + JSONArray tasks = JSONArray.parseArray(param); + JSONObject resultJson = new JSONObject(); + log.info("createFromWms--------------:输入参数:" + tasks.toString()); + try { + JSONArray errArr = new JSONArray(); + for (int i = 0; i < tasks.size(); i++) { + JSONObject task = tasks.getJSONObject(i); + String task_uuid = task.getString("task_uuid"); + String task_code = task.getString("task_code"); + String start_point_code = task.getString("start_device_code"); + String next_point_code = task.getString("next_device_code"); + String is_send = task.getString("is_send"); + String link_num = task.getString("link_num"); + String start_device_code = ""; + String next_device_code = ""; + if (StrUtil.isEmpty(task_code)) { + throw new WDKException("任务号不能为空"); + } + if (StrUtil.isEmpty(start_point_code)) { + throw new WDKException("起点不能为空"); + } + if (StrUtil.isEmpty(next_point_code)) { + throw new WDKException("终点不能为空"); + } - String task_uuid = request.getExt_task_id(); - String task_code = request.getTask_code(); - String vehicle_code = request.getVehicle_code(); + JSONObject start_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + start_point_code + "'").uniqueResult(0); + if (!ObjectUtil.isEmpty(start_device_json)) { + start_point_code = (String) start_device_json.get("parent_storage_code") == null ? start_point_code : (String) start_device_json.get("storage_code"); + } + JSONObject next_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + next_point_code + "'").uniqueResult(0); + if (!ObjectUtil.isEmpty(next_device_json)) { + next_point_code = (String) next_device_json.get("parent_storage_code") == null ? next_point_code : (String) next_device_json.get("storage_code"); + } + String priority = task.getString("priority"); + String vehicle_code = task.getString("vehicle_code"); + String vehicle_type = task.getString("vehicle_type"); + String route_plan_code = task.getString("route_plan_code"); + String task_type = task.getString("task_type"); + String remark = task.getString("remark"); + String params = task.getString("params"); + + if (start_point_code.indexOf("-") > 0) { + String str[] = start_point_code.split("-"); + start_device_code = str[0]; + } else { + start_device_code = start_point_code; + } + + if (next_point_code.indexOf("-") > 0) { + String str[] = next_point_code.split("-"); + next_device_code = str[0]; + } else { + next_device_code = next_point_code; + } + + if (StrUtil.isEmpty(route_plan_code)) { + route_plan_code = "normal"; + } +// List list = RouteLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); +// +// if (ObjectUtil.isEmpty(list)) { +// throw new WDKException("路由不通!"); +// } + TaskDto taskDto = taskService.findByCodeFromCache(task_code); + if (taskDto != null) { + throw new WDKException("不能存在相同的任务号!"); + } + if (!StrUtil.isEmpty(vehicle_code)) { + TaskDto vehicle_dto = taskService.findByContainer(vehicle_code); + if (vehicle_dto != null) { + throw new WDKException("已存在该载具号的任务!"); + } + } + JSONObject jo = new JSONObject(); + jo.put("task_code", task_code); + jo.put("start_point_code", start_point_code); + jo.put("next_point_code", next_point_code); + jo.put("start_parent_code", start_point_code); + jo.put("next_parent_code", next_point_code); + jo.put("start_device_code", start_device_code); + jo.put("next_device_code", next_device_code); + jo.put("priority", priority); + jo.put("is_send", is_send); + jo.put("link_num", link_num); + jo.put("vehicle_code", vehicle_code); + jo.put("vehicle_type", vehicle_type); + jo.put("remark", remark); + jo.put("params", params); + jo.put("task_type", StrUtil.isEmpty(task_type) ? 1 : Integer.parseInt(task_type)); + + if (!StrUtil.isEmpty(task_uuid)) { + jo.put("ext_task_id", task_uuid); + } + + TaskDto task_dto = jo.toJavaObject(TaskDto.class); + try { + taskService.create(task_dto); + } catch (Exception e) { + e.printStackTrace(); + JSONObject json = new JSONObject(); + json.put("task_code", task_code); + json.put("task_uuid", task_uuid); + json.put("message", e.getMessage()); + errArr.add(json); + } + } + if (ObjectUtil.isEmpty(errArr)) { + resultJson.put("status", 200); + } else { + resultJson.put("status", 400); + } + resultJson.put("errArr", errArr); + resultJson.put("message", "操作成功"); + resultJson.put("data", new JSONObject()); + log.info("createFromWms--------------:输出参数:" + resultJson.toString()); + + } catch (Exception e) { + resultJson.put("status", 400); + resultJson.put("errArr", e.getMessage()); + resultJson.put("message", e.getMessage()); + resultJson.put("data", new JSONObject()); + log.info("createFromWms--------------:输出参数:" + resultJson.toString()); + } + + + return resultJson; + } + + + @Override + public Map cancelFromWms(String param) throws Exception { + JSONArray tasks = JSONArray.parseArray(param); + ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); + InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); + log.debug(tasks.toString()); + log.info("cancelFromWms--------------:输入参数" + tasks.toString()); + for (int i = 0; i < tasks.size(); i++) { + JSONObject task = tasks.getJSONObject(i); + String task_uuid = task.getString("task_id"); + String task_code = task.getString("task_code"); + String vehicle_code = task.getString("vehicle_code"); + String params = task.getString("params"); if (StrUtil.isEmpty(task_uuid)) { throw new WDKException("任务标识不能为空"); @@ -92,17 +226,12 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } } - - if (ObjectUtil.isEmpty(errArr)) { - response.setStatus(200); - } else { - response.setStatus(400); - } - response.setMessage("success"); - response.setErrArr(errArr); - log.info("cancelFromWms--------------:输出参数:" + response); - - return response; + JSONObject resultJson = new JSONObject(); + resultJson.put("status", HttpStatus.OK); + resultJson.put("message", "操作成功"); + resultJson.put("data", new JSONObject()); + log.info("cancelFromWms--------------:输出参数" + resultJson.toString()); + return resultJson; } @Override @@ -144,126 +273,457 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } @Override - public PutActionResponse putAction(String jsonObject) throws Exception { - try { - MDC.put(log_file_type, log_type); - log.info("putAction--------------:输出参数" + jsonObject); - JSONArray datas = JSONArray.parseArray(jsonObject); - PutActionResponse response = new PutActionResponse(); - JSONArray errArr = new JSONArray(); - for (int i = 0; i < datas.size(); i++) { - String data = datas.get(i).toString(); - PutActionRequest request = JsonUtl.format(data, PutActionRequest.class); - String device_code = request.getDevice_code(); - String code = request.getCode(); - String value = request.getValue(); - Device device = deviceAppService.findDeviceByCode(device_code); - if (ObjectUtil.isEmpty(device)) { - throw new Exception("未找到对应设备:" + device_code); - } -// HongXiangStationDeviceDriver hongXiangStationDeviceDriver; -// LampThreecolorDeviceDriver lampThreecolorDeviceDriver; -// if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { -// hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); -// hongXiangStationDeviceDriver.writing(code, value); -// } -// if (device.getDeviceDriver() instanceof LampThreecolorDeviceDriver) { -// lampThreecolorDeviceDriver = (LampThreecolorDeviceDriver) device.getDeviceDriver(); -// lampThreecolorDeviceDriver.writing(code, value); -// } - - + public Map putAction(String jsonObject) throws Exception { + JSONArray datas = JSONArray.parseArray(jsonObject); + log.info("putAction--------------:输入参数" + datas.toString()); + for (int i = 0; i < datas.size(); i++) { + JSONObject data = datas.getJSONObject(i); + String device_code = data.getString("device_code"); + String code = data.getString("code"); + String value = data.getString("value"); + Device device = deviceAppService.findDeviceByCode(device_code); + if (ObjectUtil.isEmpty(device)) { + throw new Exception("未找到对应设备:" + device_code); } - response.setStatus(200); - response.setMessage("success"); - log.info("putAction--------------:输出参数:" + response); - return response; - } finally { - MDC.remove(log_file_type); } - + JSONObject resultJson = new JSONObject(); + resultJson.put("status", HttpStatus.OK); + resultJson.put("message", "操作成功"); + resultJson.put("data", new JSONObject()); + log.info("putAction--------------:输出参数" + resultJson.toString()); + return resultJson; } @Override public Map queryDevice(String jsonObject) throws Exception { - try { - MDC.put(log_file_type, log_type); -// log.info("queryDevice--------------:输入参数" + jsonObject.toString()); - JSONArray backja = new JSONArray(); - JSONArray datas = JSONArray.parseArray(jsonObject); + log.info("queryDevice--------------:输入参数" + jsonObject.toString()); + JSONArray backja = new JSONArray(); + JSONArray datas = JSONArray.parseArray(jsonObject); -// //AGV烘箱对接位 -// HongXiangStationDeviceDriver hongXiangStationDeviceDriver; -// //烘箱工位 -// HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; - //货梯对接线-带扫码器 - StandardCoveyorControlWithScannerDeviceDriver standardCoveyorControlWithScannerDeviceDriver; + //无光电普通站点 + StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; + //检测站点 + StandardInspectSiteDeviceDriver standardInspectSiteDevicedriver; + //控制点 + StandardCoveyorControlDeviceDriver standardCoveyorControlDeviceDriver; + //控制点-带扫码 + StandardCoveyorControlWithScannerDeviceDriver standardCoveyorControlWithScannerDeviceDriver; + //控制点-PLC扫码 + StandardCoveyorControlWithPlcScannerDeviceDriver standardCoveyorControlWithPlcScannerDeviceDriver; + //扫码器 + StandardScannerDeviceDriver standardScannerDeviceDriver; + //自动门 + StandardAutodoorDeviceDriver standardAutodoorDeviceDriver; - if (datas.size() == 0) { - throw new BadRequestException("缺少输入参数!"); - } - - for (int i = 0; i < datas.size(); i++) { + if (datas.size() == 0) { + List list = deviceService.findCacheDevice(); + for (int i = 0, j = list.size(); i < j; i++) { + Device device = list.get(i); + JSONObject obj = new JSONObject(); + String device_code = device.getDevice_code(); JSONObject jo = new JSONObject(); -// JSONObject data = datas.getJSONObject(i); -// String parent_device_code = data.getString("device_code"); -// String device_code = ""; -// JSONObject device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + parent_device_code + "'").uniqueResult(0); -// if (!ObjectUtil.isEmpty(device_json)) { -// device_code = (String) device_json.get("parent_storage_code") == null ? parent_device_code : (String) device_json.get("storage_code"); -// } -// Device device = deviceAppService.findDeviceByCode(device_code); -// if (ObjectUtil.isEmpty(device)) { -// throw new Exception("未找到对应设备:" + parent_device_code); -// } -// -// if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { -// hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); -// jo.put("device_code", parent_device_code); -// jo.put("mode", hongXiangStationDeviceDriver.getMode()); -// jo.put("move", hongXiangStationDeviceDriver.getMove()); -// -// } else if (device.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { -// hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) device.getDeviceDriver(); -// jo.put("device_code", parent_device_code); -// jo.put("mode", hongXiangConveyorDeviceDriver.getMode()); -// jo.put("move", hongXiangConveyorDeviceDriver.getMove()); -// jo.put("countdown_house", hongXiangConveyorDeviceDriver.getCountdown_house()); -// jo.put("countdown_min", hongXiangConveyorDeviceDriver.getCountdown_min()); -// jo.put("countdown_sec", hongXiangConveyorDeviceDriver.getCountdown_sec()); -// //温度需要除以10 -// jo.put("temperature", hongXiangConveyorDeviceDriver.getTo_temperature()/10); -// jo.put("now_temperature", hongXiangConveyorDeviceDriver.getTemperature()/10); -// -// jo.put("door", hongXiangConveyorDeviceDriver.getDoor()); -// jo.put("finish", hongXiangConveyorDeviceDriver.getFinish()); -// jo.put("task", hongXiangConveyorDeviceDriver.getTask()); -// jo.put("error", hongXiangConveyorDeviceDriver.getError()); -// } else if (device.getDeviceDriver() instanceof StandardCoveyorControlWithScannerDeviceDriver) { -// standardCoveyorControlWithScannerDeviceDriver = (StandardCoveyorControlWithScannerDeviceDriver) device.getDeviceDriver(); -// jo.put("device_code", parent_device_code); + if (ObjectUtil.isNull(device)) { + continue; + } + if (device.getDeviceDriver() instanceof StandardCoveyorControlDeviceDriver) { + standardCoveyorControlDeviceDriver = (StandardCoveyorControlDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("mode", standardCoveyorControlDeviceDriver.getMode()); + jo.put("move", standardCoveyorControlDeviceDriver.getMove()); + jo.put("hasGoods", standardCoveyorControlDeviceDriver.getHasGoods()); + jo.put("isOnline", standardCoveyorControlDeviceDriver.getIsonline()); + jo.put("error", standardCoveyorControlDeviceDriver.getError()); + jo.put("isError", standardCoveyorControlDeviceDriver.getIserror()); + jo.put("requestSucess", standardCoveyorControlDeviceDriver.getRequireSucess()); + jo.put("applySucess", standardCoveyorControlDeviceDriver.getApplySucess()); + jo.put("message", standardCoveyorControlDeviceDriver.getMessage()); + } else if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { + standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); +// jo.put("device_code", device.getDevice_code()); +// jo.put("mode", standardAutodoorDeviceDriver.getMode()); +// jo.put("action", standardAutodoorDeviceDriver.getAction()); +// jo.put("isOnline", true); +// jo.put("error", standardAutodoorDeviceDriver.getError()); +// jo.put("isError", standardAutodoorDeviceDriver.getIserror()); + } else if (device.getDeviceDriver() instanceof StandardCoveyorControlWithScannerDeviceDriver) { + standardCoveyorControlWithScannerDeviceDriver = (StandardCoveyorControlWithScannerDeviceDriver) device.getDeviceDriver(); +// jo.put("device_code", device.getDevice_code()); +// jo.put("mode", standardCoveyorControlWithScannerDeviceDriver.getMode()); // jo.put("move", standardCoveyorControlWithScannerDeviceDriver.getMove()); -// jo.put("action", standardCoveyorControlWithScannerDeviceDriver.getAction()); +// jo.put("hasGoods", standardCoveyorControlWithScannerDeviceDriver.getHasGoods()); +// jo.put("isOnline", standardCoveyorControlWithScannerDeviceDriver.getIsonline()); // jo.put("error", standardCoveyorControlWithScannerDeviceDriver.getError()); -// } else { -// jo.put("device_code", parent_device_code); -// } +// jo.put("isError", standardCoveyorControlWithScannerDeviceDriver.getIserror()); +// jo.put("height", standardCoveyorControlWithScannerDeviceDriver.getHeight()); +// jo.put("operation_type", standardCoveyorControlWithScannerDeviceDriver.getOperation_type()); +// jo.put("direction", standardCoveyorControlWithScannerDeviceDriver.getDirection()); +// jo.put("action", standardCoveyorControlWithScannerDeviceDriver.getAction()); +// jo.put("ioaction", standardCoveyorControlWithScannerDeviceDriver.getIoaction()); +// jo.put("container", StrUtil.isEmpty(standardCoveyorControlWithScannerDeviceDriver.barcode()) ? "" : standardCoveyorControlWithScannerDeviceDriver.barcode()); +// jo.put("message", standardCoveyorControlWithScannerDeviceDriver.getMessage()); +// jo.put("requestSucess", standardCoveyorControlWithScannerDeviceDriver.getRequireSucess().toString()); +// jo.put("applySucess", standardCoveyorControlWithScannerDeviceDriver.getApplySucess().toString()); +// jo.put("instruction_message", standardCoveyorControlWithScannerDeviceDriver.getInst_message()); + } else if (device.getDeviceDriver() instanceof StandardCoveyorControlWithPlcScannerDeviceDriver) { + standardCoveyorControlWithPlcScannerDeviceDriver = (StandardCoveyorControlWithPlcScannerDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("mode", standardCoveyorControlWithPlcScannerDeviceDriver.getMode()); + jo.put("move", standardCoveyorControlWithPlcScannerDeviceDriver.getMove()); + jo.put("hasGoods", standardCoveyorControlWithPlcScannerDeviceDriver.getHasGoods()); + jo.put("isOnline", standardCoveyorControlWithPlcScannerDeviceDriver.getIsonline()); + jo.put("error", standardCoveyorControlWithPlcScannerDeviceDriver.getError()); + jo.put("isError", standardCoveyorControlWithPlcScannerDeviceDriver.getIserror()); + jo.put("height", standardCoveyorControlWithPlcScannerDeviceDriver.getHeight()); + jo.put("operation_type", standardCoveyorControlWithPlcScannerDeviceDriver.getOperation_type()); + jo.put("direction", standardCoveyorControlWithPlcScannerDeviceDriver.getDirection()); + jo.put("action", standardCoveyorControlWithPlcScannerDeviceDriver.getAction()); + jo.put("ioaction", standardCoveyorControlWithPlcScannerDeviceDriver.getIoaction()); + jo.put("container", StrUtil.isEmpty(standardCoveyorControlWithPlcScannerDeviceDriver.getBarcode()) ? "" : standardCoveyorControlWithPlcScannerDeviceDriver.getBarcode()); + jo.put("message", standardCoveyorControlWithPlcScannerDeviceDriver.getMessage()); + jo.put("requestSucess", standardCoveyorControlWithPlcScannerDeviceDriver.getRequireSucess().toString()); + jo.put("applySucess", standardCoveyorControlWithPlcScannerDeviceDriver.getApplySucess().toString()); + jo.put("instruction_message", standardCoveyorControlWithPlcScannerDeviceDriver.getInst_message()); + } + //检测站点 + else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + standardInspectSiteDevicedriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("mode", standardInspectSiteDevicedriver.getMode()); + jo.put("move", standardInspectSiteDevicedriver.getMove()); + jo.put("hasGoods", standardInspectSiteDevicedriver.getHasGoods()); + jo.put("isOnline", standardInspectSiteDevicedriver.getIsonline()); + jo.put("error", standardInspectSiteDevicedriver.getError()); + jo.put("isError", standardInspectSiteDevicedriver.getIserror()); + jo.put("container", standardInspectSiteDevicedriver.getContainer()); + jo.put("message", standardInspectSiteDevicedriver.getMessage()); + } + //普通站点 + else if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("move", standardOrdinarySiteDeviceDriver.getMove()); + jo.put("container", standardOrdinarySiteDeviceDriver.getContainer()); + jo.put("hasGoods", standardOrdinarySiteDeviceDriver.getHasGoods()); + jo.put("isOnline", true); + //点击弹出 + jo.put("is_click", true); + jo.put("device_type", device.getDevice_type()); + jo.put("error", standardOrdinarySiteDeviceDriver.getError()); + jo.put("isError", standardOrdinarySiteDeviceDriver.getIserror()); + jo.put("container", standardOrdinarySiteDeviceDriver.getContainer()); + jo.put("message", standardOrdinarySiteDeviceDriver.getMessage()); + jo.put("material", standardOrdinarySiteDeviceDriver.getMaterial()); + jo.put("batch", standardOrdinarySiteDeviceDriver.getBatch()); + + } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + standardInspectSiteDevicedriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("mode", standardInspectSiteDevicedriver.getMode()); + jo.put("move", standardInspectSiteDevicedriver.getMove()); + jo.put("hasGoods", standardInspectSiteDevicedriver.getHasGoods()); + jo.put("isOnline", standardInspectSiteDevicedriver.getIsonline()); + jo.put("error", standardInspectSiteDevicedriver.getError()); + jo.put("isError", standardInspectSiteDevicedriver.getIserror()); + jo.put("container", standardInspectSiteDevicedriver.getContainer()); + jo.put("message", standardInspectSiteDevicedriver.getMessage()); + } else if (device.getDeviceDriver() instanceof StandardScannerDeviceDriver) { + standardScannerDeviceDriver = (StandardScannerDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("isOnline", true); + jo.put("device_type", device.getDevice_type()); + //点击弹出 + jo.put("is_click", true); + jo.put("ip", standardScannerDeviceDriver.getIp()); + jo.put("container", StrUtil.isEmpty(standardScannerDeviceDriver.readBarcode()) ? "" : standardScannerDeviceDriver.readBarcode()); + } else { + jo.put("device_code", device.getDevice_code()); + } backja.add(jo); } - JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.OK.value()); - resultJson.put("message", "操作成功"); - resultJson.put("data", backja); -// log.info("queryDevice--------------:输出参数" + resultJson.toString()); - return resultJson; + } else { + for (int i = 0; i < datas.size(); i++) { + JSONObject jo = new JSONObject(); + JSONObject data = datas.getJSONObject(i); + String device_code = data.getString("device_code"); + Device device = deviceAppService.findDeviceByCode(device_code); + if (ObjectUtil.isEmpty(device)) { + throw new Exception("未找到对应设备:" + device_code); + } - } finally { - MDC.remove(log_file_type); + if (device.getDeviceDriver() instanceof StandardCoveyorControlDeviceDriver) { + standardCoveyorControlDeviceDriver = (StandardCoveyorControlDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("mode", standardCoveyorControlDeviceDriver.getMode()); + jo.put("move", standardCoveyorControlDeviceDriver.getMove()); + jo.put("hasGoods", standardCoveyorControlDeviceDriver.getHasGoods()); + jo.put("isOnline", standardCoveyorControlDeviceDriver.getIsonline()); + jo.put("error", standardCoveyorControlDeviceDriver.getError()); + jo.put("isError", standardCoveyorControlDeviceDriver.getIserror()); + jo.put("requestSucess", standardCoveyorControlDeviceDriver.getRequireSucess()); + jo.put("applySucess", standardCoveyorControlDeviceDriver.getApplySucess()); + jo.put("message", standardCoveyorControlDeviceDriver.getMessage()); + } else if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { + standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); +// jo.put("device_code", device.getDevice_code()); +// jo.put("mode", standardAutodoorDeviceDriver.getMode()); +// jo.put("action", standardAutodoorDeviceDriver.getAction()); +// jo.put("isOnline", true); +// jo.put("error", standardAutodoorDeviceDriver.getError()); +// jo.put("isError", standardAutodoorDeviceDriver.getIserror()); + } else if (device.getDeviceDriver() instanceof StandardCoveyorControlWithScannerDeviceDriver) { + standardCoveyorControlWithScannerDeviceDriver = (StandardCoveyorControlWithScannerDeviceDriver) device.getDeviceDriver(); +// jo.put("device_code", device.getDevice_code()); +// jo.put("mode", standardCoveyorControlWithScannerDeviceDriver.getMode()); +// jo.put("move", standardCoveyorControlWithScannerDeviceDriver.getMove()); +// jo.put("hasGoods", standardCoveyorControlWithScannerDeviceDriver.getHasGoods()); +// jo.put("isOnline", standardCoveyorControlWithScannerDeviceDriver.getIsonline()); +// jo.put("error", standardCoveyorControlWithScannerDeviceDriver.getError()); +// jo.put("isError", standardCoveyorControlWithScannerDeviceDriver.getIserror()); +// jo.put("height", standardCoveyorControlWithScannerDeviceDriver.getHeight()); +// jo.put("operation_type", standardCoveyorControlWithScannerDeviceDriver.getOperation_type()); +// jo.put("direction", standardCoveyorControlWithScannerDeviceDriver.getDirection()); +// jo.put("action", standardCoveyorControlWithScannerDeviceDriver.getAction()); +// jo.put("ioaction", standardCoveyorControlWithScannerDeviceDriver.getIoaction()); +// jo.put("container", StrUtil.isEmpty(standardCoveyorControlWithScannerDeviceDriver.barcode()) ? "" : standardCoveyorControlWithScannerDeviceDriver.barcode()); +// jo.put("message", standardCoveyorControlWithScannerDeviceDriver.getMessage()); +// jo.put("requestSucess", standardCoveyorControlWithScannerDeviceDriver.getRequireSucess().toString()); +// jo.put("applySucess", standardCoveyorControlWithScannerDeviceDriver.getApplySucess().toString()); +// jo.put("instruction_message", standardCoveyorControlWithScannerDeviceDriver.getInst_message()); + } else if (device.getDeviceDriver() instanceof StandardCoveyorControlWithPlcScannerDeviceDriver) { + standardCoveyorControlWithPlcScannerDeviceDriver = (StandardCoveyorControlWithPlcScannerDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("mode", standardCoveyorControlWithPlcScannerDeviceDriver.getMode()); + jo.put("move", standardCoveyorControlWithPlcScannerDeviceDriver.getMove()); + jo.put("hasGoods", standardCoveyorControlWithPlcScannerDeviceDriver.getHasGoods()); + jo.put("isOnline", standardCoveyorControlWithPlcScannerDeviceDriver.getIsonline()); + jo.put("error", standardCoveyorControlWithPlcScannerDeviceDriver.getError()); + jo.put("isError", standardCoveyorControlWithPlcScannerDeviceDriver.getIserror()); + jo.put("height", standardCoveyorControlWithPlcScannerDeviceDriver.getHeight()); + jo.put("operation_type", standardCoveyorControlWithPlcScannerDeviceDriver.getOperation_type()); + jo.put("direction", standardCoveyorControlWithPlcScannerDeviceDriver.getDirection()); + jo.put("action", standardCoveyorControlWithPlcScannerDeviceDriver.getAction()); + jo.put("ioaction", standardCoveyorControlWithPlcScannerDeviceDriver.getIoaction()); + jo.put("container", StrUtil.isEmpty(standardCoveyorControlWithPlcScannerDeviceDriver.getBarcode()) ? "" : standardCoveyorControlWithPlcScannerDeviceDriver.getBarcode()); + jo.put("message", standardCoveyorControlWithPlcScannerDeviceDriver.getMessage()); + jo.put("requestSucess", standardCoveyorControlWithPlcScannerDeviceDriver.getRequireSucess().toString()); + jo.put("applySucess", standardCoveyorControlWithPlcScannerDeviceDriver.getApplySucess().toString()); + jo.put("instruction_message", standardCoveyorControlWithPlcScannerDeviceDriver.getInst_message()); + } + //检测站点 + else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + standardInspectSiteDevicedriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("mode", standardInspectSiteDevicedriver.getMode()); + jo.put("move", standardInspectSiteDevicedriver.getMove()); + jo.put("hasGoods", standardInspectSiteDevicedriver.getHasGoods()); + jo.put("isOnline", standardInspectSiteDevicedriver.getIsonline()); + jo.put("error", standardInspectSiteDevicedriver.getError()); + jo.put("isError", standardInspectSiteDevicedriver.getIserror()); + jo.put("container", standardInspectSiteDevicedriver.getContainer()); + jo.put("message", standardInspectSiteDevicedriver.getMessage()); + } + //普通站点 + else if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("move", standardOrdinarySiteDeviceDriver.getMove()); + jo.put("container", standardOrdinarySiteDeviceDriver.getContainer()); + jo.put("hasGoods", standardOrdinarySiteDeviceDriver.getHasGoods()); + jo.put("isOnline", true); + //点击弹出 + jo.put("is_click", true); + jo.put("device_type", device.getDevice_type()); + jo.put("error", standardOrdinarySiteDeviceDriver.getError()); + jo.put("isError", standardOrdinarySiteDeviceDriver.getIserror()); + jo.put("container", standardOrdinarySiteDeviceDriver.getContainer()); + jo.put("message", standardOrdinarySiteDeviceDriver.getMessage()); + jo.put("material", standardOrdinarySiteDeviceDriver.getMaterial()); + jo.put("batch", standardOrdinarySiteDeviceDriver.getBatch()); + + } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + standardInspectSiteDevicedriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("mode", standardInspectSiteDevicedriver.getMode()); + jo.put("move", standardInspectSiteDevicedriver.getMove()); + jo.put("hasGoods", standardInspectSiteDevicedriver.getHasGoods()); + jo.put("isOnline", standardInspectSiteDevicedriver.getIsonline()); + jo.put("error", standardInspectSiteDevicedriver.getError()); + jo.put("isError", standardInspectSiteDevicedriver.getIserror()); + jo.put("container", standardInspectSiteDevicedriver.getContainer()); + jo.put("message", standardInspectSiteDevicedriver.getMessage()); + } else if (device.getDeviceDriver() instanceof StandardScannerDeviceDriver) { + standardScannerDeviceDriver = (StandardScannerDeviceDriver) device.getDeviceDriver(); + jo.put("device_code", device.getDevice_code()); + jo.put("isOnline", true); + jo.put("device_type", device.getDevice_type()); + //点击弹出 + jo.put("is_click", true); + jo.put("ip", standardScannerDeviceDriver.getIp()); + jo.put("container", StrUtil.isEmpty(standardScannerDeviceDriver.readBarcode()) ? "" : standardScannerDeviceDriver.readBarcode()); + } else { + jo.put("device_code", device.getDevice_code()); + } + backja.add(jo); + } } - - + JSONObject resultJson = new JSONObject(); + resultJson.put("status", HttpStatus.OK); + resultJson.put("message", "操作成功"); + resultJson.put("data", backja); + log.info("queryDevice--------------:输出参数" + resultJson.toString()); + return resultJson; } + @Override + @Transactional(rollbackFor = Exception.class) + public Map actionOrder(String whereJson) { + JSONArray datas = JSONArray.parseArray(whereJson); + log.info("actionOrder--------------:输入参数" + datas.toString()); + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + for (int i = 0; i < datas.size(); i++) { + JSONObject param = datas.getJSONObject(i); + String ext_order_id = param.getString("ext_order_id"); + if (StrUtil.isEmpty(ext_order_id)) { + throw new BadRequestException("外部标识不能为空"); + } + String order_code = param.getString("order_code"); + if (StrUtil.isEmpty(order_code)) { + order_code = CodeUtil.getNewCode("ORDER_NO"); + } else { + JSONObject jsonObject = wo.query("is_deleted = '0' and order_code = '" + order_code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) { + throw new BadRequestException("工单编码不能重复"); + } + } + String qty = param.getString("qty"); + if (StrUtil.isEmpty(qty)) { + throw new BadRequestException("生产数量不能为空"); + } + String material_uuid = param.getString("material_uuid"); + if (StrUtil.isEmpty(material_uuid)) { + throw new BadRequestException("物料标识不能为空"); + } + String material_code = param.getString("material_code"); + if (StrUtil.isEmpty(material_code)) { + throw new BadRequestException("物料编码不能为空"); + } + String material_name = param.getString("material_name"); + if (StrUtil.isEmpty(material_name)) { + throw new BadRequestException("物料名称不能为空"); + } + String material_spec = param.getString("material_spec"); + String device_code = param.getString("device_code"); + if (StrUtil.isEmpty(device_code)) { + throw new BadRequestException("设备编码不能为空"); + } + String is_needmove = param.getString("is_needmove"); + ProduceshiftorderDto dto = new ProduceshiftorderDto(); + dto.setExt_order_id(ext_order_id); + dto.setOrder_code(order_code); + dto.setQty(BigDecimal.valueOf(Long.parseLong(qty))); + dto.setMaterial_uuid(material_uuid); + dto.setMaterial_code(material_code); + dto.setMaterial_name(material_name); + dto.setMaterial_spec(material_spec); + dto.setDevice_code(device_code); + dto.setIs_needmove(is_needmove); + dto.setCreate_by("mes"); + dto.setUpdate_by("mes"); + produceshiftorderService.create(dto); + } + JSONObject resultJson = new JSONObject(); + resultJson.put("status", HttpStatus.OK); + resultJson.put("message", "操作成功"); + log.info("actionOrder--------------:输出参数" + resultJson.toString()); + return resultJson; + } + + @Override + public Map orderStatusUpdate(String whereJson) { + JSONArray datas = JSONArray.parseArray(whereJson); + log.info("orderStatusUpdate--------------:输入参数" + datas.toString()); + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + for (int i = 0; i < datas.size(); i++) { + JSONObject jsonObject = datas.getJSONObject(i); + String ext_order_id = jsonObject.getString("ext_order_id"); + String type = jsonObject.getString("type"); + JSONObject json = wo.query("ext_order_id = '" + ext_order_id + "'").uniqueResult(0); + ProduceshiftorderDto obj = JSONObject.toJavaObject(json, ProduceshiftorderDto.class); + Device device = deviceAppService.findDeviceByCode(obj.getDevice_code()); + HailiangSpecialDeviceDriver hailiangSpecialDeviceDriver; + HailiangPackerStationDeviceDriver hailiangPackerStationDeviceDriver; + HailiangEngravingMachineDeviceDriver hailiangEngravingMachineDeviceDriver; + HailiangStackingStationDriver hailiangStackingStationDriver; + if (device.getDeviceDriver() instanceof HailiangSpecialDeviceDriver) { + hailiangSpecialDeviceDriver = (HailiangSpecialDeviceDriver) device.getDeviceDriver(); + //暂停 + if (type.equals("1")) { + hailiangSpecialDeviceDriver.writing("to_pause", "1"); + } + //恢复 + if (type.equals("2")) { + hailiangSpecialDeviceDriver.writing("to_pause", "0"); + } + //强制完成 + if (type.equals("3")) { + obj.setOrder_status("3"); + obj.setUpdate_by("mes"); + obj.setUpdate_time(DateUtil.now()); + produceshiftorderService.update(obj); + } + } + if (device.getDeviceDriver() instanceof HailiangPackerStationDeviceDriver) { + hailiangPackerStationDeviceDriver = (HailiangPackerStationDeviceDriver) device.getDeviceDriver(); + //强制完成 + if (type.equals("3")) { + obj.setOrder_status("3"); + obj.setUpdate_by("mes"); + produceshiftorderService.update(obj); + } + } + if (device.getDeviceDriver() instanceof HailiangEngravingMachineDeviceDriver) { + hailiangEngravingMachineDeviceDriver = (HailiangEngravingMachineDeviceDriver) device.getDeviceDriver(); + //暂停 + if (type.equals("1")) { + hailiangEngravingMachineDeviceDriver.writing("to_pause", "1"); + } + //恢复 + if (type.equals("2")) { + hailiangEngravingMachineDeviceDriver.writing("to_pause", "0"); + } + //强制完成 + if (type.equals("3")) { + obj.setOrder_status("3"); + obj.setUpdate_by("mes"); + obj.setUpdate_time(DateUtil.now()); + produceshiftorderService.update(obj); + } + } + + if (device.getDeviceDriver() instanceof HailiangStackingStationDriver) { + hailiangStackingStationDriver = (HailiangStackingStationDriver) device.getDeviceDriver(); + //暂停 + if (type.equals("1")) { + hailiangStackingStationDriver.writing("to_lane_off", "1"); + } + //恢复 + if (type.equals("2")) { + hailiangStackingStationDriver.writing("to_lane_off", "0"); + } + if (type.equals("3")) { + obj.setOrder_status("3"); + obj.setUpdate_by("mes"); + obj.setUpdate_time(DateUtil.now()); + produceshiftorderService.update(obj); + } + } + } + JSONObject resultJson = new JSONObject(); + resultJson.put("status", HttpStatus.OK); + resultJson.put("message", "操作成功"); + log.info("orderStatusUpdate--------------:输出参数" + resultJson.toString()); + return resultJson; + } @Override public Map queryDeviceDBValue(String whereJson) { @@ -302,502 +762,65 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } @Override - public Map querydevice(String whereJson) { - return null; - } - - - - @Override - public Map putPlusPullAction(String param) { - try { - MDC.put(log_file_type, log_type); - log.info("putPlusPullAction-----输入参数{}", param); - JSONObject jo = JSON.parseObject(param); - String device_code = jo.getString("device_code"); - String size = jo.getString("size"); - String type = jo.getString("type"); - Device device = deviceAppService.findDeviceByCode(device_code); - if (ObjectUtil.isEmpty(device)) { - JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.BAD_REQUEST.value()); - resultJson.put("message", "未找到对应的设备:"+device_code); - return resultJson; - } -// PlugPullDeviceSiteDeviceDriver plugPullDeviceSiteDeviceDriver; -// if (device.getDeviceDriver() instanceof PlugPullDeviceSiteDeviceDriver) { -// plugPullDeviceSiteDeviceDriver = (PlugPullDeviceSiteDeviceDriver) device.getDeviceDriver(); -// // 0 穿轴 1拔轴 -// if(StrUtil.equals(type,"1")){ -// -// if(plugPullDeviceSiteDeviceDriver.getMode() == 1){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求拔轴,当前设备工作模式未自动"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getAction() == 0){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求拔轴,当前设备未全自动"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getStatus() != 0){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求拔轴,当前设备未待机"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getControl() != 0){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求拔轴,当前设备未远程控制"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getMove() != 0){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求拔轴,当前设备有轴"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getMode() == 0 && plugPullDeviceSiteDeviceDriver.getAction() ==1 -// && plugPullDeviceSiteDeviceDriver.getStatus() ==0 && plugPullDeviceSiteDeviceDriver.getMove() ==0 -// && plugPullDeviceSiteDeviceDriver.getControl() ==0 ){ -// -// List list = new ArrayList(); -// Map map = new HashMap(); -// map.put("code","to_size"); -// map.put("value",size); -// list.add(map); -// Map map2 = new HashMap(); -// map2.put("code","to_type"); -// map2.put("value",type); -// list.add(map2); -// Map map3 = new HashMap(); -// map3.put("code","to_command"); -// map3.put("value","1"); -// list.add(map3); -// plugPullDeviceSiteDeviceDriver.writing(list); -// -// } else { -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "当前设备状态不满足下发条件"); -// return resultJson; -// } -// -// } else if (StrUtil.equals(type,"0")){ -// -// if(plugPullDeviceSiteDeviceDriver.getMode() == 1){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求插轴,当前设备工作模式未自动"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getAction() == 0){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求插轴,当前设备未全自动"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getStatus() != 0){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求插轴,当前设备未待机"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getControl() != 0){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求插轴,当前设备未远程控制"); -// return resultJson; -// } -// if(plugPullDeviceSiteDeviceDriver.getMove() != 1){ -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "请求插轴,当前设备没有轴"); -// return resultJson; -// } -// -// if(plugPullDeviceSiteDeviceDriver.getMode() == 0 && plugPullDeviceSiteDeviceDriver.getAction() ==1 -// && plugPullDeviceSiteDeviceDriver.getStatus() ==0 && plugPullDeviceSiteDeviceDriver.getMove() ==1 -// && plugPullDeviceSiteDeviceDriver.getControl() ==0 ){ -// -// List list = new ArrayList(); -// Map map = new HashMap(); -// map.put("code","to_size"); -// map.put("value",size); -// list.add(map); -// Map map2 = new HashMap(); -// map2.put("code","to_type"); -// map2.put("value",type); -// list.add(map2); -// Map map3 = new HashMap(); -// map3.put("code","to_command"); -// map3.put("value","1"); -// list.add(map3); -// plugPullDeviceSiteDeviceDriver.writing(list); -// -// } else { -// JSONObject resultJson = new JSONObject(); -// resultJson.put("status", HttpStatus.BAD_REQUEST.value()); -// resultJson.put("message", "当前设备状态不满足下发条件"); -// return resultJson; -// } -// } -// } - - JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.OK.value()); - resultJson.put("message", "操作成功"); - log.info("putPlusPullAction--------------:输出参数" + resultJson.toString()); - return resultJson; - - } finally { - MDC.remove(log_file_type); - } - } - - - - @Override - public CreateTaskResponse crateTask(String param) { - try { - MDC.put(log_file_type, log_type); - log.info("crateTask-----输入参数{}", param); - JSONArray datas = JSONArray.parseArray(param); - CreateTaskResponse response = new CreateTaskResponse(); - ParamService paramService = SpringContextHolder.getBean(ParamService.class); - String cancelTaskCheck = paramService.findByCode(AcsConfig.ISALLOWTASK).getValue(); - JSONArray errArr = new JSONArray(); - if(StrUtil.equals(cancelTaskCheck,"0")){ - response.setStatus(400); - response.setMessage("ACS系统需要更新,请稍等"); - response.setErrArr(datas); - return response; - } - for (int i = 0; i < datas.size(); i++) { - String data = datas.get(i).toString(); - CreateTaskRequest request = JsonUtl.format(data, CreateTaskRequest.class); - String ext_task_id = request.getExt_task_id(); - String task_code = request.getTask_code(); - String start_device_code = request.getStart_device_code(); - String start_device_code2 = request.getStart_device_code2(); - String next_device_code = request.getNext_device_code(); - String next_device_code2 = request.getNext_device_code2(); - String put_device_code = request.getPut_device_code(); - String priority = request.getPriority(); - String vehicle_code = request.getVehicle_code(); - String vehicle_type = request.getVehicle_type(); - String route_plan_code = request.getRoute_plan_code(); - String task_type = request.getTask_type(); - String storage_task_type = request.getDtl_type(); - String agv_system_type = request.getAgv_system_type(); - String remark = request.getRemark(); - double oven_time = 0.00d; - if (StrUtil.isNotEmpty(request.getOven_time())) { - oven_time = Double.parseDouble(request.getOven_time()); - } - String temperature = request.getTemperature(); - Map params = request.getParams(); - - String start_point_code = ""; - String start_point_code2 = ""; - String next_point_code = ""; - String next_point_code2 = ""; - String put_point_code = ""; - if (StrUtil.isEmpty(task_code)) { - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", "任务号不能为空"); - errArr.add(json); - continue; - } - if (StrUtil.isEmpty(start_device_code)) { - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", "起点不能为空"); - errArr.add(json); - continue; - } - if (StrUtil.isEmpty(next_device_code)) { - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", "终点不能为空"); - errArr.add(json); - continue; - } - - if(StrUtil.equals(task_type,"8")){ - next_device_code = request.getPut_device_code(); - put_device_code = request.getNext_device_code(); - } - - JSONObject start_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + start_device_code + "'").uniqueResult(0); - if (!ObjectUtil.isEmpty(start_device_json)) { - start_point_code = (String) start_device_json.get("parent_storage_code") == null ? start_device_code : (String) start_device_json.get("storage_code"); - } - JSONObject next_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + next_device_code + "'").uniqueResult(0); - if (!ObjectUtil.isEmpty(next_device_json)) { - next_point_code = (String) next_device_json.get("parent_storage_code") == null ? next_point_code : (String) next_device_json.get("storage_code"); - } - JSONObject start_device_json2 = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + start_device_code2 + "'").uniqueResult(0); - if (!ObjectUtil.isEmpty(start_device_json2)) { - start_point_code2 = (String) start_device_json2.get("parent_storage_code") == null ? start_device_code2 : (String) start_device_json2.get("storage_code"); - } - JSONObject next_device_json2 = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + next_device_code2 + "'").uniqueResult(0); - if (!ObjectUtil.isEmpty(next_device_json2)) { - next_point_code2 = (String) next_device_json2.get("parent_storage_code") == null ? next_device_code2 : (String) next_device_json2.get("storage_code"); - } - JSONObject put_device_json = WQLObject.getWQLObject("acs_storage_cell").query("parent_storage_code ='" + put_device_code + "'").uniqueResult(0); - if (!ObjectUtil.isEmpty(put_device_json)) { - put_point_code = (String) put_device_json.get("parent_storage_code") == null ? put_device_code : (String) put_device_json.get("storage_code"); - } - if (StrUtil.isNotEmpty(start_point_code) && start_point_code.indexOf("-") > 0) { - String str[] = start_point_code.split("-"); - start_device_code = str[0]; - } else { - start_device_code = start_point_code; - } - - if (StrUtil.isNotEmpty(next_point_code) && next_point_code.indexOf("-") > 0) { - String str[] = next_point_code.split("-"); - next_device_code = str[0]; - } else { - next_device_code = next_point_code; - } - - if (StrUtil.isNotEmpty(start_point_code2) && start_point_code2.indexOf("-") > 0) { - String str[] = start_point_code2.split("-"); - start_device_code2 = str[0]; - } else { - start_device_code2 = start_point_code2; - } - - if (StrUtil.isNotEmpty(next_point_code2) && next_point_code2.indexOf("-") > 0) { - String str[] = next_point_code2.split("-"); - next_device_code2 = str[0]; - } else { - next_device_code2 = next_point_code2; - } - - if (StrUtil.isNotEmpty(put_point_code) && put_point_code.indexOf("-") > 0) { - String str[] = put_point_code.split("-"); - put_device_code = str[0]; - } else { - put_device_code = put_point_code; - } - - if (StrUtil.isEmpty(route_plan_code)) { - route_plan_code = "normal"; - } - -// if(StrUtil.equals(task_type,"5")){ -// Device device = deviceAppService.findDeviceByCode(next_device_code); -// SiemensConveyorDeviceDriver siemensConveyorDeviceDriver; -// if(device.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { -// siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) device.getDeviceDriver(); -// if (ObjectUtil.equal("true", siemensConveyorDeviceDriver.getExtraValue().get("inspect_in_stock"))) { -// if(siemensConveyorDeviceDriver.getMove() == 1) -// { -// JSONObject json = new JSONObject(); -// json.put("task_code", task_code); -// json.put("ext_task_id", ext_task_id); -// json.put("message", "终点"+siemensConveyorDeviceDriver.getDevice_code()+"有货无法生成任务"); -// errArr.add(json); -// continue; -// } -// } -// } -// -// if( taskService.querySameDeviceReadyTask(start_device_code,next_device_code,"0") > 1){ -// JSONObject json = new JSONObject(); -// json.put("task_code", task_code); -// json.put("ext_task_id", ext_task_id); -// json.put("message", "已存在相同的起点:"+start_device_code + "终点:"+ next_device_code + "未执行的输送任务"); -// errArr.add(json); -// continue; -// } -// } - - TaskDto taskDto = taskService.findByCodeFromCache(task_code); - if (taskDto != null) { - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", "不能存在相同的任务号:"+task_code); - errArr.add(json); - continue; - } - if (!StrUtil.isEmpty(vehicle_code)) { - TaskDto vehicle_dto = taskService.findByContainer(vehicle_code); - if (vehicle_dto != null) { - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", "不能存在相同的托盘号:"+vehicle_code); - errArr.add(json); - continue; - } - } - - if (StrUtil.isEmpty(start_point_code)) { - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", request.getStart_device_code() + " 该设备号未找到对应点位"); - errArr.add(json); - continue; - } - if (StrUtil.isEmpty(next_point_code)) { - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", request.getNext_device_code() + " 该设备号未找到对应点位"); - errArr.add(json); - continue; - } - - JSONObject jo = new JSONObject(); - jo.put("task_id", IdUtil.simpleUUID()); - jo.put("task_code", task_code); - jo.put("start_point_code", start_point_code); - jo.put("next_point_code", next_point_code); - jo.put("start_point_code2", start_point_code2); - jo.put("next_point_code2", next_point_code2); - jo.put("put_point_code", put_point_code); - jo.put("start_parent_code", start_point_code); - jo.put("next_parent_code", next_point_code); - jo.put("start_device_code", start_device_code); - jo.put("next_device_code", next_device_code); - jo.put("start_device_code2", start_device_code2); - jo.put("next_device_code2", next_device_code2); - jo.put("put_device_code", put_device_code); - jo.put("priority", priority); - jo.put("vehicle_code", vehicle_code); - jo.put("vehicle_type", vehicle_type); - jo.put("storage_task_type", storage_task_type); - jo.put("agv_system_type", agv_system_type); - jo.put("oven_time", (int) Math.ceil(oven_time)); - jo.put("remark", remark); - jo.put("params", params); - jo.put("task_type", StrUtil.isEmpty(task_type) ? 1 : Integer.parseInt(task_type)); - - if (!StrUtil.isEmpty(ext_task_id)) { - jo.put("ext_task_id", ext_task_id); - } - - TaskDto task_dto = jo.toJavaObject(TaskDto.class); - try { - // task_type=7 则是立库任务需要下刻下发 - if (StrUtil.equals(task_dto.getTask_type(), "7")) { - //创建临时指令 不创建、不生成 - //等立库反馈成功才能创建任务和指令 - Instruction inst = null; - try { - inst = taskService.createTemporaryInst(task_dto); - } catch (Exception e){ - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", e.getMessage()); - errArr.add(json); - continue; - } - Resp resp = acsToLiKuService.sendInst(task_dto.getStorage_task_type(),inst); - - if(StrUtil.equals(resp.result,"true")){ - //创建任务和指令 - taskService.create(task_dto); - inst.setSend_status("1"); - taskService.createInst(inst); - - } else { - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", resp.getComment()); - json.put("code", resp.code); - json.put("data", data); - errArr.add(json); - continue; - } - - } else { - taskService.create(task_dto); - } - } catch (Exception e) { -// e.printStackTrace(); - JSONObject json = new JSONObject(); - json.put("task_code", task_code); - json.put("ext_task_id", ext_task_id); - json.put("message", e.getMessage()); - errArr.add(json); - continue; - } - } - if (ObjectUtil.isEmpty(errArr)) { - response.setStatus(200); - response.setMessage("success"); - } else { - response.setStatus(400); - if(ObjectUtil.isNotEmpty(errArr)){ - response.setMessage(errArr.getJSONObject(0).getString("message")); - } else { - response.setMessage("false"); - } - response.setErrArr(errArr); - } - log.info("createFromWms--------------:输出参数:" + JSON.toJSONString(response)); - - return response; - } finally { - MDC.remove(log_file_type); - } - - } - - - @Override - public Map updateTask(String whereJson) { + public Map replaceDevice(String whereJson) { + String now = DateUtil.now(); JSONArray datas = JSONArray.parseArray(whereJson); - log.info("updateTask--------------:输入参数" + datas.toString()); - JSONArray errArr = new JSONArray(); - if (datas.size() > 0) { - for (int i = 0; i < datas.size(); i++) { - JSONObject jsonObject = datas.getJSONObject(i); - String device_code = jsonObject.getString("device_code"); - String task_code = jsonObject.getString("task_code"); - //1-允许取放; 2-允许离开 - String option = jsonObject.getString("option"); - StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; - Device device_k = deviceAppService.findDeviceByCode(device_code+"_K"); - Device device_m = deviceAppService.findDeviceByCode(device_code+"_M"); - if(device_k.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver){ - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device_k.getDeviceDriver(); - standardOrdinarySiteDeviceDriver.setOption(Integer.parseInt(option)); - } - if(device_m.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver){ - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device_m.getDeviceDriver(); - standardOrdinarySiteDeviceDriver.setOption(Integer.parseInt(option)); + log.info("replaceDevice工单更换设备--------------:输入参数" + datas.toString()); + for (int i = 0; i < datas.size(); i++) { + JSONObject jsonObject = datas.getJSONObject(i); + String order_code = jsonObject.getString("order_code"); + String new_device_code = jsonObject.getString("device_code"); + ProduceshiftorderDto produceshiftorderDto = produceshiftorderService.findByCode(order_code); + String old_device_code = produceshiftorderDto.getDevice_code(); + Device old_device = deviceAppService.findDeviceByCode(old_device_code); + HailiangSpecialDeviceDriver old_hailiangSpecialDeviceDriver; + HailiangSpecialDeviceDriver new_hailiangSpecialDeviceDriver; + HailiangPackerStationDeviceDriver old_hailiangPackerStationDeviceDriver; + HailiangPackerStationDeviceDriver new_hailiangPackerStationDeviceDriver; + HailiangEngravingMachineDeviceDriver old_hailiangEngravingMachineDeviceDriver; + HailiangEngravingMachineDeviceDriver new_hailiangEngravingMachineDeviceDriver; + if (old_device.getDeviceDriver() instanceof HailiangSpecialDeviceDriver) { + //更换设备前,先判断新设备是否开机 + Device new_device = deviceAppService.findDeviceByCode(new_device_code); + new_hailiangSpecialDeviceDriver = (HailiangSpecialDeviceDriver) new_device.getDeviceDriver(); + if (!new_hailiangSpecialDeviceDriver.getItemProtocol().getIsonline()) { + throw new BadRequestException("更换设备失败,该设备已关机,请开机后重试!"); } + old_hailiangSpecialDeviceDriver = (HailiangSpecialDeviceDriver) old_device.getDeviceDriver(); + //获取更换设备前 老设备生产的数量 + int now_order_prod_num = old_hailiangSpecialDeviceDriver.getNow_order_prod_num(); + //获取订单总量 + int order_prod_allnum = Integer.parseInt(produceshiftorderDto.getQty().toString()); + //获取每箱数量 + int one_qty = Integer.parseInt(produceshiftorderDto.getOne_qty().toString()); + //计算订单数量还需要生产多少个 + int diff = order_prod_allnum - now_order_prod_num; + //更改工单设备号 + produceshiftorderDto.setDevice_code(new_device_code); + produceshiftorderDto.setUpdate_time(now); + produceshiftorderDto.setUpdate_by("mes"); + produceshiftorderService.updateByOrderCode(produceshiftorderDto); + + //将新设备中的报工数量Report_qty更改为上个设备生产的数量 + //将工单数据写入到新生产设备中 + new_hailiangSpecialDeviceDriver.writing("to_clear", "1"); + new_hailiangSpecialDeviceDriver.writing("to_order", order_code); + new_hailiangSpecialDeviceDriver.writing("to_one_box_num", one_qty + ""); + new_hailiangSpecialDeviceDriver.writing("to_order_prod_num", diff + ""); + new_hailiangSpecialDeviceDriver.writing("to_pause", "0"); + //老设备数据清除 + old_hailiangSpecialDeviceDriver.writing("to_order","0"); + old_hailiangSpecialDeviceDriver.writing("to_clear","1"); + } + // TODO其他驱动更换设备还没写 + if (old_device.getDeviceDriver() instanceof HailiangPackerStationDeviceDriver){ } } JSONObject resultJson = new JSONObject(); - if (ObjectUtil.isEmpty(errArr)) { - resultJson.put("status", HttpStatus.OK.value()); - resultJson.put("message", "操作成功"); - } else { - resultJson.put("status", HttpStatus.BAD_REQUEST.value()); - resultJson.put("message", "操作失败"); - if(ObjectUtil.isNotEmpty(errArr)){ - resultJson.put("errArr",errArr); - } - } + resultJson.put("status", HttpStatus.OK); + resultJson.put("message", "操作成功"); + resultJson.put("data", new JSONObject()); return resultJson; } 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 e8c1a767..4e37d525 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 @@ -25,8 +25,6 @@ import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_plcsca import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_inspect_site.StandardInspectSiteDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_storage.StandardStorageDeviceDriver; -import org.nl.acs.ext.wms.liKuData.*; -import org.nl.acs.ext.wms.service.AcsToLiKuService; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.opc.Device; @@ -83,8 +81,8 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu RouteLineService routeLineService; @Autowired TaskService taskService; - @Autowired - AcsToLiKuService acsToLiKuService; +// @Autowired +// AcsToLiKuService acsToLiKuService; @Override public void autoInitial() { @@ -1212,28 +1210,28 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu if (flag) { - if (StrUtil.equals(entity.getInstruction_type(), "7")) { - CancelTaskRequest cancelTaskRequest = new CancelTaskRequest(); - cancelTaskRequest.setOrderId(entity.getInstruction_code()); - cancelTaskRequest.setPalletCode(entity.getVehicle_code()); - cancelTaskRequest.setSrcLocation(entity.getStart_point_code()); - cancelTaskRequest.setDestLocation(entity.getNext_point_code()); - // 1 入库,2 出库,3 移库,4 空托盘入库,5 空托盘出库 - int type = 0; - if (StrUtil.equals(task.getStorage_task_type(), "1")) { - type = 1; - } else if (StrUtil.equals(task.getStorage_task_type(), "2")) { - type = 4; - } else if (StrUtil.equals(task.getStorage_task_type(), "3")) { - type = 2; - } else if (StrUtil.equals(task.getStorage_task_type(), "4")) { - type = 5; - } else if (StrUtil.equals(task.getStorage_task_type(), "5")) { - type = 3; - } - cancelTaskRequest.setTaskType(type); - acsToLiKuService.cancelTask(cancelTaskRequest); - } +// if (StrUtil.equals(entity.getInstruction_type(), "7")) { +// CancelTaskRequest cancelTaskRequest = new CancelTaskRequest(); +// cancelTaskRequest.setOrderId(entity.getInstruction_code()); +// cancelTaskRequest.setPalletCode(entity.getVehicle_code()); +// cancelTaskRequest.setSrcLocation(entity.getStart_point_code()); +// cancelTaskRequest.setDestLocation(entity.getNext_point_code()); +// // 1 入库,2 出库,3 移库,4 空托盘入库,5 空托盘出库 +// int type = 0; +// if (StrUtil.equals(task.getStorage_task_type(), "1")) { +// type = 1; +// } else if (StrUtil.equals(task.getStorage_task_type(), "2")) { +// type = 4; +// } else if (StrUtil.equals(task.getStorage_task_type(), "3")) { +// type = 2; +// } else if (StrUtil.equals(task.getStorage_task_type(), "4")) { +// type = 5; +// } else if (StrUtil.equals(task.getStorage_task_type(), "5")) { +// type = 3; +// } +// cancelTaskRequest.setTaskType(type); +// acsToLiKuService.cancelTask(cancelTaskRequest); +// } String currentUsername = SecurityUtils.getCurrentUsername(); String now = DateUtil.now(); @@ -1635,84 +1633,85 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu @Override public boolean createLkInst(String type, Instruction dto) { - Class var3 = TaskInstructionLock.class; - synchronized (TaskInstructionLock.class) { - // 入库 - AcsToLiKuService acsToLiKuService = SpringContextHolder.getBean(AcsToLiKuService.class); - Resp resp = null; - if (StrUtil.equals(type, "1")) { - InStoreRequest request = new InStoreRequest(); - request.setFloorNo(Integer.parseInt(dto.getTo_z())); - request.setType(1); - request.setPalletCode(dto.getVehicle_code()); - request.setOrderId(dto.getInstruction_code()); - request.setSrcLocation(dto.getStart_point_code()); - request.setDestLocation(dto.getNext_point_code()); - resp = acsToLiKuService.inStore(request); - // 空托入库 - } else if (StrUtil.equals(type, "2")) { - InStoreRequest request = new InStoreRequest(); - request.setFloorNo(Integer.parseInt(dto.getTo_z())); - request.setType(2); - request.setPalletCode(dto.getVehicle_code()); - request.setOrderId(dto.getInstruction_code()); - request.setSrcLocation(dto.getStart_point_code()); - request.setDestLocation(dto.getNext_point_code()); - resp = acsToLiKuService.inStore(request); - // 出库 - } else if (StrUtil.equals(type, "3")) { - OutStoreRequest outStore = new OutStoreRequest(); - BaseStoreRequest baseReq = new BaseStoreRequest(); - List list = new ArrayList(); - baseReq.setOrderId(dto.getInstruction_code()); - baseReq.setSrcLocation(dto.getStart_point_code()); - baseReq.setDestLocation(dto.getNext_point_code()); - baseReq.setFloorNo(Integer.parseInt(dto.getFrom_z())); - baseReq.setPalletCode(dto.getVehicle_code()); - list.add(baseReq); - outStore.setOrderInfos(list); - outStore.setGroupId(dto.getInstruction_code()); - resp = acsToLiKuService.outStore(outStore); - // 空托出库 - } else if (StrUtil.equals(type, "4")) { - EmptyVehicleOutStoreRequest emptyVehicleOutStoreRequest = new EmptyVehicleOutStoreRequest(); - emptyVehicleOutStoreRequest.setOrderId(dto.getInstruction_code()); - emptyVehicleOutStoreRequest.setFloorNo(Integer.parseInt(dto.getFrom_z())); - emptyVehicleOutStoreRequest.setSrcLocation(dto.getStart_point_code()); - emptyVehicleOutStoreRequest.setDestLocation(dto.getNext_point_code()); - emptyVehicleOutStoreRequest.setPalletCode(dto.getVehicle_code()); - resp = acsToLiKuService.emptyVehicleOutStore(emptyVehicleOutStoreRequest); - // 转库 - } else if (StrUtil.equals(type, "5")) { - MoveStoreRequest moveStoreRequest = new MoveStoreRequest(); - BaseStoreRequest baseReq = new BaseStoreRequest(); - List list = new ArrayList(); - baseReq.setFloorNo(Integer.parseInt(dto.getFrom_z())); - baseReq.setPalletCode(dto.getVehicle_code()); - baseReq.setOrderId(dto.getInstruction_code()); - baseReq.setSrcLocation(dto.getStart_point_code()); - baseReq.setDestLocation(dto.getNext_point_code()); - list.add(baseReq); - moveStoreRequest.setGroupId(dto.getInstruction_code()); - moveStoreRequest.setOrderInfos(list); - resp = acsToLiKuService.moveStore(moveStoreRequest); - } - - if (ObjectUtil.isNotEmpty(resp)) { - if (StrUtil.equals(resp.getResult(), "true")) { - dto.setSend_status("1"); - } else { - dto.setSend_status("2"); - dto.setRemark(resp.getData().toString()); - return false; - } - } else { - dto.setSend_status("2"); - dto.setRemark("ERROR"); - return false; - } - return true; - } + return false; +// Class var3 = TaskInstructionLock.class; +// synchronized (TaskInstructionLock.class) { +// // 入库 +// AcsToLiKuService acsToLiKuService = SpringContextHolder.getBean(AcsToLiKuService.class); +// Resp resp = null; +// if (StrUtil.equals(type, "1")) { +// InStoreRequest request = new InStoreRequest(); +// request.setFloorNo(Integer.parseInt(dto.getTo_z())); +// request.setType(1); +// request.setPalletCode(dto.getVehicle_code()); +// request.setOrderId(dto.getInstruction_code()); +// request.setSrcLocation(dto.getStart_point_code()); +// request.setDestLocation(dto.getNext_point_code()); +// resp = acsToLiKuService.inStore(request); +// // 空托入库 +// } else if (StrUtil.equals(type, "2")) { +// InStoreRequest request = new InStoreRequest(); +// request.setFloorNo(Integer.parseInt(dto.getTo_z())); +// request.setType(2); +// request.setPalletCode(dto.getVehicle_code()); +// request.setOrderId(dto.getInstruction_code()); +// request.setSrcLocation(dto.getStart_point_code()); +// request.setDestLocation(dto.getNext_point_code()); +// resp = acsToLiKuService.inStore(request); +// // 出库 +// } else if (StrUtil.equals(type, "3")) { +// OutStoreRequest outStore = new OutStoreRequest(); +// BaseStoreRequest baseReq = new BaseStoreRequest(); +// List list = new ArrayList(); +// baseReq.setOrderId(dto.getInstruction_code()); +// baseReq.setSrcLocation(dto.getStart_point_code()); +// baseReq.setDestLocation(dto.getNext_point_code()); +// baseReq.setFloorNo(Integer.parseInt(dto.getFrom_z())); +// baseReq.setPalletCode(dto.getVehicle_code()); +// list.add(baseReq); +// outStore.setOrderInfos(list); +// outStore.setGroupId(dto.getInstruction_code()); +// resp = acsToLiKuService.outStore(outStore); +// // 空托出库 +// } else if (StrUtil.equals(type, "4")) { +// EmptyVehicleOutStoreRequest emptyVehicleOutStoreRequest = new EmptyVehicleOutStoreRequest(); +// emptyVehicleOutStoreRequest.setOrderId(dto.getInstruction_code()); +// emptyVehicleOutStoreRequest.setFloorNo(Integer.parseInt(dto.getFrom_z())); +// emptyVehicleOutStoreRequest.setSrcLocation(dto.getStart_point_code()); +// emptyVehicleOutStoreRequest.setDestLocation(dto.getNext_point_code()); +// emptyVehicleOutStoreRequest.setPalletCode(dto.getVehicle_code()); +// resp = acsToLiKuService.emptyVehicleOutStore(emptyVehicleOutStoreRequest); +// // 转库 +// } else if (StrUtil.equals(type, "5")) { +// MoveStoreRequest moveStoreRequest = new MoveStoreRequest(); +// BaseStoreRequest baseReq = new BaseStoreRequest(); +// List list = new ArrayList(); +// baseReq.setFloorNo(Integer.parseInt(dto.getFrom_z())); +// baseReq.setPalletCode(dto.getVehicle_code()); +// baseReq.setOrderId(dto.getInstruction_code()); +// baseReq.setSrcLocation(dto.getStart_point_code()); +// baseReq.setDestLocation(dto.getNext_point_code()); +// list.add(baseReq); +// moveStoreRequest.setGroupId(dto.getInstruction_code()); +// moveStoreRequest.setOrderInfos(list); +// resp = acsToLiKuService.moveStore(moveStoreRequest); +// } +// +// if (ObjectUtil.isNotEmpty(resp)) { +// if (StrUtil.equals(resp.getResult(), "true")) { +// dto.setSend_status("1"); +// } else { +// dto.setSend_status("2"); +// dto.setRemark(resp.getData().toString()); +// return false; +// } +// } else { +// dto.setSend_status("2"); +// dto.setRemark("ERROR"); +// return false; +// } +// return true; +// } } /* diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java index 6d5c6641..f45fd129 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java @@ -10,9 +10,9 @@ import org.nl.acs.device.service.DeviceExtraService; import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_cleaning_machine_storage_station.HailiangCleaningMachineStorageStationDeviceDriver; import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_engraving_machine.HailiangEngravingMachineDeviceDriver; import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_packer_station.HailiangPackerStationDeviceDriver; -import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_smart_plc_test.HailiangSmartplcTestDeviceDriver; import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_special_device.HailiangSpecialDeviceDriver; import org.nl.acs.device_driver.basedriver.hailiang_one.hailiang_stacking_station.HailiangStackingStationDriver; +import org.nl.acs.device_driver.basedriver.hailiang_smart_plc_test.HailiangSmartplcTestDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.opc.Device; import org.nl.acs.order.service.ProduceshiftorderService; diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryLKDeviceStatus.java b/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryLKDeviceStatus.java index 98b5a5f8..edbce2a6 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryLKDeviceStatus.java +++ b/wcs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryLKDeviceStatus.java @@ -1,3 +1,4 @@ +/* package org.nl.modules.quartz.task; import cn.hutool.core.map.MapUtil; @@ -20,9 +21,11 @@ import org.springframework.stereotype.Component; import java.util.List; +*/ /** * 查询立库设备状态 - */ + *//* + @Slf4j @Component public class QueryLKDeviceStatus { @@ -42,3 +45,4 @@ public class QueryLKDeviceStatus { } } +*/ diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/ParamServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/ParamServiceImpl.java index 25d05225..47dc5a9f 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/ParamServiceImpl.java +++ b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/ParamServiceImpl.java @@ -5,6 +5,7 @@ package org.nl.modules.system.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -59,7 +60,8 @@ public class ParamServiceImpl implements ParamService { public ParamDto findById(String id) { WQLObject wo = WQLObject.getWQLObject("sys_param"); JSONObject json = wo.query("id ='" + id + "'").uniqueResult(0); - final ParamDto obj = json.toJavaObject(ParamDto.class);; + final ParamDto obj = json.toJavaObject(ParamDto.class); + ; return obj; } @@ -67,7 +69,11 @@ public class ParamServiceImpl implements ParamService { public ParamDto findByCode(String code) { WQLObject wo = WQLObject.getWQLObject("sys_param"); JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); - final ParamDto obj = json.toJavaObject(ParamDto.class);; + if (ObjectUtil.isEmpty(json)) { + return null; + } + final ParamDto obj = json.toJavaObject(ParamDto.class); + ; return obj; } @@ -88,7 +94,7 @@ public class ParamServiceImpl implements ParamService { dto.setCreate_time(now); WQLObject wo = WQLObject.getWQLObject("sys_param"); - JSONObject json = JSONObject.parseObject( JSONObject.toJSONString(dto)); + JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(dto)); wo.insert(json); } @@ -105,7 +111,7 @@ public class ParamServiceImpl implements ParamService { dto.setUpdate_optname(SecurityUtils.getCurrentNickName()); WQLObject wo = WQLObject.getWQLObject("sys_param"); - JSONObject json = JSONObject.parseObject( JSONObject.toJSONString(dto)); + JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(dto)); wo.update(json); } 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 a1f56261..82867e69 100644 --- a/wcs/nladmin-system/src/main/resources/config/application-dev.yml +++ b/wcs/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:lzhl_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_one_test}?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:123456} + password: ${DB_PWD:password} # 初始连接数 initial-size: 5