From d779f3110d07efeb8ffd28b1810a258f938078f6 Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Wed, 9 Nov 2022 11:17:53 +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 --- .../java/org/nl/acs/autotask/CleanLog.java | 2 +- .../device/device_driver/DriverTypeEnum.java | 8 +- .../HfGantryManipulatorDefination.java | 64 ++ .../HfGantryManipulatorDeviceDriver.java | 502 ++++++++++++ .../hongfeng/hf_manipulator/ItemProtocol.java | 122 +++ .../hf_station/HfStationDefination.java | 64 ++ .../hf_station/HfStationDeviceDriver.java | 733 +++++++++++++++++ .../hongfeng/hf_station/ItemProtocol.java | 171 ++++ .../hf_two_rgv/HfTwoRGVDefination.java | 63 ++ .../hf_two_rgv/HfTwoRGVDeviceDriver.java | 733 +++++++++++++++++ .../hongfeng/hf_two_rgv/ItemProtocol.java | 168 ++++ .../main/java/org/nl/acs/ext/wms/AcsUtil.java | 57 ++ .../acs/ext/wms/rest/AcsToWmsController.java | 15 + .../acs/ext/wms/rest/WmsToAcsController.java | 32 + .../acs/ext/wms/service/AcsToWmsService.java | 21 + .../acs/ext/wms/service/WmsToAcsService.java | 17 + .../wms/service/impl/AcsToWmsServiceImpl.java | 117 ++- .../wms/service/impl/WmsToAcsServiceImpl.java | 154 +++- .../service/impl/InstructionServiceImpl.java | 8 +- .../rest/ProduceshiftorderController.java | 94 +++ .../service/ProduceshiftorderService.java | 110 +++ .../service/dto/ProduceshiftorderDto.java | 72 ++ .../impl/ProduceshiftorderServiceImpl.java | 299 +++++++ .../org/nl/acs/order/service/wql/order.xls | Bin 0 -> 163840 bytes .../task/service/impl/TaskServiceImpl.java | 169 ++-- .../test/service/impl/TestServiceImpl.java | 68 ++ .../nl/hand/amb/rest/HFHandController.java | 152 ++++ .../nl/hand/amb/service/HFHandService.java | 115 +++ .../org/nl/hand/amb/service/dto/HandDto.java | 80 ++ .../amb/service/impl/HFHandServiceImpl.java | 767 ++++++++++++++++++ .../java/org/nl/hand/amb/wql/QJN_QUERY001.wql | 176 ++++ .../satoken/TokenKeyExpirationListener.java | 51 -- .../main/resources/config/application-dev.yml | 10 +- .../resources/config/application-prod.yml | 81 +- .../resources/config/application-test.yml | 57 +- .../src/main/resources/logback-spring.xml | 2 +- acs/nladmin-ui/src/App.vue | 76 +- .../src/api/acs/order/produceshiftorder.js | 42 + acs/nladmin-ui/src/settings.js | 2 +- .../src/views/acs/device/config.vue | 9 +- .../device/driver/hongfeng/hf_manipulator.vue | 488 +++++++++++ .../acs/device/driver/hongfeng/hf_station.vue | 483 +++++++++++ .../acs/device/driver/hongfeng/hf_two_rgv.vue | 589 ++++++++++++++ acs/nladmin-ui/src/views/acs/order/index.vue | 214 +++++ acs/nladmin-ui/src/views/login.vue | 2 +- .../satoken/TokenKeyExpirationListener.java | 51 -- .../modules/system/rest/UserController.java | 8 + .../wms/basedata/rest/VehicleController.java | 7 + .../wms/basedata/service/VehicleService.java | 6 + .../service/impl/MaterialbaseServiceImpl.java | 14 +- .../service/impl/VehicleServiceImpl.java | 21 +- .../wms/ext/acs/rest/AcsToWmsController.java | 31 + .../wms/ext/acs/rest/WmsToAcsController.java | 8 + .../wms/ext/acs/service/AcsToWmsService.java | 23 + .../wms/ext/acs/service/WmsToAcsService.java | 2 + .../acs/service/impl/AcsToWmsServiceImpl.java | 345 +++++--- .../acs/service/impl/WmsToAcsServiceImpl.java | 6 + .../rest/HandlingTaskController.java} | 24 +- .../service/HandlingTaskService.java} | 8 +- .../impl/HandlingTaskServiceImpl.java} | 42 +- .../wql/PDA_HandlingTask_01.wql} | 6 - .../rest/InStructController.java} | 31 +- .../service/InStructService.java} | 12 +- .../service/impl/InStructServiceImpl.java | 76 ++ .../wms/pda/inStruct/wql/PDA_InStruct_01.wql | 83 ++ .../outStruct/rest/OutStructController.java | 34 + .../outStruct/service/OutStructService.java | 14 + .../service/impl/OutStructServiceImpl.java | 43 + .../wql/PDA_OutStruct_01.wql} | 22 +- .../org/nl/wms/pda/scanGroup/HcwNumEnum.java | 37 + .../org/nl/wms/pda/scanGroup/KlzhcwUtil.java | 200 +++++ .../pda/scanGroup/MyLinkedListService.java | 18 + .../service/impl/SendVehicleServiceImpl.java | 78 -- .../nl/wms/pdm/rest/WorkorderController.java | 4 +- .../nl/wms/pdm/service/WorkordeService.java | 2 +- .../service/impl/WorkorderServiceImpl.java | 51 +- .../src/main/java/org/nl/wms/sch/AcsUtil.java | 28 +- .../nl/wms/sch/manage/AbstractAcsTask.java | 30 +- .../org/nl/wms/sch/manage/AutoCreateTask.java | 2 +- .../sch/service/impl/PointServiceImpl.java | 2 +- .../wms/sch/service/impl/TaskServiceImpl.java | 11 +- .../java/org/nl/wms/sch/tasks/AcsTaskDto.java | 2 + .../org/nl/wms/sch/tasks/RegionTypeEnum.java | 23 +- .../callEmpty/GjxCallEmpVehicleTask.java | 429 ---------- .../callEmpty/HnjCallEmpVehicleTask.java | 323 ++++++++ .../callEmpty/YqxCallEmpVehicleTask.java | 434 ---------- ...ask.wql => QSCH_HnjCallEmpVehicleTask.wql} | 31 +- .../wql/QSCH_YqxCallEmpVehicleTask.wql | 60 -- .../callMaterial/YljCallMaterialTask.java | 303 +++++++ .../callMaterial/YqxCallMaterialTask.java | 258 ------ ...ial_01.wql => QSCH_yljCallMAterial_01.wql} | 14 +- .../org/nl/wms/sch/tasks/cpOut/CpOutTask.java | 235 ------ .../wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql | 59 -- .../wms/sch/tasks/handling/HandlingTask.java | 455 +++++++++++ .../tasks/sendEmpty/HtSendEmpVehicleTask.java | 438 ---------- .../sendEmpty/KzdjwSendEmpVehicleTask.java | 311 +++++++ .../sendEmpty/YqxSendEmpVehicleTask.java | 391 --------- .../sendMaterial/GjxSendMaterialTask.java | 384 --------- .../sendMaterial/HkxSendMaterialTask.java | 263 ------ .../sendMaterial/HnjSendMaterialTask.java | 456 +++++++++++ .../sendMaterial/YqxSendMaterialTask.java | 263 ------ .../tasks/timing/TimingSendMaterialTask.java | 344 ++++++++ .../java/org/nl/wms/sch/wql/QSCH_TASK_01.wql | 6 +- .../service/impl/RegionIoServiceImpl.java | 9 +- .../structivt/service/StructivtService.java | 5 + .../service/impl/StructivtServiceImpl.java | 170 +++- .../wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql | 33 +- .../src/main/java/org/nl/wms/wms.xls | Bin 291328 -> 300544 bytes .../main/resources/config/application-dev.yml | 8 +- .../resources/config/application-prod.yml | 91 ++- .../resources/config/application-test.yml | 67 +- lms/nladmin-ui/.env.development | 2 +- lms/nladmin-ui/src/App.vue | 76 +- lms/nladmin-ui/src/main.js | 7 +- lms/nladmin-ui/src/settings.js | 2 +- lms/nladmin-ui/src/utils/nladmin.js | 42 + lms/nladmin-ui/src/views/login.vue | 2 +- .../src/views/wms/basedata/vehicle/vehicle.js | 9 +- .../src/views/wms/pdm/workerorder/index.vue | 28 +- .../src/views/wms/sch/point/index.vue | 50 +- .../src/views/wms/sch/region/index.vue | 16 +- .../src/views/wms/sch/task/index.vue | 2 +- .../src/views/wms/st/cppoint/cppInRegion.vue | 188 ----- .../src/views/wms/st/cppoint/cppInventory.vue | 274 ------- .../src/views/wms/st/cppoint/cppOutRegion.vue | 206 ----- .../src/views/wms/st/cppoint/index.vue | 31 - lms/nladmin-ui/src/views/wms/st/ysa/index.vue | 20 +- .../src/views/wms/st/ysa/inventory.vue | 203 +++-- 128 files changed, 10762 insertions(+), 4900 deletions(-) create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/HfGantryManipulatorDefination.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/HfGantryManipulatorDeviceDriver.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/ItemProtocol.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/HfStationDefination.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/HfStationDeviceDriver.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/ItemProtocol.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/HfTwoRGVDefination.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/HfTwoRGVDeviceDriver.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/ItemProtocol.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/order/rest/ProduceshiftorderController.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/order/service/ProduceshiftorderService.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/order/service/dto/ProduceshiftorderDto.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/order/service/wql/order.xls create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/amb/rest/HFHandController.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/amb/service/HFHandService.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/amb/service/dto/HandDto.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/amb/service/impl/HFHandServiceImpl.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/hand/amb/wql/QJN_QUERY001.wql delete mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/security/satoken/TokenKeyExpirationListener.java create mode 100644 acs/nladmin-ui/src/api/acs/order/produceshiftorder.js create mode 100644 acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_manipulator.vue create mode 100644 acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_station.vue create mode 100644 acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_two_rgv.vue create mode 100644 acs/nladmin-ui/src/views/acs/order/index.vue delete mode 100644 lms/nladmin-system/src/main/java/org/nl/modules/security/satoken/TokenKeyExpirationListener.java rename lms/nladmin-system/src/main/java/org/nl/wms/pda/{callmaterial/rest/CallMaterialController.java => handlingTask/rest/HandlingTaskController.java} (56%) rename lms/nladmin-system/src/main/java/org/nl/wms/pda/{sendvehicle/service/SendVehicleService.java => handlingTask/service/HandlingTaskService.java} (56%) rename lms/nladmin-system/src/main/java/org/nl/wms/pda/{callmaterial/service/impl/CallMaterialServiceImpl.java => handlingTask/service/impl/HandlingTaskServiceImpl.java} (54%) rename lms/nladmin-system/src/main/java/org/nl/wms/pda/{sendvehicle/wql/PDA_SENDVEHICLE_01.wql => handlingTask/wql/PDA_HandlingTask_01.wql} (94%) rename lms/nladmin-system/src/main/java/org/nl/wms/pda/{sendvehicle/rest/SendVehicleController.java => inStruct/rest/InStructController.java} (54%) rename lms/nladmin-system/src/main/java/org/nl/wms/pda/{callmaterial/service/CallMaterialService.java => inStruct/service/InStructService.java} (57%) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/service/impl/InStructServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/wql/PDA_InStruct_01.wql create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/rest/OutStructController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/service/OutStructService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/service/impl/OutStructServiceImpl.java rename lms/nladmin-system/src/main/java/org/nl/wms/pda/{callmaterial/wql/PDA_CALLMATERIAL_01.wql => outStruct/wql/PDA_OutStruct_01.wql} (84%) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/HcwNumEnum.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/KlzhcwUtil.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/MyLinkedListService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnjCallEmpVehicleTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java rename lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/{QSCH_GjxCallEmpVehicleTask.wql => QSCH_HnjCallEmpVehicleTask.wql} (60%) delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YljCallMaterialTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java rename lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/{QSCH_yqxCallMAterial_01.wql => QSCH_yljCallMAterial_01.wql} (79%) delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/handling/HandlingTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/KzdjwSendEmpVehicleTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnjSendMaterialTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/timing/TimingSendMaterialTask.java delete mode 100644 lms/nladmin-ui/src/views/wms/st/cppoint/cppInRegion.vue delete mode 100644 lms/nladmin-ui/src/views/wms/st/cppoint/cppInventory.vue delete mode 100644 lms/nladmin-ui/src/views/wms/st/cppoint/cppOutRegion.vue delete mode 100644 lms/nladmin-ui/src/views/wms/st/cppoint/index.vue diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/autotask/CleanLog.java b/acs/nladmin-system/src/main/java/org/nl/acs/autotask/CleanLog.java index 3d82c43..84d7084 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/autotask/CleanLog.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/autotask/CleanLog.java @@ -1,4 +1,4 @@ -package org.nl.wms.autotask; +package org.nl.acs.autotask; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java index 6f46ade..c90d7ad 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java @@ -31,7 +31,13 @@ public enum DriverTypeEnum { HAOKAI_AUTO_CONVEYOR(11, "haokai_auto_conveyor", "豪恺自动线对接位", "conveyor"), - PAINT_CONVEYOR(12, "paint_conveyor", "油漆线", "conveyor"); + PAINT_CONVEYOR(12, "paint_conveyor", "油漆线", "conveyor"), + + HF_MANIPULATOR(13, "hf_manipulator", "宏丰-行架机械手", "conveyor"), + + HF_STATION(14, "hf_station", "宏丰-工位(交互模板)", "conveyor"), + + HF_TWO_RGV(15, "hf_two_rgv", "宏丰-双工位RGV", "rgv"); //驱动索引 diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/HfGantryManipulatorDefination.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/HfGantryManipulatorDefination.java new file mode 100644 index 0000000..2f9af80 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/HfGantryManipulatorDefination.java @@ -0,0 +1,64 @@ +package org.nl.acs.device_driver.hongfeng.hf_manipulator; + +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; + +/** + * 宏丰行架机械手 + * + */ +@Service +public class HfGantryManipulatorDefination implements OpcDeviceDriverDefination { + @Override + public String getDriverCode() { + return "hf_manipulator"; + } + + @Override + public String getDriverName() { + return "宏丰-行架机械手"; + } + + @Override + public String getDriverDescription() { + return "宏丰-行架机械手"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new HfGantryManipulatorDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return HfGantryManipulatorDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList(); + types.add(DeviceType.station); + return types; + } + + @Override + public List getReadableItemDtos() { + return ItemProtocol.getReadableItemDtos(); + } + + + + @Override + public List getWriteableItemDtos() { + return ItemProtocol.getWriteableItemDtos(); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/HfGantryManipulatorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/HfGantryManipulatorDeviceDriver.java new file mode 100644 index 0000000..0585461 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/HfGantryManipulatorDeviceDriver.java @@ -0,0 +1,502 @@ +package org.nl.acs.device_driver.hongfeng.hf_manipulator; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.device_driver.hongfeng.hf_station.HfStationDeviceDriver; +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.service.DeviceExecuteLogService; +import org.nl.acs.monitor.DeviceStageMonitor; +import org.nl.acs.opc.Device; +import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.opc.DeviceAppServiceImpl; +import org.nl.acs.route.service.RouteLineService; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.modules.wql.util.SpringContextHolder; +import org.openscada.opc.lib.da.Server; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; + +/** + * 嘉耐码垛机械手 + */ +@Slf4j +@Data +@RequiredArgsConstructor +public class HfGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor { + protected ItemProtocol itemProtocol = new ItemProtocol(this); + @Autowired + InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl"); + @Autowired + DeviceService deviceservice = SpringContextHolder.getBean("deviceServiceImpl"); + @Autowired + RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); + @Autowired + TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); + @Autowired + DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl"); + @Autowired + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + + //工作模式 + int mode = 0; + int last_mode = 0; + //光电信号 + int move = 0; + int last_move = 0; + //动作信号 + int action = 0; + int last_action = 0; + //行走列 + int walk_y = 0; + int last_walk_y = 0; + //报警信号 + int error = 0; + int last_error = 0; + //任务号 + int task = 0; + int last_task = 0; + + + Boolean isonline = true; + int hasGoods = 0; + String message = null; + Boolean iserror = false; + + Integer heartbeat_tag; + private Date instruction_require_time = new Date(); + + private int instruction_require_time_out; + //行架机械手申请任务成功标识 + boolean requireSucess = false; + + private int instruction_finished_time_out; + + int branchProtocol = 0; + + + //暂定 0就绪 1请求取货 2取货完成 3请求放货 4放货完成 5取货完成离开 6放货完成离开 7请求进入区域 8请求离开区域 + int flag; + + String device_code; + + + @Override + public Device getDevice() { + return this.device; + } + + + @Override + public void execute() { + String message = null; + try { + device_code = this.getDeviceCode(); + mode = this.itemProtocol.getMode(); + move = this.itemProtocol.getMove(); + action = this.itemProtocol.getAction(); + walk_y = this.itemProtocol.getWalk_y(); + error = this.itemProtocol.getError(); + task = this.itemProtocol.getTask(); + if (mode != last_mode) { + if (mode == 2){ + this.setRequireSucess(false); + } + logServer.deviceItemValue(this.device_code, "mode", String.valueOf(mode)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号mode:" + last_mode + "->" + mode); + } + if (move != last_move) { + logServer.deviceItemValue(this.device_code, "move", String.valueOf(move)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号move:" + last_move + "->" + move); + } + if (action != last_action) { + logServer.deviceItemValue(this.device_code, "action", String.valueOf(action)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号action:" + last_action + "->" + action); + } + if (error != last_error) { + logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); + } + if (walk_y != last_walk_y) { + logServer.deviceItemValue(this.device_code, "walk_y", String.valueOf(walk_y)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号walk_y:" + last_walk_y + "->" + walk_y); + } + if (task != last_task) { + logServer.deviceItemValue(this.device_code, "task", String.valueOf(task)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号task:" + last_task + "->" + task); + } + + //更改任务状态 + if (task > 0) { + //inst_message + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task)); + if (inst1 != null) { + if (StrUtil.equals(inst1.getInstruction_status(), "0")) { + inst1.setInstruction_status("1"); + instructionService.update(inst1); + TaskDto taskDto = taskserver.findByCode(inst1.getTask_code()); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id",taskDto.getExt_task_id()); + map.put("task_status","1"); + array.add(map); + acsToWmsService.feedbackTaskStatusToWms(array); + } + } + } + + //申请取货 判断取货位是否有货 有货就下发允许取货命令 + if (mode == 3 && action == 1 && move == 0 && task > 0) { + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task)); + if (ObjectUtil.isNotEmpty(inst2)){ + String start_device_code = inst2.getStart_device_code(); + Device device = appService.findDeviceByCode(start_device_code); + HfStationDeviceDriver hfStationDeviceDriver; + if (device.getDeviceDriver() instanceof HfStationDeviceDriver){ + hfStationDeviceDriver = (HfStationDeviceDriver) device.getDeviceDriver(); + if (hfStationDeviceDriver.getMove() == 1){ + this.writing("to_command", "2"); + } + } + } + } + + //行架机械手取货时校验条码 校验失败,取消任务 + if (mode == 4 && action == 1 && move == 0 && task > 0) { + try { + Instruction instructionDto = instructionService.findByCode(String.valueOf(task)); + if (ObjectUtil.isNotEmpty(instructionDto)) { + // TODO 校验失败我是取消指令还是完成指令 + instructionService.cancel(instructionDto.getInstruction_id()); + //taskserver.cancel(instructionDto.getTask_id()); +// TaskDto taskDto = taskserver.findByCode(instructionDto.getTask_code()); +// JSONArray array = new JSONArray(); +// JSONObject map = new JSONObject(); +// map.put("task_id",taskDto.getExt_task_id()); +// map.put("task_status","3"); +// array.add(map); +// acsToWmsService.feedbackTaskStatusToWms(array); + } + } catch (Exception e) { + e.printStackTrace(); + } + this.writing("to_command", "4"); + this.writing("to_onset", "0"); + this.writing("to_target", "0"); + this.writing("to_task", "0"); + } + + //申请放货 + if (mode == 3 && action == 3 && move == 1 && task > 0) { + Instruction instructionDto = instructionService.findByCode(String.valueOf(task)); + String next_device_code = instructionDto.getNext_device_code(); + Device nextDevice = appService.findDeviceByCode(next_device_code); + HfStationDeviceDriver hfStationDeviceDriver; + if (nextDevice.getDeviceDriver() instanceof HfStationDeviceDriver) { + hfStationDeviceDriver = (HfStationDeviceDriver) nextDevice.getDeviceDriver(); + int move = hfStationDeviceDriver.getMove(); + if (move == 0) { + this.writing("to_command", "3"); + } + } + } + + //放货完成 + if (mode == 3 && action == 4 && move == 0 && task > 0) { + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task)); + if (inst2 != null) { + if (StrUtil.equals(inst2.getInstruction_status(), "1")) { + try { + finish_instruction(inst2); + } catch (Exception e) { + e.printStackTrace(); + } + //获取当前工单数量 + TaskDto taskDto = taskserver.findByCode(inst2.getTask_code()); + String next_device_code = inst2.getNext_device_code(); + Device device = appService.findDeviceByCode(next_device_code); + HfStationDeviceDriver hfStationDeviceDriver; + String current_num = ""; + if (device.getDeviceDriver() instanceof HfStationDeviceDriver){ + hfStationDeviceDriver = (HfStationDeviceDriver) device.getDeviceDriver(); + current_num = String.valueOf(hfStationDeviceDriver.getCurrent_order_num()); + } + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id",taskDto.getExt_task_id()); + map.put("task_status","2"); + map.put("material_num",current_num); + array.add(map); + acsToWmsService.feedbackTaskStatusToWms(array); + this.writing("to_command2", "0"); + this.writing("to_onset2", "0"); + this.writing("to_target2", "0"); + this.writing("to_task2", "0"); + } + } + } + + + } catch (Exception var17) { + return; + } + + if (!this.itemProtocol.getIsonline()) { + this.setIsonline(false); + this.setIserror(true); + message = "信号量同步异常"; + //未联机 + } else if (mode == 0) { + this.setIsonline(false); + this.setIserror(true); + message = "未联机"; + //有报警 + } else if (error != 0) { + this.setIsonline(false); + this.setIserror(true); + message = "有报警"; + //无报警 + } else { + this.setIsonline(true); + this.setIserror(false); + message = ""; + Instruction instruction = null; + List toInstructions; + + //行架机械手申请任务 + if (mode == 2 && move == 0 && task == 0 && !requireSucess) { + applyTask(); + } + + } + last_mode = mode; + last_move = move; + last_action = action; + last_walk_y = walk_y; + last_error = error; + last_task = task; + } + + + /** + * 申请任务 + * + * @param + */ + public synchronized boolean applyTask() { + 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; + //抓取工位 + List getDeviceCodeList = this.getExtraDeviceCodes("link_get_device_code"); + //放货工位 + List putDeviceCodeList = this.getExtraDeviceCodes("link_put_device_code"); + TaskDto task = null; + for (int i = 0; i < getDeviceCodeList.size(); i++) { + String startDeviceCode = getDeviceCodeList.get(i); + List taskDtoList = taskserver.queryTaskByDeviceCode(startDeviceCode); + if (ObjectUtil.isNotEmpty(taskDtoList)) { + task = taskDtoList.get(0); + } + if (ObjectUtil.isNotEmpty(task)) break; + } + if (!ObjectUtil.isEmpty(task)) { + String taskid = task.getTask_id(); + String taskcode = task.getTask_code(); + String vehiclecode = task.getVehicle_code(); + String priority = task.getPriority(); + String start_point_code = task.getStart_point_code(); + String start_device_code = task.getStart_device_code(); + String route_plan_code = task.getRoute_plan_code(); + String next_point_code = task.getNext_point_code(); + String next_device_code = task.getNext_device_code(); + + Instruction instdto = new Instruction(); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(task.getRemark()); + instdto.setMaterial(task.getMaterial()); + instdto.setQuantity(task.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(); + } + //创建指令后修改任务状态 + task.setTask_status("1"); + task.setUpdate_time(DateUtil.now()); + taskserver.update(task); + //根据获取托盘信息返回的结果 得到对应抓取工位/放货工位设备编码所在的索引位置 + int start_addrIndex = getDeviceCodeList.indexOf(start_device_code); + int next_addrIndex = putDeviceCodeList.indexOf(next_device_code); + writing("to_onset", String.valueOf(start_addrIndex)); + writing("to_target", String.valueOf(next_addrIndex)); + writing("to_task", instdto.getInstruction_code()); + writing("to_command", "1"); + this.setRequireSucess(true); + } + return true; + } + } + + public boolean exe_error() { + if (this.error == 0) { + return true; + } else { + log.debug("设备报警"); + return false; + } + } + + public boolean exe_business() { + return true; + } + + public synchronized boolean finish_instruction(Instruction inst) throws Exception { + instructionService.finish(inst); + return true; + } + + public void writing(String param, String value) { + + String to_param = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + param; + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + + itemMap.put(to_param, value); +// itemMap.put(to_param, Integer.parseInt(value)); + ReadUtil.write(itemMap, server); + } + + public void executing(Server server, Map itemMap) { + ReadUtil.write(itemMap, server); + } + + public void writing(int command) { + + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + ReadUtil.write(itemMap, server); + + } + + //将扩展表中的字符串数据转换成集合 + public List getExtraDeviceCodes(String extraName) { + String extraValue = (String) this.getDevice().getExtraValue().get(extraName); + String devicesString = extraValue.substring(1, extraValue.length() - 1); + List devicesList = new ArrayList<>(); + String[] devices = devicesString.split(","); + for (int i = 0; i < devices.length; i++) { + String s = devices[i].replace("\"", "").replace("\"", ""); + devicesList.add(s); + } + return devicesList; + } + + + @Override + public JSONObject getDeviceStatusName() { + JSONObject jo = new JSONObject(); + String mode = ""; + String move = ""; + String action = ""; + String walk_y = ""; + if (this.getMode() == 0) { + mode = "脱机"; + } else if (this.getMode() == 1) { + mode = "单机"; + } else if (this.getMode() == 2) { + mode = "待机"; + } else if (this.getMode() == 3) { + mode = "运行中"; + } else if (this.getMode() == 4) { + mode = "托盘号校验失败"; + } + + if (this.getMove() == 0) { + move = "无货"; + } else if (this.getMove() == 1) { + move = "有货"; + } + + if (this.getAction() == 1) { + action = "取货中"; + } else if (this.getAction() == 2) { + action = "取货完成"; + } else if (this.getAction() == 3) { + action = "放货中"; + } else if (this.getAction() == 4) { + action = "放货完成"; + } + + jo.put("device_name", this.getDevice().getDevice_name()); + jo.put("mode", mode); + jo.put("move", move); + jo.put("action", action); + jo.put("task", task); + jo.put("walk_y", walk_y); + jo.put("isOnline", this.getIsonline()); + jo.put("error", this.getError()); + jo.put("isError", this.getIserror()); + jo.put("message", this.getMessage()); + return jo; + } + + @Override + public void setDeviceStatus(JSONObject data) { + + } + +// public void writing(int type, int command) { +// String to_material_code = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() +// + "." + ItemProtocol.item_to_material_code; +// String opcservcerid = this.getDevice().getOpc_server_id(); +// Server server = ReadUtil.getServer(opcservcerid); +// Map itemMap = new HashMap(); +// if (type == 2) { +// itemMap.put(to_material_code, command); +// } +// ReadUtil.write(itemMap, server); +// +// } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/ItemProtocol.java new file mode 100644 index 0000000..4381e50 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_manipulator/ItemProtocol.java @@ -0,0 +1,122 @@ +package org.nl.acs.device_driver.hongfeng.hf_manipulator; + +import cn.hutool.core.util.StrUtil; +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_move = "move"; + //动作信号 + public static String item_action = "action"; + //行走列 + public static String item_walk_y = "walk_y"; + //报警 + public static String item_error = "error"; + //任务号 + public static String item_task = "task"; + + //下发命令 + public static String item_to_command = "to_command"; + //下发起始站 + public static String item_to_onset = "to_onset"; + //下发目标站 + public static String item_to_target = "to_target"; + //下发任务号 + public static String item_to_task = "to_task"; + + + private HfGantryManipulatorDeviceDriver driver; + + public ItemProtocol(HfGantryManipulatorDeviceDriver driver) { + this.driver = driver; + } + + public int getHeartbeat() { + return this.getOpcIntegerValue(item_heartbeat); + } + + public int getMode() { + return this.getOpcIntegerValue(item_mode); + } + + public int getMove() { + return this.getOpcIntegerValue(item_move); + } + + public int getAction() { + return this.getOpcIntegerValue(item_action); + } + + public int getWalk_y() { + return this.getOpcIntegerValue(item_walk_y); + } + + public int getError() { + return this.getOpcIntegerValue(item_error); + } + + public int getTask() { + return this.getOpcIntegerValue(item_task); + } + + + Boolean isonline; + + public int getOpcIntegerValue(String protocol) { + Integer value = this.driver.getIntegeregerValue(protocol); + if (value == null) { + log.error(this.getDriver().getDeviceCode() + ":protocol " + protocol + " 信号同步异常!"); + setIsonline(false); + } else { + setIsonline(true); + return value; + } + return 0; + + } + + public String getOpcStringValue(String protocol) { + String value = this.driver.getStringValue(protocol); + if (StrUtil.isEmpty(value)) { + + } else { + return value; + } + return "0"; + } + + public static List getReadableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB1.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB1.B1")); + list.add(new ItemDto(item_move, "光电信号", "DB1.B2")); + list.add(new ItemDto(item_action, "动作信号", "DB1.B3")); + list.add(new ItemDto(item_walk_y, "行走列", "DB1.B4")); + list.add(new ItemDto(item_error, "报警信号", "DB1.B5")); + list.add(new ItemDto(item_task, "任务号", "DB1.D6")); + return list; + } + + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_to_command, "下发命令", "DB2.W0")); + list.add(new ItemDto(item_to_onset, "下发起始站", "DB2.W2")); + list.add(new ItemDto(item_to_target, "下发目标站", "DB2.W4")); + list.add(new ItemDto(item_to_task, "下发任务号", "DB2.D6")); + return list; + } + +} + diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/HfStationDefination.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/HfStationDefination.java new file mode 100644 index 0000000..55ea581 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/HfStationDefination.java @@ -0,0 +1,64 @@ +package org.nl.acs.device_driver.hongfeng.hf_station; + +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.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * 宏丰-工位(交互模板) + * + */ +@Service +public class HfStationDefination implements OpcDeviceDriverDefination { + @Override + public String getDriverCode() { + return "hf_station"; + } + + @Override + public String getDriverName() { + return "宏丰-工位(交互模板)"; + } + + @Override + public String getDriverDescription() { + return "宏丰-工位(交互模板)"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new HfStationDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return HfStationDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList(); + types.add(DeviceType.station); + return types; + } + + @Override + public List getReadableItemDtos() { + return ItemProtocol.getReadableItemDtos(); + } + + + @Override + public List getWriteableItemDtos() { + return ItemProtocol.getWriteableItemDtos(); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/HfStationDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/HfStationDeviceDriver.java new file mode 100644 index 0000000..06d4572 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/HfStationDeviceDriver.java @@ -0,0 +1,733 @@ +package org.nl.acs.device_driver.hongfeng.hf_station; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.instruction.service.InstructionService; +import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.log.service.DeviceExecuteLogService; +import org.nl.acs.monitor.DeviceStageMonitor; +import org.nl.acs.opc.Device; +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.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.List; +import java.util.Map; + +/** + * 嘉耐-工位(交互模板) + */ +@Slf4j +@Data +@RequiredArgsConstructor +public class HfStationDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor { + protected ItemProtocol itemProtocol = new ItemProtocol(this); + @Autowired + InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl"); + @Autowired + DeviceService deviceservice = SpringContextHolder.getBean("deviceServiceImpl"); + @Autowired + RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); + @Autowired + TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); + @Autowired + DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl"); + @Autowired + ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean("produceshiftorderServiceImpl"); + + + String device_code; + + //心跳 + int heartbeat; + int last_heartbeat; + //工作模式 + int mode = 0; + int last_mode = 0; + //光电信号 + int move = 0; + int last_move = 0; + //取放信号 + int action = 0; + int last_action = 0; + //进出信号 + int io_action = 0; + int last_ioaction = 0; + //报警信号 + int error = 0; + int last_error = 0; + //任务号 + int task = 0; + int last_task = 0; + //设备状态 + int status = 0; + int last_status = 0; + //当前工单数量 + int current_order_num = 0; + int last_current_order_num = 0; + //工单号 + String order = "0"; + String last_order = "0"; + //产品编码 + String material_code = "0"; + String last_material_code = "0"; + //条码 + String barcode = "0"; + String last_barcode = "0"; + + + Boolean isonline = true; + int hasGoods = 0; + Boolean iserror = false; + + protected int instruction_num = 0; + protected int instruction_num_truth = 0; + Integer heartbeat_tag; + //人工排产确认请求时间 + private Date instruction_require_time = new Date(); + //工单完成请求时间 + private Date instruction_finished_time = new Date(); + //呼叫空盅请求时间 + private Date instruction_call_empty_time = new Date(); + //满盅入库请求时间 + private Date instruction_full_in_time = new Date(); + //叫料请求时间 + private Date instruction_call_material_time = new Date(); + //空料盅对接位有货时请求时间 + private Date instruction_empty_hasGoods_time = new Date(); + //条码改变请求标记 + private Date instruction_update_barcode_time = new Date(); + + + private int instruction_require_time_out = 3000; + //人工排产确认请求标记 + boolean requireSucess = false; + //工单完成请求标记 + boolean finishRequireSucess = false; + //呼叫空盅请求标记 + boolean callEmptyRequireSucess = false; + //满盅入库请求标记 + boolean fullInRequireSucess = false; + //叫料请求标记 + boolean callMaterialRequireSucess = false; + //空料盅对接位有货时请求标记 + boolean emptyHasGoodsRequireSucess = true; + //条码改变请求标记 + boolean updateBarcodeRequireSucess = true; + + private int instruction_finished_time_out; + + + int branchProtocol = 0; + //当前指令 + Instruction inst = null; + //上次指令 + Instruction last_inst = null; + + //触摸屏手动触发任务 + private Boolean is_has_task = false; + + //暂定 0就绪 1请求取货 2取货完成 3请求放货 4放货完成 5取货完成离开 6放货完成离开 7请求进入区域 8请求离开区域 + int flag; + int last_flag; + + String message; + + int container_type = 0; + + + @Override + public Device getDevice() { + return this.device; + } + + + @Override + public void execute() { + String message = null; + try { + device_code = this.getDeviceCode(); + + mode = this.itemProtocol.getMode(); + move = this.itemProtocol.getMove(); + action = this.itemProtocol.getAction(); + io_action = this.itemProtocol.getIoAction(); + error = this.itemProtocol.getError(); + task = this.itemProtocol.getTask(); + status = this.itemProtocol.getStatus(); + current_order_num = this.itemProtocol.getCurrent_order_num(); + barcode = this.itemProtocol.getBarcode(); + material_code = this.itemProtocol.getMaterial_code(); + order = this.itemProtocol.getOrder(); + + if (mode != last_mode) { + logServer.deviceItemValue(this.device_code, "mode", String.valueOf(mode)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号mode:" + last_mode + "->" + mode); + } + if (move != last_move) { + Object inspect_in_stocck = this.getDevice().getExtraValue().get("inspect_in_stocck"); + if (ObjectUtil.isEmpty(inspect_in_stocck)) { + inspect_in_stocck = "false"; + } + if (inspect_in_stocck.toString().equals("true") && move == 1) { + this.setEmptyHasGoodsRequireSucess(false); + } + logServer.deviceItemValue(this.device_code, "move", String.valueOf(move)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号move:" + last_move + "->" + move); + } + if (action != last_action) { + logServer.deviceItemValue(this.device_code, "action", String.valueOf(action)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号action:" + last_action + "->" + action); + } + if (io_action != last_ioaction) { + logServer.deviceItemValue(this.device_code, "io_action", String.valueOf(io_action)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号io_action: " + last_ioaction + "->" + io_action); + } + if (error != last_error) { + logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); + } + if (task != last_task) { + logServer.deviceItemValue(this.device_code, "task", String.valueOf(task)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号task:" + last_task + "->" + task); + } + if (status != last_status) { + logServer.deviceItemValue(this.device_code, "status", String.valueOf(status)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号status: " + last_status + "->" + status); + } + if (current_order_num != last_current_order_num) { + logServer.deviceItemValue(this.device_code, "current_order_num", String.valueOf(current_order_num)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号current_order_num: " + last_current_order_num + "->" + current_order_num); + } + if (!order.equals(last_order)) { + logServer.deviceItemValue(this.device_code, "order", order); + logServer.deviceExecuteLog(this.device_code, "", "", "信号order:" + last_order + "->" + order); + } + if (!barcode.equals(last_barcode)) { + this.setUpdateBarcodeRequireSucess(false); + logServer.deviceItemValue(this.device_code, "barcode", barcode); + logServer.deviceExecuteLog(this.device_code, "", "", "信号barcode:" + last_barcode + "->" + barcode); + } + if (!material_code.equals(last_material_code)) { + logServer.deviceItemValue(this.device_code, "material_code", material_code); + logServer.deviceExecuteLog(this.device_code, "", "", "信号material_code:" + last_material_code + "->" + material_code); + } + + if (!emptyHasGoodsRequireSucess && move == 1) { + //申请将空盅对接位空盅搬运至空盅缓存线 + applyMoveEmpty(); + } + + if (!updateBarcodeRequireSucess) { + //updateBarcode(); + } + + + } catch (Exception var17) { + return; + } + + //急停 + if (this.isStop()) { + //未在线无心跳 + } else if (!this.itemProtocol.getIsonline()) { + this.setIsonline(false); + this.setIserror(true); + message = "信号量同步异常"; + //未联机 + } else if (mode == 0) { + this.setIsonline(false); + this.setIserror(true); + message = "未联机"; + //有报警 + } else if (error != 0) { + this.setIsonline(false); + this.setIserror(true); + message = "有报警"; + //无报警 + } else { + this.setIsonline(true); + this.setIserror(false); + message = ""; + Instruction instruction = null; + List toInstructions; + switch (mode) { + case 1: + log.debug("设备运转模式:等待工作"); + break; + case 2: + break; + case 3: + //人工排产确认 + if (!requireSucess && !order.equals("0")) { + enterOrder(); + } + break; + case 4: + //工单完成 + if (!finishRequireSucess && !order.equals("0")) { + finish(); + } + break; + case 5: + break; + case 6: + //呼叫空盅 + if (!callEmptyRequireSucess && !order.equals("0")) { + callEmpty(); + } + break; + case 7: + //满盅入库 + if (!fullInRequireSucess && !order.equals("0")) { + fullIn(); + } + break; + case 8: + //压机叫料 + if (!callMaterialRequireSucess && !order.equals("0")) { + callMaterial(); + } + break; + } + + } + + last_mode = mode; + last_move = move; + last_action = action; + last_ioaction = io_action; + last_error = error; + last_task = task; + last_status = status; + last_current_order_num = current_order_num; + last_order = order; + last_barcode = barcode; + last_material_code = material_code; + } + + + /** + * 人工排产确认 + * + * @param + */ + public synchronized boolean enterOrder() { + 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; + ProduceshiftorderDto dto = produceshiftorderService.findByCode(order); + JSONObject json = new JSONObject(); + json.put("device_code", device_code); + json.put("material_code", material_code); + json.put("ext_order_id", dto.getExt_order_id()); + json.put("order_code", order); + HttpResponse result = acsToWmsService.orderConfirm(json); + if (ObjectUtil.isNotEmpty(result)) { + JSONObject jsonObject = JSONObject.parseObject(result.body()); + if (result.getStatus() == 200 && StrUtil.equals(jsonObject.getString("status"), "200")) { + dto.setOrder_status("1"); + dto.setUpdate_time(DateUtil.now()); + produceshiftorderService.update(dto); + this.writing(3); + this.setRequireSucess(true); + } + } + return true; + } + } + + /** + * 工单完成 + * + * @param + */ + public synchronized boolean finish() { + Date date = new Date(); + if (date.getTime() - this.instruction_finished_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_finished_time); + return false; + } else { + this.instruction_finished_time = date; + ProduceshiftorderDto dto = produceshiftorderService.findByCode(order); + JSONObject json = new JSONObject(); + json.put("device_code", device_code); + json.put("order_code", order); + json.put("ext_order_id", dto.getExt_order_id()); + json.put("qty", current_order_num); + json.put("type", "3"); + HttpResponse result = acsToWmsService.feedbackOrderStatus(json); + if (ObjectUtil.isNotEmpty(result)) { + if (result.getStatus() == 200) { + dto.setOrder_status("2"); + dto.setUpdate_time(DateUtil.now()); + produceshiftorderService.update(dto); + this.writing(4); + this.setFinishRequireSucess(true); + } + } + return true; + } + } + + /** + * 呼叫空盅 + * + * @param + */ + public synchronized boolean callEmpty() { + Date date = new Date(); + if (date.getTime() - this.instruction_call_material_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_call_material_time); + return false; + } else { + this.instruction_call_material_time = date; + JSONObject json = new JSONObject(); + json.put("point_code", this.device_code); + json.put("create_mode", "2"); + json.put("is_auto_issue", "0"); + json.put("type", "1"); + HttpResponse result = acsToWmsService.apply(json); + if (ObjectUtil.isNotEmpty(result)) { + if (result.getStatus() == 200) { + this.writing(6); + this.setCallEmptyRequireSucess(true); + } + } + return true; + } + } + + + /** + * 满盅入库 + * + * @param + */ + public synchronized boolean fullIn() { + Date date = new Date(); + if (date.getTime() - this.instruction_full_in_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_full_in_time); + return false; + } else { + this.instruction_full_in_time = date; + JSONObject json = new JSONObject(); + json.put("device_code", device_code); + json.put("barcode", barcode); + json.put("material_code", material_code); + json.put("create_mode", "2"); + json.put("is_auto_issue", "0"); + json.put("type", "2"); + HttpResponse result = acsToWmsService.apply(json); + if (ObjectUtil.isNotEmpty(result)) { + if (result.getStatus() == 200) { + this.writing(7); + this.setFullInRequireSucess(true); + } + } + return true; + } + } + + + /** + * 压机叫料 + * + * @param + */ + public synchronized boolean callMaterial() { + Date date = new Date(); + if (date.getTime() - this.instruction_call_material_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_call_material_time); + return false; + } else { + this.instruction_call_material_time = date; + JSONObject json = new JSONObject(); + json.put("device_code", this.device_code); + json.put("create_mode", "2"); + json.put("is_auto_issue", "0"); + json.put("type", "3"); + HttpResponse result = acsToWmsService.apply(json); + if (ObjectUtil.isNotEmpty(result)) { + if (result.getStatus() == 200) { + this.writing(8); + this.setCallMaterialRequireSucess(true); + } + } + return true; + } + } + + /** + * 空盅对接位有货时申请搬运至空料盅缓存线 + * + * @param + */ + public synchronized boolean applyMoveEmpty() { + Date date = new Date(); + if (date.getTime() - this.instruction_empty_hasGoods_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_empty_hasGoods_time); + return false; + } else { + this.instruction_empty_hasGoods_time = date; + JSONObject json = new JSONObject(); + json.put("device_code", device_code); + json.put("create_mode", "2"); + json.put("is_auto_issue", "0"); + json.put("type", "4"); + HttpResponse result = acsToWmsService.apply(json); + if (ObjectUtil.isNotEmpty(result)) { + if (result.getStatus() == 200) { + this.setEmptyHasGoodsRequireSucess(true); + } + } + } + return true; + } + + /** + * 条码改变更新库存 + * + * @param + */ + public synchronized boolean updateBarcode() { + Date date = new Date(); + if (date.getTime() - this.instruction_update_barcode_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_update_barcode_time); + return false; + } else { + this.instruction_update_barcode_time = date; + JSONObject json = new JSONObject(); + Object inspect_in_stocck = this.getDevice().getExtraValue().get("inspect_in_stocck"); + if (ObjectUtil.isEmpty(inspect_in_stocck)) { + inspect_in_stocck = "false"; + } + if (inspect_in_stocck.toString().equals("true")) { + json.put("is_first", "true"); + } + json.put("device_code", device_code); + json.put("barcode", barcode); + HttpResponse result = acsToWmsService.updateBarcode(json); + if (ObjectUtil.isNotEmpty(result)) { + if (result.getStatus() == 200) { + this.setEmptyHasGoodsRequireSucess(true); + } + } + } + return true; + } + + public boolean exe_error() { + if (this.error == 0) { + return true; + } else { + log.debug("设备报警"); + return false; + } + } + + public boolean exe_business() { + return true; + } + + public String autoGenericCode(String vehicle_code) { + return String.format("%0" + 4 + "d", Integer.parseInt(vehicle_code)); + } + + protected void executing(Instruction instruction) { + this.executing(1, instruction, ""); + } + + public void executing(int command, Instruction instruction, String appendMessage) { + String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command; + String to_target = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_target; + String to_task = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_task; + if (appendMessage == null) { + appendMessage = ""; + } + if (instruction != null) { + instruction_num = Integer.parseInt(instruction.getInstruction_code()); + } + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_command, 1); + itemMap.put(to_task, instruction_num); + ReadUtil.write(itemMap, server); + + } + + public void executing(Server server, Map itemMap) { + ReadUtil.write(itemMap, server); + } + + public void writing(int type, int command) { + String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command; + String to_target = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_target; + String to_task = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_task; + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + if (type == 1) { + itemMap.put(to_command, command); + } else if (type == 2) { + itemMap.put(to_target, command); + + } else if (type == 3) { + itemMap.put(to_task, command); + } + ReadUtil.write(itemMap, server); + + } + + public void writing(int command) { + String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command; + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_command, command); + ReadUtil.write(itemMap, server); + } + + public void writing(String param, String value) { + String to_param = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + param; + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_param, value); + ReadUtil.write(itemMap, server); + } + + public synchronized boolean finish_instruction() throws Exception { + instructionService.finish(inst); + return true; + } + + public synchronized void OpenOrClose(String type) { + + //进入区域 +// if ("1".equals(type)) { +// writing(5); +// } else { +// //离开区域 +// writing(6); +// } + } + + + @Override + public String toString() { + return ""; + } + + @Override + public JSONObject getDeviceStatusName() { + JSONObject jo = new JSONObject(); + String mode = ""; + String action = ""; + String io_action = ""; + String move = ""; + String status = ""; + if (this.getMode() == 0) { + mode = "脱机"; + } else if (this.getMode() == 1) { + mode = "单机"; + } else if (this.getMode() == 2) { + mode = "待机"; + } else if (this.getMode() == 3) { + mode = "人工排产确认"; + } else if (this.getMode() == 4) { + mode = "工单完成"; + } else if (this.getMode() == 5) { + mode = "工单强制完成"; + } else if (this.getMode() == 6) { + mode = "呼叫空盅"; + } else if (this.getMode() == 7) { + mode = "满盅入库"; + } else if (this.getMode() == 8) { + mode = "叫料"; + } + + if (this.getStatus() == 1) { + status = "待机"; + } else if (this.getStatus() == 2) { + status = "生产中"; + } else { + status = "故障"; + } + + if (this.getAction() == 1) { + action = "允许取货"; + } else if (this.getAction() == 2) { + action = "允许放货"; + } else if (this.getAction() == 3) { + action = "允许取放"; + } + + if (this.getIo_action() == 1) { + io_action = "允许进入"; + } else if (this.getIo_action() == 2) { + io_action = "允许离开"; + } else if (this.getIo_action() == 3) { + io_action = "允许进出"; + } + + if (this.getMove() == 0) { + move = "无货"; + } else if (this.getMove() == 1) { + move = "有货"; + } else if (this.getMove() == 2) { + move = "有托盘有货"; + } + + jo.put("device_name", this.getDevice().getDevice_name()); + jo.put("mode", mode); + jo.put("move", move); + jo.put("action", action); + jo.put("io_action", io_action); + jo.put("hasGoods", this.getHasGoods()); + jo.put("isOnline", this.getIsonline()); + jo.put("error", this.getError()); + jo.put("status", status); + jo.put("message", this.getMessage()); + jo.put("task", this.getTask()); + return jo; + } + + @Override + public void setDeviceStatus(JSONObject data) { + + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/ItemProtocol.java new file mode 100644 index 0000000..1d1b094 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_station/ItemProtocol.java @@ -0,0 +1,171 @@ +package org.nl.acs.device_driver.hongfeng.hf_station; + +import cn.hutool.core.util.StrUtil; +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_move = "move"; + //释放信号 + public static String item_action = "action"; + //进出信号 + public static String item_ioaction = "ioaction"; + //报警信号 + public static String item_error = "error"; + //任务号 + public static String item_task = "task"; + //设备状态 + public static String item_status = "status"; + //当前工单数量 + public static String item_current_order_num = "current_order_num"; + //工单号 + public static String item_order = "order"; + //产品编码 + public static String item_material_code = "material_code"; + //条码 + public static String item_barcode = "barcode"; + + + //下发命令 + public static String item_to_command = "to_command"; + //下发目标站 + public static String item_to_target = "to_target"; + //下发任务号 + public static String item_to_task = "to_task"; + //故障代码 + public static String item_to_error = "to_error"; + //当前工单数量 + public static String item_to_order_num = "to_order_num"; + //产品编号 + public static String item_to_product_number = "to_product_number"; + //工单号 + public static String item_to_order = "to_order"; + + + Boolean isonline; + + private HfStationDeviceDriver driver; + + public ItemProtocol(HfStationDeviceDriver driver) { + this.driver = driver; + } + + public int getHeartbeat() { + return this.getOpcIntegerValue(item_heartbeat); + } + + public int getMode() { + return this.getOpcIntegerValue(item_mode); + } + + public int getMove() { + return this.getOpcIntegerValue(item_move); + } + + public int getAction() { + return this.getOpcIntegerValue(item_action); + } + + public int getIoAction() { + return this.getOpcIntegerValue(item_ioaction); + } + + public int getError() { + return this.getOpcIntegerValue(item_error); + } + + public int getTask() { + return this.getOpcIntegerValue(item_task); + } + + public int getStatus() { + return this.getOpcIntegerValue(item_status); + } + + public int getCurrent_order_num() { + return this.getOpcIntegerValue(item_current_order_num); + } + + public String getOrder() { + return this.getOpcStringValue(item_order); + } + + public String getBarcode() { + return this.getOpcStringValue(item_barcode); + } + + public String getMaterial_code() { + return this.getOpcStringValue(item_material_code); + } + + //是否有货 + public int hasGoods(int move) { + return move; + } + + + public int getOpcIntegerValue(String protocol) { + Integer value = this.driver.getIntegeregerValue(protocol); + if (value == null) { + log.error(this.getDriver().getDeviceCode() + ":protocol " + protocol + " 信号同步异常!"); + setIsonline(false); + } else { + setIsonline(true); + return value; + } + return 0; + } + + public String getOpcStringValue(String protocol) { + String value = this.driver.getStringValue(protocol); + if (StrUtil.isEmpty(value)) { + + } else { + return value; + } + return ""; + } + + public static List getReadableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB4.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB4.B1")); + list.add(new ItemDto(item_move, "光电信号", "DB4.B2")); + list.add(new ItemDto(item_action, "取放信号", "DB4.B3")); + list.add(new ItemDto(item_ioaction, "进出信号", "DB4.B4")); + list.add(new ItemDto(item_error, "报警信号", "DB4.B5")); + list.add(new ItemDto(item_task, "任务号", "DB4.D6")); + list.add(new ItemDto(item_status, "设备状态", "DB4.D7")); + list.add(new ItemDto(item_current_order_num, "当前工单数量", "DB4.D8")); + list.add(new ItemDto(item_material_code, "产品编号", "DB4.S6")); + list.add(new ItemDto(item_barcode, "条码", "DB4.S7")); + list.add(new ItemDto(item_order, "工单号", "DB4.S8")); + return list; + } + + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_to_command, "作业命令", "DB5.W0")); + list.add(new ItemDto(item_to_target, "目标站", "DB5.W2")); + list.add(new ItemDto(item_to_task, "任务号", "DB5.D4")); + list.add(new ItemDto(item_to_error, "故障代码", "DB5.W6")); + list.add(new ItemDto(item_to_order_num, "工单数量", "DB5.W8")); + list.add(new ItemDto(item_to_product_number, "产品编号", "DB5.S10")); + list.add(new ItemDto(item_to_order, "工单号", "DB5.S12")); + return list; + } + +} + diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/HfTwoRGVDefination.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/HfTwoRGVDefination.java new file mode 100644 index 0000000..168ea69 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/HfTwoRGVDefination.java @@ -0,0 +1,63 @@ +package org.nl.acs.device_driver.hongfeng.hf_two_rgv; + +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.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * 宏丰双工位RGV + * + */ +@Service +public class HfTwoRGVDefination implements OpcDeviceDriverDefination { + @Override + public String getDriverCode() { + return "hf_two_rgv"; + } + + @Override + public String getDriverName() { + return "宏丰双工位RGV"; + } + + @Override + public String getDriverDescription() { + return "宏丰双工位RGV"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new HfTwoRGVDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return HfTwoRGVDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList(); + types.add(DeviceType.station); + return types; + } + + @Override + public List getReadableItemDtos() { + return ItemProtocol.getReadableItemDtos(); + } + + @Override + public List getWriteableItemDtos() { + return ItemProtocol.getWriteableItemDtos(); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/HfTwoRGVDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/HfTwoRGVDeviceDriver.java new file mode 100644 index 0000000..486e725 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/HfTwoRGVDeviceDriver.java @@ -0,0 +1,733 @@ +package org.nl.acs.device_driver.hongfeng.hf_two_rgv; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.device_driver.hongfeng.hf_station.HfStationDeviceDriver; +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.service.DeviceExecuteLogService; +import org.nl.acs.monitor.DeviceStageMonitor; +import org.nl.acs.opc.Device; +import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.opc.DeviceAppServiceImpl; +import org.nl.acs.route.service.RouteLineService; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.modules.wql.util.SpringContextHolder; +import org.openscada.opc.lib.da.Server; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.*; + +/** + * 宏丰双工位RGV + */ +@Slf4j +@Data +@RequiredArgsConstructor +public class HfTwoRGVDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor { + protected ItemProtocol itemProtocol = new ItemProtocol(this); + @Autowired + InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl"); + @Autowired + DeviceService deviceservice = SpringContextHolder.getBean("deviceServiceImpl"); + @Autowired + RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); + @Autowired + TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); + @Autowired + AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl"); + @Autowired + DeviceAppService deviceAppservice = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + + //当前指令1 + Instruction inst1 = null; + //当前指令2 + Instruction inst2 = null; + + DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + + //工作模式 + int mode = 0; + int last_mode = 0; + //设备状态 + int status = 0; + int last_status = 0; + //前后工位光电信号 + int move1 = 0; + int last_move1 = 0; + int move2 = 0; + int last_move2 = 0; + //前后工位动作信号 + int action1 = 0; + int last_action1 = 0; + int action2 = 0; + int last_action2 = 0; + //报警信号 + int error = 0; + int last_error = 0; + //行走列 + int walk_y = 0; + int last_walk_y = 0; + //前后工位任务号 + int task1 = 0; + int last_task1 = 0; + int task2 = 0; + int last_task2 = 0; + + + + Boolean isonline = true; + //后工位申请任务请求标记 + Boolean requireBackSucess = false; + //前工位申请任务请求标记 + Boolean requireHeadSucess = false; + + int hasGoods = 0; + String message = null; + Boolean iserror = false; + + int branchProtocol = 0; + + //暂定 0就绪 1请求取货 2取货完成 3请求放货 4放货完成 5取货完成离开 6放货完成离开 7请求进入区域 8请求离开区域 + int flag; + + String device_code; + + + //后工位申请任务请求时间 + private Date instruction_require_time = new Date(); + //前工位申请任务请求时间 + private Date instruction_head_time = new Date(); + //请求超时时间 + private int instruction_require_time_out = 3000; + + @Override + public Device getDevice() { + return this.device; + } + + + @Override + public void execute() throws Exception { + String message = null; + try { + device_code = this.getDeviceCode(); + mode = this.itemProtocol.getMode(); + status = this.itemProtocol.getStatus(); + move1 = this.itemProtocol.getMove1(); + move2 = this.itemProtocol.getMove2(); + action1 = this.itemProtocol.getAction1(); + action2 = this.itemProtocol.getAction2(); + walk_y = this.itemProtocol.getWalk_y(); + error = this.itemProtocol.getError(); + task1 = this.itemProtocol.getTask1(); + task2 = this.itemProtocol.getTask2(); + + if (mode != last_mode) { + 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 (status != last_status) { + logServer.deviceItemValue(this.device_code, "status", String.valueOf(status)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号status:" + last_status + "->" + status); + } + if (move1 != last_move1) { + if (move1 == 0){ + this.setRequireHeadSucess(false); + } + logServer.deviceItemValue(this.device_code, "move1", String.valueOf(move1)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号move1:" + last_move1 + "->" + move1); + } + if (move2 != last_move2) { + if (move2 == 0){ + this.setRequireBackSucess(false); + } + logServer.deviceItemValue(this.device_code, "move2", String.valueOf(move2)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号move2:" + last_move2 + "->" + move2); + } + if (action1 != last_action1) { + logServer.deviceItemValue(this.device_code, "action1", String.valueOf(action1)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号action1:" + last_action1 + "->" + action1); + } + if (action2 != last_action2) { + logServer.deviceItemValue(this.device_code, "action2", String.valueOf(action2)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号action2:" + last_action2 + "->" + action2); + } + if (walk_y != last_walk_y) { + logServer.deviceItemValue(this.device_code, "walk_y", String.valueOf(walk_y)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号walk_y:" + last_walk_y + "->" + walk_y); + } + if (task1 != last_task1) { + logServer.deviceItemValue(this.device_code, "task1", String.valueOf(task1)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号task1:" + last_task1 + "->" + task1); + } + if (task2 != last_task2) { + logServer.deviceItemValue(this.device_code, "task2", String.valueOf(task2)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号task2:" + last_task2 + "->" + task2); + } + + //前工位任务就绪->执行 + if ( task1 > 0) { + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst1 != null) { + if (StrUtil.equals(inst1.getInstruction_status(), "0")) { + inst1.setInstruction_status("1"); + instructionService.update(inst1); + TaskDto taskDto = taskserver.findByCode(inst1.getTask_code()); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id",taskDto.getExt_task_id()); + map.put("task_status","1"); + array.add(map); + acsToWmsService.feedbackTaskStatusToWms(array); + } + } + } + //前工位放货完成 任务完成 + if (action1 == 4 && move1 == 0 && task1 > 0) { + //inst_message + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst1 != null) { + if (StrUtil.equals(inst1.getInstruction_status(), "1")) { + finish_instruction(inst1); + JSONArray array = new JSONArray(); + TaskDto taskDto = taskserver.findByCode(inst1.getTask_code()); + JSONObject map = new JSONObject(); + map.put("task_id",taskDto.getExt_task_id()); + map.put("task_status","2"); + map.put("finished_type","1"); + array.add(map); + acsToWmsService.feedbackTaskStatusToWms(array); + writing("to_command1", "0"); + writing("to_onset1", "0"); + writing("to_target1", "0"); + writing("to_task1", "0"); + } + } + } + + //后工位任务就绪->执行 + if (task2 > 0) { + //inst_message + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); + if (inst2 != null) { + if (StrUtil.equals(inst2.getInstruction_status(), "0")) { + inst2.setInstruction_status("1"); + instructionService.update(inst2); + TaskDto taskDto = taskserver.findByCode(inst2.getTask_code()); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id",taskDto.getExt_task_id()); + map.put("task_status","1"); + array.add(map); + acsToWmsService.feedbackTaskStatusToWms(array); + } + } + } + //后工位放货完成 任务完成 + if (action2 == 4 && move2 == 0 && task2 > 0) { + //inst_message + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); + if (inst2 != null) { + if (StrUtil.equals(inst2.getInstruction_status(), "1")) { + finish_instruction(inst2); + JSONArray array = new JSONArray(); + TaskDto taskDto = taskserver.findByCode(inst1.getTask_code()); + JSONObject map = new JSONObject(); + map.put("task_id",taskDto.getExt_task_id()); + map.put("task_status","2"); + map.put("finished_type","1"); + array.add(map); + acsToWmsService.feedbackTaskStatusToWms(array); + writing("to_command2", "0"); + writing("to_onset2", "0"); + writing("to_target2", "0"); + writing("to_task2", "0"); + } + } + } + + //前工位取货时判断取货位光电信号 + if (mode == 3 && action1 == 1 && move1 == 0 && task1 > 0) { + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + String start_device_code = inst1.getStart_device_code(); + Device startDevice = deviceAppservice.findDeviceByCode(start_device_code); + HfStationDeviceDriver hfStationDeviceDriver; + if (startDevice.getDeviceDriver() instanceof HfStationDeviceDriver){ + hfStationDeviceDriver = (HfStationDeviceDriver) startDevice.getDeviceDriver(); + int move = hfStationDeviceDriver.getMove(); + if (move == 1){ + this.writing("to_command1", "2"); + } else { + log.warn("前工位取货位无货,取货位:{}",start_device_code); + } + } + } + //前工位放货时判断放货位光电信号 + if (mode == 3 && action1 == 3 && move1 == 1 && task1 > 0){ + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + String next_device_code = inst1.getNext_device_code(); + Device nextDevice = deviceAppservice.findDeviceByCode(next_device_code); + HfStationDeviceDriver hfStationDeviceDriver; + if (nextDevice.getDeviceDriver() instanceof HfStationDeviceDriver){ + hfStationDeviceDriver = (HfStationDeviceDriver) nextDevice.getDeviceDriver(); + int move = hfStationDeviceDriver.getMove(); + if (move == 0){ + this.writing("to_command1","3"); + } else { + log.warn("前工位放货位有货,放货位:{}",next_device_code); + } + } + } + //后工位取货时判断取货位光电信号 + if (mode == 3 && action2 == 2 && move2 == 0 && task2 > 0){ + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task2)); + String start_device_code = inst1.getStart_device_code(); + Device startDevice = deviceAppservice.findDeviceByCode(start_device_code); + HfStationDeviceDriver hfStationDeviceDriver; + if (startDevice.getDeviceDriver() instanceof HfStationDeviceDriver){ + hfStationDeviceDriver = (HfStationDeviceDriver) startDevice.getDeviceDriver(); + int move = hfStationDeviceDriver.getMove(); + if (move == 1){ + this.writing("to_command2","2"); + } else { + log.warn("后工位取货位无货,取货位:{}",start_device_code); + } + } + } + //后工位放货时判断放货位光电信号 + if (mode == 3 && action2 == 3 && move2 == 1 && task2 > 0){ + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task2)); + String next_device_code = inst1.getNext_device_code(); + Device nextDevice = deviceAppservice.findDeviceByCode(next_device_code); + HfStationDeviceDriver hfStationDeviceDriver; + if (nextDevice.getDeviceDriver() instanceof HfStationDeviceDriver){ + hfStationDeviceDriver = (HfStationDeviceDriver) nextDevice.getDeviceDriver(); + int move = hfStationDeviceDriver.getMove(); + if (move == 0){ + this.writing("to_command2","3"); + } else { + log.warn("后工位放货位有货,放货位:{}",next_device_code); + } + } + } + + } catch (Exception var17) { + return; + } + + if (!this.itemProtocol.getIsonline()) { + this.setIsonline(false); + this.setIserror(true); + message = "信号量同步异常"; + //未联机 + } else if (mode == 0) { + this.setIsonline(false); + this.setIserror(true); + message = "未联机"; + //有报警 + } else if (error != 0) { + this.setIsonline(false); + this.setIserror(true); + message = "有报警"; + //无报警 + } else { + this.setIsonline(true); + this.setIserror(false); + message = ""; + Instruction instruction = null; + List toInstructions; + switch (mode) { + case 1: + log.debug("设备运转模式:等待工作"); + return; + case 2: + //后工位申请任务 + if (mode == 2 && move2 == 0 && action2 == 0 && !requireBackSucess) { + instruction_require2(); + logServer.deviceExecuteLog(device_code,"",String.valueOf(task2),"move2:" + move2 + ",action2:" + action2 + ",move1:" + move1 + ",task2:" + task2 + ",requireBackSucess:" + requireBackSucess); + } + //前工位申请任务 + if (mode == 2 && move2 == 0 && action2 == 0 && task2 == 0 && move1 == 0 && task1 > 0 && !requireHeadSucess) { + instruction_require(); + logServer.deviceExecuteLog(device_code,"",String.valueOf(task1),"move2:" + move2 + ",action2:" + action2 + ",move1:" + move1 + ",task2:" + task2 + ",requireHeadSucess:" + requireHeadSucess); + } + break; + case 3: + //前工位申请任务 + if (mode == 3 && move2 == 1 && action2 == 1 && move1 == 0 && action1 == 0 && !requireHeadSucess) { + instruction_require(); + logServer.deviceExecuteLog(device_code,"",String.valueOf(task1),"move2:" + move2 + ",action2:" + action2 + ",move1:" + move1 + ",task2:" + task2 + ",requireHeadSucess:" + requireHeadSucess); + } + } + + } + last_mode = mode; + last_error = error; + last_status = status; + last_move1 = move1; + last_move2 = move2; + last_action1 = action1; + last_action2 = action2; + last_walk_y = walk_y; + last_task1 = task1; + last_task2 = task2; + } + + + //申请前工位任务 + public synchronized boolean instruction_require() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_head_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_head_time); + return false; + } else { + this.instruction_head_time = date; + //后工位取货关联设备 + List getDeviceCodeList = this.getExtraDeviceCodes("head_get_device_code"); + //后工位放货关联设备 + List putDeviceCodeList = this.getExtraDeviceCodes("head_put_device_code"); + TaskDto task = null; + for (int i = 0; i < getDeviceCodeList.size(); i++) { + String startDeviceCode = getDeviceCodeList.get(i); + List taskDtoList = taskserver.queryTaskByDeviceCode(startDeviceCode); + if (ObjectUtil.isNotEmpty(taskDtoList)) { + task = taskDtoList.get(0); + } + if (ObjectUtil.isNotEmpty(task)) break; + } + + if (!ObjectUtil.isEmpty(task)) { + String taskid = task.getTask_id(); + String taskcode = task.getTask_code(); + String vehiclecode = task.getVehicle_code(); + String priority = task.getPriority(); + String start_point_code = task.getStart_point_code(); + String start_device_code = task.getStart_device_code(); + String route_plan_code = task.getRoute_plan_code(); + String next_point_code = task.getNext_point_code(); + String next_device_code = task.getNext_device_code(); + + Instruction instdto = new Instruction(); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(task.getRemark()); + instdto.setMaterial(task.getMaterial()); + instdto.setQuantity(task.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(); + } + + //创建指令后修改任务状态 + task.setTask_status("1"); + task.setUpdate_time(DateUtil.now()); + taskserver.update(task); + + //根据查询的任务起始点位 得出取放工位的索引值 写入后工位电气中 + int start_addrIndex = getDeviceCodeList.indexOf(start_device_code); + int next_addrIndex = putDeviceCodeList.indexOf(next_device_code); + this.writing("to_onset1", String.valueOf(start_addrIndex)); + this.writing("to_target1", String.valueOf(next_addrIndex)); + this.writing("to_task1", instdto.getInstruction_code()); + this.writing("to_command1", "1"); + requireHeadSucess = true; + } + } + return true; + } + + //申请后工位任务 + public synchronized boolean instruction_require2() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_require_time); + return false; + } else { + this.instruction_require_time = date; + + //后工位取货关联设备 + List getDeviceCodeList = this.getExtraDeviceCodes("back_get_device_code"); + //后工位放货关联设备 + List putDeviceCodeList = this.getExtraDeviceCodes("back_put_device_code"); + + TaskDto task = null; + for (int i = 0; i < getDeviceCodeList.size(); i++) { + String startDeviceCode = getDeviceCodeList.get(i); + List taskDtoList = taskserver.queryTaskByDeviceCode(startDeviceCode); + if (ObjectUtil.isNotEmpty(taskDtoList)) { + task = taskDtoList.get(0); + } + if (ObjectUtil.isNotEmpty(task)) break; + } + + if (!ObjectUtil.isEmpty(task)) { + String taskid = task.getTask_id(); + String taskcode = task.getTask_code(); + String vehiclecode = task.getVehicle_code(); + String priority = task.getPriority(); + String start_point_code = task.getStart_point_code(); + String start_device_code = task.getStart_device_code(); + String route_plan_code = task.getRoute_plan_code(); + String next_point_code = task.getNext_point_code(); + String next_device_code = task.getNext_device_code(); + + Instruction instdto = new Instruction(); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(task.getRemark()); + instdto.setMaterial(task.getMaterial()); + instdto.setQuantity(task.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(); + } + + //创建指令后修改任务状态 + task.setTask_status("1"); + taskserver.update(task); + + //根据查询的任务起始点位 得出取放工位的索引值 写入后工位电气中 + int start_addrIndex = getDeviceCodeList.indexOf(start_device_code); + int next_addrIndex = putDeviceCodeList.indexOf(next_device_code); + this.writing("to_onset2", String.valueOf(start_addrIndex)); + this.writing("to_target2", String.valueOf(next_addrIndex)); + this.writing("to_task2", instdto.getInstruction_code()); + this.writing("to_command2", "1"); + requireBackSucess = true; + } + } + return true; + } + + public boolean exe_error() { + if (this.error == 0) { + return true; + } else { + log.debug("设备报警"); + return false; + } + } + + public void writing(String param, String value) { + + String to_param = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + param; + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_param, value); + + ReadUtil.write(itemMap, server); + } + + public boolean exe_business() { + return true; + } + + protected void executing(Instruction instruction) { + this.executing(1, instruction, ""); + } + + public void executing(int command, Instruction instruction, String appendMessage) { + + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + ReadUtil.write(itemMap, server); + + } + + + public synchronized boolean finish_instruction(Instruction inst) throws Exception { + instructionService.finish(inst); + return true; + } + + + public void executing(Server server, Map itemMap) { + ReadUtil.write(itemMap, server); + } + + public void writing1(int command) { + String to_command1 = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command1; + + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_command1, command); + ReadUtil.write(itemMap, server); + + } + + public void writing2(int command) { + String to_command2 = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code() + + "." + ItemProtocol.item_to_command2; + + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + itemMap.put(to_command2, command); + ReadUtil.write(itemMap, server); + + } + + public void writing(int type, int command) { + String opcservcerid = this.getDevice().getOpc_server_id(); + Server server = ReadUtil.getServer(opcservcerid); + Map itemMap = new HashMap(); + ReadUtil.write(itemMap, server); + } + + //将扩展表中的字符串数组数据转换成集合 + public List getExtraDeviceCodes(String extraName){ + String extraValue = (String) this.getDevice().getExtraValue().get(extraName); + String devicesString = extraValue.substring(1, extraValue.length() - 1); + List devicesList = new ArrayList<>(); + String[] devices = devicesString.split(","); + for (int i = 0; i < devices.length; i++) { + String s = devices[i].replace("\"", "").replace("\"", ""); + devicesList.add(s); + } + return devicesList; + } + + @Override + public JSONObject getDeviceStatusName() { + JSONObject jo = new JSONObject(); + String move1 = ""; + String move2 = ""; + String action1 = ""; + String action2 = ""; + String walk_y = ""; + String mode = ""; + String status = ""; + + if (this.getMode() == 0) { + mode = "脱机"; + } else if (this.getMode() == 1) { + mode = "单机"; + } else if (this.getMode() == 2) { + mode = "待机"; + } else if (this.getMode() == 3) { + mode = "运行中"; + } + + if (this.getStatus() == 1) { + status = "待机"; + } else if (this.getStatus() == 2) { + status = "生产中"; + } else if (this.getStatus() == 3) { + status = "故障"; + } + + if (this.getMove1() == 0) { + move1 = "无货"; + } else if (this.getMove1() == 1) { + move1 = "有货"; + } + + if (this.getMove2() == 0) { + move2 = "无货"; + } else if (this.getMove2() == 1) { + move2 = "有货"; + } + + if (this.getAction1() == 1) { + action1 = "取货中"; + } else if (this.getAction1() == 2) { + action1 = "取货完成"; + } else if (this.getAction1() == 3) { + action1 = "放货中"; + } else if (this.getAction1() == 4) { + action1 = "放货完成"; + } + + if (this.getAction2() == 1) { + action2 = "取货中"; + } else if (this.getAction2() == 2) { + action2 = "取货完成"; + } else if (this.getAction2() == 3) { + action2 = "放货中"; + } else if (this.getAction2() == 4) { + action2 = "放货完成"; + } + + if (this.getWalk_y() == 0) { + walk_y = "原位"; + } else if (this.getWalk_y() == 2) { + walk_y = "非原位"; + } + + jo.put("device_name", this.getDevice().getDevice_name()); + jo.put("mode", mode); + jo.put("status", status); + jo.put("move1", move1); + jo.put("move2", move2); + jo.put("action1", action1); + jo.put("action2", action2); + jo.put("walk_y", walk_y); + jo.put("error", this.getError()); + jo.put("task1", this.getTask1()); + jo.put("task2", this.getTask2()); + jo.put("isOnline", this.getIsonline()); + jo.put("isError", this.getIserror()); + jo.put("message", this.getMessage()); + return jo; + } + + @Override + public void setDeviceStatus(JSONObject data) { + + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/ItemProtocol.java new file mode 100644 index 0000000..976adbd --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/hongfeng/hf_two_rgv/ItemProtocol.java @@ -0,0 +1,168 @@ +package org.nl.acs.device_driver.hongfeng.hf_two_rgv; + +import cn.hutool.core.util.StrUtil; +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_status = "status"; + //前工位光电信号 + public static String item_move1 = "move1"; + //后工位光电信号 + public static String item_move2 = "move2"; + //前工位动作信号 + public static String item_action1 = "action1"; + //后工位动作信号 + public static String item_action2 = "action2"; + //行走列 + public static String item_walk_y = "walk_y"; + //报警信号 + public static String item_error = "error"; + //前工位任务号 + public static String item_task1 = "task1"; + //后工位任务号 + public static String item_task2 = "task2"; + + + //后工位下发命令 + public static String item_to_command1 = "to_command1"; + //后工位下发起始站 + public static String item_to_onset1 = "to_onset1"; + //后工位下发目标站 + public static String item_to_target1 = "to_target1"; + //后工位下发任务号 + public static String item_to_task1 = "to_task1"; + //后工位下发命令 + public static String item_to_command2 = "to_command2"; + //后工位下发起始站 + public static String item_to_onset2 = "to_onset2"; + //后工位下发目标站 + public static String item_to_target2 = "to_target2"; + //后工位下发任务号 + public static String item_to_task2 = "to_task2"; + + + private HfTwoRGVDeviceDriver driver; + + public ItemProtocol(HfTwoRGVDeviceDriver driver) { + this.driver = driver; + } + + public int getHeartbeat() { + return this.getOpcIntegerValue(item_heartbeat); + } + + public int getMode() { + return this.getOpcIntegerValue(item_mode); + } + + public int getStatus() { + return this.getOpcIntegerValue(item_status); + } + + public int getError() { + return this.getOpcIntegerValue(item_error); + } + + public int getMove1() { + return this.getOpcIntegerValue(item_move1); + } + + public int getMove2() { + return this.getOpcIntegerValue(item_move2); + } + + public int getAction1() { + return this.getOpcIntegerValue(item_action1); + } + + public int getAction2() { + return this.getOpcIntegerValue(item_action2); + } + + public int getWalk_y() { + return this.getOpcIntegerValue(item_walk_y); + } + + public int getTask1() { + return this.getOpcIntegerValue(item_task1); + } + + public int getTask2() { + return this.getOpcIntegerValue(item_task2); + } + + + //是否有货 + public int hasGoods(int move) { + return move; + } + + Boolean isonline; + + public int getOpcIntegerValue(String protocol) { + Integer value = this.driver.getIntegeregerValue(protocol); + if (value == null) { + log.error(this.getDriver().getDeviceCode() + ":protocol " + protocol + " 信号同步异常!"); + setIsonline(false); + } else { + setIsonline(true); + return value; + } + return 0; + + } + + public String getOpcStringValue(String protocol) { + String value = this.driver.getStringValue(protocol); + if (StrUtil.isEmpty(value)) { + + } else { + return value; + } + return "0"; + } + + public static List getReadableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_heartbeat, "心跳", "DB1.B0")); + list.add(new ItemDto(item_mode, "工作模式", "DB1.B1")); + list.add(new ItemDto(item_status, "设备状态", "DB1.B2")); + list.add(new ItemDto(item_move1, "前工位光电信号", "DB1.B3")); + list.add(new ItemDto(item_move2, "后工位光电信号", "DB1.B4")); + list.add(new ItemDto(item_action1, "前工位动作信号", "DB1.B5")); + list.add(new ItemDto(item_action2, "后工位动作信号", "DB1.B6")); + list.add(new ItemDto(item_walk_y, "行走列", "DB1.B7")); + list.add(new ItemDto(item_error, "报警信号", "DB1.B8")); + list.add(new ItemDto(item_task1, "前工位任务号", "DB1.D10")); + list.add(new ItemDto(item_task2, "后工位任务号", "DB1.D14")); + return list; + } + + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_to_command1, "前工位下发命令", "DB2.W0")); + list.add(new ItemDto(item_to_onset1, "前工位下发起始站", "DB2.W2")); + list.add(new ItemDto(item_to_target1, "前工位下发目标站", "DB2.W4")); + list.add(new ItemDto(item_to_task1, "前工位下发任务号", "DB2.D6")); + list.add(new ItemDto(item_to_command2, "后工位下发命令", "DB2.W10")); + list.add(new ItemDto(item_to_onset2, "后工位下发起始站", "DB2.W12")); + list.add(new ItemDto(item_to_target2, "后工位下发目标站", "DB2.W14")); + list.add(new ItemDto(item_to_task2, "后工位下发任务号", "DB2.D16")); + return list; + } + +} + diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java new file mode 100644 index 0000000..f852605 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/AcsUtil.java @@ -0,0 +1,57 @@ + +package org.nl.acs.ext.wms; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.system.service.impl.ParamServiceImpl; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.http.HttpStatus; + +/** + * ACS连接工具类: + */ +public class AcsUtil { + public static JSONObject notifyAcs(String api, JSONArray list) { + //判断是否连接ACS系统 + String isConnect = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("is_connect_wms").getValue(); + JSONObject result = new JSONObject(); + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "未连接WMS!"); + result.put("data", new JSONObject()); + return result; + } + //ACS地址:127.0.0.1:8010 + String acsUrl = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("wms_url").getValue(); + String url = acsUrl + api; + String resultMsg + = HttpRequest.post(url) + .body(String.valueOf(list)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + return result; + } + + public static JSONObject notifyAcs(String api, JSONObject list) { + //判断是否连接ACS系统 + String isConnect = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("is_connect_wms").getValue(); + JSONObject result = new JSONObject(); + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "未连接WMS!"); + result.put("data", new JSONObject()); + return result; + } + //ACS地址:127.0.0.1:8010 + String acsUrl = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("wms_url").getValue(); + String url = acsUrl + api; + String resultMsg + = HttpRequest.post(url) + .body(String.valueOf(list)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + return result; + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java index 84a7905..b081e4b 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java @@ -95,4 +95,19 @@ public class AcsToWmsController { public ResponseEntity applyOutCacheLineTask(@RequestBody JSONObject param) { return new ResponseEntity<>(acstowmsService.applyOutCacheLineTask(param), HttpStatus.OK); } + + @PostMapping("/apply") + @Log("acs向lms申请任务") + @ApiOperation("acs向lms申请任务") + public ResponseEntity apply(@RequestBody JSONObject param) { + return new ResponseEntity<>(acstowmsService.apply(param), HttpStatus.OK); + } + + @PostMapping("/orderConfirm") + @Log("人工排产确认") + @ApiOperation("人工排产确认") + public ResponseEntity orderConfirm(@RequestBody JSONObject param) { + return new ResponseEntity<>(acstowmsService.orderConfirm(param), HttpStatus.OK); + } + } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java index 017aba3..1d52f48 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java @@ -2,6 +2,7 @@ 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; @@ -28,9 +29,26 @@ import org.springframework.web.bind.annotation.RestController; public class WmsToAcsController { private final WmsToAcsService wmstoacsService; + @PostMapping("/order") + @Log("接受wms工单") + @ApiOperation("接受wms工单") + @SaIgnore + public ResponseEntity order(@RequestBody String whereJson) { + return new ResponseEntity<>(wmstoacsService.order(whereJson),HttpStatus.OK); + } + + @PostMapping("/orderStatusUpdate") + @Log("wms更改工单状态") + @ApiOperation("wms更改工单状态") + @SaIgnore + public ResponseEntity orderStatusUpdate(@RequestBody String whereJson) { + return new ResponseEntity<>(wmstoacsService.orderStatusUpdate(whereJson),HttpStatus.OK); + } + @PostMapping("/task") @Log("接收WMS任务") @ApiOperation("接收WMS任务") + @SaIgnore public ResponseEntity createFromWms(@RequestBody String whereJson) { return new ResponseEntity<>(wmstoacsService.createFromWms(whereJson), HttpStatus.OK); } @@ -38,13 +56,23 @@ public class WmsToAcsController { @PostMapping("/cancelTask") @Log("WMS取消任务") @ApiOperation("WMS取消任务") + @SaIgnore public ResponseEntity cancelFromWms(@RequestBody String whereJson) throws Exception { return new ResponseEntity<>(wmstoacsService.cancelFromWms(whereJson), HttpStatus.OK); } + @PostMapping("/forceFinishToAcs") + @Log("WMS完成任务") + @ApiOperation("WMS完成任务") + @SaIgnore + public ResponseEntity forceFinishFromWms(@RequestBody String whereJson) throws Exception { + return new ResponseEntity<>(wmstoacsService.forceFinishFromWms(whereJson), HttpStatus.OK); + } + @PostMapping("/updateDeviceGoodsFromWms") @Log("WMS修改点位状态") @ApiOperation("WMS修改点位状态") + @SaIgnore public ResponseEntity updateDeviceGoodsFromWms(@RequestBody String whereJson) { return new ResponseEntity<>(wmstoacsService.updateDeviceGoodsFromWms(whereJson), HttpStatus.OK); } @@ -52,6 +80,7 @@ public class WmsToAcsController { @PostMapping("/areaControl") @Log("区域控制") @ApiOperation("区域控制") + @SaIgnore public ResponseEntity areaControl(@RequestBody JSONObject whereJson) { return new ResponseEntity<>(wmstoacsService.areaControl(whereJson), HttpStatus.OK); } @@ -59,6 +88,7 @@ public class WmsToAcsController { @PostMapping("/action") @Log("下发动作") @ApiOperation("WMS修改点位状态") + @SaIgnore public ResponseEntity putAction(@RequestBody String whereJson) throws Exception { return new ResponseEntity<>(wmstoacsService.putAction(whereJson), HttpStatus.OK); } @@ -66,6 +96,7 @@ public class WmsToAcsController { @PostMapping("/querydevice") @Log("查询设备状态") @ApiOperation("查询设备状态") + @SaIgnore public ResponseEntity queryDevice(@RequestBody String whereJson) throws Exception { return new ResponseEntity<>(wmstoacsService.queryDevice(whereJson), HttpStatus.OK); } @@ -73,6 +104,7 @@ public class WmsToAcsController { @PostMapping("/queryDeviceDBValue") @Log("查询设备DB值") @ApiOperation("查询设备DB值") + @SaIgnore public ResponseEntity queryDeviceDBValue(@RequestBody String whereJson){ return new ResponseEntity<>(wmstoacsService.queryDeviceDBValue(whereJson), HttpStatus.OK); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java index 6c2487f..cb9e865 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java @@ -122,4 +122,25 @@ public interface AcsToWmsService { * @return */ HttpResponse applyOutCacheLineTask(JSONObject param); + + /** + * 申请lms任务 + * @param param + * @return + */ + HttpResponse apply(JSONObject param); + + /** + * 人工排产确认 + * @param param + * @return + */ + HttpResponse orderConfirm(JSONObject param); + + /** + * 人工排产确认 + * @param param + * @return + */ + HttpResponse updateBarcode(JSONObject param); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java index f9e6347..a0d45bd 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java @@ -15,6 +15,21 @@ public interface WmsToAcsService { */ Map createFromWms(String jsonObject); + /** + * 接受wms工单 + * + * @param jsonObject 条件 + * @return + */ + Map order(String jsonObject); + + /** + * wms更改工单状态 + * @param jsonObject + * @return + */ + Map orderStatusUpdate(String jsonObject); + /** * 取消任务 * @@ -23,6 +38,8 @@ public interface WmsToAcsService { */ Map cancelFromWms(String jsonObject) throws Exception; + Map forceFinishFromWms(String jsonObject) throws Exception; + /** * 修改设置有无货属性 * diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java index 464dc39..7e8dadd 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java @@ -77,15 +77,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override public HttpResponse feedbackTaskStatusToWms(JSONArray data) { String wmsurl = paramService.findByCode(AcsConfig.WMSURL).getValue(); - - String task_code = ""; - for (int i = 0; i < data.size(); i++) { - JSONObject json = (JSONObject) data.get(i); - task_code = json.getString("task_code"); - } - TaskDto taskDto = taskService.findByCode(task_code); - String vehicle_code = taskDto.getVehicle_code(); - HttpResponse result2 = null; log.info("feedbackTaskStatusToWms-----请求参数{}", data.toString()); @@ -424,21 +415,15 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { 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); + param.put("type","3"); AddressDto addressDto = addressService.findByCode("feedbackOrderStatus"); String methods_url = addressDto.getMethods_url(); String url = wmsUrl + methods_url; HttpResponse result = null; - log.info("feedbackOrderStatus----请求参数{}", json); + log.info("feedbackOrderStatus----请求参数{}", param); try { result = HttpRequest.post(url) - .body(String.valueOf(json)) + .body(String.valueOf(param)) .execute(); String type = ""; if (result.getStatus() == 200) { @@ -523,4 +508,100 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return null; } + @Override + public HttpResponse apply(JSONObject param) { + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + // TODO 还没向地址表中添加 apply + AddressDto addressDto = addressService.findByCode("apply"); + String methods_url = addressDto.getMethods_url(); + String url = wmsUrl + methods_url; + HttpResponse result = null; + log.info("apply----请求参数{}", param); + try { + result = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute(); + String type = ""; + if (result.getStatus() == 200) { + type = "info"; + } else { + type = "error"; + } + + log.info("apply----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; + } + return null; + } + + @Override + public HttpResponse orderConfirm(JSONObject param) { + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + // TODO 还没向地址表中添加 orderConfirm + AddressDto addressDto = addressService.findByCode("orderConfirm"); + String methods_url = addressDto.getMethods_url(); + String url = wmsUrl + methods_url; + HttpResponse result = null; + log.info("orderConfirm----请求参数{}", param); + try { + result = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute(); + String type = ""; + if (result.getStatus() == 200) { + type = "info"; + } else { + type = "error"; + } + + log.info("orderConfirm----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; + } + return null; + } + + @Override + public HttpResponse updateBarcode(JSONObject param) { + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + // TODO 还没向地址表中添加 orderConfirm + AddressDto addressDto = addressService.findByCode("updateBarcode"); + String methods_url = addressDto.getMethods_url(); + String url = wmsUrl + methods_url; + HttpResponse result = null; + log.info("orderConfirm----请求参数{}", param); + try { + result = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute(); + String type = ""; + if (result.getStatus() == 200) { + type = "info"; + } else { + type = "error"; + } + + log.info("orderConfirm----返回参数{}", result); + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + } + return result; + } + return null; + } + } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index 3c6856b..c1c4675 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -1,5 +1,6 @@ package org.nl.acs.ext.wms.service.impl; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; @@ -9,15 +10,19 @@ 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.service.dto.DeviceDto; import org.nl.acs.device_driver.basedriver.cargo_lift_conveyor.CargoLiftConveyorDeviceDriver; import org.nl.acs.device_driver.basedriver.empty_vehicle_stacking_position.EmptyVehicleStackingPositionDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; +import org.nl.acs.device_driver.hongfeng.hf_station.HfStationDeviceDriver; 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; @@ -30,6 +35,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.List; import java.util.Map; @@ -45,6 +51,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { private final DeviceService deviceService; private final DeviceAppService deviceAppService; private final RouteLineService routeLineService; + private final ProduceshiftorderService produceshiftorderService; @Override public Map createFromWms(String param) { @@ -123,7 +130,8 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } JSONObject jo = new JSONObject(); jo.put("task_code", task_code); - jo.put("task_id", ext_task_id); + jo.put("task_id", IdUtil.simpleUUID()); + jo.put("ext_task_id", ext_task_id); jo.put("start_point_code", start_point_code); jo.put("next_point_code", next_point_code); jo.put("start_parent_code", start_point_code); @@ -142,7 +150,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { if (!StrUtil.isEmpty(ext_task_id)) { jo.put("ext_task_id", ext_task_id); } - TaskDto task_dto = jo.toJavaObject(TaskDto.class); try { taskService.create(task_dto); @@ -173,14 +180,106 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { resultJson.put("data", new JSONObject()); log.info("createFromWms--------------:输出参数:" + resultJson.toString()); } + return resultJson; + } + @Override + public Map order(String jsonObject) { + JSONArray orders = JSONArray.parseArray(jsonObject); + log.info("order--------------:输入参数" + orders.toString()); + for (int i = 0; i < orders.size(); i++) { + JSONObject order = orders.getJSONObject(i); + String ext_order_id = order.getString("ext_order_id"); + String order_code = order.getString("order_code"); + String qty = order.getString("qty"); + String material_code = order.getString("material_code"); + String device_code = order.getString("device_code"); + if (StrUtil.isEmpty(ext_order_id)) { + throw new WDKException("工单外部标识不能为空"); + } + if (StrUtil.isEmpty(order_code)) { + throw new WDKException("工单编码不能为空"); + } + if (ObjectUtil.isNotEmpty(produceshiftorderService.findByCode(order_code))) { + throw new WDKException("工单编码不重复"); + } + if (StrUtil.isEmpty(qty)) { + throw new WDKException("工单数量不能为空"); + } + if (StrUtil.isEmpty(material_code)) { + throw new WDKException("物料编码不能为空"); + } + if (StrUtil.isEmpty(device_code)) { + throw new WDKException("设备编码不能为空"); + } + DeviceDto deviceDto = deviceService.findByCode(device_code); + if (ObjectUtil.isEmpty(deviceDto)) { + throw new WDKException("设备编码不存在!"); + } + ProduceshiftorderDto dto = new ProduceshiftorderDto(); + dto.setOrder_id(IdUtil.simpleUUID()); + dto.setOrder_code(order_code); + dto.setQty(new BigDecimal(qty)); + dto.setExt_order_id(ext_order_id); + dto.setMaterial_code(material_code); + dto.setMaterial_name(""); + dto.setDevice_code(device_code); + dto.setCreate_by("lms"); + dto.setUpdate_by("lms"); + produceshiftorderService.create(dto); + } + JSONObject resultJson = new JSONObject(); + resultJson.put("status", "200"); + resultJson.put("message", "操作成功"); + resultJson.put("data", new JSONObject()); + log.info("order--------------:输出参数" + resultJson.toString()); + return resultJson; + } + @Override + public Map orderStatusUpdate(String jsonObject) { + JSONArray orders = JSONArray.parseArray(jsonObject); + log.info("order--------------:输入参数" + orders.toString()); + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + for (int i = 0; i < orders.size(); i++) { + JSONObject order = orders.getJSONObject(i); + String ext_order_id = order.getString("ext_order_id"); + if (StrUtil.isEmpty(ext_order_id)) { + throw new WDKException("工单外部标识不能为空!"); + } + String type = order.getString("type"); + if (StrUtil.isEmpty(type)) { + throw new WDKException("type不能为空!"); + } + JSONObject object = wo.query("ext_order_id = '" + ext_order_id + "'").uniqueResult(0); + ProduceshiftorderDto produceshiftorderDto = produceshiftorderService.findById(object.getString("order_id")); + if (ObjectUtil.isNotEmpty(produceshiftorderDto)) { + if (StrUtil.equals("3", type)) { + HfStationDeviceDriver hfStationDeviceDriver; + String device_code = produceshiftorderDto.getDevice_code(); + Device device = deviceAppService.findDeviceByCode(device_code); + if (device.getDeviceDriver() instanceof HfStationDeviceDriver) { + hfStationDeviceDriver = (HfStationDeviceDriver) device.getDeviceDriver(); + hfStationDeviceDriver.writing("to_command", "5"); + } + produceshiftorderDto.setOrder_status("3"); + produceshiftorderDto.setUpdate_by("lms"); + produceshiftorderService.updateByOrderCode(produceshiftorderDto); + } + } + } + JSONObject resultJson = new JSONObject(); + resultJson.put("status", "200"); + resultJson.put("message", "操作成功"); + resultJson.put("data", new JSONObject()); + log.info("orderStatusUpdate--------------:输出参数" + resultJson.toString()); return resultJson; } @Override public Map cancelFromWms(String param) throws Exception { + WQLObject wo = WQLObject.getWQLObject("acs_task"); JSONArray tasks = JSONArray.parseArray(param); ParamService paramService = SpringContextHolder.getBean(ParamService.class); InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); @@ -192,20 +291,21 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { 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("任务标识不能为空"); } if (StrUtil.isEmpty(task_code)) { throw new WDKException("任务号不能为空"); } + JSONObject jsonObject = wo.query("ext_task_id = '" + task_uuid + "'").uniqueResult(0); + String task_id = jsonObject.getString("task_id"); String cancelTaskCheck = paramService.findByCode(AcsConfig.CANCELTASKCHECK).getValue(); if (StrUtil.equals(cancelTaskCheck, "1")) { - taskService.cancel(task_uuid); + taskService.cancel(task_id); } else if (StrUtil.equals(cancelTaskCheck, "0")) { Instruction inst = instructionService.findByTaskcode(task_code); if (inst == null) { - taskService.cancel(task_uuid); + taskService.cancel(task_id); } else { throw new RuntimeException("指令正在执行中,操作失败!"); } @@ -213,13 +313,55 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { } JSONObject resultJson = new JSONObject(); - resultJson.put("status", HttpStatus.OK); + resultJson.put("status", "200"); resultJson.put("message", "操作成功"); resultJson.put("data", new JSONObject()); log.info("cancelFromWms--------------:输出参数" + resultJson.toString()); return resultJson; } + + @Override + public Map forceFinishFromWms(String param) throws Exception { + WQLObject wo = WQLObject.getWQLObject("acs_task"); + JSONArray tasks = JSONArray.parseArray(param); + ParamService paramService = SpringContextHolder.getBean(ParamService.class); + InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); + log.debug(tasks.toString()); + log.info("forceFinishFromWms--------------:输入参数" + 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"); + if (StrUtil.isEmpty(task_uuid)) { + throw new WDKException("任务标识不能为空"); + } + if (StrUtil.isEmpty(task_code)) { + throw new WDKException("任务号不能为空"); + } + JSONObject jsonObject = wo.query("ext_task_id = '" + task_uuid + "'").uniqueResult(0); + String task_id = jsonObject.getString("task_id"); + String cancelTaskCheck = paramService.findByCode(AcsConfig.CANCELTASKCHECK).getValue(); + if (StrUtil.equals(cancelTaskCheck, "1")) { + taskService.finish(task_id); + } else if (StrUtil.equals(cancelTaskCheck, "0")) { + Instruction inst = instructionService.findByTaskcode(task_code); + if (inst == null) { + taskService.finish(task_id); + } else { + throw new RuntimeException("指令正在执行中,操作失败!"); + } + } + + } + JSONObject resultJson = new JSONObject(); + resultJson.put("status", "200"); + resultJson.put("message", "操作成功"); + resultJson.put("data", new JSONObject()); + log.info("forceFinishFromWms--------------:输出参数" + resultJson.toString()); + return resultJson; + } + @Override public Map updateDeviceGoodsFromWms(String param) { JSONArray datas = JSONArray.parseArray(param); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index 794f4a6..33a1416 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -221,8 +221,11 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu public Instruction findByTaskcode(String code) { WQLObject wo = WQLObject.getWQLObject("acs_instruction"); JSONObject json = wo.query("task_code ='" + code + "'").uniqueResult(0); - final Instruction obj = json.toJavaObject(Instruction.class); - return obj; + if (ObjectUtil.isNotEmpty(json)){ + final Instruction obj = json.toJavaObject(Instruction.class); + return obj; + } + return null; } @Override @@ -790,6 +793,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu public void finish(Instruction dto) throws Exception { String now = DateUtil.now(); dto.setInstruction_status("2"); + dto.setUpdate_time(now); WQLObject wo = WQLObject.getWQLObject("acs_instruction"); JSONObject json = (JSONObject) JSONObject.toJSON(dto); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/order/rest/ProduceshiftorderController.java b/acs/nladmin-system/src/main/java/org/nl/acs/order/rest/ProduceshiftorderController.java new file mode 100644 index 0000000..4f5df86 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/order/rest/ProduceshiftorderController.java @@ -0,0 +1,94 @@ + +package org.nl.acs.order.rest; + + +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.order.service.dto.ProduceshiftorderDto; +import org.nl.acs.order.service.ProduceshiftorderService; +import org.nl.modules.logging.annotation.Log; +import org.springframework.data.domain.Pageable; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.*; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; + +/** +* @author geng by +* @date 2022-06-06 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "工单信息管理") +@RequestMapping("/api/produceshiftorder") +@Slf4j +public class ProduceshiftorderController { + + private final ProduceshiftorderService produceshiftorderService; + + @GetMapping + @Log("查询工单信息") + @ApiOperation("查询工单信息") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(produceshiftorderService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增工单信息") + @ApiOperation("新增工单信息") + //@PreAuthorize("@el.check('produceshiftorder:add')") + public ResponseEntity create(@Validated @RequestBody ProduceshiftorderDto dto){ + produceshiftorderService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改工单信息") + @ApiOperation("修改工单信息") + //@PreAuthorize("@el.check('produceshiftorder:edit')") + public ResponseEntity update(@Validated @RequestBody ProduceshiftorderDto dto){ + produceshiftorderService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除工单信息") + @ApiOperation("删除工单信息") + //@PreAuthorize("@el.check('produceshiftorder:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + produceshiftorderService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("导出工单信息") + @ApiOperation("导出工单信息") + @GetMapping(value = "/download") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public void download(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + produceshiftorderService.download(produceshiftorderService.queryAll(whereJson), response); + } + + @PostMapping("/finishd") + @Log("工单强制完成") + @ApiOperation("工单强制完成") + //@PreAuthorize("@el.check('produceshiftorder:add')") + public ResponseEntity finishd(@RequestBody JSONObject param){ + produceshiftorderService.finishd(param); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PostMapping("/synchron") + @Log("工单同步") + @ApiOperation("工单同步") + //@PreAuthorize("@el.check('produceshiftorder:add')") + public ResponseEntity synchron(){ + produceshiftorderService.synchron(); + return new ResponseEntity<>(HttpStatus.CREATED); + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/order/service/ProduceshiftorderService.java b/acs/nladmin-system/src/main/java/org/nl/acs/order/service/ProduceshiftorderService.java new file mode 100644 index 0000000..571976d --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/order/service/ProduceshiftorderService.java @@ -0,0 +1,110 @@ + +package org.nl.acs.order.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.order.service.dto.ProduceshiftorderDto; +import org.springframework.data.domain.Pageable; +import java.util.Map; +import java.util.List; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; + +/** +* @description 服务接口 +* @author geng by +* @date 2022-06-06 +**/ +public interface ProduceshiftorderService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询数据 + * @param whereJson 条件 + * @return Map + */ + List queryAll(String whereJson); + + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param order_id ID + * @return Produceshiftorder + */ + ProduceshiftorderDto findById(String order_id); + + /** + * 根据编码查询 + * @param code code + * @return Produceshiftorder + */ + ProduceshiftorderDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(ProduceshiftorderDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(ProduceshiftorderDto dto); + + /** + * 编辑 + * @param dto / + */ + void updateByOrderCode(ProduceshiftorderDto dto); + + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 导出数据 + * @param dtos 待导出的数据 + * @param response / + * @throws IOException / + */ + void download(List dtos, HttpServletResponse response) throws IOException; + + /** + * 工单强制完成 + * @param param + */ + void finishd(JSONObject param); + + /** + * 数据同步 + */ + void reload(); + + List findAllOrderFromCache(); + + ProduceshiftorderDto findOrderByDeviceCode(String device_code); + + /** + * 工单同步 + */ + void synchron(); + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/order/service/dto/ProduceshiftorderDto.java b/acs/nladmin-system/src/main/java/org/nl/acs/order/service/dto/ProduceshiftorderDto.java new file mode 100644 index 0000000..946bab9 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/order/service/dto/ProduceshiftorderDto.java @@ -0,0 +1,72 @@ +package org.nl.acs.order.service.dto; + +import lombok.Data; + import java.math.BigDecimal; +import java.io.Serializable; + +/** +* @description / +* @author geng by +* @date 2022-06-06 +**/ +@Data +public class ProduceshiftorderDto implements Serializable { + + /** 工单标识 */ + private String order_id; + + /** 工单编码 */ + private String order_code; + + /** 工单状态 */ + private String order_status; + + /** 下料数量 */ + private BigDecimal qty; + + /** 每框接料数量 */ + private BigDecimal one_qty; + + /** 物料编码 */ + private String material_code; + + /** 物料名称 */ + private String material_name; + + /** 物料标识 */ + private String material_uuid; + + /** 规格型号 */ + private String material_spec; + + /** 创建者 */ + private String create_by; + + /** 创建时间 */ + private String create_time; + + /** 修改者 */ + private String update_by; + + /** 修改时间 */ + private String update_time; + + /** 是否删除 */ + private String is_deleted; + + /** 工单外部标识 */ + private String ext_order_id; + + /** 设备编号 */ + private String device_code; + + /** 是否下发AGV */ + private String is_needmove; + + //托盘模板 + private String lane_tray_template; + + //托盘总量 + private String tray_num; + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java new file mode 100644 index 0000000..27c2ff9 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/order/service/impl/ProduceshiftorderServiceImpl.java @@ -0,0 +1,299 @@ + +package org.nl.acs.order.service.impl; + + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import org.nl.acs.auto.initial.ApplicationAutoInitial; +import org.nl.acs.device.service.DeviceExtraService; +import org.nl.acs.device_driver.hongfeng.hf_station.HfStationDeviceDriver; +import org.nl.acs.device_driver.hongfeng.hf_two_rgv.HfTwoRGVDeviceDriver; +import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.opc.Device; +import org.nl.acs.order.service.ProduceshiftorderService; +import org.nl.acs.order.service.dto.ProduceshiftorderDto; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.FileUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.springframework.data.domain.Pageable; + +import java.math.BigDecimal; +import java.util.*; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; + +/** + * @author geng by + * @description 服务实现 + * @date 2022-06-06 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class ProduceshiftorderServiceImpl implements ProduceshiftorderService, ApplicationAutoInitial { + + private final org.nl.acs.opc.DeviceAppService deviceAppService; + private final DeviceExtraService deviceExtraService; + + List order = new ArrayList(); + + @Autowired + AcsToWmsService acsToWmsService; + + @Override + public void autoInitial() throws Exception { + this.reload(); + } + + public synchronized void reload() { + this.order = this.queryAll(" order_status !='2' and order_status !='3' and is_deleted =0"); + } + + @Override + public List queryAll(String whereJson) { + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + JSONArray arr = wo.query(whereJson).getResultJSONArray(0); + List list = arr.toJavaList(ProduceshiftorderDto.class); + return list; + } + + @Override + public Map queryAll(Map whereJson, Pageable page) { + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "is_deleted = '0' and order_status != '2' and order_status != '3'", "update_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(ProduceshiftorderDto.class); + return list; + } + + @Override + public ProduceshiftorderDto findById(String order_id) { + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + JSONObject json = wo.query("order_id ='" + order_id + "'").uniqueResult(0); + final ProduceshiftorderDto obj = (ProduceshiftorderDto) JSONObject.toJavaObject(json, ProduceshiftorderDto.class); + return obj; + } + + @Override + public ProduceshiftorderDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + JSONObject json = wo.query("order_code ='" + code + "'").uniqueResult(0); + final ProduceshiftorderDto obj = (ProduceshiftorderDto) JSONObject.toJavaObject(json, ProduceshiftorderDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(ProduceshiftorderDto dto) { + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + Device device = deviceAppService.findDeviceByCode(dto.getDevice_code()); + if (ObjectUtil.isEmpty(device)) { + throw new BadRequestException("未找到对应设备:" + dto.getDevice_code()); + } + JSONArray resultJSONArray = wo.query("is_deleted = '0' and order_status in ('0', '1') and device_code = '" + dto.getDevice_code() + "'").getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(resultJSONArray)) { + throw new BadRequestException("该设备已存在未完成工单,不能下发"); + } + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + dto.setOrder_id(IdUtil.simpleUUID()); + if (StrUtil.isEmpty(dto.getOrder_code())) { + String order_no = CodeUtil.getNewCode("ORDER_NO"); + dto.setOrder_code(order_no); + } + dto.setOrder_status("0"); + if (StrUtil.isEmpty(dto.getCreate_by())) { + dto.setCreate_by(currentUsername); + } + if (StrUtil.isEmpty(dto.getUpdate_by())) { + dto.setUpdate_by(currentUsername); + } + dto.setCreate_time(now); + dto.setUpdate_time(now); + + HfStationDeviceDriver hfStationDeviceDriver; + + if (device.getDeviceDriver() instanceof HfStationDeviceDriver) { + hfStationDeviceDriver = (HfStationDeviceDriver) device.getDeviceDriver(); +// hfStationDeviceDriver.writing("to_order",dto.getOrder_code()); +// hfStationDeviceDriver.writing("to_order_num",String.valueOf(dto.getQty())); +// hfStationDeviceDriver.writing("to_product_number",dto.getMaterial_code()); + } + + JSONObject json = (JSONObject) JSONObject.toJSON(dto); + wo.insert(json); + order.add(dto); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ProduceshiftorderDto dto) { + ProduceshiftorderDto entity = this.findById(dto.getOrder_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_by(currentUsername); + + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); + wo.update(json); + Iterator iterator = order.iterator(); + while (iterator.hasNext()) { + ProduceshiftorderDto instruction = iterator.next(); + if (instruction.getOrder_code().equals(dto.getOrder_code())) { + iterator.remove(); + } + } + if (StrUtil.equals(dto.getOrder_status(), "0") || StrUtil.equals(dto.getOrder_status(), "1")) { + order.add(dto); + } + if (StrUtil.equals(dto.getOrder_status(), "3")) { + + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateByOrderCode(ProduceshiftorderDto dto) { + ProduceshiftorderDto entity = this.findByCode(dto.getOrder_code()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + entity.setUpdate_time(now); + entity.setOrder_status(dto.getOrder_status()); + entity.setUpdate_by(dto.getUpdate_by()); + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + JSONObject json = (JSONObject) JSONObject.toJSON(entity); + wo.update(json, "order_code = '" + dto.getOrder_code() + "'"); + Iterator iterator = order.iterator(); + while (iterator.hasNext()) { + ProduceshiftorderDto oneorder = iterator.next(); + if (oneorder.getOrder_code().equals(dto.getOrder_code())) { + iterator.remove(); + } + } + if (StrUtil.equals(dto.getOrder_status(), "0") || StrUtil.equals(dto.getOrder_status(), "1")) { + order.add(dto); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + WQLObject wo = WQLObject.getWQLObject("acs_produceshiftorder"); + for (String order_id : ids) { + wo.delete("order_id = '" + order_id + "'"); + Iterator iterator = order.iterator(); + while (iterator.hasNext()) { + ProduceshiftorderDto instruction = iterator.next(); + if (instruction.getOrder_id().equals(order_id)) { + iterator.remove(); + } + } + } + } + + @Override + public void download(List all, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (ProduceshiftorderDto produceshiftorder : all) { + Map map = new LinkedHashMap<>(); + map.put("工单编码", produceshiftorder.getOrder_code()); + map.put("工单状态", produceshiftorder.getOrder_status()); + map.put("下料数量", produceshiftorder.getQty()); + map.put("物料编码", produceshiftorder.getMaterial_code()); + map.put("物料名称", produceshiftorder.getMaterial_name()); + map.put("物料标识", produceshiftorder.getMaterial_uuid()); + map.put("规格型号", produceshiftorder.getMaterial_spec()); + map.put("创建者", produceshiftorder.getCreate_by()); + map.put("创建时间", produceshiftorder.getCreate_time()); + map.put("修改者", produceshiftorder.getUpdate_by()); + map.put("修改时间", produceshiftorder.getUpdate_time()); + map.put("是否删除", produceshiftorder.getIs_deleted()); + map.put("工单外部标识", produceshiftorder.getExt_order_id()); + map.put("设备编号", produceshiftorder.getDevice_code()); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finishd(JSONObject param) { + param = param.getJSONObject("data"); + String now = DateUtil.now(); + String order_id = param.getString("order_id"); + String ext_order_id = param.getString("ext_order_id"); + String order_code = param.getString("order_code"); + if (StrUtil.isNotEmpty(ext_order_id)) { + param.put("ext_order_id",ext_order_id); + acsToWmsService.feedbackOrderStatus(param); + } + JSONObject map1 = new JSONObject(); + map1.put("order_id", order_id); + map1.put("order_status", "3"); + map1.put("update_by", SecurityUtils.getCurrentNickName()); + map1.put("update_time", now); + WQLObject wo1 = WQLObject.getWQLObject("acs_produceshiftorder"); + wo1.update(map1); + String device_code = param.getString("device_code"); + HfStationDeviceDriver hfStationDeviceDriver; + Device device = deviceAppService.findDeviceByCode(device_code); + if (device.getDeviceDriver() instanceof HfStationDeviceDriver){ + hfStationDeviceDriver = (HfStationDeviceDriver) device.getDeviceDriver(); + hfStationDeviceDriver.writing("to_command","5"); + } + Iterator iterator = order.iterator(); + while (iterator.hasNext()) { + ProduceshiftorderDto instruction = iterator.next(); + if (instruction.getOrder_code().equals(order_code)) { + iterator.remove(); + } + } + } + + @Override + public List findAllOrderFromCache() { + return order; + } + + @Override + public ProduceshiftorderDto findOrderByDeviceCode(String device_code) { + for (int i = 0; i < this.order.size(); i++) { + ProduceshiftorderDto dto = order.get(i); + if (StrUtil.equals(device_code, dto.getDevice_code())) { + return dto; + } + } + return null; + } + + @Override + public void synchron() { + this.reload(); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/order/service/wql/order.xls b/acs/nladmin-system/src/main/java/org/nl/acs/order/service/wql/order.xls new file mode 100644 index 0000000000000000000000000000000000000000..23a5943ef9a2c47015ec648d970a7440b02d93c6 GIT binary patch literal 163840 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
    h_OKPqiPxw>Gv%DW^D4P>+!f;ma=%b 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�hU~`5s&WWdQkAGs{-ub?jg{ry@0r>IE%9Pr`|qrNen>v#CY~|R zS>v)05u}!3cew0NZS_{?D<8ddTy9T1cD$#n>ldHePNy;IusbnTo2p4Qr5kC=C8eDt zhiP?&3S9~&v6woQ=}J>F$_%9`I6hgW$35;c n#w|ji)Qdg}A_B;+tf(+c>T`*)%f~IIn%On#0pu+I_x=7CskUvc literal 0 HcmV?d00001 diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java index 613ec94..bd8bc30 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java @@ -21,6 +21,7 @@ import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.StorageCellService; import org.nl.acs.device.service.dto.DeviceAssignedDto; import org.nl.acs.device.service.impl.DeviceServiceImpl; +import org.nl.acs.device_driver.DeviceDriverDefination; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; @@ -240,15 +241,18 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { public TaskDto findById(String task_id) { WQLObject wo = WQLObject.getWQLObject("acs_task"); JSONObject json = wo.query("task_id ='" + task_id + "'").uniqueResult(0); - final TaskDto obj = json.toJavaObject(TaskDto.class); - return obj; + if (ObjectUtil.isNotEmpty(json)) { + final TaskDto obj = json.toJavaObject(TaskDto.class); + return obj; + } + return null; } @Override public List queryAllUnfinished(Map whereJson) { WQLObject wo = WQLObject.getWQLObject("acs_task"); JSONArray arr = wo.query("task_status < 2 ").getResultJSONArray(0); - List list =arr.toJavaList(TaskDto.class); + List list = arr.toJavaList(TaskDto.class); return list; } @@ -336,61 +340,61 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { Device nextdevice = appService.findDeviceByCode(next_device_code); Device startdevice = appService.findDeviceByCode(start_device_code); dto.setMaterial(startdevice.getMaterial_type()); - if (StrUtil.equals(createTaskCheck, "1")) { - //判断起点为输送设备 - if (StrUtil.equals(DeviceType.conveyor.toString(), startDeviceType)) { - - } - if (StrUtil.equals(DeviceType.conveyor.toString(), nextDeviceType)) { - } - } else { - //判断起点为输送设备 - if (StrUtil.equals(DeviceType.conveyor.toString(), startDeviceType)) { - - } - - if (StrUtil.equals(DeviceType.conveyor.toString(), nextDeviceType)) { -// if (nextdevice.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { -// standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) nextdevice.getDeviceDriver(); -// if (nextdevice.getHas_goods() != 0) { -// throw new Exception("任务终点需满足无货!"); +// if (StrUtil.equals(createTaskCheck, "1")) { +// //判断起点为输送设备 +// if (StrUtil.equals(DeviceType.conveyor.toString(), startDeviceType)) { +// +// } +// if (StrUtil.equals(DeviceType.conveyor.toString(), nextDeviceType)) { +// } +// } else { +// //判断起点为输送设备 +// if (StrUtil.equals(DeviceType.conveyor.toString(), startDeviceType)) { +// +// } +// +// if (StrUtil.equals(DeviceType.conveyor.toString(), nextDeviceType)) { +//// if (nextdevice.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { +//// standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) nextdevice.getDeviceDriver(); +//// if (nextdevice.getHas_goods() != 0) { +//// throw new Exception("任务终点需满足无货!"); +//// } +//// } +// +// JSONObject jo = new JSONObject(); +// JSONObject jo2 = new JSONObject(); +// if (!StrUtil.isEmpty(dto.getMaterial())) { +// if (!StrUtil.equals(dto.getMaterial(), "1")) { +// jo.put("hasGoodStatus", "2"); +// jo.put("material_type", dto.getMaterial()); +// } else { +// jo.put("hasGoodStatus", "1"); +// jo.put("material_type", "1"); // } +// +// } else { +// jo.put("hasGoodStatus", "1"); +// jo.put("material_type", "1"); // } - - JSONObject jo = new JSONObject(); - JSONObject jo2 = new JSONObject(); - if (!StrUtil.isEmpty(dto.getMaterial())) { - if (!StrUtil.equals(dto.getMaterial(), "1")) { - jo.put("hasGoodStatus", "2"); - jo.put("material_type", dto.getMaterial()); - } else { - jo.put("hasGoodStatus", "1"); - jo.put("material_type", "1"); - } - - } else { - jo.put("hasGoodStatus", "1"); - jo.put("material_type", "1"); - } - jo.put("device_code", dto.getStart_device_code()); - jo.put("quantity", dto.getQuantity()); - jo.put("remark", dto.getRemark()); - jo.put("batch", startdevice.getBatch()); - jo.put("islock", "true"); - deviceService.changeDeviceStatus(jo); - Device deviceByCode = deviceAppService.findDeviceByCode(dto.getNext_device_code()); - jo2.put("device_code", dto.getNext_device_code()); - jo2.put("hasGoodStatus", deviceByCode.getHas_goods()); - jo2.put("quantity", deviceByCode.getQuantity()); - jo2.put("remark", deviceByCode.getRemark()); - jo2.put("material_type", deviceByCode.getMaterial_type()); - jo2.put("batch", deviceByCode.getBatch()); - jo2.put("islock", "true"); - deviceService.changeDeviceStatus(jo2); - } - } +// jo.put("device_code", dto.getStart_device_code()); +// jo.put("quantity", dto.getQuantity()); +// jo.put("remark", dto.getRemark()); +// jo.put("batch", startdevice.getBatch()); +// jo.put("islock", "true"); +// deviceService.changeDeviceStatus(jo); +// Device deviceByCode = deviceAppService.findDeviceByCode(dto.getNext_device_code()); +// jo2.put("device_code", dto.getNext_device_code()); +// jo2.put("hasGoodStatus", deviceByCode.getHas_goods()); +// jo2.put("quantity", deviceByCode.getQuantity()); +// jo2.put("remark", deviceByCode.getRemark()); +// jo2.put("material_type", deviceByCode.getMaterial_type()); +// jo2.put("batch", deviceByCode.getBatch()); +// jo2.put("islock", "true"); +// deviceService.changeDeviceStatus(jo2); +// } +// } WQLObject wo = WQLObject.getWQLObject("acs_task"); - JSONObject json = (JSONObject) JSONObject.toJSON(dto); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); wo.insert(json); tasks.add(dto); @@ -492,7 +496,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { } if (ObjectUtil.isNotEmpty(this.findByStartCode(start_device_code)) - || ObjectUtil.isNotEmpty(this.findByNextCode(next_device_code))) { + || ObjectUtil.isNotEmpty(this.findByNextCode(next_device_code))) { throw new WDKException("已存在该起点或终点的任务!"); } if (StrUtil.equals(material_type, "") || StrUtil.equals(quantity, "")) { @@ -523,7 +527,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { dto.setUpdate_by(currentUsername); WQLObject wo = WQLObject.getWQLObject("acs_task"); - JSONObject json = (JSONObject) JSONObject.toJSON(dto); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); wo.update(json); @@ -653,14 +657,15 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { JSONObject json = (JSONObject) JSONObject.toJSON(entity); wo.update(json); removeByCodeFromCache(entity.getTask_code()); + Long currentUserId = SecurityUtils.getCurrentUserId(); //判断是否为WMS下发的任务,如果是反馈任务状态给WMS String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); - if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { + if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1") && ObjectUtil.isNotEmpty(currentUserId)) { TaskFeedbackDto feefbackdto = taskFeedbackService.findByCode(entity.getTask_code()); JSONObject feed_jo = new JSONObject(); - feed_jo.put("task_id", entity.getTask_id()); - feed_jo.put("task_code", entity.getTask_code()); - feed_jo.put("task_status", entity.getTask_status()); + feed_jo.put("task_id", entity.getExt_task_id()); + feed_jo.put("finished_type", "2"); + feed_jo.put("task_status", "2"); JSONArray ja = new JSONArray(); ja.add(feed_jo); String message = null; @@ -766,6 +771,19 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { if (instdto != null) { throw new BadRequestException("有指令未完成!"); } + Long currentUserId = SecurityUtils.getCurrentUserId(); + //判断是否为WMS下发的任务,如果是反馈任务状态给WMS + String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); + if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1") && ObjectUtil.isNotEmpty(currentUserId)) { + JSONObject feed_jo = new JSONObject(); + feed_jo.put("task_id", entity.getExt_task_id()); + feed_jo.put("task_code", entity.getTask_code()); + feed_jo.put("task_status", "3"); + JSONArray ja = new JSONArray(); + ja.add(feed_jo); + acstowmsService.feedbackTaskStatusToWms(ja); + } + String currentUsername = SecurityUtils.getCurrentUsername(); String now = DateUtil.now(); entity.setUpdate_time(now); @@ -781,17 +799,6 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { tasks.remove(i); } } - //判断是否为WMS下发的任务,如果是反馈任务状态给WMS - String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); - if (!StrUtil.startWith(entity.getTask_code(), "-") && StrUtil.equals(hasWms, "1")) { - JSONObject feed_jo = new JSONObject(); - feed_jo.put("task_id", entity.getTask_id()); - feed_jo.put("task_code", entity.getTask_code()); - feed_jo.put("task_status", entity.getTask_status()); - JSONArray ja = new JSONArray(); - ja.add(feed_jo); - acstowmsService.feedbackTaskStatusToWms(ja); - } List shortPathsList = routeLineService.getShortPathLines(entity.getStart_device_code(), entity.getNext_device_code(), entity.getRoute_plan_code()); String type = shortPathsList.get(0).getType(); // != 0 为agv任务 @@ -1054,7 +1061,14 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { task.setStart_device_code(task.getStart_device_code()); } else { - String start_device = deviceAppService.findDeviceByCode(start_point_code).getDeviceDriverDefination().getFitDeviceTypes().get(0).name(); + String start_device = ""; + DeviceDriverDefination deviceDriverDefination = deviceAppService.findDeviceByCode(start_point_code).getDeviceDriverDefination(); + if (ObjectUtil.isNotEmpty(deviceDriverDefination)) { + List fitDeviceTypes = deviceDriverDefination.getFitDeviceTypes(); + if (ObjectUtil.isNotEmpty(fitDeviceTypes)) { + start_device = fitDeviceTypes.get(0).name(); + } + } //如果point_device为货架,则不包含列层信息,需要重新拼接 if (StrUtil.equals("storage", start_device)) { if (StrUtil.isEmpty(task.getFrom_x())) { @@ -1106,7 +1120,14 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { task.setNext_device_code(task.getNext_device_code()); } else { - String next_device = deviceAppService.findDeviceByCode(next_point_code).getDeviceDriverDefination().getFitDeviceTypes().get(0).name(); + String next_device = ""; + DeviceDriverDefination deviceDriverDefination = deviceAppService.findDeviceByCode(next_point_code).getDeviceDriverDefination(); + if (ObjectUtil.isNotEmpty(deviceDriverDefination)) { + List fitDeviceTypes = deviceDriverDefination.getFitDeviceTypes(); + if (ObjectUtil.isNotEmpty(fitDeviceTypes)) { + next_device = fitDeviceTypes.get(0).name(); + } + } if (StrUtil.equals("storage", next_device)) { if (StrUtil.isEmpty(task.getTo_x())) { throw new BadRequestException("货位信息终点需要包含列信息"); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/test/service/impl/TestServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/test/service/impl/TestServiceImpl.java index 5d1ff4f..76a9248 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/test/service/impl/TestServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/test/service/impl/TestServiceImpl.java @@ -2,10 +2,16 @@ package org.nl.acs.test.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.service.dto.DeviceDto; import org.nl.acs.test.service.TestService; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.WQLObject; import org.springframework.stereotype.Service; import java.io.IOException; @@ -24,6 +30,68 @@ public class TestServiceImpl implements TestService @Override public void test1() throws IOException { + WQLObject wo = WQLObject.getWQLObject("acs_device"); + String now = DateUtil.now(); + String currentUsername = SecurityUtils.getCurrentUsername(); + +// for (int i = 1; i <= 12; i++) { +// String device_code = "KLZHC"; +// if (i < 10){ +// device_code = device_code + "0" + i; +// } else { +// device_code = device_code + i; +// } +// DeviceDto dto = new DeviceDto(); +// dto.setDevice_id(IdUtil.simpleUUID()); +// dto.setDevice_code(device_code); +// dto.setDevice_name(device_code); +// dto.setDevice_type("conveyor"); +// dto.setCreate_by(currentUsername); +// dto.setUpdate_by(currentUsername); +// dto.setUpdate_time(now); +// dto.setCreate_time(now); +// JSONObject json = (JSONObject) JSONObject.toJSON(dto); +// wo.insert(json); +// } +// for (int i = 1; i <= 25; i++) { +// String device_code = "KLZC"; +// if (i < 10){ +// device_code = device_code + "0" + i; +// } else { +// device_code = device_code + i; +// } +// DeviceDto dto = new DeviceDto(); +// dto.setDevice_id(IdUtil.simpleUUID()); +// dto.setDevice_code(device_code); +// dto.setDevice_name(device_code); +// dto.setDevice_type("conveyor"); +// dto.setCreate_by(currentUsername); +// dto.setUpdate_by(currentUsername); +// dto.setUpdate_time(now); +// dto.setCreate_time(now); +// JSONObject json = (JSONObject) JSONObject.toJSON(dto); +// wo.insert(json); +// } +// for (int i = 1; i <= 25; i++) { +// String device_code = "MLZHC"; +// if (i < 10){ +// device_code = device_code + "0" + i; +// } else { +// device_code = device_code + i; +// } +// DeviceDto dto = new DeviceDto(); +// dto.setDevice_id(IdUtil.simpleUUID()); +// dto.setDevice_code(device_code); +// dto.setDevice_name(device_code); +// dto.setDevice_type("conveyor"); +// dto.setCreate_by(currentUsername); +// dto.setUpdate_by(currentUsername); +// dto.setUpdate_time(now); +// dto.setCreate_time(now); +// JSONObject json = (JSONObject) JSONObject.toJSON(dto); +// wo.insert(json); +// } + } diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/amb/rest/HFHandController.java b/acs/nladmin-system/src/main/java/org/nl/hand/amb/rest/HFHandController.java new file mode 100644 index 0000000..e14d738 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/amb/rest/HFHandController.java @@ -0,0 +1,152 @@ + +package org.nl.hand.amb.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.hand.amb.service.HFHandService; +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 qxuan + * @date 2021-07-21 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "手持接口") +@RequestMapping("/api/hand") +@Slf4j +public class HFHandController { + private final HFHandService HandService; + + @PostMapping("/area") + @Log("查询区域") + @ApiOperation("查询区域") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity query() { + return new ResponseEntity<>(HandService.queryArea(null), HttpStatus.OK); + } + + @PostMapping("/point") + @Log("查询设备编号及状态") + @ApiOperation("查询设备编号及状态") + //@PreAuthorize("@el.check('sect:list')") + //@RequestBody JSONObject json + public ResponseEntity queryPoint(@RequestBody Map whereJson) { + String region = (String) whereJson.get("region"); + return new ResponseEntity<>(HandService.queryPointByArea(region), HttpStatus.OK); + } + + @PostMapping("/point/storage") + @Log("查询设备扩展属性") + @ApiOperation("查询设备扩展属性") + //@PreAuthorize("@el.check('sect:list')") + //@RequestBody JSONObject json + public ResponseEntity queryDeviceAugmentabilityByCode(@RequestBody Map whereJson) { + return new ResponseEntity<>(HandService.queryDeviceAugmentabilityByCode(whereJson), HttpStatus.OK); + } + + @PostMapping("/task_type") + @Log("查询任务类型") + @ApiOperation("查询任务类型") + //@PreAuthorize("@el.check('sect:list')") + //@RequestBody JSONObject json + public ResponseEntity queryTaskType() { + return new ResponseEntity<>(HandService.queryTaskType(), HttpStatus.OK); + } + + @PostMapping("/tasks") + @Log("查询任务") + @ApiOperation("查询任务") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity queryTask(@RequestBody Map whereJson) { + + return new ResponseEntity<>(HandService.queryTask(whereJson), HttpStatus.OK); + } + + @PostMapping("/insts") + @Log("查询指令") + @ApiOperation("查询指令") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity queryInst(@RequestBody Map whereJson) { + + return new ResponseEntity<>(HandService.queryInst(whereJson), HttpStatus.OK); + } + + @PostMapping("/routeplan_type") + @Log("查询路由类型") + @ApiOperation("查询路由类型") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity queryRouteplanType() { + return new ResponseEntity<>(HandService.queryRouteplanType(), HttpStatus.OK); + } + + @PostMapping("/task") + @Log("创建任务") + @ApiOperation("创建任务") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity createTask(@RequestBody Map whereJson) { + return new ResponseEntity<>(HandService.createTask(whereJson), HttpStatus.OK); + } + + @PostMapping("/inst") + @Log("指令操作") + @ApiOperation("指令操作") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity Instoperation(@RequestBody Map whereJson) { + return new ResponseEntity<>(HandService.Instoperation(whereJson), HttpStatus.OK); + } + + @PostMapping("/taskoperation") + @Log("任务操作") + @ApiOperation("任务操作") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity Taskoperation(@RequestBody Map whereJson) throws Exception { + return new ResponseEntity<>(HandService.Taskoperation(whereJson), HttpStatus.OK); + } + + @PostMapping("/deviceStatus") + @Log("修改设备状态") + @ApiOperation("修改设备状态") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity updateDeviceStatus(@RequestBody Map whereJson) { + + return new ResponseEntity<>(HandService.updateDeviceStatus(whereJson), HttpStatus.OK); + } + + @PostMapping("/handlogin") + @Log("手持登陆验证") + @ApiOperation("手持登陆验证") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity handlogin(@RequestBody Map whereJson) { + + return new ResponseEntity<>(HandService.handleLogin(whereJson), HttpStatus.OK); + } + + @PostMapping("/matrial") + @Log("查询物料信息") + @ApiOperation("查询物料信息") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity queryMaterial() { + return new ResponseEntity<>(HandService.queryMaterial(), HttpStatus.OK); + } + + @PostMapping("/task2") + @Log("创建任务") + @ApiOperation("创建任务") + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity createTask2(@RequestBody Map whereJson) { + return new ResponseEntity<>(HandService.createTask2(whereJson), HttpStatus.OK); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/HFHandService.java b/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/HFHandService.java new file mode 100644 index 0000000..b9f60d4 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/HFHandService.java @@ -0,0 +1,115 @@ + +package org.nl.hand.amb.service; + + +import java.util.Map; + +/** + * @author qxuan + * @description 服务接口 + * @date 2021-07-21 + **/ +public interface HFHandService { + + /** + * 查询区域 + * + * @param whereJson 条件 + * @return Map + */ + Map queryArea(Map whereJson); + + /** + * 查询设备编号及状态 + * + * @return Map + */ + Map queryPointByArea(String dict_id); + + /** + * 查询设备扩展性 + * + * @param deviceCode + * @return + */ + Map queryDeviceAugmentabilityByCode(Map deviceCode); + + /** + * 查询任务状态 + * + * @return + */ + Map queryTaskType(); + + /** + * 查询路由类型 + * + * @return + */ + Map queryRouteplanType(); + + /** + * 查询指令 + * + * @param jsonObject 条件 + * @return Map + */ + Map queryInst(Map jsonObject); + + /** + * 创建任务 + * + * @param jsonObject 条件 + * @return Map + */ + Map createTask(Map jsonObject); + + /** + * 查询任务 + * + * @param jsonObject 条件 + * @return Map + */ + Map queryTask(Map jsonObject); + + /** + * 修改设备状态 + * + * @param jsonObject 条件 + * @return Map + */ + Map updateDeviceStatus(Map jsonObject); + + /** + * 手持登陆 + * + * @param jsonObject 条件 + * @return Map + */ + Map handleLogin(Map jsonObject); + + /** + * 指令操作 + * + * @param jsonObject 条件 + * @return Map + */ + Map Instoperation(Map jsonObject); + + /** + * 任务操作 + * + * @param jsonObject 条件 + * @return Map + */ + Map Taskoperation(Map jsonObject) throws Exception; + + /** + * 查询物料 + * + * @return Map + */ + Map queryMaterial(); + + Map createTask2(Map whereJson); +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/dto/HandDto.java b/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/dto/HandDto.java new file mode 100644 index 0000000..c940b50 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/dto/HandDto.java @@ -0,0 +1,80 @@ +package org.nl.hand.amb.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author qxuan + * @description / + * @date 2021-07-21 + **/ +@Data +public class HandDto implements Serializable { + + /** + * 库区标识 + */ + private String sect_uuid; + + /** + * 库区编码 + */ + private String sect_code; + + /** + * 库区名称 + */ + private String sect_name; + + /** + * 库区简称 + */ + private String simple_name; + + /** + * 库区类型 + */ + private String sect_type; + + /** + * 顺序号 + */ + private BigDecimal order_seq; + + /** + * 仓库标识 + */ + private String store_uuid; + + /** + * 是否启用 + */ + private String is_active; + + /** + * 是否删除 + */ + private String is_delete; + + /** + * 创建者 + */ + private String create_by; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改者 + */ + private String update_by; + + /** + * 修改时间 + */ + private String update_time; +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/impl/HFHandServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/impl/HFHandServiceImpl.java new file mode 100644 index 0000000..6f6e9c3 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/amb/service/impl/HFHandServiceImpl.java @@ -0,0 +1,767 @@ + +package org.nl.hand.amb.service.impl; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.agv.server.MagicAgvService; +import org.nl.acs.agv.server.impl.MagicAgvServiceImpl; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.device.service.dto.DeviceDto; +import org.nl.acs.device.service.impl.DeviceServiceImpl; +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.instruction.service.InstructionService; +import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.instruction.service.dto.InstructionDto; +import org.nl.acs.instruction.service.impl.InstructionServiceImpl; +import org.nl.acs.opc.Device; +import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.opc.DeviceAppServiceImpl; +import org.nl.acs.route.service.RouteLineService; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.acs.task.service.impl.TaskServiceImpl; +import org.nl.hand.amb.service.HFHandService; +import org.nl.modules.common.config.RsaProperties; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.RsaUtils; +import org.nl.modules.system.service.UserService; +import org.nl.modules.system.service.dto.UserDto; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + + +/** + * @author qxuan + * @description 服务实现 + * @date 2021-07-21 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class HFHandServiceImpl implements HFHandService { + private final UserService userService; + private final DeviceService deviceService; + private final DeviceAppService deviceAppService; + InstructionService instructionService = null; + + + @Override + public Map queryArea(Map whereJson) { + JSONObject jo = new JSONObject(); + JSONArray resultJSONArray = WQL.getWO("QJN_QUERY001").addParam("flag", "1").process().getResultJSONArray(0); + jo.put("code", "1"); + jo.put("desc", "查询成功"); + jo.put("result", resultJSONArray); + return jo; + } + + @Override + public Map queryPointByArea(String dict_id) { + JSONArray resultArr = new JSONArray(); + JSONObject resultJson = new JSONObject(); + JSONObject jo = new JSONObject(); + + if (StrUtil.isEmpty(dict_id)) { + throw new BadRequestException("区域id不能为空!"); + } + String value = ""; + String move = ""; + String status = ""; + String input_material = "0"; + String allow_update = ""; + String material = ""; + String batch = ""; + + //再字典中查询出value + //JSONObject valuejo = WQLObject.getWQLObject("sys_dict_detail").query("detail_id='" + dict_id + "'").uniqueResult(0); + JSONObject valuejo = WQL.getWO("QJN_QUERY001").addParam("flag", "3").addParam("detail_id", dict_id).process().uniqueResult(0); + if (!ObjectUtil.isEmpty(valuejo)) { + value = valuejo.getString("value"); + } + //根据value值去查所有的设备 + JSONArray acs_deviceja = WQLObject.getWQLObject("ACS_DEVICE").query("region='" + value + "' and device_type='conveyor' and is_config='true' ", "seq_num,device_name").getResultJSONArray(0); + for (int i = 0; i < acs_deviceja.size(); i++) { + JSONObject devicejo = acs_deviceja.getJSONObject(i); + String device_code = devicejo.getString("device_code"); + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + Device device = appService.findDeviceByCode(device_code); + //无光电普通站点 + StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; + //检测站点 + StandardInspectSiteDeviceDriver standardInspectSiteDeviceDriver; + + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + if (StrUtil.equals(device.getIslock(), "true")) { + status = "3"; + move = "有任务"; + } else { + if (standardOrdinarySiteDeviceDriver.getHasGoods() == 0) { + status = "0"; + move = "无货"; + } else if (standardOrdinarySiteDeviceDriver.getHasGoods() == 1) { + status = "1"; + move = "有托盘"; + } else if (standardOrdinarySiteDeviceDriver.getHasGoods() == 2) { + status = "2"; + move = "有托盘有货"; + } + } + + material = device.getMaterial_type(); + //material = standardOrdinarySiteDeviceDriver.getMaterial(); + if (StrUtil.isNullOrUndefined(material)) { + material = ""; + } + batch = device.getBatch(); + //batch = standardOrdinarySiteDeviceDriver.getBatch(); + if (StrUtil.isNullOrUndefined(batch)) { + batch = ""; + } + String input_materialflag = (String) device.getExtraValue().get("input_material"); + if (!StrUtil.isEmpty(input_materialflag) && input_materialflag.equals("false")) { + input_material = "0"; + } + if (!StrUtil.isEmpty(input_materialflag) && input_materialflag.equals("true")) { + input_material = "1"; + } + jo.put("material_type", material); + jo.put("batch", batch); + jo.put("islock", device.getIslock()); + jo.put("status_name", move); + jo.put("status", status); + jo.put("device_id", devicejo.getString("device_id")); + jo.put("device_code", devicejo.getString("device_code")); + jo.put("device_name", devicejo.getString("device_name")); + jo.put("allow_update", "1"); + jo.put("input_material", input_material); + // 特殊驱动 + } + //检测站点 + else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); + + if (StrUtil.equals(device.getIslock(), "true")) { + status = "3"; + move = "有任务"; + } else { + if (standardInspectSiteDeviceDriver.getHasGoods() == 0) { + status = "0"; + move = "无货"; + } else if (standardInspectSiteDeviceDriver.getHasGoods() == 1) { + status = "1"; + move = "有托盘"; + } else if (standardInspectSiteDeviceDriver.getHasGoods() == 2) { + status = "2"; + move = "有托盘有货"; + } + } + jo.put("material_type", standardInspectSiteDeviceDriver.getMaterial()); + jo.put("status_name", move); + jo.put("status", status); + jo.put("device_id", devicejo.getString("device_id")); + jo.put("device_code", devicejo.getString("device_code")); + jo.put("device_name", devicejo.getString("device_name")); + jo.put("allow_update", "1"); + jo.put("batch", standardInspectSiteDeviceDriver.getBatch()); + jo.put("input_material", input_material); + + } + resultArr.add(jo); + } + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", resultArr); + return resultJson; + } + + @Override + public Map queryDeviceAugmentabilityByCode(Map whereMap) { + String deviceCode = whereMap.get("device_code").toString(); + JSONObject resultJson = new JSONObject(); + JSONObject jo = new JSONObject(); + JSONObject acs_device = WQLObject.getWQLObject("ACS_DEVICE").query("device_code = '" + deviceCode + "'").pageResult(); + JSONObject acsDevice = (JSONObject) acs_device.getJSONArray("content").get(0); + //判断设备类型是不是storage + if (!"storage".equals(acsDevice.getString("device_type"))) { + resultJson.put("code", "0"); + resultJson.put("desc", "该设备不是货架"); + resultJson.put("result", ""); + return resultJson; + } + JSONObject jsonObject = deviceService.queryStorageExtra(deviceCode); + jo.put("device_id", acsDevice.getString("device_id")); + jo.put("device_code", deviceCode); + jo.put("device_name", acsDevice.getString("device_name")); + jo.put("device_type", acsDevice.getString("device_type")); + jo.put("maxY", jsonObject.getString("maxY")); + jo.put("minY", jsonObject.getString("minY")); + jo.put("maxZ", jsonObject.getString("maxZ")); + jo.put("minZ", jsonObject.getString("minZ")); + + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", jo); + return resultJson; + } + + @Override + public Map queryRouteplanType() { + JSONObject resultJson = new JSONObject(); + JSONObject jo = WQLObject.getWQLObject("acs_route_plan").query().pageResult(); + JSONArray arr = new JSONArray(); + JSONArray content = jo.getJSONArray("content"); + for (int i = 0; i < content.size(); i++) { + JSONObject jsonObject = (JSONObject) content.get(i); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("value", jsonObject.getString("plan_code")); + jsonObject1.put("label", jsonObject.getString("plan_name")); + arr.add(jsonObject1); + } + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", arr); + return resultJson; + } + + @Override + public Map queryTaskType() { + JSONObject resultJson = new JSONObject(); + JSONObject jo = WQLObject.getWQLObject("sys_dict_detail").query("name = 'task_type'").pageResult(); + JSONArray arr = new JSONArray(); + JSONArray content = jo.getJSONArray("content"); + for (int i = 0; i < content.size(); i++) { + JSONObject jsonObject = (JSONObject) content.get(i); + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("value", jsonObject.getString("value")); + jsonObject1.put("label", jsonObject.getString("label")); + arr.add(jsonObject1); + } + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", arr); + return resultJson; + } + + @Override + public Map queryInst(Map jsonObject) { + //查询位完成的指令 + JSONObject resultJson = new JSONObject(); + HashMap map = new HashMap<>(); + + String key = jsonObject.get("keyword"); + String start_point = jsonObject.get("start_devicecode"); + String next_point = jsonObject.get("next_devicecode"); + map.put("flag", "4"); + if (StrUtil.isNotEmpty(key)) { + map.put("key", "%" + key + "%"); + } + if (StrUtil.isNotEmpty(start_point)) { + map.put("start_point", "%" + start_point + "%"); + } + if (StrUtil.isNotEmpty(next_point)) { + map.put("next_point", "%" + next_point + "%"); + } + JSONArray resultArr = WQL.getWO("QJN_QUERY001").addParamMap(map).addParamMap((HashMap) jsonObject).process().getResultJSONArray(0); + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", resultArr); + return resultJson; + } + + @Override + public Map createTask(Map jsonObject) { + String start_devicecode = jsonObject.get("start_devicecode"); + String next_devicecode = jsonObject.get("next_devicecode"); + String material_type = jsonObject.get("material_type"); + String task_type = jsonObject.get("task_type"); + String priority = jsonObject.get("priority"); + String carrier = jsonObject.get("carrier"); + + JSONObject resultJson = new JSONObject(); + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + Device startDevice = appService.findDeviceByCode(start_devicecode); + Device nextDevice = appService.findDeviceByCode(next_devicecode); + + if (StrUtil.isEmpty(start_devicecode)) { + resultJson.put("code", "0"); + resultJson.put("desc", "起点不能为空"); + resultJson.put("result", ""); + return resultJson; + } + if (StrUtil.isEmpty(next_devicecode)) { + resultJson.put("code", "0"); + resultJson.put("desc", "终点不能为空"); + resultJson.put("result", ""); + return resultJson; + } +// if (ObjectUtil.isNotEmpty(taskService.findByStartCode(start_devicecode)) || +// ObjectUtil.isNotEmpty(taskService.findByStartCode(next_devicecode))) { +// resultJson.put("code", "2"); +// resultJson.put("desc", "已存在该起点或终点的任务!"); +// resultJson.put("result", ""); +// return resultJson; +// } + //判断起点有货,终点为空 + if (ObjectUtil.isEmpty(startDevice.getMaterial_type()) || Integer.parseInt(startDevice.getMaterial_type()) == 0) { + resultJson.put("code", "0"); + resultJson.put("desc", "起点必须有货"); + resultJson.put("result", ""); + return resultJson; + } + if (!ObjectUtil.isEmpty(nextDevice.getMaterial_type()) && !StrUtil.equals(nextDevice.getMaterial_type(), "0")) { + resultJson.put("code", "0"); + resultJson.put("desc", "终点必须为空"); + resultJson.put("result", ""); + return resultJson; + } + if(Boolean.parseBoolean(startDevice.getIslock()) || Boolean.parseBoolean(nextDevice.getIslock())){ + resultJson.put("code", "0"); + resultJson.put("desc", "起点或终点设备已被锁定"); + resultJson.put("result", ""); + return resultJson; + } + if (StrUtil.isEmpty(priority)) { + priority = "1"; + } + + if (start_devicecode.equals(next_devicecode)) { + resultJson.put("code", "0"); + resultJson.put("desc", "起点和终点不能是同一设备【" + next_devicecode + "】"); + resultJson.put("result", ""); + return resultJson; + } + + TaskService taskService = SpringContextHolder.getBean(TaskServiceImpl.class); + TaskDto dto = new TaskDto(); + dto.setIs_active("1"); + dto.setIs_delete("0"); + dto.setMaterial(material_type); + dto.setStart_point_code(start_devicecode); + dto.setNext_point_code(next_devicecode); + dto.setMaterial(material_type); + dto.setTask_type(task_type); + dto.setPriority(priority); + dto.setVehicle_code(carrier); + try { + taskService.create(dto); + startDevice.setIslock("true"); + nextDevice.setIslock("true"); + } catch (Exception e) { + resultJson.put("code", "2"); + resultJson.put("desc", e.getMessage()); + resultJson.put("result", ""); + return resultJson; + } + + resultJson.put("code", "1"); + resultJson.put("desc", "生成成功!"); + resultJson.put("result", ""); + return resultJson; + + } + + @Override + public Map queryTask(Map jsonObject) { + String key = jsonObject.get("keyword"); + String start_point = jsonObject.get("start_devicecode"); + String next_point = jsonObject.get("next_devicecode"); + HashMap map = new HashMap<>(); + map.put("flag", "2"); + if (StrUtil.isNotEmpty(key)) { + map.put("key", "%" + key + "%"); + } + if (StrUtil.isNotEmpty(start_point)) { + map.put("start_point", "%" + start_point + "%"); + } + if (StrUtil.isNotEmpty(next_point)) { + map.put("next_point", "%" + next_point + "%"); + } + //查询有任务 但是没有指令的任务 + JSONArray result = WQL.getWO("QJN_QUERY001").addParamMap(map).process().getResultJSONArray(0); + JSONObject resultJson = new JSONObject(); + resultJson.put("code", "1"); + resultJson.put("desc", "查询成功"); + resultJson.put("result", result); + return resultJson; + } + + + @Override + public Map updateDeviceStatus(Map jsonObject) { + //修改任务的状态 + String device_code = jsonObject.get("device_code"); + String type = jsonObject.get("type"); + String status = jsonObject.get("status"); + String material_type = jsonObject.get("material_type"); + String batch = jsonObject.get("batch"); + JSONObject resultJson = new JSONObject(); + DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); + + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + Device device = appService.findDeviceByCode(device_code); + //无光电普通站点 + StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; + + DeviceDto dto = deviceService.findByCode(device_code); + + if (Boolean.parseBoolean(device.getIslock())) { + resultJson.put("code", "0"); + resultJson.put("desc", "已有任务无法绑定!"); + resultJson.put("result", new JSONObject()); + return resultJson; + } + //修改 + if (type.equals("1")) { + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + + if (StrUtil.equals("0", material_type)) { + status = "0"; + } + if (StrUtil.equals("1", material_type)) { + status = "1"; + } + if ("2,3,4,5".contains(material_type)) { + status = "2"; + } + standardOrdinarySiteDeviceDriver.setHasGoods(Integer.parseInt(status)); + device.setHas_goods(Integer.parseInt(status)); + JSONObject jo = new JSONObject(); + jo.put("device_code", device_code); + jo.put("hasGoodStatus", status); + jo.put("batch", batch); + jo.put("material_type", material_type); + deviceService.changeDeviceStatus(jo); + if (!StrUtil.isEmpty(material_type)) { + standardOrdinarySiteDeviceDriver.setMaterial(material_type); + } + if (!StrUtil.isEmpty(batch)) { + standardOrdinarySiteDeviceDriver.setBatch(batch); + } + } + } + //清空 + if (type.equals("2")) { + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + standardOrdinarySiteDeviceDriver.setHasGoods(0); + device.setHas_goods(0); + JSONObject jo = new JSONObject(); + jo.put("device_code", device_code); + jo.put("hasGoodStatus", "0"); + jo.put("batch", ""); + jo.put("material_type", ""); + deviceService.changeDeviceStatus(jo); + standardOrdinarySiteDeviceDriver.setMaterial(""); + standardOrdinarySiteDeviceDriver.setBatch(""); + } + } + resultJson.put("code", "1"); + resultJson.put("desc", "更新成功"); + resultJson.put("result", new JSONObject()); + + return resultJson; + } + + @SneakyThrows + @Override + public Map handleLogin(Map jsonObject) { + JSONObject resultJson = new JSONObject(); + String user = jsonObject.get("user"); + String password = jsonObject.get("password"); + if (StrUtil.isEmpty("user")) { + resultJson.put("code", "1"); + resultJson.put("desc", "用户不能为空"); + return resultJson; + } + if (StrUtil.isEmpty("password")) { + resultJson.put("code", "1"); + resultJson.put("desc", "密码不能为空!"); + return resultJson; + } + boolean is_match = false; + Long account_id = 0L; + try { + String pwd = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, password); + UserDto userDto = userService.findByName(user); + account_id = userDto.getId(); + //is_match = passwordEncoder.matches(pwd, userDto.getPassword()); + + } catch (Exception e) { + e.printStackTrace(); + } + + if (is_match) { + resultJson.put("code", "1"); + resultJson.put("desc", "登陆成功"); + } else { + resultJson.put("code", "2"); + resultJson.put("desc", "登陆失败!"); + } + JSONObject jo = new JSONObject(); + jo.put("user_name", user); + jo.put("account_id", account_id); + resultJson.put("result", jo); + return resultJson; + } + + @Override + public Map Instoperation(Map jsonObject) { + JSONObject jo = new JSONObject(); + String type = jsonObject.get("type"); + String inst_uuid = jsonObject.get("inst_uuid"); + JSONObject instwo = WQLObject.getWQLObject("acs_instruction").query("instruction_id='" + inst_uuid + "'").uniqueResult(0); + if (instwo == null) { + jo.put("code", "2"); + jo.put("desc", "未找到该指令!"); + jo.put("result", ""); + return jo; + } + if (StrUtil.equals(instwo.getString("instruction_status"), "2") || + StrUtil.equals(instwo.getString("instruction_status"), "3")) { + jo.put("code", "2"); + jo.put("desc", "指令已完成或已取消,无法操作"); + jo.put("result", ""); + return jo; + } + String task_id = instwo.getString("task_id"); + Instruction instdto = (Instruction) instwo.toJavaObject(Instruction.class); + MagicAgvService agvService = SpringContextHolder.getBean(MagicAgvServiceImpl.class); + InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); + + /* 1 指令撤销 + 2 重新下发 + 3 强制完成*/ + if (type.equals("1")) { + //调用agv删除任务的接口 + + try { + //agvService.deleteAgvInst(instwo.getString("instruction_code")); + if (StrUtil.isEmpty(instdto.getAgv_jobno())) { + instructionService.cancelNOSendAgv(inst_uuid); + } else { + agvService.deleteAgvInst(instdto.getInstruction_code()); + } + + } catch (Exception e) { + jo.put("code", "2"); + jo.put("desc", "下发agv失败"); + jo.put("result", ""); + return jo; + } + } + if (type.equals("2")) { + try { + agvService.sendAgvInstToMagic(instdto); + } catch (Exception e) { + jo.put("code", "2"); + jo.put("desc", "下发agv失败"); + jo.put("result", ""); + return jo; + } + + } + if (type.equals("3")) { + //完成指令 + try { + instructionService.finish(inst_uuid); + + } catch (Exception e) { + jo.put("code", "2"); + jo.put("desc", e.getMessage()); + jo.put("result", ""); + return jo; + } + } + + jo.put("code", "1"); + jo.put("desc", "操作成功"); + jo.put("result", new JSONObject()); + return jo; + } + + @Override + public Map Taskoperation(Map jsonObject) throws Exception { + JSONObject jo = new JSONObject(); + String task_uuid = jsonObject.get("inst_uuid"); + String type = jsonObject.get("type"); + JSONObject taskjo = WQLObject.getWQLObject("acs_task").query("task_id='" + task_uuid + "'").uniqueResult(0); + String task_code = taskjo.getString("task_code"); + String start_point_code = taskjo.getString("start_point_code"); + String next_point_code = taskjo.getString("next_point_code"); + String task_id = taskjo.getString("task_id"); + + if (StrUtil.isEmpty(task_uuid)) { + throw new BadRequestException("id不能为空!"); + } + if (StrUtil.isEmpty(type)) { + throw new BadRequestException("操作类型不能为空!"); + } + if (StrUtil.equals(taskjo.getString("task_status"), "2") || + StrUtil.equals(taskjo.getString("task_status"), "3")) { + jo.put("code", "2"); + jo.put("desc", "任务已完成或已取消,无法操作"); + jo.put("result", ""); + return jo; + } + //重新生成 + if (type.equals("1")) { + //重新生产指令 + Instruction instdto = new Instruction(); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setInstruction_code(CodeUtil.getNewCode("INSTRUCT_NO")); + instdto.setRemark(taskjo.getString("remark")); + instdto.setMaterial(taskjo.getString("material")); + instdto.setTask_id(taskjo.getString("task_id")); + instdto.setTask_code(taskjo.getString("task_code")); + instdto.setVehicle_code(taskjo.getString("vehicle_code")); + String now = DateUtil.now(); + instdto.setCreate_time(now); + instdto.setCreate_by("auto"); + instdto.setStart_point_code(taskjo.getString("start_point_code")); + instdto.setNext_point_code(taskjo.getString("next_point_code")); + instdto.setStart_device_code(taskjo.getString("start_device_code")); + instdto.setNext_device_code(taskjo.getString("next_device_code")); + instdto.setInstruction_status("0"); + InstructionService instructionService = SpringContextHolder.getBean("instructionServiceImpl"); + WQLObject instwo = WQLObject.getWQLObject("acs_instruction"); + JSONObject instcheckjson = instwo.query(" instruction_status <2 and next_point_code= '" + next_point_code + "'" + " and start_point_code = '" + start_point_code + "'" + " and task_id = '" + task_id + "'").uniqueResult(0); + if (instcheckjson != null) { + jo.put("code", "2"); + jo.put("desc", "操作失败"); + jo.put("result", task_code + ":该任务已存在待完成指令!"); + return jo; + } + try { + instructionService.create(instdto); + } catch (Exception e) { + jo.put("code", "2"); + jo.put("desc", e.getMessage()); + jo.put("result", ""); + return jo; + } + instdto.setExecute_device_code(taskjo.getString("start_point_code")); + //下发指令给agv +// AgvService agvserver = SpringContextHolder.getBean("agvServiceImpl"); +// try { +// agvserver.sendAgvInstToMagic(instdto); +// } catch (Exception e) { +// jo.put("code", "2"); +// jo.put("desc", e.getMessage()); +// jo.put("result", ""); +// return jo; +// } + + } + //强制完成 + if (type.equals("2")) { + //手工完成 + TaskService taskService = SpringContextHolder.getBean(TaskServiceImpl.class); + TaskDto acsTask = taskjo.toJavaObject(TaskDto.class); + InstructionService instructionservice = SpringContextHolder.getBean(InstructionServiceImpl.class); + InstructionDto instdto = instructionservice.findByTaskid(acsTask.getTask_id(), "instruction_status <2 "); + if (instdto != null){ + jo.put("code", "0"); + jo.put("desc", "有指令未完成!"); + jo.put("result", new JSONObject()); + return jo; + } + taskService.finish(acsTask.getTask_id()); + Device startDevice = deviceAppService.findDeviceByCode(acsTask.getStart_device_code()); + Device nextDevice = deviceAppService.findDeviceByCode(acsTask.getNext_device_code()); + startDevice.setIslock("false"); + nextDevice.setIslock("false"); + } + + + jo.put("code", "1"); + jo.put("desc", "操作成功"); + jo.put("result", new JSONObject()); + return jo; + } + + @Override + public Map queryMaterial() { + JSONArray resultArr = WQL.getWO("QJN_QUERY001").addParam("flag", "5").process().getResultJSONArray(0); + JSONObject jo = new JSONObject(); + jo.put("code", "1"); + jo.put("desc", "查询成功"); + jo.put("result", resultArr); + return jo; + } + + @Override + public Map createTask2(Map whereJson) { + String type = whereJson.get("type"); + String material_type = whereJson.get("material_type"); + String batch = whereJson.get("batch"); + String start_device_code = whereJson.get("start_devicecode"); + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + Device startdevice = appService.findDeviceByCode(start_device_code); + if (Boolean.parseBoolean(startdevice.getIslock())) { + JSONObject jo = new JSONObject(); + jo.put("code", "0"); + jo.put("desc", "起点设备已被锁定"); + return jo; + } + if (StrUtil.isEmpty(type)) { + throw new BadRequestException("操作类型不能为空!"); + } + if (StrUtil.isEmpty(start_device_code)) { + throw new BadRequestException("起点不能为空!"); + } + String plan_code = ""; + if (StrUtil.equals(type, "1")) { + plan_code = "normal"; + } else if (StrUtil.equals(type, "2")) { + plan_code = "one"; + } + RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); + String plan_uuid = WQLObject.getWQLObject("acs_route_plan").query("plan_code= '" + plan_code + "'").uniqueResult(0).getString("plan_uuid"); + + JSONArray ja = routelineserver.queryNextLine(start_device_code, plan_uuid); + if (ObjectUtil.isEmpty(ja)) { + JSONObject jo = new JSONObject(); + jo.put("code", "0"); + jo.put("desc", "未找到对应路由"); + return jo; + } + JSONObject form = new JSONObject(); + form.put("type", type); + form.put("material_type", material_type); + form.put("batch", batch); + form.put("start_device_code", start_device_code); + + deviceService.autoCreateTask(form); + JSONObject jo = new JSONObject(); + jo.put("code", "1"); + jo.put("desc", "创建成功"); + +// try{ +// Thread.sleep(1000); +// +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } + + return jo; + } + + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/hand/amb/wql/QJN_QUERY001.wql b/acs/nladmin-system/src/main/java/org/nl/hand/amb/wql/QJN_QUERY001.wql new file mode 100644 index 0000000..ce2b9dd --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/hand/amb/wql/QJN_QUERY001.wql @@ -0,0 +1,176 @@ +[交易说明] + 交易名: 手持接口查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.key TYPEAS s_string + 输入.keyword TYPEAS s_string + 输入.start_point TYPEAS s_string + 输入.next_point TYPEAS s_string + 输入.detail_id TYPEAS s_string + + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + IF 输入.flag = "1" + QUERY + SELECT + dtl.detail_id as region_id, + dtl.label as region_name, + dtl.value as region_code + FROM + sys_dict sys + LEFT JOIN sys_dict_detail dtl ON dtl.dict_id = sys.dict_id + WHERE + sys.NAME = "region_type" + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + task.task_id AS task_uuid, + task.task_code AS task_no, + task.start_point_code AS start_devicecode, + task.next_point_code AS next_devicecode, + task.task_type AS task_type, + task.material AS material_type, + sys2.label AS material_type_name, + task.task_status AS task_status, + sys.label AS task_status_name, + task.vehicle_code AS carrier, + task.create_time, + task.priority + FROM + acs_task task + INNER JOIN sys_dict_detail AS sys ON sys.VALUE = task.task_status + AND sys.NAME = 'task_status' + LEFT JOIN sys_dict_detail AS sys2 ON sys2.VALUE = task.material + AND sys2.NAME = 'material_type' + where + ( task.task_status ='1' or task.task_status ='0' ) + and + ( task.task_id IN (select inst.task_id FROM acs_instruction inst where inst.is_delete<>1 and (instruction_status<>'1' and instruction_status <>'2' and instruction_status <>'0')) or task.task_id not in (select inst.task_id FROM acs_instruction inst where inst.is_delete<>1 + )) + OPTION 输入.key <> "" + task.task_code like 输入.key + ENDOPTION + OPTION 输入.start_point <> "" + task.start_point_code like 输入.start_point + ENDOPTION + OPTION 输入.next_point <> "" + task.next_point_code like 输入.next_point + ENDOPTION + ORDER BY task.create_time + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + * + FROM + sys_dict_detail detl + WHERE + 1=1 + OPTION 输入.detail_id <> "" + detl.detail_id = 输入.detail_id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + inst.instruction_id AS inst_uuid, + inst.task_code AS task_no, + inst.instruction_code AS inst_no, + inst.start_point_code AS start_devicecode, + inst.next_point_code AS next_devicecode, + inst.instruction_status AS inst_status, + dtl.label AS inst_status_name, + inst.execute_message AS inst_step, + inst.vehicle_code AS carrier, + inst.carno, + inst.priority, + inst.send_status, + inst.create_time, + inst.material AS material_type, + dtl2.label AS material_type_name, + dtl3.label AS send_status_name + FROM + acs_instruction inst + LEFT JOIN sys_dict_detail AS dtl ON dtl.VALUE = inst.instruction_status + AND dtl.NAME = 'inst_status' + LEFT JOIN sys_dict_detail dtl2 ON dtl2.VALUE = inst.material + AND dtl2.NAME = 'material_type' + LEFT JOIN sys_dict_detail dtl3 ON dtl3.VALUE = inst.send_status + AND dtl3.NAME = 'send_status' + WHERE + inst.is_delete = '0' + AND inst.instruction_status <> '2' + AND inst.instruction_status < '2' + OPTION 输入.key <> "" + inst.instruction_code like 输入.key + ENDOPTION + OPTION 输入.start_point <> "" + inst.start_point_code like 输入.start_point + ENDOPTION + OPTION 输入.next_point <> "" + inst.next_point_code like 输入.next_point + ENDOPTION + ORDER BY + inst.create_time DESC + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + detl.label AS label, + detl.VALUE AS value + FROM + sys_dict_detail detl + WHERE + detl.name = 'material_type' + order by + dict_sort + ENDSELECT + ENDQUERY + ENDIF diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/security/satoken/TokenKeyExpirationListener.java b/acs/nladmin-system/src/main/java/org/nl/modules/security/satoken/TokenKeyExpirationListener.java deleted file mode 100644 index 7737724..0000000 --- a/acs/nladmin-system/src/main/java/org/nl/modules/security/satoken/TokenKeyExpirationListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.nl.modules.security.satoken; - - -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.mnt.websocket.MsgType; -import org.nl.modules.mnt.websocket.SocketMsg; -import org.nl.modules.mnt.websocket.WebSocketServer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -/** - * @author: lyd - * @description: - * @Date: 2022/10/8 - */ -@Slf4j -@Component -public class TokenKeyExpirationListener extends KeyExpirationEventMessageListener { - @Autowired - private StringRedisTemplate redisTemplate; - - public TokenKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { - super(listenerContainer); - } - - @Override - public void onMessage(Message message, byte[] pattern) { - // 监听过期的key - String expireKey = new String(message.getBody(), StandardCharsets.UTF_8); - //获取key原本的value 获取不到 是null - String expireKeyValue = redisTemplate.opsForValue().get("my-satoken"); - //我是根据tokenvalues作为主键ID的 - String[] split = expireKey.split(":"); - String s = split[split.length - 1]; - try { - WebSocketServer.sendInfo(new SocketMsg("token会话过期!", MsgType.INFO), "exp-token"); - } catch (IOException e) { - log.error(e.getMessage(), e); - } - log.info("expireKey---"+expireKey); - log.info("expireKeyValue---"+expireKeyValue); - } - -} diff --git a/acs/nladmin-system/src/main/resources/config/application-dev.yml b/acs/nladmin-system/src/main/resources/config/application-dev.yml index 5e6b6a9..fdc072b 100644 --- a/acs/nladmin-system/src/main/resources/config/application-dev.yml +++ b/acs/nladmin-system/src/main/resources/config/application-dev.yml @@ -6,11 +6,11 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:yongyu_acs2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true -# url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:yongyu_acs2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hongfeng_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true +# url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:yongyu_acs2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - password: ${DB_PWD:P@ssw0rd} -# password: ${DB_PWD:Root.123456} + #password: ${DB_PWD:P@ssw0rd} + password: ${DB_PWD:password} # 初始连接数 initial-size: 5 # 最小连接数 @@ -54,7 +54,7 @@ spring: multi-statement-allow: true redis: #数据库索引 - database: ${REDIS_DB:15} + database: ${REDIS_DB:10} host: ${REDIS_HOST:127.0.0.1} port: ${REDIS_PORT:6379} password: ${REDIS_PWD:} diff --git a/acs/nladmin-system/src/main/resources/config/application-prod.yml b/acs/nladmin-system/src/main/resources/config/application-prod.yml index ecf4775..e9446a5 100644 --- a/acs/nladmin-system/src/main/resources/config/application-prod.yml +++ b/acs/nladmin-system/src/main/resources/config/application-prod.yml @@ -6,17 +6,21 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:10.16.1.25}:${DB_PORT:3306}/${DB_NAME:whxr_mes}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:hongfeng_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:yongyu_acs2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - password: ${DB_PWD:whxr_root} + password: ${DB_PWD:P@ssw0rd} + # password: ${DB_PWD:Root.123456} # 初始连接数 initial-size: 5 # 最小连接数 min-idle: 15 # 最大连接数 - max-active: 60 + max-active: 30 + # 超时时间(以秒数为单位) + remove-abandoned-timeout: 180 # 获取连接超时时间 - max-wait: 5000 + max-wait: 3000 # 连接有效性检测时间 time-between-eviction-runs-millis: 60000 # 连接在池中最小生存的时间 @@ -36,11 +40,8 @@ spring: enabled: true stat-view-servlet: enabled: true - # 控制台管理用户名和密码 url-pattern: /druid/* reset-enable: false - login-username: admin - login-password: 123456 filter: stat: enabled: true @@ -53,12 +54,11 @@ spring: multi-statement-allow: true redis: #数据库索引 - database: ${REDIS_DB:15} - host: ${REDIS_HOST:10.16.1.25} + database: ${REDIS_DB:10} + host: ${REDIS_HOST:127.0.0.1} port: ${REDIS_PORT:6379} password: ${REDIS_PWD:} - #连接超时时间 - timeout: 5000 + # 登录相关配置 login: # 登录缓存 @@ -77,7 +77,7 @@ login: heigth: 36 # 内容长度 length: 2 - # 字体名称,为空则使用默认字体,如遇到线上乱码,设置其他字体即可 + # 字体名称,为空则使用默认字体 font-name: # 字体大小 font-size: 25 @@ -89,36 +89,29 @@ jwt: token-start-with: Bearer # 必须使用最少88位的Base64对该令牌进行编码 base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI= - # 令牌过期时间 此处单位/毫秒 ,默认2小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html - token-validity-in-seconds: 7200000 + # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html + token-validity-in-seconds: 14400000 # 在线用户key online-key: online-token- # 验证码 code-key: code-key- - # token 续期检查时间范围(默认30分钟,单位默认毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期 + # token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期 detect: 1800000 - # 续期时间范围,默认 1小时,这里单位毫秒 + # 续期时间范围,默认1小时,单位毫秒 renew: 3600000 +#是否允许生成代码,生产环境设置为false +generator: + enabled: true + +#是否开启 swagger-ui +swagger: + enabled: true + # IP 本地解析 ip: local-parsing: true -#是否允许生成代码,生产环境设置为false -generator: - enabled: false - -#如果生产环境要开启swagger,需要配置请求地址 -#springfox: -# documentation: -# swagger: -# v2: -# host: # 接口域名或外网ip - -#是否开启 swagger-ui -swagger: - enabled: false - # 文件存储路径 file: mac: @@ -135,5 +128,29 @@ file: avatarMaxSize: 5 logging: file: - path: /app/jar/logs + path: C:\log\wms config: classpath:logback-spring.xml + +# Sa-Token配置 +sa-token: + # token 名称 (同时也是cookie名称) + token-name: Authorization + # token 有效期,单位s 默认30天, -1代表永不过期 + timeout: 2592000 + # token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 + activity-timeout: -1 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # token风格 + token-style: random-128 + # 是否输出操作日志 + is-log: false + jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq + # token 前缀 + token-prefix: Bearer + +loki: + url: http://localhost:3100/loki/api/v1 + systemName: acs diff --git a/acs/nladmin-system/src/main/resources/config/application-test.yml b/acs/nladmin-system/src/main/resources/config/application-test.yml index 250e563..e9446a5 100644 --- a/acs/nladmin-system/src/main/resources/config/application-test.yml +++ b/acs/nladmin-system/src/main/resources/config/application-test.yml @@ -1,38 +1,22 @@ server: port: 8010 -#ERP系统相关 -erp: - oracle: - enabled: false - jdbcurl: jdbc:oracle:thin:@192.168.81.251:1522:ORCL2 - username: system - password: 123456 - sqlserver: - enabled: false - jdbcurl: jdbc:sqlserver://47.97.157.227:1433;DatabaseName=testdb-lx - username: sa - password: Nl@123 - #配置数据源 spring: datasource: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - # url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:whxr}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:whxr_mes1}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:hongfeng_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:yongyu_acs2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - password: ${DB_PWD:Root.123456} - # username: ${DB_USER:root} - # password: ${DB_PWD:root} + password: ${DB_PWD:P@ssw0rd} + # password: ${DB_PWD:Root.123456} # 初始连接数 initial-size: 5 # 最小连接数 min-idle: 15 # 最大连接数 max-active: 30 - # 是否自动回收超时连接 - remove-abandoned: true # 超时时间(以秒数为单位) remove-abandoned-timeout: 180 # 获取连接超时时间 @@ -70,16 +54,15 @@ spring: multi-statement-allow: true redis: #数据库索引 - database: ${REDIS_DB:1} - host: ${REDIS_HOST:47.111.78.178} + database: ${REDIS_DB:10} + host: ${REDIS_HOST:127.0.0.1} port: ${REDIS_PORT:6379} password: ${REDIS_PWD:} - #连接超时时间 - timeout: 10000 + # 登录相关配置 login: # 登录缓存 - cache-enable: false + cache-enable: true # 是否限制单用户登录 single-login: false # 验证码 @@ -147,3 +130,27 @@ logging: file: path: C:\log\wms config: classpath:logback-spring.xml + +# Sa-Token配置 +sa-token: + # token 名称 (同时也是cookie名称) + token-name: Authorization + # token 有效期,单位s 默认30天, -1代表永不过期 + timeout: 2592000 + # token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 + activity-timeout: -1 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # token风格 + token-style: random-128 + # 是否输出操作日志 + is-log: false + jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq + # token 前缀 + token-prefix: Bearer + +loki: + url: http://localhost:3100/loki/api/v1 + systemName: acs diff --git a/acs/nladmin-system/src/main/resources/logback-spring.xml b/acs/nladmin-system/src/main/resources/logback-spring.xml index 0494228..1742900 100644 --- a/acs/nladmin-system/src/main/resources/logback-spring.xml +++ b/acs/nladmin-system/src/main/resources/logback-spring.xml @@ -84,7 +84,7 @@ https://juejin.cn/post/6844903775631572999 - + diff --git a/acs/nladmin-ui/src/App.vue b/acs/nladmin-ui/src/App.vue index 3f8e408..2f82bcc 100644 --- a/acs/nladmin-ui/src/App.vue +++ b/acs/nladmin-ui/src/App.vue @@ -1,5 +1,5 @@ @@ -7,63 +7,29 @@ + + diff --git a/acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_station.vue b/acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_station.vue new file mode 100644 index 0000000..0b7dd85 --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_station.vue @@ -0,0 +1,483 @@ + + + + + diff --git a/acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_two_rgv.vue b/acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_two_rgv.vue new file mode 100644 index 0000000..cccb2c1 --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/device/driver/hongfeng/hf_two_rgv.vue @@ -0,0 +1,589 @@ + + + + + diff --git a/acs/nladmin-ui/src/views/acs/order/index.vue b/acs/nladmin-ui/src/views/acs/order/index.vue new file mode 100644 index 0000000..14d4b2f --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/order/index.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/acs/nladmin-ui/src/views/login.vue b/acs/nladmin-ui/src/views/login.vue index 976355e..c512e95 100644 --- a/acs/nladmin-ui/src/views/login.vue +++ b/acs/nladmin-ui/src/views/login.vue @@ -50,7 +50,7 @@ export default { name: 'Login', data() { return { - title: '诺力开发平台', + title: '宏丰acs系统', title_param: 'platform', Background: Background, codeUrl: '', diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/security/satoken/TokenKeyExpirationListener.java b/lms/nladmin-system/src/main/java/org/nl/modules/security/satoken/TokenKeyExpirationListener.java deleted file mode 100644 index 7737724..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/modules/security/satoken/TokenKeyExpirationListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.nl.modules.security.satoken; - - -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.mnt.websocket.MsgType; -import org.nl.modules.mnt.websocket.SocketMsg; -import org.nl.modules.mnt.websocket.WebSocketServer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -/** - * @author: lyd - * @description: - * @Date: 2022/10/8 - */ -@Slf4j -@Component -public class TokenKeyExpirationListener extends KeyExpirationEventMessageListener { - @Autowired - private StringRedisTemplate redisTemplate; - - public TokenKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { - super(listenerContainer); - } - - @Override - public void onMessage(Message message, byte[] pattern) { - // 监听过期的key - String expireKey = new String(message.getBody(), StandardCharsets.UTF_8); - //获取key原本的value 获取不到 是null - String expireKeyValue = redisTemplate.opsForValue().get("my-satoken"); - //我是根据tokenvalues作为主键ID的 - String[] split = expireKey.split(":"); - String s = split[split.length - 1]; - try { - WebSocketServer.sendInfo(new SocketMsg("token会话过期!", MsgType.INFO), "exp-token"); - } catch (IOException e) { - log.error(e.getMessage(), e); - } - log.info("expireKey---"+expireKey); - log.info("expireKeyValue---"+expireKeyValue); - } - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java index 95e2b74..d82eff0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java @@ -25,6 +25,7 @@ import lombok.RequiredArgsConstructor; import org.nl.modules.common.config.RsaProperties; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.PageUtil; +import org.nl.modules.common.utils.RedisUtils; import org.nl.modules.common.utils.RsaUtils; import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.logging.annotation.Log; @@ -67,6 +68,7 @@ public class UserController { private final DataService dataService; private final DeptService deptService; private final RoleService roleService; + private final RedisUtils redisUtils; @ApiOperation("导出用户数据") @GetMapping(value = "/download") @@ -144,6 +146,12 @@ public class UserController { if (currentLevel > optLevel) { throw new BadRequestException("角色权限不足,不能删除:" + userService.findById(id).getUsername()); } + // 删除缓存信息 + UserDto userDto = userService.findById(id); + redisUtils.del("data::user:" + userDto.getId()); + redisUtils.del("menu::user:" + userDto.getId()); + redisUtils.del("role::auth:" + userDto.getId()); + redisUtils.del("user::username:" + userDto.getUsername()); } userService.delete(ids); return new ResponseEntity<>(HttpStatus.OK); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/rest/VehicleController.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/rest/VehicleController.java index 5a0e830..331a6c9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/rest/VehicleController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/rest/VehicleController.java @@ -72,4 +72,11 @@ public class VehicleController { JSONObject json = vehicleService.getVehicle(code); return new ResponseEntity<>(json,HttpStatus.OK); } + + @GetMapping("/getVehicleByType/{type}") + @Log("获取起始载具号") + @ApiOperation("获取起始载具号") + public ResponseEntity getVehicleByType(@PathVariable String type) { + return new ResponseEntity<>(vehicleService.getVehicleByType(type),HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/VehicleService.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/VehicleService.java index 0840abd..7366408 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/VehicleService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/VehicleService.java @@ -70,4 +70,10 @@ public interface VehicleService { * @param code / */ JSONObject getVehicle(String code); + + /** + * 根据载具类型获取载具 + * @param type / + */ + JSONArray getVehicleByType(String type); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java index 8b69b3f..3628f32 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java @@ -111,10 +111,12 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { public MaterialbaseDto findById(Long material_id) { WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); JSONObject json = wo.query("material_id =" + material_id + "").uniqueResult(0); - String unit_name = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id= '" + json.getString("base_unit_id") + "'").uniqueResult(0).getString("unit_name"); - json.put("base_unit_name", unit_name); - final MaterialbaseDto obj = json.toJavaObject(MaterialbaseDto.class); - return obj; +// String unit_name = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id= '" + json.getString("base_unit_id") + "'").uniqueResult(0).getString("unit_name"); +// json.put("base_unit_name", unit_name); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject(MaterialbaseDto.class); + } + return null; } @Override @@ -125,8 +127,8 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { } JSONObject json = wo.query("material_code ='" + code + "'").uniqueResult(0); if (ObjectUtil.isEmpty(json)) return null; - String unit_name = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id= '" + json.getString("base_unit_id") + "'").uniqueResult(0).getString("unit_name"); - json.put("base_unit_name", unit_name); +// String unit_name = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id= '" + json.getString("base_unit_id") + "'").uniqueResult(0).getString("unit_name"); +// json.put("base_unit_name", unit_name); final MaterialbaseDto obj = json.toJavaObject(MaterialbaseDto.class); return obj; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/VehicleServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/VehicleServiceImpl.java index 8fdd0c7..2231d6a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/VehicleServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/VehicleServiceImpl.java @@ -75,7 +75,7 @@ public class VehicleServiceImpl implements VehicleService { @Override public VehicleDto findByCode(String code) { WQLObject wo = WQLObject.getWQLObject("md_pb_vehicle"); - JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + JSONObject json = wo.query("vehicle_code ='" + code + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(json)){ return json.toJavaObject( VehicleDto.class); } @@ -95,13 +95,13 @@ public class VehicleServiceImpl implements VehicleService { String vehicle_type = WhereJson.getString("vehicle_type"); String code = ""; switch (vehicle_type) { - case "01": + case "1": code = "1m3_ttp"; break; - case "02": + case "2": code = "1m6_ttp"; break; - case "03": + case "3": code = "1m9_ttp"; break; } @@ -168,13 +168,13 @@ public class VehicleServiceImpl implements VehicleService { public JSONObject getVehicle(String code) { String term = ""; switch (code) { - case "01": + case "1": term = "1m3_ttp"; break; - case "02": + case "2": term = "1m6_ttp"; break; - case "03": + case "3": term = "1m9_ttp"; break; } @@ -190,4 +190,11 @@ public class VehicleServiceImpl implements VehicleService { return json; } + @Override + public JSONArray getVehicleByType(String type) { + WQLObject wo = WQLObject.getWQLObject("md_pb_vehicle"); + JSONArray resultJSONArray = wo.query("vehicle_type = '" + type + "'").getResultJSONArray(0); + return resultJSONArray; + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index 0fe289f..a9acde5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -3,6 +3,7 @@ package org.nl.wms.ext.acs.rest; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -32,13 +33,23 @@ public class AcsToWmsController { @PostMapping("/status") @Log("ACS给WMS反馈任务状态") @ApiOperation("ACS给WMS反馈任务状态") + @SaIgnore public ResponseEntity receiveTaskStatusAcs(@RequestBody String string) { return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK); } + @PostMapping("/feedbackOrderStatus") + @Log("工单状态反馈") + @ApiOperation("工单状态反馈") + @SaIgnore + public ResponseEntity feedbackOrderStatus(@RequestBody String string) { + return new ResponseEntity<>(acsToWmsService.feedbackOrderStatus(string), HttpStatus.OK); + } + @PostMapping("/orderFinish") @Log("ACS给WMS下发工单完成状态") @ApiOperation("ACS给WMS下发工单完成状态") + @SaIgnore public ResponseEntity orderFinish(@RequestBody String string) { return new ResponseEntity<>(acsToWmsService.orderFinish(string), HttpStatus.OK); } @@ -47,6 +58,7 @@ public class AcsToWmsController { @Log("申请任务") @ApiOperation("申请任务") @SaCheckPermission("menu:list") + @SaIgnore public ResponseEntity apply(@RequestBody JSONObject whereJson) { return new ResponseEntity<>(acsToWmsService.apply(whereJson), HttpStatus.OK); } @@ -55,7 +67,26 @@ public class AcsToWmsController { @Log("二次申请任务") @ApiOperation("二次申请任务") @SaCheckPermission("menu:list") + @SaIgnore public ResponseEntity againApply(@RequestBody String task_id) { return new ResponseEntity<>(acsToWmsService.againApply(task_id), HttpStatus.OK); } + + @PostMapping("/updateBarcode") + @Log("更新库存") + @ApiOperation("更新库存") + @SaCheckPermission("menu:list") + @SaIgnore + public ResponseEntity updateBarcode(@RequestBody JSONObject param) { + return new ResponseEntity<>(acsToWmsService.updateBarcode(param), HttpStatus.OK); + } + + @PostMapping("/orderConfirm") + @Log("人工排产确认") + @ApiOperation("人工排产确认") + @SaCheckPermission("menu:list") + @SaIgnore + public ResponseEntity orderConfirm(@RequestBody JSONObject param) { + return new ResponseEntity<>(acsToWmsService.orderConfirm(param), HttpStatus.OK); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java index c2f627c..e70bf11 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java @@ -48,6 +48,14 @@ public class WmsToAcsController { return new ResponseEntity<>(wmsToAcsService.cancelToAcs(arr), HttpStatus.OK); } + @PostMapping("/forceFinishToAcs") + @Log("WMS完成ACS任务") + @ApiOperation("WMS完成ACS任务") + public ResponseEntity forceFinishToAcs(@RequestBody Map whereJson) { + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(whereJson.get("data"))); + return new ResponseEntity<>(wmsToAcsService.forceFinishToAcs(arr), HttpStatus.OK); + } + @PostMapping("/updatePointStatus") @Log("WMS更新ACS点位状态") @ApiOperation("WMS更新ACS点位状态") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index 17e9538..3df05c0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -17,6 +17,13 @@ public interface AcsToWmsService { Map receiveTaskStatusAcs(String string); + /** + * 工单状态反馈 + * @param string + * @return + */ + Map feedbackOrderStatus(String string); + /** * @@ -51,4 +58,20 @@ public interface AcsToWmsService { */ JSONObject apply(JSONObject whereJson); + /** + * ACS客户端--->LMS服务端 + * 任务申请 + * + * @param whereJson 条件 + * @return JSONObjectupdate + */ + JSONObject updateBarcode(JSONObject whereJson); + + /** + * 人工排产确认 + * @param whereJson + * @return + */ + JSONObject orderConfirm(JSONObject whereJson); + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java index 3735345..a250302 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -29,6 +29,8 @@ public interface WmsToAcsService { Map cancelToAcs(JSONArray arr); + Map forceFinishToAcs(JSONArray arr); + /** * 更新ACS点位 * @param arr diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index cfff4c4..e576ba7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -8,27 +8,39 @@ import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.RedisUtils; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.service.MaterialbaseService; +import org.nl.wms.basedata.service.VehicleService; +import org.nl.wms.basedata.service.dto.MaterialbaseDto; +import org.nl.wms.basedata.service.dto.VehicleDto; import org.nl.wms.ext.acs.service.AcsToWmsService; import org.nl.wms.log.LokiLog; import org.nl.wms.log.LokiLogType; +import org.nl.wms.pda.scanGroup.HcwNumEnum; +import org.nl.wms.pda.scanGroup.KlzhcwUtil; +import org.nl.wms.pda.scanGroup.MyLinkedListService; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.WorkordeService; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.nl.wms.pdm.service.dto.WorkorderDto; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.service.TaskService; -import org.nl.wms.sch.tasks.callEmpty.GjxCallEmpVehicleTask; -import org.nl.wms.sch.tasks.callEmpty.YqxCallEmpVehicleTask; -import org.nl.wms.sch.tasks.callMaterial.YqxCallMaterialTask; -import org.nl.wms.sch.tasks.sendEmpty.HtSendEmpVehicleTask; -import org.nl.wms.sch.tasks.sendEmpty.YqxSendEmpVehicleTask; -import org.nl.wms.sch.tasks.sendMaterial.GjxSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.YqxSendMaterialTask; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.nl.wms.sch.tasks.callEmpty.HnjCallEmpVehicleTask; +import org.nl.wms.sch.tasks.sendEmpty.KzdjwSendEmpVehicleTask; +import org.nl.wms.sch.tasks.callMaterial.YljCallMaterialTask; +import org.nl.wms.sch.tasks.sendMaterial.HnjSendMaterialTask; +import org.nl.wms.st.structivt.service.StructivtService; +import org.nl.wms.st.structivt.service.dto.StructivtDto; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.LinkedList; import java.util.Map; @Service @@ -36,6 +48,13 @@ import java.util.Map; @Slf4j public class AcsToWmsServiceImpl implements AcsToWmsService { private final TaskService taskService; + private final MaterialbaseService materialbaseService; + private final StructivtService structivtService; + private final VehicleService vehicleService; + private final KlzhcwUtil klzhcwUtil; + private final DeviceService deviceService; + private final WorkordeService workordeService; + private final RedisUtils redisUtils; /** * task_id:任务标识 @@ -105,13 +124,52 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } JSONObject result = new JSONObject(); - result.put("status", HttpStatus.OK.value()); + result.put("status", "200"); result.put("message", "任务状态反馈成功!"); result.put("data", new JSONObject()); result.put("errArr", errArr); return result; } + @Override + public Map feedbackOrderStatus(String string) { + WQLObject wo = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + JSONObject jsonObject = JSONObject.parseObject(string); + String ext_order_id = jsonObject.getString("ext_order_id"); + String type = jsonObject.getString("type"); + if (StrUtil.isEmpty(type)) { + throw new BadRequestException("工单状态反馈类型不能为空!"); + } + if (StrUtil.isEmpty(ext_order_id)) { + throw new BadRequestException("工单标识不能为空"); + } + WorkorderDto workorderDto = workordeService.findById(Long.valueOf(ext_order_id)); + if (ObjectUtil.isEmpty(workorderDto)) { + throw new BadRequestException("工单不存在!" + workorderDto.getWorkorder_code()); + } + String status = ""; + String message = ""; + JSONObject resp = new JSONObject(); + if (StrUtil.equals("3", type)) { + JSONObject jsonObject1 = wo.query("workorder_id = '" + ext_order_id + "'").uniqueResult(0); + jsonObject1.put("order_status", "5"); + jsonObject1.put("qty", jsonObject.getString("qty")); + jsonObject1.put("update_optname", "acs"); + jsonObject1.put("update_time", DateUtil.now()); + try { + wo.update(jsonObject1); + status = "200"; + message = "操作成功!"; + } catch (Exception e) { + status = "400"; + message = "操作失败!"; + } + } + resp.put("status", status); + resp.put("message", message); + return resp; + } + @LokiLog(type = LokiLogType.ACS_TO_LMS) @Override public String againApply(String task_id) { @@ -153,7 +211,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONObject map = new JSONObject(); map.put("workorder_id", ext_order_id); map.put("order_status", "04"); - map.put("update_optid", 1111111111); + map.put("update_optid", 1011); map.put("device_id", ""); map.put("update_optname", "acs"); map.put("update_time", now); @@ -169,129 +227,196 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override @Transactional(rollbackFor = Exception.class) public JSONObject apply(JSONObject whereJson) { + JSONObject resp = new JSONObject(); String type = whereJson.getString("type"); - String point_code = whereJson.getString("point_code"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - //载具数量 - String vehicle_num = whereJson.getString("vehicle_num"); - //物料数量 - String material_num = whereJson.getString("material_num"); + String point_code = whereJson.getString("device_code"); + String create_mode = whereJson.getString("create_mode"); + String is_auto_issue = whereJson.getString("is_auto_issue"); if (ObjectUtil.isEmpty(type)) throw new BadRequestException("类型不能为空"); if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); /* * 根据type判断是什么业务类型: - * 1.共挤线申请空盘 - * 2.共挤线满托入库 - * 3.油漆线申请空盘 - * 4.油漆线申请物料 - * 5.油漆线空盘入库 - * 6.一楼空盘入库 (有载具号) - * 7.油漆线->输送线(油漆线满料) - * 8.豪凯自动线下料入库 + * 1.混碾机呼叫空盅 + * 2.混碾机满盅入库 + * 3.压力机叫料 + * 4.空料盅对接位有货时申请RGV搬运至空料盅缓存位 */ if (StrUtil.equals(type, "1")) { - // 1.共挤线申请空盘: 调用空托盘出库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - + // 1.混碾机呼叫空盅 JSONObject param = new JSONObject(); param.put("point_code2", point_code); - param.put("vehicle_type", vehicle_type); - param.put("qty", material_num); + param.put("create_mode", create_mode); + param.put("is_auto_issue", is_auto_issue); // 创建任务 - GjxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(GjxCallEmpVehicleTask.class); + HnjCallEmpVehicleTask taskBean = SpringContextHolder.getBean(HnjCallEmpVehicleTask.class); taskBean.createTask(param); - } else if (StrUtil.equals(type, "2")) { - // 2.共挤线满托入库: 调用物料入库处理类创建任务 - if (ObjectUtil.isEmpty(material_num) || (StrUtil.equals(material_num, "0"))) - throw new BadRequestException("物料数量不能为空或者为0"); - + // 2.混碾机满盅入库 JSONObject param = new JSONObject(); param.put("point_code1", point_code); // 满料位 - param.put("qty", material_num); // 满料位 - param.put("vehicle_type", vehicle_type); - param.put("vehicle_code", vehicle_code); - - GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class); - String task_id = taskBean.createTask(param); // 创建任务 + param.put("create_mode", create_mode); + param.put("is_auto_issue", is_auto_issue); + HnjSendMaterialTask taskBean = SpringContextHolder.getBean(HnjSendMaterialTask.class); + taskBean.createTask(param); // 创建任务 } else if (StrUtil.equals(type, "3")) { - // 3.油漆线申请空盘: 调用空托盘出库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - + // 3.压力机叫料 JSONObject param = new JSONObject(); param.put("point_code2", point_code); - param.put("qty", vehicle_num); + param.put("create_mode", create_mode); + param.put("is_auto_issue", is_auto_issue); // 创建任务 - YqxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(YqxCallEmpVehicleTask.class); - String task_id = taskBean.createTask(param); - } else if (StrUtil.equals(type, "4")) { - // 4.油漆线申请物料: 调用物料出库库处理类创建任务 - JSONObject param = new JSONObject(); - param.put("point_code2", point_code); // 叫料点 - param.put("io_type", "2"); - param.put("vehicle_type", vehicle_type); - param.put("vehicle_code", vehicle_code); - param.put("material_num", material_num); - // 创建任务 - YqxCallMaterialTask taskBean = SpringContextHolder.getBean(YqxCallMaterialTask.class); - String task_id = taskBean.createTask(param); - - } else if (StrUtil.equals(type, "5")) { - // 5.油漆线空盘入库: 调用空托盘入库处理类创建任务 - if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - if (ObjectUtil.isEmpty(vehicle_type)) throw new BadRequestException("载具类型不能为空"); - - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("qty", vehicle_num); - param.put("vehicle_type", vehicle_type); - // 创建任务 - YqxSendEmpVehicleTask taskBean = SpringContextHolder.getBean(YqxSendEmpVehicleTask.class); + YljCallMaterialTask taskBean = SpringContextHolder.getBean(YljCallMaterialTask.class); taskBean.createTask(param); - - - } else if (StrUtil.equals(type, "6")) { - // 6.一楼空盘入库 (有载具号): 调用空托盘入库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_code)) throw new BadRequestException("载具号不能为空"); + } else if (StrUtil.equals(type, "4")) { + // 4.空料盅对接位有货时申请RGV搬运至空料盅缓存位 JSONObject param = new JSONObject(); - - // 查询载具号对应的数量 - JSONObject jsonVeQty = new JSONObject(); - if (ObjectUtil.isEmpty(vehicle_num)) { - if (ObjectUtil.isEmpty(jsonVeQty)) throw new BadRequestException("请先手持扫码"); - } else { - jsonVeQty.put("qty", vehicle_num); - } - - param.put("qty", jsonVeQty.getString("qty")); - param.put("point_code1", point_code); - param.put("vehicle_code", vehicle_code); - param.put("vehicle_type", vehicle_type); + param.put("point_code1", point_code); // 叫料点 + param.put("create_mode", create_mode); + param.put("is_auto_issue", is_auto_issue); // 创建任务 - HtSendEmpVehicleTask taskBean = SpringContextHolder.getBean(HtSendEmpVehicleTask.class); - String task_id = taskBean.createTask(param); - - } else if (StrUtil.equals(type, "7")) { - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("qty", material_num); - // 1.生成起点确定的任务 - SpringContextHolder.getBean(YqxSendMaterialTask.class).createTask(param); - } else if (StrUtil.equals(type, "8")) { - // 8.豪凯自动线下料入库 - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("vehicle_code", vehicle_code); - param.put("vehicle_type", vehicle_type); - param.put("qty", material_num); - HkxSendMaterialTask taskBean = SpringContextHolder.getBean(HkxSendMaterialTask.class); - String task_id = taskBean.createTask(param); - + KzdjwSendEmpVehicleTask taskBean = SpringContextHolder.getBean(KzdjwSendEmpVehicleTask.class); + taskBean.createTask(param); } - return null; + resp.put("status", "200"); + resp.put("message", "申请成功"); + return resp; + } + + @Override + @Transactional + public JSONObject updateBarcode(JSONObject whereJson) { + //工位编码 + String device_code = whereJson.getString("device_code"); + //条码 + String barcode = whereJson.getString("barcode"); + //是否是第一个工位 + String is_first = whereJson.getString("is_first"); + WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + WQLObject wo_ivt = WQLObject.getWQLObject("ST_IVT_StructIvt"); + MaterialbaseDto materialbaseDto = null; + //Long material_id = null; + //首先判断条码变化的是不是第一个满料盅缓存位 + //如果是的话说明困料区来的 先去库存表查询对应的条码的物料信息 并将对应的物料信息保存在redis中 + if (StrUtil.equals(is_first, "true")) { + JSONObject ivtJson = wo_ivt.query("vehicle_code = '" + barcode + "'").uniqueResult(0); + redisUtils.set(barcode,ivtJson.getString("material_id")); + materialbaseDto = materialbaseService.findById(ivtJson.getLong("material_id")); + } + String material_id = String.valueOf(redisUtils.get(barcode)); + Long materialId = null; + String point_status = "2"; + if (StrUtil.equals("0",barcode)){ + point_status = "1"; + } + if (StrUtil.isNotEmpty(material_id)){ + point_status = "3"; + materialId = Long.valueOf(materialId); + } + //根据工位去查对应的工位的信息 + //将新的条码 物料等信息更新到到库存表中 + StructivtDto structivtDto = structivtService.findByCode(device_code); + structivtDto.setMaterial_id(materialId); + structivtDto.setVehicle_code(barcode); + VehicleDto vehicleDto = vehicleService.findByCode(barcode); + if (ObjectUtil.isNotEmpty(vehicleDto)) { + structivtDto.setVehicle_type(vehicleDto.getVehicle_type()); + } + structivtDto.setUpdate_time(DateUtil.now()); + structivtDto.setUpdate_optname("acs"); + structivtService.update(structivtDto); + //同时修改该工位的点位状态 + JSONObject pointJson = wo.query("point_code = '" + device_code + "'").uniqueResult(0); + pointJson.put("point_status",point_status); + pointJson.put("update_time",DateUtil.now()); + wo.update(pointJson); + + //如果是第一个工位的条码变化 则需要更新困料区等的库存信息 因为第一个是从困料区过来的 + if (StrUtil.equals(is_first,"true")){ + //获取困料区的缓存信息 + LinkedList ll = MyLinkedListService.getLinkedList(); + if (ll.size() == 0) ll = structivtService.reload(); + Boolean isHasGoods = false; + JSONObject jsonObject = wo.query("is_used = '1' and is_delete = '0' and lock_type = '2' and region_code = '" + RegionTypeEnum.GT1.getCode() + "'").uniqueResult(0); + JSONObject ivtJsonObject = new JSONObject(); + if (ObjectUtil.isNotEmpty(jsonObject)){ + ivtJsonObject = wo_ivt.query("point_code = '" + jsonObject.getString("point_code") + "' and (vehicle_code <> '' or vehicle_code is not null)").uniqueResult(0); + if (ObjectUtil.isNotEmpty(ivtJsonObject)){ + isHasGoods = true; + } + } + if (ll.size() == (HcwNumEnum.KLZCQ.getNum() + HcwNumEnum.GT2.getNum()) && isHasGoods) { + ll.removeFirst(); + JSONObject map = new JSONObject(); + map.put("vehicle_type", ivtJsonObject.getString("vehicle_type")); + map.put("vehicle_code", ivtJsonObject.getString("vehicle_code")); + if (ObjectUtil.isNotEmpty(materialbaseDto)) { + map.put("material_code", materialbaseDto.getMaterial_code()); + } + boolean flag = klzhcwUtil.judge(ll, map); + if (flag) { + jsonObject.put("lock_type", "1"); + jsonObject.put("task_id", ""); + jsonObject.put("point_status", "1"); + jsonObject.put("update_time", DateUtil.now()); + wo.update(jsonObject); + JSONObject ivtJson = wo_ivt.query("point_code = '" + jsonObject.getString("point_code") + "'").uniqueResult(0); + ivtJson.put("vehicle_type", ""); + ivtJson.put("vehicle_code", ""); + ivtJson.put("material_id", ""); + wo_ivt.update(ivtJson); + } + } else if (ll.size() == (HcwNumEnum.KLZCQ.getNum() + HcwNumEnum.GT2.getNum()) && !isHasGoods) { + ll.removeFirst(); + klzhcwUtil.lessThan25(ll); + JSONObject jsonGT2 = wo_ivt.query("region_code = '" + RegionTypeEnum.GT2.getCode() + "'").uniqueResult(0); + jsonGT2.put("vehicle_code", ""); + jsonGT2.put("vehicle_type", ""); + jsonGT2.put("material_id", ""); + wo_ivt.update(jsonGT2); + JSONObject jsonObject2 = wo.query("point_code = '" + jsonGT2.getString("point_code") + "'").uniqueResult(0); + jsonObject2.put("point_status", "1"); + jsonObject2.put("update_time", DateUtil.now()); + wo.update(jsonObject2); + } + } + JSONObject resp = new JSONObject(); + resp.put("status", "200"); + resp.put("message", "申请成功"); + return resp; + } + + @Override + public JSONObject orderConfirm(JSONObject whereJson) { + JSONObject resp = new JSONObject(); + WQLObject wo = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + String device_code = whereJson.getString("device_code"); + String material_code = whereJson.getString("material_code"); + String order_code = whereJson.getString("order_code"); + String ext_order_id = whereJson.getString("ext_order_id"); + DeviceDto deviceDto = deviceService.findByCode(device_code); + MaterialbaseDto materialbaseDto = materialbaseService.findByCode(material_code); + if (ObjectUtil.isEmpty(deviceDto)) { + throw new BadRequestException("设备不存在:" + device_code); + } + if (ObjectUtil.isEmpty(materialbaseDto)) { + throw new BadRequestException("物料不存在::" + material_code); + } + JSONObject jsonObject = wo.query("workorder_id = '" + ext_order_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) { + boolean material_flag = StrUtil.equals(String.valueOf(materialbaseDto.getMaterial_id()), jsonObject.getString("material_id")); + boolean device_flag = StrUtil.equals(String.valueOf(deviceDto.getDevice_id()), jsonObject.getString("device_id")); + if (material_flag && device_flag) { + resp.put("status", "200"); + resp.put("message", "人工排产确认成功!"); + return resp; + } + } else { + throw new BadRequestException("工单不存在!" + order_code); + } + resp.put("status", "400"); + resp.put("message", "人工排产确认失败!"); + return resp; } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java index 9c28278..07518f9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -26,6 +26,12 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { return AcsUtil.notifyAcs(api, arr); } + @Override + public Map forceFinishToAcs(JSONArray arr) { + String api = "api/wms/forceFinishToAcs"; + return AcsUtil.notifyAcs(api, arr); + } + @Override public Map updatePointStatus(JSONArray arr) { JSONObject param = new JSONObject(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/rest/HandlingTaskController.java similarity index 56% rename from lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java rename to lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/rest/HandlingTaskController.java index 322deb7..2b85e60 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/rest/HandlingTaskController.java @@ -1,4 +1,4 @@ -package org.nl.wms.pda.callmaterial.rest; +package org.nl.wms.pda.handlingTask.rest; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; @@ -6,7 +6,7 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.logging.annotation.Log; -import org.nl.wms.pda.callmaterial.service.CallMaterialService; +import org.nl.wms.pda.handlingTask.service.HandlingTaskService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -16,24 +16,24 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor -@Api(tags = "手持叫料") -@RequestMapping("api/pda/callMaterial") +@Api(tags = "手持搬运任务") +@RequestMapping("api/pda/handling") @Slf4j -public class CallMaterialController { +public class HandlingTaskController { - private final CallMaterialService callMaterialService; + private final HandlingTaskService handlingTaskService; @PostMapping("/queryPoint") @Log("查询区域点位") @ApiOperation("查询区域点位") public ResponseEntity queryPoint() { - return new ResponseEntity<>(callMaterialService.queryPoint(), HttpStatus.OK); + return new ResponseEntity<>(handlingTaskService.queryPoint(), HttpStatus.OK); } - @PostMapping("/confirm") - @Log("叫料确定") - @ApiOperation("叫料确定") - public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(callMaterialService.confirm(whereJson), HttpStatus.OK); + @PostMapping("/createTask") + @Log("创建搬运任务") + @ApiOperation("创建搬运任务") + public ResponseEntity createTask(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(handlingTaskService.createTask(whereJson), HttpStatus.OK); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/service/HandlingTaskService.java similarity index 56% rename from lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java rename to lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/service/HandlingTaskService.java index f4d5ad0..07d4f29 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/service/HandlingTaskService.java @@ -1,8 +1,8 @@ -package org.nl.wms.pda.sendvehicle.service; +package org.nl.wms.pda.handlingTask.service; import com.alibaba.fastjson.JSONObject; -public interface SendVehicleService { +public interface HandlingTaskService { /** * 查询区域点位 @@ -11,9 +11,9 @@ public interface SendVehicleService { JSONObject queryPoint(); /** - * 送空托盘确定 + * 创建搬运任务 * @param whereJson / * @return JSONObject */ - JSONObject confirm(JSONObject whereJson); + JSONObject createTask(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/service/impl/HandlingTaskServiceImpl.java similarity index 54% rename from lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java rename to lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/service/impl/HandlingTaskServiceImpl.java index 7c1ac15..5dd6092 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/service/impl/HandlingTaskServiceImpl.java @@ -1,33 +1,40 @@ -package org.nl.wms.pda.callmaterial.service.impl; +package org.nl.wms.pda.handlingTask.service.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.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.pda.callmaterial.service.CallMaterialService; +import org.nl.wms.pda.handlingTask.service.HandlingTaskService; +import org.nl.wms.sch.tasks.RegionTypeEnum; + + +import org.nl.wms.sch.tasks.callEmpty.HnjCallEmpVehicleTask; +import org.nl.wms.sch.tasks.handling.HandlingTask; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @Slf4j -public class CallMaterialServiceImpl implements CallMaterialService { +public class HandlingTaskServiceImpl implements HandlingTaskService { + private final AcsToWmsService acsToWmsService; @Override public JSONObject queryPoint() { JSONObject result = new JSONObject(); - // 1.查询区域:油漆区域 YQQY01 - JSONArray regionArr = WQL.getWO("PDA_CALLMATERIAL_01").addParam("flag", "1").process().getResultJSONArray(0); + // 1.查询区域 + JSONArray regionArr = WQL.getWO("PDA_HandlingTask_01").addParam("flag", "1").process().getResultJSONArray(0); // 2.根据区域查询对应的物料上料位 JSONObject resultJson = new JSONObject(); for (int i = 0; i < regionArr.size(); i++) { JSONObject jsonRegion = regionArr.getJSONObject(i); - JSONArray pointArr = WQL.getWO("PDA_CALLMATERIAL_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); + JSONArray pointArr = WQL.getWO("PDA_HandlingTask_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); jsonRegion.put("pointArr", pointArr); } resultJson.put("regionja", regionArr); @@ -39,23 +46,12 @@ public class CallMaterialServiceImpl implements CallMaterialService { @Override @Transactional(rollbackFor = Exception.class) - public JSONObject confirm(JSONObject whereJson) { + public JSONObject createTask(JSONObject whereJson) { + HandlingTask taskBean = SpringContextHolder.getBean(HandlingTask.class); + taskBean.createTask(whereJson); JSONObject result = new JSONObject(); - // 1、准备参数:point_code、type = 4 - JSONObject param = new JSONObject(); - param.put("type", "4"); - param.put("point_code", whereJson.getString("point_code")); - // 2、调用接口 - JSONObject json = acsToWmsService.apply(param); - if (ObjectUtil.isEmpty(json) || StrUtil.equals(json.getString("status"), "200")) { - result.put("result", ""); - result.put("code", "1"); - result.put("desc", "操作成功"); - } else { - result.put("result", ""); - result.put("code", "0"); - result.put("desc", "操作失败:" + json.getString("message")); - } + result.put("code","1"); + result.put("desc","操作成功"); return result; } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/wql/PDA_HandlingTask_01.wql similarity index 94% rename from lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/wql/PDA_HandlingTask_01.wql index b8bb4a3..ec414e6 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/handlingTask/wql/PDA_HandlingTask_01.wql @@ -46,9 +46,6 @@ region_name FROM sch_base_region - WHERE - region_code in ('SSX01','YQQY01') - ENDSELECT ENDQUERY ENDIF @@ -64,12 +61,9 @@ WHERE is_used = '1' AND is_delete = '0' - AND point_type = '6' - OPTION 输入.region_id <> "" region_id = 输入.region_id ENDOPTION - ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/rest/InStructController.java similarity index 54% rename from lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java rename to lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/rest/InStructController.java index 150fb22..3e67f4b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/rest/InStructController.java @@ -1,4 +1,4 @@ -package org.nl.wms.pda.sendvehicle.rest; +package org.nl.wms.pda.inStruct.rest; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; @@ -6,9 +6,7 @@ import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.logging.annotation.Log; -import org.nl.wms.pda.callvehicle.service.CallVehicleService; -import org.nl.wms.pda.sendmaterial.service.SendMaterialService; -import org.nl.wms.pda.sendvehicle.service.SendVehicleService; +import org.nl.wms.pda.inStruct.service.InStructService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -18,24 +16,31 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor -@Api(tags = "手持送空托盘") -@RequestMapping("api/pda/sendEmpty") +@Api(tags = "手持入库") +@RequestMapping("api/pda/inStruct") @Slf4j -public class SendVehicleController { +public class InStructController { - private final SendVehicleService sendVehicleService; + private final InStructService inStructService; @PostMapping("/queryPoint") @Log("查询区域点位") @ApiOperation("查询区域点位") public ResponseEntity queryPoint() { - return new ResponseEntity<>(sendVehicleService.queryPoint(), HttpStatus.OK); + return new ResponseEntity<>(inStructService.queryPoint(), HttpStatus.OK); } - @PostMapping("/confirm") - @Log("送空托盘确定") - @ApiOperation("送空托盘确定") + @PostMapping("/inSave") + @Log("入库确认") + @ApiOperation("入库确认") public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(sendVehicleService.confirm(whereJson), HttpStatus.OK); + return new ResponseEntity<>(inStructService.confirm(whereJson), HttpStatus.OK); + } + + @PostMapping("/queryMaterial") + @Log("查询物料") + @ApiOperation("查询物料") + public ResponseEntity queryMaterial() { + return new ResponseEntity<>(inStructService.queryMaterial(), HttpStatus.OK); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/service/InStructService.java similarity index 57% rename from lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java rename to lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/service/InStructService.java index e85a64b..99b66dd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/service/InStructService.java @@ -1,8 +1,8 @@ -package org.nl.wms.pda.callmaterial.service; +package org.nl.wms.pda.inStruct.service; import com.alibaba.fastjson.JSONObject; -public interface CallMaterialService { +public interface InStructService { /** * 查询区域点位 @@ -11,9 +11,15 @@ public interface CallMaterialService { JSONObject queryPoint(); /** - * 叫料确定 + * 入库确认 * @param whereJson / * @return JSONObject */ JSONObject confirm(JSONObject whereJson); + + /** + * 查询物料 + * @return json + */ + JSONObject queryMaterial(); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/service/impl/InStructServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/service/impl/InStructServiceImpl.java new file mode 100644 index 0000000..aaece79 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/service/impl/InStructServiceImpl.java @@ -0,0 +1,76 @@ +package org.nl.wms.pda.inStruct.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.wql.WQL; +import org.nl.wms.basedata.service.VehicleService; +import org.nl.wms.basedata.service.dto.VehicleDto; +import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.pda.inStruct.service.InStructService; +import org.nl.wms.pda.scanGroup.KlzhcwUtil; +import org.nl.wms.pda.scanGroup.MyLinkedListService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.LinkedList; + +@Service +@RequiredArgsConstructor +@Slf4j +public class InStructServiceImpl implements InStructService { + private final AcsToWmsService acsToWmsService; + private final KlzhcwUtil klzhcwUtil; + private final VehicleService vehicleService; + + @Override + public JSONObject queryPoint() { + JSONObject result = new JSONObject(); + // 1.查询区域 + JSONArray regionArr = WQL.getWO("PDA_InStruct_01").addParam("flag", "1").process().getResultJSONArray(0); + // 2.根据区域查询对应点位 + JSONObject resultJson = new JSONObject(); + for (int i = 0; i < regionArr.size(); i++) { + JSONObject jsonRegion = regionArr.getJSONObject(i); + JSONArray pointArr = WQL.getWO("PDA_InStruct_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); + jsonRegion.put("pointArr", pointArr); + } + resultJson.put("regionja", regionArr); + result.put("result", resultJson); + result.put("code", "1"); + result.put("desc", "查询成功"); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject confirm(JSONObject param) { + JSONObject map = new JSONObject(); + VehicleDto vehicle = vehicleService.findByCode(param.getString("carrier_code")); + String vehicle_type = ""; + if (ObjectUtil.isNotEmpty(vehicle)) { + vehicle_type = vehicle.getVehicle_type(); + } + map.put("vehicle_code", param.getString("carrier_code")); + map.put("vehicle_type", vehicle_type); + map.put("material_code", param.getString("material_code")); + LinkedList ll = MyLinkedListService.getLinkedList(); + klzhcwUtil.judge(ll, map); + JSONObject result = new JSONObject(); + result.put("code", "1"); + result.put("desc", "入库成功"); + return result; + } + + @Override + public JSONObject queryMaterial() { + JSONObject result = new JSONObject(); + JSONArray regionArr = WQL.getWO("PDA_InStruct_01").addParam("flag", "3").process().getResultJSONArray(0); + result.put("result", regionArr); + result.put("code", "1"); + result.put("desc", "查询成功"); + return result; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/wql/PDA_InStruct_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/wql/PDA_InStruct_01.wql new file mode 100644 index 0000000..3290e40 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/inStruct/wql/PDA_InStruct_01.wql @@ -0,0 +1,83 @@ +[交易说明] + 交易名: 手持入库查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_id TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + region_id, + region_code, + region_name + FROM + sch_base_region + WHERE + region_code = 'GT01' + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point_id, + point_code, + point_name + FROM + sch_base_point + WHERE + is_used = '1' + AND is_delete = '0' + OPTION 输入.region_id <> "" + region_id = 输入.region_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + material_id, + material_code, + material_name + FROM + md_me_materialbase + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/rest/OutStructController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/rest/OutStructController.java new file mode 100644 index 0000000..e1737f1 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/rest/OutStructController.java @@ -0,0 +1,34 @@ +package org.nl.wms.pda.outStruct.rest; + +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.modules.logging.annotation.Log; +import org.nl.wms.pda.inStruct.service.InStructService; +import org.nl.wms.pda.outStruct.service.OutStructService; +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; + +@RestController +@RequiredArgsConstructor +@Api(tags = "手持出库") +@RequestMapping("api/pda/outStruct") +@Slf4j +public class OutStructController { + + private final OutStructService outStructService; + + @PostMapping("/outSave") + @Log("出库确认") + @ApiOperation("出库确认") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(outStructService.confirm(whereJson), HttpStatus.OK); + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/service/OutStructService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/service/OutStructService.java new file mode 100644 index 0000000..11fbb81 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/service/OutStructService.java @@ -0,0 +1,14 @@ +package org.nl.wms.pda.outStruct.service; + +import com.alibaba.fastjson.JSONObject; + +public interface OutStructService { + + + /** + * 出库确认 + * @param whereJson / + * @return JSONObject + */ + JSONObject confirm(JSONObject whereJson); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/service/impl/OutStructServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/service/impl/OutStructServiceImpl.java new file mode 100644 index 0000000..28f4e68 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/service/impl/OutStructServiceImpl.java @@ -0,0 +1,43 @@ +package org.nl.wms.pda.outStruct.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.pda.outStruct.service.OutStructService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class OutStructServiceImpl implements OutStructService { + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject confirm(JSONObject param) { + String carrier_code = param.getString("carrier_code"); + WQLObject wo = WQLObject.getWQLObject("ST_IVT_StructIvt"); + WQLObject wo_point = WQLObject.getWQLObject("sch_base_point"); + JSONObject jsonObject = wo.query("vehicle_code = '" + carrier_code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)){ + jsonObject.put("vehicle_type",""); + jsonObject.put("vehicle_code",""); + jsonObject.put("material_id",""); + jsonObject.put("instorage_time",""); + wo.update(jsonObject); + String point_id = jsonObject.getString("point_id"); + JSONObject jsonObject1 = wo_point.query("point_id = '" + point_id + "'").uniqueResult(0); + jsonObject1.put("point_status","1"); + jsonObject1.put("lock_type","1"); + jsonObject1.put("task_id",""); + jsonObject1.put("task_id",""); + wo_point.update(jsonObject1); + } + JSONObject result = new JSONObject(); + result.put("code", "1"); + result.put("desc", "出库成功"); + return result; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/wql/PDA_OutStruct_01.wql similarity index 84% rename from lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/wql/PDA_OutStruct_01.wql index 41b449f..e1dde29 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/outStruct/wql/PDA_OutStruct_01.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 手持叫料查询 + 交易名: 手持出库确认 所属模块: 功能简述: 版权所有: @@ -46,10 +46,7 @@ region_name FROM sch_base_region - WHERE - region_code = 'YQQY01' - - ENDSELECT + ENDSELECT ENDQUERY ENDIF @@ -64,12 +61,21 @@ WHERE is_used = '1' AND is_delete = '0' - AND point_type = '3' - OPTION 输入.region_id <> "" region_id = 输入.region_id ENDOPTION - ENDSELECT ENDQUERY ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + material_id, + material_code, + material_name + FROM + md_me_materialbase + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/HcwNumEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/HcwNumEnum.java new file mode 100644 index 0000000..d137687 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/HcwNumEnum.java @@ -0,0 +1,37 @@ +package org.nl.wms.pda.scanGroup; + +/** + * 区域枚举 + */ +public enum HcwNumEnum { + KLZHCQ(1, "KLZHCQ", 12), + KLZCQ(2, "KLZCQ", 25), + MLZZCQ(3, "MLZZCQ", 26), + YLJQ(4, "YLJQ", 0), + HNJQ(5, "HNJQ", 0), + GT1(6, "GT1", 1), + GT2(7, "GT2", 1), + GT3(8, "GT3", 0), + GT4(9, "GT4", 0); + + private int index; + private String code; + private int num; + private String id; + + public String getCode() { + return code; + } + + public int getNum() { + return num; + } + + + HcwNumEnum(int index, String code, int num) { + this.index = index; + this.code = code; + this.num = num; + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/KlzhcwUtil.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/KlzhcwUtil.java new file mode 100644 index 0000000..a824165 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/KlzhcwUtil.java @@ -0,0 +1,200 @@ +package org.nl.wms.pda.scanGroup; + +import cn.hutool.core.date.DateUtil; +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.modules.wql.core.bean.WQLObject; +import org.nl.wms.basedata.service.MaterialbaseService; +import org.nl.wms.basedata.service.VehicleService; +import org.nl.wms.basedata.service.dto.MaterialbaseDto; +import org.nl.wms.basedata.service.dto.VehicleDto; +import org.nl.wms.st.structivt.service.StructivtService; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author: geng by + * @createDate: 2022/11/1 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class KlzhcwUtil { + + private final VehicleService vehicleService; + private final MaterialbaseService materialbaseService; + private final StructivtService structivtService; + + //更新困料区 滚筒1 2区的库存信息 + public boolean judge(LinkedList ll, JSONObject param) { + boolean flag = false; + if (ll.size() == 0) ll = structivtService.reload(); + String vehicle_code = param.getString("vehicle_code"); + String material_code = param.getString("material_code"); + VehicleDto vehicle = vehicleService.findByCode(vehicle_code); + String vehicle_type = vehicle.getVehicle_type(); + //判断原先缓存个数 如果小于缓存区的个数 就将当前入库的托盘信息添加到缓存中 + if (ll.size() < HcwNumEnum.KLZCQ.getNum()) { + //判断是否有手工出库的缓存信息 + //若果有多个就将靠近GT01区域的缓存清除一个 因为后面顶上来会覆盖靠近GT01区域的第一个工位 + ll = this.getLinkedList(ll); + JSONObject map = new JSONObject(); + map.put("vehicle_code", vehicle_code); + map.put("vehicle_type", vehicle_type); + map.put("material_code", material_code); + ll.addLast(map); + //添加以后仍然小于或等于困料缓存区的个数 所以执行小于困料缓存区个数更新库存的逻辑-直接更新库存 + flag = this.lessThan25(ll); + } else if (ll.size() == HcwNumEnum.KLZCQ.getNum()) { + //如果说缓存的个数等于困料缓存区的个数 + //注解同上 + ll = this.getLinkedList(ll); + JSONObject map = new JSONObject(); + map.put("vehicle_code", vehicle_code); + map.put("vehicle_type", vehicle_type); + map.put("material_code", material_code); + ll.addLast(map); + //如果说有手工出库的缓存信息 + //将入库的信息添加到缓存中 此时缓存中的个数还是等于困料缓存区个数 所以执行直接更新库存 + if (ll.size() == HcwNumEnum.KLZCQ.getNum()) { + flag = this.lessThan25(ll); + } else if (ll.size() == HcwNumEnum.KLZCQ.getNum() + HcwNumEnum.GT2.getNum()) { + //如果没有手工出库的 入库的会往前推 此时货架上的个数为GT02区域的一个和困料区的个数 + flag = this.equle25(ll); + } + } else if (ll.size() == (HcwNumEnum.KLZCQ.getNum() + HcwNumEnum.GT2.getNum())) { + //注解同上 + ll = this.getLinkedList(ll); + if (ll.size() == HcwNumEnum.KLZCQ.getNum()) { + JSONObject map = new JSONObject(); + map.put("vehicle_code", vehicle_code); + map.put("vehicle_type", vehicle_type); + map.put("material_code", material_code); + ll.addLast(map); + flag = this.equle25(ll); + } else if (ll.size() == HcwNumEnum.KLZCQ.getNum() + HcwNumEnum.GT2.getNum()) { + flag = this.equles26(ll, param); + } + } + return flag; + } + + //判断是否有手持出库确认的 如果有就移除靠近滚筒1区的一个缓存 + public LinkedList getLinkedList(LinkedList ll) { + Collections.reverse(ll); + ListIterator it = ll.listIterator(); + while(it.hasNext()){ + JSONObject jsonObject = it.next(); + String vehicleCode = jsonObject.getString("vehicle_code"); + if (StrUtil.isEmpty(vehicleCode)){ + it.remove(); + break; + } + } + Collections.reverse(ll); + return ll; + } + + //缓存数小于25处理库存的逻辑 + public Boolean lessThan25(LinkedList ll) { + WQLObject wo = WQLObject.getWQLObject("ST_IVT_StructIvt"); + WQLObject wo_point = WQLObject.getWQLObject("sch_base_point"); + JSONArray jsonArray = wo.query("region_code = '" + HcwNumEnum.KLZCQ.getCode() + "'", "point_code desc").getResultJSONArray(0); + for (int i = 0; i < jsonArray.size(); i++) { + String point_status = "2"; + JSONObject jsonObject = jsonArray.getJSONObject(i); + MaterialbaseDto materialbaseDto = materialbaseService.findByCode(ll.get(ll.size() - i - 1).getString("material_code")); + jsonObject.put("vehicle_code", ll.get(ll.size() - i - 1).getString("vehicle_code")); + jsonObject.put("vehicle_type", ll.get(ll.size() - i - 1).getString("vehicle_type")); + if (ObjectUtil.isNotEmpty(materialbaseDto)) { + jsonObject.put("material_id", materialbaseDto.getMaterial_id()); + point_status = "3"; + } + jsonObject.put("instorage_time", DateUtil.now()); + wo.update(jsonObject); + JSONObject jsonObject1 = wo_point.query("point_code = '" + jsonObject.getString("point_code") + "'").uniqueResult(0); + jsonObject1.put("point_status", point_status); + jsonObject1.put("update_time", DateUtil.now()); + wo_point.update(jsonObject1); + if (i + 1 == ll.size()) { + break; + } + } + return true; + } + + //缓存数等于25处理库存的逻辑 + public Boolean equle25(LinkedList ll) { + String point_status = "2"; + WQLObject wo = WQLObject.getWQLObject("ST_IVT_StructIvt"); + WQLObject wo_point = WQLObject.getWQLObject("sch_base_point"); + JSONObject jsonObject = wo.query("region_code = '" + HcwNumEnum.GT2.getCode() + "'").uniqueResult(0); + MaterialbaseDto materialbaseDto = materialbaseService.findByCode(ll.get(0).getString("material_code")); + jsonObject.put("vehicle_code", ll.get(0).getString("vehicle_code")); + jsonObject.put("vehicle_type", ll.get(0).getString("vehicle_type")); + if (ObjectUtil.isNotEmpty(materialbaseDto)) { + jsonObject.put("material_id", materialbaseDto.getMaterial_id()); + point_status = "3"; + } + jsonObject.put("instorage_time", DateUtil.now()); + wo.update(jsonObject); + JSONObject jsonObjectGT2 = wo_point.query("region_code = '" + HcwNumEnum.GT2.getCode() + "'").uniqueResult(0); + jsonObjectGT2.put("point_status", point_status); + jsonObjectGT2.put("update_time", DateUtil.now()); + wo_point.update(jsonObjectGT2); + JSONArray jsonArray = wo.query("region_code = '" + HcwNumEnum.KLZCQ.getCode() + "'", "point_code desc").getResultJSONArray(0); + for (int i = 0; i < jsonArray.size(); i++) { + point_status = "2"; + materialbaseDto = materialbaseService.findByCode(ll.get(ll.size() - i - 1).getString("material_code")); + jsonObject = jsonArray.getJSONObject(i); + String vehicleCode = ll.get(ll.size() - i - 1).getString("vehicle_code"); + String vehicleType = ll.get(ll.size() - i - 1).getString("vehicle_type"); + //修改库存信息 + jsonObject.put("vehicle_code", vehicleCode); + jsonObject.put("vehicle_type", vehicleType); + if (ObjectUtil.isNotEmpty(materialbaseDto)) { + jsonObject.put("material_id", materialbaseDto.getMaterial_id()); + point_status = "3"; + } + jsonObject.put("instorage_time", DateUtil.now()); + wo.update(jsonObject); + JSONObject jsonObject1 = wo_point.query("point_code = '" + jsonObject.getString("point_code") + "'").uniqueResult(0); + jsonObject1.put("point_status", point_status); + jsonObject1.put("update_time", DateUtil.now()); + wo_point.update(jsonObject1); + } + return true; + } + + //缓存数等于26处理库存信息的逻辑 即困料区和滚筒2区都有托盘信息 + public Boolean equles26(LinkedList ll, JSONObject param) { + String vehicle_code = param.getString("vehicle_code"); + String material_code = param.getString("material_code"); + VehicleDto vehicle = vehicleService.findByCode(vehicle_code); + String vehicle_type = vehicle.getVehicle_type(); + WQLObject wo = WQLObject.getWQLObject("ST_IVT_StructIvt"); + WQLObject wo_point = WQLObject.getWQLObject("sch_base_point"); + String point_status = "2"; + JSONObject jsonObject = wo.query("region_code = '" + HcwNumEnum.GT1.getCode() + "'").uniqueResult(0); + jsonObject.put("vehicle_code", vehicle_code); + jsonObject.put("vehicle_type", vehicle_type); + MaterialbaseDto materialbaseDto = materialbaseService.findByCode(material_code); + if (ObjectUtil.isNotEmpty(materialbaseDto)) { + jsonObject.put("material_id", materialbaseDto.getMaterial_id()); + point_status = "3"; + } + jsonObject.put("instorage_time", DateUtil.now()); + wo.update(jsonObject); + JSONObject jsonObject1 = wo_point.query("region_code = '" + HcwNumEnum.GT1.getCode() + "'").uniqueResult(0); + jsonObject1.put("point_status", point_status); + jsonObject1.put("lock_type", "2"); + jsonObject1.put("update_time", DateUtil.now()); + wo_point.update(jsonObject1); + return false; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/MyLinkedListService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/MyLinkedListService.java new file mode 100644 index 0000000..5e3c6c9 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/scanGroup/MyLinkedListService.java @@ -0,0 +1,18 @@ +package org.nl.wms.pda.scanGroup; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import java.util.LinkedList; +import java.util.concurrent.LinkedTransferQueue; + +/** + * @author: geng by + * @createDate: 2022/10/31 + */ +public class MyLinkedListService { + public static LinkedList linkedList = new LinkedList<>(); + public static LinkedList getLinkedList(){ + return linkedList; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java deleted file mode 100644 index 6a0f17a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.nl.wms.pda.sendvehicle.service.impl; - -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.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.pda.sendvehicle.service.SendVehicleService; -import org.nl.wms.sch.tasks.RegionTypeEnum; - - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Slf4j -public class SendVehicleServiceImpl implements SendVehicleService { - - private final AcsToWmsService acsToWmsService; - - @Override - public JSONObject queryPoint() { - JSONObject result = new JSONObject(); - // 1.查询区域:输送区域 SSX01、油漆区域 YQQY01 - JSONArray regionArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "1").process().getResultJSONArray(0); - // 2.根据区域查询对应的物料上料位 - JSONObject resultJson = new JSONObject(); - for (int i = 0; i < regionArr.size(); i++) { - JSONObject jsonRegion = regionArr.getJSONObject(i); - if (StrUtil.equals(jsonRegion.getString("region_id"), RegionTypeEnum.SSX.getId())) { - JSONArray pointArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); - jsonRegion.put("pointArr", pointArr); - } else { - JSONArray pointArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "3").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); - jsonRegion.put("pointArr", pointArr); - } - } - resultJson.put("regionja", regionArr); - result.put("result", resultJson); - result.put("code", "1"); - result.put("desc", "查询成功"); - return result; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public JSONObject confirm(JSONObject whereJson) { - JSONObject result = new JSONObject(); - // 1、准备参数:point_code、type:6为输送线区域,5为油漆区域 - JSONObject param = new JSONObject(); - - String region_id = whereJson.getString("region_id"); - JSONObject jsonObject = WQLObject.getWQLObject("sch_base_region").query("region_id ='" + region_id + "'").uniqueResult(0); - String region_code = jsonObject.getString("region_code"); - if (StrUtil.equals(region_code, "SSX01")) param.put("type","6"); - if (StrUtil.equals(region_code, "YQQY01")) param.put("type","5"); - - param.put("point_code",whereJson.getString("point_code")); - param.put("vehicle_code",whereJson.getString("vehicle_code")); - param.put("vehicle_num",whereJson.getString("qty")); - // 2、调用接口 - JSONObject json = acsToWmsService.apply(param); - if (StrUtil.equals(json.getString("status"), "200")) { - result.put("result", ""); - result.put("code", "1"); - result.put("desc", "操作成功"); - } else { - result.put("result", ""); - result.put("code", "0"); - result.put("desc", "操作失败:"+json.getString("message")); - } - return result; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/rest/WorkorderController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/rest/WorkorderController.java index f8792a0..8c10da8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/rest/WorkorderController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/rest/WorkorderController.java @@ -66,8 +66,8 @@ public class WorkorderController { } @PutMapping("/submits") - @Log("工单下发") - @ApiOperation("工单下发") + @Log("工单开工") + @ApiOperation("工单开工") //@SaCheckPermission("produceshiftorder:edit") public ResponseEntity submits(@RequestBody JSONObject param){ workordeService.submits(param); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkordeService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkordeService.java index 911b33c..3cb23e1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkordeService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkordeService.java @@ -64,7 +64,7 @@ public interface WorkordeService { void deleteAll(Long[] ids); /** - * 工单下发 + * 工单开工 * @param param */ void submits(JSONObject param); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java index 8addcce..a748336 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java @@ -22,6 +22,8 @@ import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; import org.nl.wms.basedata.service.ClassstandardService; +import org.nl.wms.basedata.service.MaterialbaseService; +import org.nl.wms.basedata.service.dto.MaterialbaseDto; import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.pdm.service.WorkordeService; import org.nl.wms.pdm.service.dto.WorkorderDto; @@ -44,6 +46,7 @@ import java.util.Map; public class WorkorderServiceImpl implements WorkordeService { private final WmsToAcsService wmsToAcsService; + private final MaterialbaseService materialbaseService; @Override public Map queryAll(Map whereJson, Pageable page) { @@ -103,7 +106,7 @@ public class WorkorderServiceImpl implements WorkordeService { @Override public WorkorderDto findByCode(String code) { WQLObject wo = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + JSONObject json = wo.query("workorder_code ='" + code + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(json)) { return json.toJavaObject(WorkorderDto.class); } @@ -186,17 +189,31 @@ public class WorkorderServiceImpl implements WorkordeService { String now = DateUtil.now(); WQLObject wo = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + WQLObject wo_material = WQLObject.getWQLObject("md_me_materialbase"); JSONObject json = wo.query("workorder_id = '" + param.getString("workorder_id") + "'").uniqueResult(0); if (ObjectUtil.isEmpty(json.getString("device_id"))) throw new BadRequestException("请先绑定设备"); JSONArray orderArr = wo.query("device_id = '" + param.getString("device_id") + "' and order_status = '02'").getResultJSONArray(0); if (ObjectUtil.isNotEmpty(orderArr)) throw new BadRequestException("当前设备正在生产中"); - json.put("order_status", "02"); - json.put("update_optid", currentUserId); - json.put("update_optname", nickName); - json.put("update_time", now); - wo.update(json); + JSONObject jsonObject = wo_material.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("ext_order_id",json.getString("workorder_id")); + map.put("order_code",json.getString("workorder_code")); + map.put("qty",json.getString("plan_qty")); + map.put("material_code",jsonObject.getString("material_code")); + map.put("device_code",json.getString("device_code")); + array.add(map); + Map resp = wmsToAcsService.order(array); + if (StrUtil.equals(String.valueOf(resp.get("status")),"200")){ + json.put("order_status", "3"); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + wo.update(json); + } } @Override @@ -389,15 +406,7 @@ public class WorkorderServiceImpl implements WorkordeService { JSONObject row = param.getJSONObject("row"); String workorder_id = row.getString("workorder_id"); WQLObject wo = WQLObject.getWQLObject("PDM_BD_WORKORDER"); - JSONObject produceorderMap = new JSONObject(); - produceorderMap.put("workorder_id",workorder_id); - produceorderMap.put("order_status","5"); - produceorderMap.put("update_optid", currentUserId); - produceorderMap.put("device_id", null); - produceorderMap.put("update_optname", nickName); - produceorderMap.put("update_time", now); - produceorderMap.put("realproduceend_date", now); - wo.update(produceorderMap); + //wms向acs发送请求 工单强制完成 // TODO JSONArray array = new JSONArray(); @@ -405,7 +414,17 @@ public class WorkorderServiceImpl implements WorkordeService { map.put("ext_order_id",workorder_id); map.put("type","3"); array.add(map); - wmsToAcsService.orderStatusUpdate(array); + Map resp = wmsToAcsService.orderStatusUpdate(array); + if (StrUtil.equals(String.valueOf(resp.get("status")),"200")){ + JSONObject produceorderMap = new JSONObject(); + produceorderMap.put("workorder_id",workorder_id); + produceorderMap.put("order_status","5"); + produceorderMap.put("update_optid", currentUserId); + produceorderMap.put("update_optname", nickName); + produceorderMap.put("update_time", now); + produceorderMap.put("realproduceend_date", now); + wo.update(produceorderMap); + } } @Override diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java index 6884c31..902f4af 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java @@ -20,34 +20,18 @@ public class AcsUtil { JSONObject result = new JSONObject(); if (StrUtil.equals("0", isConnect)) { result.put("status", HttpStatus.OK.value()); - result.put("message", "下发成功,但未连接ACS!"); + result.put("message", "未连接ACS!"); result.put("data", new JSONObject()); return result; } - //ACS地址:127.0.0.1:8010 String acsUrl = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("acs_url").getValue(); - String url = acsUrl + api; - try { - String resultMsg = HttpRequest.post(url) - .body(String.valueOf(list)) - .execute().body(); - result = JSONObject.parseObject(resultMsg); - - } catch (Exception e) { - String msg = e.getMessage(); - //ConnectException: Connection refused: connect - //网络不通 - System.out.println(msg); - result.put("status", HttpStatus.BAD_REQUEST); - result.put("message", "网络不通,操作失败!"); - result.put("data", new JSONObject()); - } - //acs抛异常这里 - /*if (result.getString("status").equals(String.valueOf(HttpStatus.BAD_REQUEST.value()))) - throw new BadRequestException(result.getString("message"));*/ - + String resultMsg + = HttpRequest.post(url) + .body(String.valueOf(list)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); return result; } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index 1473a84..069a6cb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -1,10 +1,15 @@ package org.nl.wms.sch.manage; +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 org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.sch.AcsUtil; +import org.nl.wms.sch.service.impl.TaskServiceImpl; import org.nl.wms.sch.tasks.AcsTaskDto; import java.util.List; @@ -110,12 +115,31 @@ public abstract class AbstractAcsTask { public JSONObject immediateNotifyAcs() { List taskList = this.schedule(); if (ObjectUtil.isNotEmpty(taskList)) { - + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); JSONArray arr = JSONArray.parseArray(JSON.toJSONString(taskList)); - return AcsUtil.notifyAcs("api/wms/task", arr); + JSONObject jsonObject = AcsUtil.notifyAcs("api/wms/task", arr); + String status = jsonObject.getString("status"); + String message = jsonObject.getString("message"); + if (StrUtil.equals(status,"200")){ + taskList.forEach(item -> { + JSONObject taskObj = new JSONObject(); + taskObj.put("task_id", item.getTask_id()); + taskObj.put("task_status", TaskStatusEnum.ISSUE.getCode()); + taskObj.put("remark", message); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + }); + }else { + taskList.forEach(item -> { + JSONObject taskObj = new JSONObject(); + taskObj.put("task_id", item.getTask_id()); + taskObj.put("remark", message); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + }); + } } return null; - } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java index af2d49e..b0dd849 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java @@ -97,7 +97,7 @@ public class AutoCreateTask { taskList.forEach(item -> { JSONObject taskObj = new JSONObject(); taskObj.put("task_id", item.getTask_id()); - taskObj.put("task_status", TaskStatusEnum.ISSUE.getCode()); + //taskObj.put("task_status", TaskStatusEnum.ISSUE.getCode()); taskObj.put("remark", "下发失败:" + message); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java index fe130b5..0fe2b78 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java @@ -79,7 +79,7 @@ public class PointServiceImpl implements PointService { String[] types = split[j].split("-"); typeArr.put(types[0], types[1]); } - object.put("point_status_name", typeArr.getString(point_type)); + object.put("point_type_name", typeArr.getString(point_type)); } res.add(object); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java index 5283eaa..7be2539 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java @@ -127,8 +127,15 @@ public class TaskServiceImpl implements TaskService { Class clz = Class.forName(processing_class); Object obj = clz.newInstance(); // 调用每个任务类的method_name()强制结束方法 - Method m = obj.getClass().getMethod(method_name, String.class); - JSONObject result = (JSONObject) m.invoke(obj, task_id); + Method m = null; + JSONObject result; + if (method_name.equals("immediateNotifyAcs")) { // 立即下发不需要参数 + m = obj.getClass().getMethod(method_name); + result = (JSONObject) m.invoke(obj); + } else { + m = obj.getClass().getMethod(method_name, String.class); + result = (JSONObject) m.invoke(obj, task_id); + } if (ObjectUtil.isEmpty(result)) return; JSONArray arr = result.getJSONArray("errArr"); WQLObject wo = WQLObject.getWQLObject("sch_base_task"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java index c76d653..6ce7100 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java @@ -20,6 +20,8 @@ public class AcsTaskDto { private String vehicle_code; //载具类型 private String vehicle_type; + //物料编码 + private String material_code; //优先级 private String priority; //备注 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java index 21ce4b5..dfe0abb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java @@ -1,21 +1,18 @@ package org.nl.wms.sch.tasks; /** - * 任务状态枚举 + * 区域枚举 */ public enum RegionTypeEnum { - CPQYA(1, "CPQYA01", "成品区域A","1557538851726168064"), - YSQA(2, "YSQA01", "养生A区","1557539288307077120"), - YSQB(3, "YSQB01", "养生B区","1557539423292362752"), - GJQY(4, "GJQY01", "共挤区","1557539744848678912"), - YQQY(5, "YQQY01", "油漆区","1557913112412295168"), - DPJQA(6, "DPJQA01", "叠盘架A区","1558015562792177664"), - DPJQB(7, "DPJQB01", "叠盘架B区","1558015634472833024"), - KTPHCQA(8, "KTPHCQA01", "空托盘缓存A区","1558015810096730112"), - KTPHCQB(9, "KTPHCQB01", "空托盘缓存B区","1558015870570205184"), - HKQY(10, "HKQY01", "豪凯区域","1564862312702152704"), - SSX(12, "SSX01", "输送线区域","1559374522581389312"), - YSAQKTPQ01(13, "YSAQKTPQ01", "养生A空托盘区","1582909373552922624"); + KLZHCQ(1, "KLZHCQ", "空料盅缓存区","1586240366032588800"), + KLZCQ(2, "KLZCQ", "困料暂存区","1586240455950077952"), + MLZZCQ(3, "MLZHCQ", "满料盅缓存区","1586240614075338752"), + YLJQ(4, "YLJQ", "压力机区","1586887408316715008"), + HNJQ(5, "HNJQ", "混碾机区","1586887462549065728"), + GT1(6, "GT1", "1号接驳滚筒机区","1586888185684824064"), + GT2(7, "GT2", "2号接驳滚筒机区","1586888795951861760"), + GT3(8, "GT3", "3号接驳滚筒机区","1586888837689380864"), + GT4(9, "GT4", "4号接驳滚筒机区","1586888946166665216"); private int index; private String code; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java deleted file mode 100644 index 1e73ff8..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java +++ /dev/null @@ -1,429 +0,0 @@ -package org.nl.wms.sch.tasks.callEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -/** - * 共挤线申请空盘 - */ -public class GjxCallEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = GjxCallEmpVehicleTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - /* - * 取消删除 - * 1.终点为叠盘架更新起点点位、等待点点位、叠盘架点位 - * 2.终点为供给线更新叠盘架点位 - */ - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and col_num = '" + jsonStart.getString("col_num") + - "' and row_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("lock_type", "1"); - pointTab.update(jsonEnd); - - } else { - // 终点在供给线 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - } - - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - /* - * 更改任务状态为完成 - * 1.终点为叠盘架更新叠盘架数量、起点点位状态、等待位状态,更新任务组状态 - * 2.终点为供给线,更新起点载数量 - */ - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); - jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - // 判断终点在哪里 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - // 更新起点点位状态 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断起点是不是养生A区空载具 - if (StrUtil.equals(jsonStart.getString("region_id"), RegionTypeEnum.YSAQKTPQ01.getId())) { - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and col_num = '" + jsonStart.getString("col_num") + - "' and row_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - } - - jsonStart.put("point_status", "1"); - jsonStart.put("lock_type", "1"); - jsonStart.put("vehicle_type", ""); - jsonStart.put("vehicle_code", ""); - jsonStart.put("vehicle_qty", 0); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("vehicle_qty", NumberUtil.add(jsonEnd.getString("vehicle_qty"), jsonTask.getString("vehicle_qty"))); - jsonEnd.put("lock_type", "1"); - jsonEnd.put("point_status", "2"); - jsonEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(jsonEnd); - - // 更新任务组状态 - JSONObject jsonTask2 = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_id <> '" + jsonTask.getString("task_id") + "'").uniqueResult(0); - jsonTask2.put("point_code1", jsonEnd.getString("point_code")); - jsonTask2.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask2); - } else { - // 终点在供给线线: 更新起点(叠盘架)数量 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("vehicle_qty", NumberUtil.sub(jsonStart.getString("vehicle_qty"), "1")); - jsonStart.put("lock_type", "1"); - if (StrUtil.equals(jsonStart.getString("vehicle_qty"), "0")) { - jsonStart.put("point_status", "1"); - jsonStart.put("vehicle_type", ""); - } - pointTab.update(jsonStart); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void findStartPoint() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - - JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - // 创建任务 - JSONObject jsonTask = taskArr.getJSONObject(i); - String vehicle_type = jsonTask.getString("vehicle_type"); - - // 找叠盘架是否与对应的载具类型 - JSONObject jsonDpjStart = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty <> '0'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDpjStart)) { - // 判断叠盘架是否有任务 有就下一个任务 - boolean is_point = this.isTask(jsonDpjStart.getString("point_code")); - if (!is_point) continue; - - // 更新任务起点 - jsonTask.put("point_code1", jsonDpjStart.getString("point_code")); - jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask); - - } else { - // 判断叠盘架载具数量是否是0 - JSONObject jsonDpjStart2 = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDpjStart2)) continue; - - // 判断叠盘架是否有任务 - boolean is_point = this.isTask(jsonDpjStart2.getString("point_code")); - if (!is_point) continue; - - // 找叠盘架暂存位是否有空托盘 - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("vehicle_type", vehicle_type); - - JSONObject jsonZcKtp = WQL.getWO("QSCH_GjxCallEmpVehicleTask").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcKtp)) { - // 创建任务:空载具暂存位 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("暂存位->叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonZcKtp.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonZcKtp.getString("vehicle_code")) - .vehicle_type(jsonZcKtp.getString("vehicle_type")) - .vehicle_qty(jsonZcKtp.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁定起点 - jsonZcKtp.put("lock_type", "2"); - pointTab.update(jsonZcKtp); - } else { - // 空托盘暂存区没有就到养生A区找: 先找到出库等待点 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + - "' and row_num = '9' and can_vehicle_type = '" + vehicle_type + - "' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonEmpWait)) continue; - - JSONObject jsonStartPoint = pointTab.query("region_id = '" + jsonEmpWait.getString("region_id") + - "' and block_num = '" + jsonEmpWait.getString("block_num") + - "' and col_num = '" + jsonEmpWait.getString("col_num") + - "' and point_status = '2' and lock_type = '1' order by out_empty_seq DESC").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPoint)) continue; - - // 判断找到的空载具点位是否是等待点 - if (StrUtil.equals(jsonEmpWait.getString("point_code"), jsonStartPoint.getString("point_code"))) { - // 创建 养生A区空载具等待点 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区-> 叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - } else { - // 判断等待点是否是 未锁定、为空载具 - if (StrUtil.equals(jsonEmpWait.getString("lock_type"), "1")) { - // 创建 养生A区空载具 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - // 锁等待点 - jsonEmpWait.put("lock_type", "2"); - pointTab.update(jsonEmpWait); - } else { - continue; - } - } - } - } - } - - } - - - @Override - @Transactional(rollbackFor = Exception.class) -// 虽然是养生A区,应该有二次申请,但是通过判断叠盘架是否有任务来判断做限制 - public String createTask(JSONObject form) { - /* - * 1.先生成确定终点的任务 - * 2.通过findStartPoint()找起点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 - - //任务表【SCH_BASE_Task】 - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); - - - - - String point_code2 = form.getString("point_code2"); - String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); - - String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_name("共挤线叫空载具") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .acs_task_type("2") - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(workOrderObj.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .task_group_id(IdUtil.getLongId()) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void cancel(String task_id) { - - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - String point_code1 = json.getString("point_code1"); - //判断起点是否属于养生A区 - if (point_code1.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code1 = point_code1.substring(0, 4) + "1" + point_code1.substring(4, 9); - } - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(point_code1) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } - - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnjCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnjCallEmpVehicleTask.java new file mode 100644 index 0000000..fd621d2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnjCallEmpVehicleTask.java @@ -0,0 +1,323 @@ +package org.nl.wms.sch.tasks.callEmpty; + +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; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.acs.service.impl.AcsToWmsServiceImpl; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +/** + * 混碾机呼叫空料盅 + */ +public class HnjCallEmpVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = HnjCallEmpVehicleTask.class.getName(); + + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + //任务表 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + //库存表 + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + + String task_id = taskObj.getString("task_id"); + String finished_type = taskObj.getString("finished_type"); + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String point_code1 = jsonTask.getString("point_code1"); + String point_code2 = jsonTask.getString("point_code2"); + + JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + + + //取消任务 + if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + + // 更新任务状态为执行中 + if (StrUtil.equals(status, TaskStatusEnum.EXECUTING.getCode())) { + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + + //更新任务状态为完成 + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("finished_type", finished_type); + jsonTask.put("update_optname", "acs"); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + + //更新起点终点的库存 + JSONObject ivtStart = ivtTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + JSONObject ivtEnd = ivtTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + + //修改终点库存 + ivtEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); + ivtEnd.put("vehicle_code", jsonTask.getString("vehicle_code")); + ivtEnd.put("material_id", jsonTask.getString("material_id")); + ivtEnd.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtEnd); + + //修改起点库存 + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("point_status", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void findStartPoint() { + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + //1、查询未锁定,空料盅,空盅位暂存区的起始点位 + JSONObject json1 = pointTab.query("is_used = '1' AND is_delete = '0' AND lock_type = '1' AND point_status = '2' AND region_code = '" + RegionTypeEnum.KLZHCQ.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json1)) { + JSONObject ivtJson = ivtTab.query("point_code = '" + json1.getString("point_code") + "'").uniqueResult(0); + // 起始点位上锁 + json1.put("lock_type", "2"); + json1.put("task_id", taskObj.getString("task_id")); + json1.put("update_time", DateUtil.now()); + pointTab.update(json1); + //更改任务表中的起始点位和状态 + taskObj.put("point_code1", json1.getString("point_code")); + taskObj.put("vehicle_code", ivtJson.getString("vehicle_code")); + taskObj.put("vehicle_type", ivtJson.getString("vehicle_type")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + //如果空料盅缓存区没有空载具 就去4号接驳机滚筒区查询有无空载具 + JSONObject json2 = pointTab.query("is_used = '1' AND is_delete = '0' AND lock_type = '1' AND point_status = '2' AND region_code = '" + RegionTypeEnum.GT4.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json2)) { + JSONObject ivtJson = ivtTab.query("is_used = '1' AND is_delete = '0' AND lock_type = '1' AND point_status = '2' AND point_code = '" + json2.getString("point_code") + "'").uniqueResult(0); + // 起始点位上锁 + json1.put("lock_type", "2"); + json1.put("task_id", taskObj.getString("task_id")); + json1.put("update_time", DateUtil.now()); + pointTab.update(json1); + //更改任务表中的起始点位和状态 + taskObj.put("point_code1", json2.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("vehicle_type", ivtJson.getString("vehicle_type")); + taskObj.put("vehicle_code", ivtJson.getString("vehicle_code")); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("remark", "空盅缓存区和4号接驳机滚筒区都没有空盅!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + } + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + String point_code2 = form.getString("point_code2"); + String create_mode = form.getString("create_mode"); + String is_auto_issue = form.getString("is_auto_issue"); + + /* + * 1.先生成确定终点的任务 + * 2.通过findStartPoint()找起点 + * 3.下发给ACS + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 + + //任务表【SCH_BASE_Task】 + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); + + JSONObject workOrderObj = workOrderTab.query("device_code = '" + point_code2 + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_name("混碾机呼叫空料盅") + .task_type("task_type") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .priority("1") + .handle_class(THIS_CLASS) + .is_auto_issue(is_auto_issue) + .acs_task_type("1") + .create_mode(create_mode) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.forceFinishToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")), "200")) { + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } + + @Override + public void cancel(String task_id) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.cancelToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")),"200")){ + this.updateTaskStatus(taskObj, "0"); + }else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + }else { + throw new BadRequestException("任务已删除或者已完成!"); + } + + } + + @Override + public List addTask() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + // WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase"); + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + //JSONObject jsonMaterial = materialTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + // .material_code(jsonMaterial.getString("material_code")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Transactional(rollbackFor = Exception.class) + public boolean isTask(String point_code) { + /* + * 判断点位是否有任务存在 + */ + WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); + + boolean result; + + JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { + result = true; + } else { + result = false; + } + + return result; + } + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java deleted file mode 100644 index 6c70069..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java +++ /dev/null @@ -1,434 +0,0 @@ -package org.nl.wms.sch.tasks.callEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxCallEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxCallEmpVehicleTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - /* - * 取消删除 - * 1.终点为叠盘架更新起点点位、等待点点位、叠盘架点位 - * 2.终点为油漆线更新叠盘架点位 - */ - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and col_num = '" + jsonStart.getString("col_num") + - "' and row_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("lock_type", "1"); - pointTab.update(jsonEnd); - - } else { - // 终点在油漆线 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - } - - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - /* - * 更改任务状态为完成 - * 1.终点为叠盘架更新叠盘架数量、起点点位状态、等待位状态,更新任务组状态 - * 2.终点为油漆线,更新起点载具数量 - */ - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); - jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - // 判断终点在哪里 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQA.getId())) { - // 更新起点点位状态 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断起点是不是养生A区空载具 - if (StrUtil.equals(jsonStart.getString("region_id"), RegionTypeEnum.YSAQKTPQ01.getId())) { - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and col_num = '" + jsonStart.getString("col_num") + - "' and row_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - } - - jsonStart.put("point_status", "1"); - jsonStart.put("lock_type", "1"); - jsonStart.put("vehicle_type", ""); - jsonStart.put("vehicle_code", ""); - jsonStart.put("vehicle_qty", 0); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("vehicle_qty", NumberUtil.add(jsonEnd.getString("vehicle_qty"),jsonTask.getString("vehicle_qty"))); - jsonEnd.put("lock_type", "1"); - jsonEnd.put("point_status", "2"); - jsonEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(jsonEnd); - - // 更新任务组状态 - JSONObject jsonTask2 = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_id <> '" + jsonTask.getString("task_id") + "'").uniqueResult(0); - // 判断叠盘架数量是否 < 需求数量 (暂时只能<需求数量) - if (jsonEnd.getIntValue("vehicle_qty") < jsonTask2.getIntValue("vehicle_qty")) { - jsonTask2.put("vehicle_qty", jsonEnd.getIntValue("vehicle_qty")); - } - jsonTask2.put("point_code1", jsonEnd.getString("point_code")); - jsonTask2.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask2); - } else { - // 终点在油漆线: 更新起点(叠盘架)数量 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("vehicle_qty",NumberUtil.sub(jsonStart.getString("vehicle_qty"),jsonTask.getString("vehicle_qty"))); - jsonStart.put("lock_type", "1"); - if (StrUtil.equals(jsonStart.getString("vehicle_qty"),"0")) { - jsonStart.put("point_status", "1"); - jsonStart.put("vehicle_type", ""); - } - pointTab.update(jsonStart); - } - } - } - - /** - * 虽然是养生A区,应该有二次申请,但是通过判断叠盘架是否有任务来判断做限制 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void findStartPoint() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - - JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - // 创建任务 - JSONObject jsonTask = taskArr.getJSONObject(i); - String vehicle_type = jsonTask.getString("vehicle_type"); - - // 找叠盘架是否与对应的载具类型 - JSONObject jsonDpjStart = pointTab.query("region_id = '" + RegionTypeEnum.DPJQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty <> '0'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDpjStart)) { - // 判断叠盘架是否有任务 有就下一个任务 - boolean is_point = this.isTask(jsonDpjStart.getString("point_code")); - if (!is_point) continue; - - // 判断叠盘架数量是否 < 需求数量 (暂时只能<需求数量) - if (jsonDpjStart.getIntValue("vehicle_qty") < jsonTask.getIntValue("vehicle_qty")) { - jsonTask.put("vehicle_qty", jsonDpjStart.getIntValue("vehicle_qty")); - } - - // 更新任务起点 - jsonTask.put("point_code1", jsonDpjStart.getString("point_code")); - jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask); - - } else { - // 判断叠盘架载具数量是否是0 - JSONObject jsonDpjStart2 = pointTab.query("region_id = '" + RegionTypeEnum.DPJQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDpjStart2)) continue; - - // 判断叠盘架是否有任务 - boolean is_point = this.isTask(jsonDpjStart2.getString("point_code")); - if (!is_point) continue; - - // 找叠盘架暂存位是否有空托盘 - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("vehicle_type", vehicle_type); - - JSONObject jsonZcKtp = WQL.getWO("QSCH_YqxCallEmpVehicleTask").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcKtp)) { - // 创建任务:空载具暂存位 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("暂存位>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonZcKtp.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonZcKtp.getString("vehicle_code")) - .vehicle_type(jsonZcKtp.getString("vehicle_type")) - .vehicle_qty(jsonZcKtp.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁定起点 - jsonZcKtp.put("lock_type", "2"); - pointTab.update(jsonZcKtp); - } else { - // 空托盘暂存区没有就到养生A区找: 先找到出库等待点 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + - "' and row_num = '9' and can_vehicle_type = '" + vehicle_type + - "' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonEmpWait)) continue; - - JSONObject jsonStartPoint = pointTab.query("region_id = '" + jsonEmpWait.getString("region_id") + - "' and block_num = '" + jsonEmpWait.getString("block_num") + - "' and col_num = '" + jsonEmpWait.getString("col_num") + - "' and point_status = '2' and lock_type = '1' order by out_empty_seq DESC").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPoint)) continue; - - // 判断找到的空载具点位是否是等待点 - if (StrUtil.equals(jsonEmpWait.getString("point_code"), jsonStartPoint.getString("point_code"))) { - // 创建 养生A区空载具等待点 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - } else { - // 判断等待点是否是 未锁定 - if (StrUtil.equals(jsonEmpWait.getString("lock_type"), "1")) { - // 创建 养生A区空载具 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - // 锁等待点 - jsonEmpWait.put("lock_type", "2"); - pointTab.update(jsonEmpWait); - } else { - continue; - - } - } - } - } - } - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject form) { - /* - * 1.先生成确定终点的任务 - * 2.通过findStartPoint()找起点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 - - //任务表【SCH_BASE_Task】 - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); - - - - - String point_code2 = form.getString("point_code2"); - String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); - - String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_name("油漆线叫空载具") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .acs_task_type("2") - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(workOrderObj.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .task_group_id(org.nl.wms.util.IdUtil.getLongId()) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - - @Override - public void cancel(String task_id) { - - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '"+THIS_CLASS+"' and task_status = '"+TaskStatusEnum.START_AND_POINT.getCode()+"' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - String point_code1 = json.getString("point_code1"); - //判断起点是否属于养生A区 - if (point_code1.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code1 = point_code1.substring(0, 4) + "1" + point_code1.substring(4, 9); - } - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(point_code1) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_HnjCallEmpVehicleTask.wql similarity index 60% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_HnjCallEmpVehicleTask.wql index b76c2fb..2349e81 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_HnjCallEmpVehicleTask.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 共挤线申请空盘 + 交易名: 混碾机呼叫空盅 所属模块: 功能简述: 版权所有: @@ -14,7 +14,7 @@ ## 表字段对应输入参数 ################################################# 输入.flag TYPEAS s_string - 输入.vehicle_type TYPEAS s_string + 输入.point_code TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -41,20 +41,23 @@ IF 输入.flag = "1" QUERY SELECT - * + ivt.point_id, + ivt.point_code, + ivt.point_name, + ivt.region_id, + ivt.region_code, + ivt.region_name, + ivt.vehicle_type, + ivt.vehicle_code, + ivt.material_id, + point.point_status, + point.lock_type, + point.lock_type FROM - SCH_BASE_Point + ST_IVT_StructIvt ivt + left join SCH_BASE_Point point on point.point_id = ivt.point WHERE - is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND point_status = '2' - AND region_code = 'KTPHCQB01' - - OPTION 输入.vehicle_type <> "" - can_vehicle_type = 输入.vehicle_type - ENDOPTION - + ivt.point_code = 输入.point_code ENDSELECT ENDQUERY ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql deleted file mode 100644 index 8163667..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql +++ /dev/null @@ -1,60 +0,0 @@ -[交易说明] - 交易名: 油漆线申请空盘 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - * - FROM - SCH_BASE_Point - WHERE - is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND point_status = '2' - AND region_code = 'KTPHCQA01' - - OPTION 输入.vehicle_type <> "" - can_vehicle_type = 输入.vehicle_type - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YljCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YljCallMaterialTask.java new file mode 100644 index 0000000..2d251c2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YljCallMaterialTask.java @@ -0,0 +1,303 @@ +package org.nl.wms.sch.tasks.callMaterial; + +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; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +/** + * 压力机叫料 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class YljCallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = YljCallMaterialTask.class.getName(); + + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + + String task_id = task.getString("task_id"); + String finished_type = task.getString("finished_type"); + + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String point_code1 = taskObj.getString("point_code1"); + String point_code2 = taskObj.getString("point_code2"); + JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + //任务取消 + if (StrUtil.equals(status, "0")) { + // 取消删除任务 + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + + // 点位解锁 + jsonStart.put("lock_type", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + + if (StrUtil.equals(status, "1")) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, "2")) { + + //判断状态, + if (StrUtil.equals("2", taskObj.getString("task_status"))) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + return; + } + + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optname", "acs"); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("finished_type", finished_type); + taskTab.update(taskObj); + + //修改起点库存 + JSONObject ivtStart = ivtTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("point_status", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + + //修改终点库存 即空盅对接位因为压力机叫完料 放到空盅对接位才上报放货完成 此时需要修改空盅对接位的库存 即 + JSONObject ivtEnd = ivtTab.query("region_code = '" + RegionTypeEnum.GT4.getCode() + "'").uniqueResult(0); + ivtEnd.put("vehicle_type", taskObj.getString("vehicle_type")); + ivtEnd.put("vehicle_code", taskObj.getString("vehicle_code")); + ivtEnd.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtEnd); + + JSONObject jsonEnd = pointTab.query("point_code = '" + ivtEnd.getString("point_code") + "'").uniqueResult(0); + jsonEnd.put("point_status","2"); + pointTab.update(jsonEnd); + + } + + } + + @Override + public void findStartPoint() { + /* + * 根据业务找对应的起点 + */ + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + String material_id = taskObj.getString("material_id"); + //查询与该任务终点生产物料一样的起点 + JSONObject param = new JSONObject(); + param.put("flag", "1"); + param.put("material_id", material_id); + param.put("region_code", RegionTypeEnum.MLZZCQ.getCode()); + JSONObject json = WQL.getWO("QSCH_yljCallMAterial_01").addParamMap(param).process().uniqueResult(0); + //判断是否有起点 + if (ObjectUtil.isNotEmpty(json)) { + // 拿到起点 + JSONObject material_point = pointTab.query("point_id = '" + json.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(material_point)) throw new BadRequestException("数据错误,请校验!"); + + //获取起点库存信息 + JSONObject ivtJson = ivtTab.query("point_code = '" + material_point.getString("point_code") + "'").uniqueResult(0); + + // 起点上锁 + material_point.put("lock_type", "2"); + material_point.put("task_id", taskObj.getString("task_id")); + material_point.put("update_time", DateUtil.now()); + pointTab.update(material_point); + + //更改任务中的载具信息 任务状态 + taskObj.put("point_code1", material_point.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("vehicle_code", ivtJson.getString("vehicle_code")); + taskObj.put("vehicle_type", ivtJson.getString("vehicle_type")); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + } else { + taskObj.put("remark", "满料盅缓存区无所需物料"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + } + } + + @Override + public List addTask() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + // WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase"); + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + //JSONObject jsonMaterial = materialTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + //.material_code(jsonMaterial.getString("material_code")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + @Override + public String createTask(JSONObject whereJson) { + + String point_code2 = whereJson.getString("point_code2"); + String create_mode = whereJson.getString("create_mode"); + String is_auto_issue = whereJson.getString("is_auto_issue"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); + + JSONObject workOrderObj = workOrderTab.query("device_code = '" + point_code2 + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_name("压力机叫料") + .task_type("task_type") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .priority("1") + .handle_class(THIS_CLASS) + .is_auto_issue(is_auto_issue) + .acs_task_type("2") + .create_mode(create_mode) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .create_time(DateUtil.now()) + .request_param(whereJson.toJSONString()) + .build(); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.forceFinishToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")), "200")) { + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } + + + @Override + public void cancel(String task_id) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.cancelToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")),"200")){ + this.updateTaskStatus(taskObj, "0"); + }else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + }else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java deleted file mode 100644 index be830eb..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java +++ /dev/null @@ -1,258 +0,0 @@ -package org.nl.wms.sch.tasks.callMaterial; - -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - *油漆线叫料 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxCallMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxCallMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - // 物料点 - JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code2 = taskObj.getString("point_code2"); - String point_code3 = taskObj.getString("point_code3"); - //说明未二次申请过 - if (ObjectUtil.isEmpty(point_code3)) { - JSONObject json = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - json.put("lock_type", "1"); - pointTab.update(json); - } - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "已取消"); - taskTab.update(taskObj); - - // 点位解锁 并设置空位 - material_point.put("lock_type", "1"); - material_point.put("point_status", "1"); - pointTab.update(material_point); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - JSONObject requestObj = task.getJSONObject("request_param"); - - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - JSONObject regionIoObj = new JSONObject(); - regionIoObj.put("iostorinv_id", IdUtil.getLongId()); - regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); - regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "2"); - regionIoObj.put("region_id", material_point.getString("region_id")); - regionIoObj.put("region_code", material_point.getString("region_code")); - regionIoObj.put("region_name", material_point.getString("region_name")); - regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("material_num")); - regionIoObj.put("bill_status", "3"); - regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code2")); - regionIoObj.put("create_mode", "2"); - regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); - regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); - regionIoObj.put("create_time", DateUtil.now()); - regionIoTab.insert(regionIoObj); - - //完成后将仓位库存删掉 - //仓位库存表【ST_IVT_StructIvt】 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - ivtTab.delete("point_code = '" + taskObj.getString("point_code1") + "'"); - - // 点位解锁 并设置空位 - material_point.put("lock_type", "1"); - material_point.put("point_status", "1"); - pointTab.update(material_point); - } - - } - - @Override - public void findStartPoint() { - /* - * 根据业务找对应的起点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("material_id", material_id); - param1.put("region_code", "YSQA01"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); - //1、根据物料id查找养生A区物料点 - JSONObject json1 = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(param1).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(json1)) { - // 拿到点位 - JSONObject material_point = pointTab.query("point_id = '" + json1.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); - if (ObjectUtil.isEmpty(material_point)) throw new BadRequestException("数据错误,请校验!"); - // 物料点位上锁 - material_point.put("lock_type", "2"); - pointTab.update(material_point); - - taskObj.put("point_code1", material_point.getString("point_code")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("acs_task_type", "2"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - taskObj.put("remark", "养生A区无所需物料"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code =json.getString("point_code1"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(newPoint) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code2 = whereJson.getString("point_code2"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("material_num"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code"); - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("油漆线叫料") - .material_qty(qty) - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .vehicle_code(vehicle_code) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成"); - } - } - - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yljCallMAterial_01.wql similarity index 79% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yljCallMAterial_01.wql index 16c4b37..64205ad 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yljCallMAterial_01.wql @@ -16,7 +16,6 @@ 输入.flag TYPEAS s_string 输入.region_code TYPEAS s_string 输入.material_id TYPEAS s_string - 输入.vehicle_type TYPEAS s_string [临时表] @@ -45,27 +44,20 @@ SELECT p.point_id, p.point_code, - p.point_name, - p.block_num, - p.row_num, - p.col_num + p.point_name FROM ST_IVT_StructIvt ivt LEFT JOIN SCH_BASE_Point p on ivt.point_id = p.point_id WHERE p.is_used = '1' - AND is_delete = '0' - AND lock_type='1' + AND p.is_delete = '0' + AND p.lock_type='1' OPTION 输入.material_id <> "" ivt.material_id = 输入.material_id ENDOPTION OPTION 输入.region_code <> "" p.region_code = 输入.region_code ENDOPTION - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION - ORDER BY block_num,row_num desc,col_num ENDSELECT ENDQUERY ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java deleted file mode 100644 index 99a4a40..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java +++ /dev/null @@ -1,235 +0,0 @@ -package org.nl.wms.sch.tasks.cpOut; - -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - *成品出库 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class CpOutTask extends AbstractAcsTask { - private final String THIS_CLASS = CpOutTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code2 = taskObj.getString("point_code2"); - JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "任务已取消"); - taskTab.update(taskObj); - // 释放终点点位 - point2Obj.put("lock_type", "1"); - point2Obj.put("point_status", "1"); - pointTab.update(point2Obj); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - // 任务表的点位1 - String point_code1 = taskObj.getString("point_code1"); // 起点编码 - JSONObject point1Obj = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0);// 起点 - - //table_fk_id = 单据id - JSONObject regionIoObject = regionIoTab.query("iostorinv_id = '" + taskObj.getString("table_fk_id") + "'").uniqueResult(0); - - String point_code2 = taskObj.getString("point_code2"); // 终点编码:出库点位 - JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);// 终点 - - // 修改区域出入库 - 起点点位解锁、点位状态更新 - 终点解锁、更新状态 - //区域出入表【st_ivt_regionIO】 - regionIoObject.put("end_point_code", point_code2); - regionIoObject.put("start_region_id", point1Obj.getString("region_id")); // 终点区域 - regionIoObject.put("end_region_id", point2Obj.getString("region_id")); // 终点区域 - regionIoObject.put("bill_status", "3"); // 单据状态 - regionIoObject.put("task_id", task_id); // 任务id - regionIoTab.update(regionIoObject); - - //完成后将仓位库存删掉 - //仓位库存表【ST_IVT_StructIvt】 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - ivtTab.delete("point_code = '" + taskObj.getString("point_code1") + "'"); - - // 点位解锁 并设置空位 - point1Obj.put("lock_type", "1"); - point1Obj.put("point_status", "1"); - point2Obj.put("lock_type", "1"); - point2Obj.put("point_status", "3"); - pointTab.update(point1Obj); - pointTab.update(point2Obj); - } - - } - - @Override - public void findNextPoint() { - /* - * 根据业务找对应的终点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("material_id", material_id); - param1.put("region_code", "CPCKQ01"); - //1、找空位的终点 - JSONObject endPoint = WQL.getWO("QSCH_cpOut_01").addParamMap(param1).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(endPoint)) { - // 找到终点,上锁 - taskObj.put("update_time", DateUtil.now()); - taskObj.put("point_code2", endPoint.getString("point_code")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(taskObj); - - //锁住终点 - endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); - pointTab.update(endPoint); - } else { - taskObj.put("remark", "成品出库区无可用货位"); - taskObj.put("update_time", DateUtil.now()); - } - - taskTab.update(taskObj); - - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - String point_code1 = whereJson.getString("point_code1"); // 起点 - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String iostorinv_id = whereJson.getString("iostorinv_id"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("成品区出库") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code1(point_code1) - .vehicle_code(vehicle_code) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .table_name("st_ivt_regionIO") - .table_fk("iostorinv_id") - .table_fk_id(Long.valueOf(iostorinv_id)) - .build(); - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - // 单据设置执行中 - JSONObject iostorinv = regionIoTab.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - iostorinv.put("bill_status", "2"); - regionIoTab.update(iostorinv); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成"); - } - } - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql deleted file mode 100644 index 7546033..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql +++ /dev/null @@ -1,59 +0,0 @@ -[交易说明] - 交易名: 成品出库 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_code TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - * - FROM - SCH_BASE_Point - WHERE - is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND is_used = '1' - AND point_status = '1' - OPTION 输入.region_code <> "" - region_code = 输入.region_code - ENDOPTION - ORDER BY point_code - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/handling/HandlingTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/handling/HandlingTask.java new file mode 100644 index 0000000..e2a7c88 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/handling/HandlingTask.java @@ -0,0 +1,455 @@ +package org.nl.wms.sch.tasks.handling; + +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; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.service.dto.MaterialbaseDto; +import org.nl.wms.basedata.service.impl.MaterialbaseServiceImpl; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.nl.wms.pda.scanGroup.KlzhcwUtil; +import org.nl.wms.pda.scanGroup.MyLinkedListService; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +/** + * 手持创建搬运任务 + */ +public class HandlingTask extends AbstractAcsTask { + private final String THIS_CLASS = HandlingTask.class.getName(); + + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + String task_id = taskObj.getString("task_id"); + String finished_type = taskObj.getString("finished_type"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String point_code1 = jsonTask.getString("point_code1"); + String point_code2 = jsonTask.getString("point_code2"); + JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonEnd)) { + throw new BadRequestException("未找到可用点位:" + point_code2); + } + JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonStart)) { + throw new BadRequestException("未找到可用点位:" + point_code1); + } + String region_codeS = jsonStart.getString("region_code"); + String region_codeE = jsonEnd.getString("region_code"); + //取消任务 + if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("remark", "已取消"); + taskTab.update(jsonTask); + + jsonStart.put("lock_type", "1"); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + + jsonEnd.put("lock_type", "1"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + + } + + // 更新任务状态为执行中 + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + + //更新任务状态为完成 + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("finished_type", finished_type); + jsonTask.put("update_optname", "acs"); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + //更新起点终点的库存 + JSONObject ivtStart = ivtTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + JSONObject ivtEnd = ivtTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + + if (StrUtil.equals(region_codeS, RegionTypeEnum.HNJQ.getCode())) { + MaterialbaseServiceImpl materialbaseService = SpringContextHolder.getBean(MaterialbaseServiceImpl.class); + KlzhcwUtil klzhcwUtil = SpringContextHolder.getBean(KlzhcwUtil.class); + //更新终点的库存 + if (!StrUtil.equals(region_codeE, RegionTypeEnum.KLZHCQ.getCode())) { + MaterialbaseDto materialbaseDto = materialbaseService.findById(Long.parseLong(jsonTask.getString("material_id"))); + LinkedList ll = MyLinkedListService.getLinkedList(); + JSONObject param = new JSONObject(); + param.put("vehicle_type", jsonTask.getString("vehicle_type")); + param.put("vehicle_code", jsonTask.getString("vehicle_code")); + if (ObjectUtil.isNotEmpty(materialbaseDto)) { + param.put("material_code", materialbaseDto.getMaterial_code()); + } + boolean flag = klzhcwUtil.judge(ll, param); + if (flag) { + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("vehicle_type", ""); + jsonEnd.put("vehicle_code", ""); + jsonEnd.put("material_id", ""); + jsonEnd.put("point_status", "1"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + } else { + JSONObject jsonObject = ivtTab.query("point_code = '" + jsonEnd.getString("point_code") + "'").uniqueResult(0); + //修改终点库存信息 + jsonObject.put("vehicle_type", jsonTask.getString("vehicle_type")); + jsonObject.put("vehicle_code", jsonTask.getString("vehicle_code")); + jsonObject.put("material_id", jsonTask.getString("material_id")); + jsonObject.put("instorage_time", DateUtil.now()); + ivtTab.update(jsonObject); + //解锁终点 + jsonEnd.put("point_status", "3"); + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + } else if (StrUtil.equals(region_codeE, RegionTypeEnum.YLJQ.getCode())) { + //修改起点库存 + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("point_status", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + + //修改终点库存 即空盅对接位因为压力机叫完料 放到空盅对接位才上报放货完成 此时需要修改空盅对接位的库存 即 + ivtEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); + ivtEnd.put("vehicle_code", jsonTask.getString("vehicle_code")); + ivtEnd.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtEnd); + + jsonEnd.put("point_status", "2"); + pointTab.update(jsonEnd); + } else if (StrUtil.equals(region_codeE, RegionTypeEnum.HNJQ.getCode())) { + //修改终点库存 + ivtEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); + ivtEnd.put("vehicle_code", jsonTask.getString("vehicle_code")); + ivtEnd.put("material_id", jsonTask.getString("material_id")); + ivtEnd.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtEnd); + + //修改起点库存 + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("point_status", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } else if (StrUtil.equals(region_codeS, RegionTypeEnum.GT4.getCode())) { + //修改终点库存 + ivtEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); + ivtEnd.put("vehicle_code", jsonTask.getString("vehicle_code")); + ivtEnd.put("material_id", ""); + ivtEnd.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtEnd); + + //解锁终点 + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("vehicle_type", ""); + jsonEnd.put("vehicle_code", ""); + jsonEnd.put("material_id", ""); + jsonEnd.put("point_status", "2"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + + //修改起点库存 + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + + jsonStart.put("lock_type", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("point_status", "1"); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } else if (StrUtil.equals(RegionTypeEnum.GT4.getCode(), region_codeE) + && StrUtil.equals(RegionTypeEnum.MLZZCQ.getCode(), region_codeS)) { + //修改终点库存 + ivtEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); + ivtEnd.put("vehicle_code", jsonTask.getString("vehicle_code")); + ivtEnd.put("material_id", ""); + ivtEnd.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtEnd); + + //解锁终点 + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("vehicle_type", ""); + jsonEnd.put("vehicle_code", ""); + jsonEnd.put("material_id", ""); + jsonEnd.put("point_status", "2"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + + //修改起点库存 + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + + jsonStart.put("lock_type", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("point_status", "1"); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + /* + * 1.先生成确定终点的任务 + * 2.通过findStartPoint()找起点 + * 3.下发给ACS + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 + WQLObject ivtTab = WQLObject.getWQLObject("st_ivt_structivt"); //点位基础表 + + //任务表【SCH_BASE_Task】 + //判断当前点是否有未完成的任务 + JSONObject taskObj2 = taskTab.query("is_delete='0' and point_code2 = '" + next_point_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj2)) + throw new BadRequestException("当前点位" + next_point_code + "存在未完成的任务"); + + JSONObject taskObj1 = taskTab.query("is_delete='0' and point_code1 = '" + start_point_code + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj1)) + throw new BadRequestException("当前点位" + start_point_code + "存在未完成的任务"); + + JSONObject jsonObject = ivtTab.query("point_code = '" + start_point_code + "'").uniqueResult(0); + + JSONObject jsonStart = pointTab.query("is_delete = '0' and is_used = '1' and point_code = '" + start_point_code + "'").uniqueResult(0); + JSONObject jsonEnd = pointTab.query("is_delete = '0' and is_used = '1' and point_code = '" + next_point_code + "'").uniqueResult(0); + String region_codeS = jsonStart.getString("region_code"); + String region_codeE = jsonEnd.getString("region_code"); + if (StrUtil.equals(region_codeE, RegionTypeEnum.GT1.getCode())) { + if (StrUtil.equals(jsonEnd.getString("lock_type"), "2")) { + throw new BadRequestException("终点已锁定"); + } + } + String acs_task_type = "1"; + if (StrUtil.equals(region_codeS, RegionTypeEnum.MLZZCQ.getCode())) { + acs_task_type = "2"; + } + Long material_id = jsonObject.getLong("material_id"); + if (StrUtil.equals(region_codeS, RegionTypeEnum.HNJQ.getCode()) || StrUtil.equals(region_codeS, RegionTypeEnum.YLJQ.getCode())) { + JSONObject workOrderObj = workOrderTab.query("device_code = '" + start_point_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + material_id = workOrderObj.getLong("material_id"); + } + + SchTaskDto dto = SchTaskDto.builder().task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("手持创建搬运任务") + .task_status(TaskStatusEnum.START_AND_POINT.getCode()) + .point_code1(start_point_code) + .point_code2(next_point_code) + .acs_task_type(acs_task_type) + .vehicle_code(jsonObject.getString("vehicle_code")) + .vehicle_type(jsonObject.getString("vehicle_type")) + .material_id(material_id) + .create_mode("3") + .is_auto_issue("0") + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + if (StrUtil.equals(region_codeS, RegionTypeEnum.KLZHCQ.getCode()) + || StrUtil.equals(region_codeS, RegionTypeEnum.MLZZCQ.getCode()) + || StrUtil.equals(region_codeS, RegionTypeEnum.GT4.getCode())) { + jsonStart.put("lock_type", "2"); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + + if (StrUtil.equals(RegionTypeEnum.GT4.getCode(), region_codeE) + && StrUtil.equals(RegionTypeEnum.MLZZCQ.getCode(), region_codeS)) { + jsonStart.put("lock_type", "2"); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + jsonEnd.put("lock_type", "2"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + + if (StrUtil.equals(region_codeE, RegionTypeEnum.KLZHCQ.getCode()) + || StrUtil.equals(region_codeE, RegionTypeEnum.GT1.getCode()) + || StrUtil.equals(RegionTypeEnum.GT4.getCode(), region_codeE)) { + jsonEnd.put("lock_type", "2"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.forceFinishToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")), "200")) { + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } + + @Override + public void cancel(String task_id) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.cancelToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")),"200")){ + this.updateTaskStatus(taskObj, "0"); + }else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + }else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } + + @Override + public List addTask() { + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + String point_code1 = json.getString("point_code1"); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(point_code1) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Transactional(rollbackFor = Exception.class) + public boolean isTask(String point_code) { + /* + * 判断点位是否有任务存在 + */ + WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); + + boolean result; + + JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { + result = true; + } else { + result = false; + } + + return result; + } + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java deleted file mode 100644 index a5bf266..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java +++ /dev/null @@ -1,438 +0,0 @@ -package org.nl.wms.sch.tasks.sendEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 一楼往二楼送空托盘业务 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class HtSendEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = HtSendEmpVehicleTask.class.getName(); - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code3 = jsonTask.getString("point_code3"); - String point_code2 = jsonTask.getString("point_code2"); - if (ObjectUtil.isNotEmpty(point_code3)) { - JSONObject jsonPoint3 = pointTab.query("point_code ='" + point_code3 + "'").uniqueResult(0); - jsonPoint3.put("point_status", "1"); - pointTab.update(jsonPoint3); - } - if (ObjectUtil.isNotEmpty(point_code2)) { - JSONObject jsonPoint2 = pointTab.query("point_code ='" + point_code2 + "'").uniqueResult(0); - jsonPoint2.put("point_status", "1"); - pointTab.update(jsonPoint2); - } - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - // 更改任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - String point_code3 = jsonTask.getString("point_code3"); - String point_code = ""; - // 更新终点:判断point_code3是否为空,为空就更新point_code2 - if (ObjectUtil.isNotEmpty(point_code3)) { - point_code = point_code3; - // 更新point_code2:解锁 - JSONObject point2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - point2.put("lock_type", "1"); - point2.put("vehicle_type", ""); - point2.put("vehicle_code", ""); - point2.put("vehicle_qty", 0); - pointTab.update(point2); - } else { - point_code = jsonTask.getString("point_code2"); - } - - JSONObject endPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); - - //终点是叠盘架 - if (StrUtil.equals(endPoint.getString("region_id"), RegionTypeEnum.DPJQA.getId())) { - Integer vehicle_qty = endPoint.getInteger("vehicle_qty"); - vehicle_qty += jsonTask.getInteger("vehicle_qty"); - endPoint.put("lock_type", "1"); - endPoint.put("vehicle_qty", vehicle_qty); - endPoint.put("point_status", "1"); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(endPoint); - } else {//非叠盘架 - endPoint.put("lock_type", "1"); - endPoint.put("vehicle_code", jsonTask.getString("vehicle_code")); - endPoint.put("vehicle_qty", jsonTask.getString("vehicle_qty")); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - endPoint.put("point_status", "2"); - pointTab.update(endPoint); - } - } - } - - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject form) { - /* - * 1.先生成确定起点的任务 - * 2.通过findNextPoint()找终点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - - String point_code1 = form.getString("point_code1"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_name("电梯送空载具") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(form.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - this.findNextPoint(); -// this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void findNextPoint() { - /* - * 根据业务找对应的终点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject jsonTask = taskArr.getJSONObject(i); - String point_code_ht = ""; - - //判断SSX01A1是否有任务没有则判断其他的三个点位 - boolean ssx_1 = this.isTask("SSX01A1"); - if (ssx_1) { - String like = "SSX01%"; - - JSONArray taskArrNum = new JSONArray(); - JSONArray pointArr = pointTab.query("region_id = '" + RegionTypeEnum.SSX.getId() + "' and is_used = '1' and is_delete = '0' and point_code like '" + like + "'").getResultJSONArray(0); - - for (int j = 0; j < pointArr.size(); j++) { - JSONObject json = pointArr.getJSONObject(j); - boolean is_empTask = this.isTask(json.getString("point_code")); - - if (!is_empTask) taskArrNum.add(json); - } - - if (taskArrNum.size() > 0) { - - } else { - point_code_ht = "SSX01A1"; - } - } - - // 判断SSX02A1是否有任务没有则判断其他的三个点位 - if (ObjectUtil.isEmpty(point_code_ht)) { - boolean ssx_2 = this.isTask("SSX02A1"); - if (ssx_2) { - String like = "SSX02%"; - - JSONArray taskArrNum = new JSONArray(); - JSONArray pointArr = pointTab.query("region_id = '" + RegionTypeEnum.SSX.getId() + "' and is_used = '1' and is_delete = '0' and point_code like '" + like + "'").getResultJSONArray(0); - - for (int k = 0; k < pointArr.size(); k++) { - JSONObject json = pointArr.getJSONObject(k); - boolean is_empTask = this.isTask(json.getString("point_code")); - - if (!is_empTask) taskArrNum.add(json); - } - - if (taskArrNum.size() > 0) { - - } else { - point_code_ht = "SSX02A1"; - } - } - } - - // 如果此时point_code_ht为空则循环下一个任务 - if (ObjectUtil.isEmpty(point_code_ht)) { - continue; - } - - // 说明货梯无任务:找终点 - JSONObject param = new JSONObject(); - param.put("vehicle_type", jsonTask.getString("vehicle_type")); - param.put("qty", jsonTask.getString("vehicle_qty")); - String endPoint = this.endPoint(param); - - // 如果此时endPoint为空则循环下一个任务 - if (ObjectUtil.isEmpty(endPoint)) { - continue; - } - - // 更新任务表point_code2 - jsonTask.put("point_code2", endPoint); - jsonTask.put("task_status", "4"); - taskTab.update(jsonTask); - - // 锁定终点 - JSONObject jsonEnd = pointTab.query("point_code = '" + endPoint + "'").uniqueResult(0); - jsonEnd.put("lock_type", "2"); - pointTab.update(jsonEnd); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - /* - * 强制完成 - */ - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void cancel(String task_id) { - - } - - @Transactional(rollbackFor = Exception.class) - public String endPoint(JSONObject param) { - /* - * 1.叠盘架有A对应货位 规则:如果暂存位能放下则放暂存位如果放不下则走2或3 - * 2.叠盘架A没有货位 则去叠盘架暂存位 - * 3.叠盘架暂存位没有货位则去养生A区 - */ - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - String end_code = ""; - - String vehicle_type = param.getString("vehicle_type"); - - // 1.找到对应类型的叠盘架 - JSONObject jsonDpjEnd = pointTab.query("region_id = '" + RegionTypeEnum.DPJQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonDpjEnd)) { - // 判断数量 + 叠盘架的数量是否超过此叠盘架的最大数量 - double add_num = NumberUtil.add(param.getIntValue("qty"), jsonDpjEnd.getIntValue("vehicle_qty")); - - if (jsonDpjEnd.getDoubleValue("vehicle_max_qty") >= add_num) { - end_code = jsonDpjEnd.getString("point_code"); - } else { - // 如果数量大于此叠盘架最大数量则查找叠盘架缓存位是否有对应空位 - JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { - end_code = jsonZcwEnd.getString("point_code"); - } else { - // 为空就去养生A区的等待位 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and row_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpWait)) { - // 判断是否有任务 - boolean is_point = this.isTask(jsonEmpWait.getString("point_code")); - if (is_point) { - JSONArray jsonEmpArr = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '" + jsonEmpWait.getString("col_num") + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(jsonEmpArr)) end_code = jsonEmpWait.getString("point_code"); - } - } - } - } - } else { - // 2.叠盘架没有空位去找叠盘暂存位 - JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { - end_code = jsonZcwEnd.getString("point_code"); - } else { - // 为空就去养生A区的等待位 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and row_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpWait)) { - // 判断是否有任务 - boolean is_point = this.isTask(jsonEmpWait.getString("point_code")); - if (is_point) { - JSONArray jsonEmpArr = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '" + jsonEmpWait.getString("col_num") + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(jsonEmpArr)) end_code = jsonEmpWait.getString("point_code"); - } - } - } - } - - return end_code; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } - - @Transactional(rollbackFor = Exception.class) - @Override - public String againApply(String task_id) { - /* - * 再次下发任务处理方法 - * 涉及业务:入空载具、出空载具、入物料、出物料 - */ - - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - String point_code = ""; - - JSONObject jsonTask = taskTab.query("task_id ='" + task_id + "'").uniqueResult(0); - JSONObject jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - - // 根据 区域、块、列找到第一个有物料的货位 - JSONObject jsonOnePoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and point_status = '2' and lock_type = '1' order by in_empty_seq ASC").uniqueResult(0); - - // 如果为空说明这一列其他货位为空 则入到最后一个货位 - if (ObjectUtil.isEmpty(jsonOnePoint)) { - JSONObject jsonEmpPoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and point_status = '1' and lock_type = '1' order by in_empty_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpPoint)) { - point_code = jsonEmpPoint.getString("point_code"); - jsonTask.put("point_code3", point_code); - taskTab.update(jsonTask); - } - } else { - // 找前一位的空位 - double in_empty_seq = NumberUtil.sub(jsonOnePoint.getIntValue("in_empty_seq"), 1); - - JSONObject jsonEmpPoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and in_empty_seq = '" + in_empty_seq + - "' and point_status = '1' and lock_type = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpPoint)) { - point_code = jsonEmpPoint.getString("point_code"); - jsonTask.put("point_code3", point_code); - taskTab.update(jsonTask); - } - } - - if (ObjectUtil.isNotEmpty(point_code)) { - JSONObject jsonEndPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); - jsonEndPoint.put("lock_type", "2"); - pointTab.update(jsonEndPoint); - } - //判断点位是否属于养生A区 - if (point_code.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - } - return point_code; - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '"+THIS_CLASS+"' and task_status = '"+TaskStatusEnum.START_AND_POINT.getCode()+"' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - String point_code3=json.getString("point_code3"); - //判断终点是否属于养生A区 - if (point_code3.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code3 = point_code3.substring(0, 4) + "1" + point_code3.substring(4, 9); - } - - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(point_code3) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/KzdjwSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/KzdjwSendEmpVehicleTask.java new file mode 100644 index 0000000..229e1be --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/KzdjwSendEmpVehicleTask.java @@ -0,0 +1,311 @@ +package org.nl.wms.sch.tasks.sendEmpty; + +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; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +/** + * 空盅对接位呼叫送空盅到空盅暂存区 + */ +public class KzdjwSendEmpVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = KzdjwSendEmpVehicleTask.class.getName(); + + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject task, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + + String task_id = task.getString("task_id"); + String finished_type = task.getString("finished_type"); + + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String point_code1 = taskObj.getString("point_code1"); + String point_code2 = taskObj.getString("point_code2"); + JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + + //解锁终点 + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + + if (StrUtil.equals(status, TaskStatusEnum.EXECUTING.getCode())) { + // 更新任务状态为执行中 + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + + //判断状态, + if (StrUtil.equals("2", taskObj.getString("task_status"))) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + return; + } + + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("finished_type", finished_type); + taskTab.update(taskObj); + + JSONObject ivtStart = ivtTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + JSONObject ivtEnd = ivtTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + + //修改终点库存 + ivtEnd.put("vehicle_type", taskObj.getString("vehicle_type")); + ivtEnd.put("vehicle_code", taskObj.getString("vehicle_code")); + ivtEnd.put("material_id", ""); + ivtEnd.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtEnd); + + //解锁终点 + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("vehicle_type", ""); + jsonEnd.put("vehicle_code", ""); + jsonEnd.put("material_id", ""); + jsonEnd.put("point_status", "2"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + + //修改起点库存 + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + + jsonStart.put("lock_type", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("point_status", "1"); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void findNextPoint() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + /* + * 根据业务找对应的终点 + */ + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_START.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + JSONObject taskObj = taskArr.getJSONObject(i); + //区查询空盅缓存为是否有空位 如果有就生成到空盅缓存位的任务 + JSONObject json = pointTab.query("is_used = '1' AND is_delete = '0' AND lock_type = '1' AND point_status = '1' AND region_code = '" + RegionTypeEnum.KLZHCQ.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + JSONObject ivtJson = ivtTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); + json.put("lock_type", "2"); + json.put("task_id", taskObj.getString("task_id")); + json.put("update_time", DateUtil.now()); + pointTab.update(json); + //更改任务表中的终点点位和状态 + taskObj.put("point_code2", json.getString("point_code")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("vehicle_code", ivtJson.getString("vehicle_code")); + taskObj.put("vehicle_type", ivtJson.getString("vehicle_type")); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } else { + taskObj.put("remark", "空盅缓存区没有空位!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + String point_code1 = form.getString("point_code1"); + String create_mode = form.getString("create_mode"); + String is_auto_issue = form.getString("is_auto_issue"); + /* + * 1.先生成确定终点的任务 + * 2.通过findStartPoint()找起点 + * 3.下发给ACS + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + + //任务表【SCH_BASE_Task】 + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("空料盅对接位呼叫送空盅") + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .priority("1") + .handle_class(THIS_CLASS) + .is_auto_issue(is_auto_issue) + .acs_task_type("1") + .create_mode(create_mode) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.forceFinishToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")), "200")) { + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } + + @Override + public void cancel(String task_id) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.cancelToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")),"200")){ + this.updateTaskStatus(taskObj, "0"); + }else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + }else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } + + @Override + public List addTask() { + + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Transactional(rollbackFor = Exception.class) + public boolean isTask(String point_code) { + /* + * 判断点位是否有任务存在 + */ + WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); + + boolean result; + + JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { + result = true; + } else { + result = false; + } + + return result; + } + + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java deleted file mode 100644 index 4177b9b..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java +++ /dev/null @@ -1,391 +0,0 @@ -package org.nl.wms.sch.tasks.sendEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxSendEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxSendEmpVehicleTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code3 = jsonTask.getString("point_code3"); - String point_code2 = jsonTask.getString("point_code2"); - if (ObjectUtil.isNotEmpty(point_code3)) { - JSONObject jsonPoint3 = pointTab.query("point_code ='" + point_code3 + "'").uniqueResult(0); - jsonPoint3.put("point_status", "1"); - pointTab.update(jsonPoint3); - } - if (ObjectUtil.isNotEmpty(point_code2)) { - JSONObject jsonPoint2 = pointTab.query("point_code ='" + point_code2 + "'").uniqueResult(0); - jsonPoint2.put("point_status", "1"); - pointTab.update(jsonPoint2); - } - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - // 更改任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - String point_code3 = jsonTask.getString("point_code3"); - String point_code = ""; - // 更新终点:判断point_code3是否为空,为空就更新point_code2 - if (ObjectUtil.isNotEmpty(point_code3)) { - point_code = point_code3; - // 更新point_code2:解锁 - JSONObject point2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - point2.put("lock_type", "1"); - point2.put("vehicle_type", ""); - point2.put("vehicle_code", ""); - point2.put("vehicle_qty", 0); - pointTab.update(point2); - } else { - point_code = jsonTask.getString("point_code2"); - } - - JSONObject endPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); - - //终点是叠盘架 - if (StrUtil.equals(endPoint.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - Integer vehicle_qty = endPoint.getInteger("vehicle_qty"); - vehicle_qty += jsonTask.getInteger("vehicle_qty"); - endPoint.put("lock_type", "1"); - endPoint.put("vehicle_qty", vehicle_qty); - endPoint.put("point_status", "1"); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(endPoint); - } else {//非叠盘架 - endPoint.put("lock_type", "1"); - endPoint.put("vehicle_code", jsonTask.getString("vehicle_code")); - endPoint.put("vehicle_qty", jsonTask.getString("vehicle_qty")); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - endPoint.put("point_status", "2"); - pointTab.update(endPoint); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject form) { - /* - * 1.先生成确定起点的任务 - * 2.通过findNextPoint()找终点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - - String point_code1 = form.getString("point_code1"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(form.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); -// this.findNextPoint(); - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - /** - * @return - * @discription 确定下一点位 - * @author ldjun - * @created 2020年6月12日 下午6:01:06 - */ - @Override - public void findNextPoint() { - /* - * 根据业务找对应的终点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject jsonTask = taskArr.getJSONObject(i); - - // 找终点 - JSONObject param = new JSONObject(); - param.put("vehicle_type", jsonTask.getString("vehicle_type")); - param.put("qty", jsonTask.getString("vehicle_qty")); - String endPoint = this.endPoint(param); - - // 如果此时endPoint为空则循环下一个任务 - if (ObjectUtil.isEmpty(endPoint)) { - continue; - } - - // 更新任务表point_code2 - jsonTask.put("point_code2", endPoint); - jsonTask.put("task_status", "4"); - taskTab.update(jsonTask); - - // 锁定终点 - JSONObject jsonEnd = pointTab.query("point_code = '" + endPoint + "'").uniqueResult(0); - jsonEnd.put("lock_type", "2"); - pointTab.update(jsonEnd); - } - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - /* - * 强制完成 - */ - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - - @Override - public void cancel(String task_id) { - - } - - @Transactional(rollbackFor = Exception.class) - public String endPoint(JSONObject param) { - /* - * 1.叠盘架有B对应货位 规则:如果暂存位能放下则放暂存位如果放不下则走2或3 - * 2.叠盘架B没有货位 则去叠盘架暂存位 - * 3.叠盘架暂存位没有货位则去养生A区 - */ - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - String end_code = ""; - - String vehicle_type = param.getString("vehicle_type"); - - // 1.找到对应类型的叠盘架 - JSONObject jsonDpjEnd = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonDpjEnd)) { - // 判断数量 + 叠盘架的数量是否超过此叠盘架的最大数量 - double add_num = NumberUtil.add(param.getIntValue("qty"), jsonDpjEnd.getIntValue("vehicle_qty")); - - if (jsonDpjEnd.getDoubleValue("vehicle_max_qty") >= add_num) { - end_code = jsonDpjEnd.getString("point_code"); - } else { - // 如果数量大于此叠盘架最大数量则查找叠盘架缓存位是否有对应空位 - JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { - end_code = jsonZcwEnd.getString("point_code"); - } else { - // 为空就去养生A区的等待位 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and row_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpWait)) { - // 判断是否有任务 - boolean is_point = this.isTask(jsonEmpWait.getString("point_code")); - if (is_point) { - JSONArray jsonEmpArr = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '" + jsonEmpWait.getString("col_num") + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(jsonEmpArr)) end_code = jsonEmpWait.getString("point_code"); - } - } - } - } - } else { - // 2.叠盘架没有空位去找叠盘暂存位 - JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { - end_code = jsonZcwEnd.getString("point_code"); - } else { - // 为空就去养生A区的等待位 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and row_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpWait)) { - // 判断是否有任务 - boolean is_point = this.isTask(jsonEmpWait.getString("point_code")); - if (is_point) { - JSONArray jsonEmpArr = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '" + jsonEmpWait.getString("col_num") + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(jsonEmpArr)) end_code = jsonEmpWait.getString("point_code"); - } - } - } - } - - return end_code; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } - - @Transactional(rollbackFor = Exception.class) - @Override - public String againApply(String task_id) { - /* - * 再次下发任务处理方法 - * 涉及业务:入空载具、出空载具、入物料、出物料 - */ - - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - String point_code = ""; - - JSONObject jsonTask = taskTab.query("task_id ='" + task_id + "'").uniqueResult(0); - JSONObject jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - - // 根据 区域、块、列找到第一个有物料的货位 - JSONObject jsonOnePoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and point_status = '2' and lock_type = '1' order by in_empty_seq ASC").uniqueResult(0); - - // 如果为空说明这一列其他货位为空 则入到最后一个货位 - if (ObjectUtil.isEmpty(jsonOnePoint)) { - JSONObject jsonEmpPoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and point_status = '1' and lock_type = '1' order by in_empty_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpPoint)) { - point_code = jsonEmpPoint.getString("point_code"); - jsonTask.put("point_code3", point_code); - taskTab.update(jsonTask); - } - } else { - // 找前一位的空位 - double in_empty_seq = NumberUtil.sub(jsonOnePoint.getIntValue("in_empty_seq"), 1); - - JSONObject jsonEmpPoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and in_empty_seq = '" + in_empty_seq + - "' and point_status = '1' and lock_type = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpPoint)) { - point_code = jsonEmpPoint.getString("point_code"); - jsonTask.put("point_code3", point_code); - taskTab.update(jsonTask); - } - } - - if (ObjectUtil.isNotEmpty(point_code)) { - JSONObject jsonEndPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); - jsonEndPoint.put("lock_type", "2"); - pointTab.update(jsonEndPoint); - } - //判断点位是否属于养生A区 - if (point_code.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - } - return point_code; - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - String point_code3 = json.getString("point_code3"); - //判断终点是否属于养生A区 - if (point_code3.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code3 = point_code3.substring(0, 4) + "1" + point_code3.substring(4, 9); - } - - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(point_code3) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java deleted file mode 100644 index b9290ca..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java +++ /dev/null @@ -1,384 +0,0 @@ -package org.nl.wms.sch.tasks.sendMaterial; - -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - * 共挤线送料任务服务 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class GjxSendMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = GjxSendMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "已取消"); - taskTab.update(taskObj); - - //释放相关电位信息 - JSONObject param1 = new JSONObject(); - param1.put("lock_type", "1"); - param1.put("task_id", ""); - param1.put("material_id", ""); - pointTab.update(param1, "task_id = '" + taskObj.getString("task_id") + "'"); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - - //判断状态, - if (StrUtil.equals("2", taskObj.getString("task_status"))) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - return; - } - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - - String point_code2 = taskObj.getString("point_code2"); - JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject requestObj = task.getJSONObject("request_param"); - //工单标识 - String workorder_id = requestObj.getString("material_info_id"); - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); - - - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - JSONObject regionIoObj = new JSONObject(); - regionIoObj.put("iostorinv_id", IdUtil.getLongId()); - regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); - regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "1"); - regionIoObj.put("region_id", endPoint.getString("region_id")); - regionIoObj.put("region_code", endPoint.getString("region_code")); - regionIoObj.put("region_name", endPoint.getString("region_name")); - regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("qty")); - regionIoObj.put("bill_status", "3"); - regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code3")); - regionIoObj.put("create_mode", "2"); - regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); - regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); - regionIoObj.put("create_time", DateUtil.now()); - regionIoTab.insert(regionIoObj); - - - //完成后入库 - //仓位库存表【ST_IVT_StructIvt】 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - JSONObject ivtObj = new JSONObject(); - ivtObj.put("stockrecord_id", IdUtil.getLongId()); - ivtObj.put("point_id", endPoint.getString("point_id")); - ivtObj.put("point_code", endPoint.getString("point_code")); - ivtObj.put("point_name", endPoint.getString("point_name")); - ivtObj.put("region_id", endPoint.getString("region_id")); - ivtObj.put("region_code", endPoint.getString("region_code")); - ivtObj.put("region_name", endPoint.getString("region_name")); - ivtObj.put("instorage_time", DateUtil.now()); - ivtObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - ivtObj.put("ivt_qty", requestObj.getString("qty")); - ivtObj.put("standing_time", workorderObj.getString("standing_time")); - ivtObj.put("material_id", workorderObj.getString("material_id")); - ivtTab.insert(ivtObj); - - // 点位解锁 - endPoint.put("lock_type", "1"); - endPoint.put("point_status", "3"); - endPoint.put("material_id", taskObj.getString("material_id")); - pointTab.update(endPoint); - //释放整列货位 - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - pointTab.update(param, "task_id = '" + task_id + "'"); - - } - - } - - @Override - public void findNextPoint() { - //判断共挤线是否有执行中的任务,如果任务数>=3,则不生成任务 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - /* - * 根据业务找对应的终点 - */ - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("material_id", material_id); - param1.put("region_code", "YSQA01"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找库区类是否有响应的载具类型和对应的物料 - JSONObject json1 = WQL.getWO("QSCH_gjxSendMaterial_01").addParamMap(param1).process().uniqueResult(0); - - - //判断是否有到同一列的相同物料SKU的AGV任务,如果有,则等待 - JSONArray taskIngs = taskTab.query("is_delete='0' and material_id = '" + material_id + "' and (task_status = '4' or task_status = '5' or task_status = '6' )").getResultJSONArray(0); - - if (ObjectUtil.isNotEmpty(taskIngs)) { - JSONObject taskIng = taskIngs.getJSONObject(0); - if (ObjectUtil.isNotEmpty(taskIng) && ObjectUtil.isNotEmpty(json1)) { - JSONObject point2 = pointTab.query("point_code = '" + taskIng.getString("point_code2") + "'").uniqueResult(0); - if (StrUtil.equals(point2.getString("block_num"), json1.getString("block_num")) - && StrUtil.equals(point2.getString("col_num"), json1.getString("col_num"))) { - taskObj.put("remark", "相应列有AGV在工作,等待执行!"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - } - } - - - if (ObjectUtil.isNotEmpty(json1)) { - Integer block_num = json1.getInteger("block_num"); - Integer row_num = json1.getInteger("row_num"); - Integer col_num = json1.getInteger("col_num"); - - JSONObject firstRow = pointTab.query("block_num = '" + block_num + "' and col_num = '" + col_num + "' and row_num ='" + (row_num - 1) + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(firstRow)) throw new BadRequestException("数据错误,请校验!"); - taskObj.put("point_code2", firstRow.getString("point_code")); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - //二楼普通任务 - taskTab.update(taskObj); - //锁住相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "2"); - point.put("task_id", taskObj.getString("task_id")); - pointTab.update(point, "block_num = '" + block_num + "' and col_num = '" + col_num + "' and row_num <= '" + (row_num - 1) + "'"); - - } else {//找空位入 - if (ObjectUtil.isNotEmpty(taskIngs) && taskIngs.size() > 1) { - taskObj.put("remark", "相应列有AGV在工作,等待执行!"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - continue; - } - - JSONObject param2 = new JSONObject(); - param2.put("flag", "2"); - param2.put("region_code", "YSQA01"); - param2.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找整列为空的货位 - JSONObject json2 = WQL.getWO("QSCH_gjxSendMaterial_01").addParamMap(param2).process().uniqueResult(0); - if (ObjectUtil.isEmpty(json2)) { - taskObj.put("remark", "养生A区无可用货位"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - Integer block_num = json2.getInteger("block_num"); - Integer col_num = json2.getInteger("col_num"); - JSONObject firstRow = pointTab.query("block_num = '" + block_num + "' and col_num = '" + col_num + "' and row_num ='9'").uniqueResult(0); - taskObj.put("point_code2", firstRow.getString("point_code")); - //二楼普通任务 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - //锁住相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "2"); - point.put("task_id", taskObj.getString("task_id")); - pointTab.update(point, "block_num = '" + block_num + "' and col_num = '" + col_num + "' and row_num <= '" + 9 + "'"); - - } - } - - } - } - - @Override - public List addTask() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code = json.getString("point_code2"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(newPoint) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("共挤线满料") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .acs_task_type("2")//2楼AGV普通任务 - .vehicle_code(vehicle_code) - .material_qty(qty) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) { - this.updateTaskStatus(taskObj, "2"); - } else { - throw new BadRequestException("任务已删除或者已完成!"); - } - - } - - - @Override - public void cancel(String task_id) { - - } - - //TODO 暂时不用二次申请 - @Transactional(rollbackFor = Exception.class) - @Override - public String againApply(String task_id) { - /* - * 再次下发任务处理方法 - * 涉及业务:入空载具、出空载具、入物料、出物料 - */ - - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - JSONObject taskObj = taskTab.query("task_id ='" + task_id + "'").uniqueResult(0); - - JSONObject jsonPoint3 = pointTab.query("point_code = '" + taskObj.getString("point_code3") + "'").uniqueResult(0); - //提前更新这列货位状态,方便生成往这列的任务 - jsonPoint3.put("point_status", "3"); - jsonPoint3.put("material_id", taskObj.getString("material_id")); - pointTab.update(jsonPoint3); - //释放相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "1"); - point.put("task_id", ""); - pointTab.update(point, "task_id = '" + taskObj.getString("task_id") + "'"); - - - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code = taskObj.getString("point_code3"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - return newPoint; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java deleted file mode 100644 index 3848674..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java +++ /dev/null @@ -1,263 +0,0 @@ -package org.nl.wms.sch.tasks.sendMaterial; - -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - * 豪凯自动线线送料任务服务 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class HkxSendMaterialTask extends AbstractAcsTask { - - private final String THIS_CLASS = HkxSendMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code2 = taskObj.getString("point_code2"); - if (ObjectUtil.isEmpty(point_code2)) { - JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - endPoint.put("lock_type", "1"); - pointTab.update(endPoint); - } - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "已取消"); - taskTab.update(taskObj); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - String point_code2 = taskObj.getString("point_code2"); - JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject requestObj = task.getJSONObject("request_param"); - //工单标识 - String workorder_id = requestObj.getString("material_info_id"); - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); - - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - JSONObject regionIoObj = new JSONObject(); - regionIoObj.put("iostorinv_id", IdUtil.getLongId()); - regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); - regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "1"); - regionIoObj.put("region_id", point2Obj.getString("region_id")); - regionIoObj.put("region_code", point2Obj.getString("region_code")); - regionIoObj.put("region_name", point2Obj.getString("region_name")); - regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("qty")); - regionIoObj.put("bill_status", "3"); - regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code3")); - regionIoObj.put("create_mode", "2"); - regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); - regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); - regionIoObj.put("create_time", DateUtil.now()); - regionIoTab.insert(regionIoObj); - - - //完成后入库 - //仓位库存表【ST_IVT_StructIvt】 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - JSONObject ivtObj = new JSONObject(); - ivtObj.put("stockrecord_id", IdUtil.getLongId()); - ivtObj.put("point_id", point2Obj.getString("point_id")); - ivtObj.put("point_code", point2Obj.getString("point_code")); - ivtObj.put("point_name", point2Obj.getString("point_name")); - ivtObj.put("region_id", point2Obj.getString("region_id")); - ivtObj.put("region_code", point2Obj.getString("region_code")); - ivtObj.put("region_name", point2Obj.getString("region_name")); - ivtObj.put("instorage_time", DateUtil.now()); - ivtObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - ivtObj.put("ivt_qty", requestObj.getString("qty")); - ivtObj.put("standing_time", workorderObj.getString("standing_time")); - ivtObj.put("material_id", workorderObj.getString("material_id")); - ivtTab.insert(ivtObj); - - // 终点解锁 - point2Obj.put("lock_type", "1"); - point2Obj.put("point_status", "3"); - // 载具类型 - point2Obj.put("vehicle_type", taskObj.getString("vehicle_type")); - pointTab.update(point2Obj); - } - - } - - @Override - public void findNextPoint() { - /* - * 根据业务找对应的终点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("region_code", "CPQYA01"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找库区类是否有响应的载具类型和对应的物料 - JSONObject endPoint = WQL.getWO("QSCH_hkxSendMaterial_01").addParamMap(param1).process().uniqueResult(0); - if (ObjectUtil.isEmpty(endPoint)) { - taskObj.put("remark", "成品区无可用货位!"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - taskObj.put("update_time", DateUtil.now()); - taskObj.put("point_code2", endPoint.getString("point_code")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(taskObj); - - //锁住终点 - endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); - pointTab.update(endPoint); - } - - - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("豪凯线满料") - .material_qty(qty) - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(vehicle_code) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj, "2"); - } - - - @Override - public void cancel(String task_id) { - - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnjSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnjSendMaterialTask.java new file mode 100644 index 0000000..b0d7ccf --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnjSendMaterialTask.java @@ -0,0 +1,456 @@ +package org.nl.wms.sch.tasks.sendMaterial; + +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; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.RedisUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.service.MaterialbaseService; +import org.nl.wms.basedata.service.dto.MaterialbaseDto; +import org.nl.wms.basedata.service.impl.MaterialbaseServiceImpl; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.nl.wms.pda.scanGroup.KlzhcwUtil; +import org.nl.wms.pda.scanGroup.MyLinkedListService; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + + +/** + * 混碾机满盅入库 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class HnjSendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = HnjSendMaterialTask.class.getName(); + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject task, String status) { + //任务表 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + //库存表 + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + + String task_id = task.getString("task_id"); + String finished_type = task.getString("finished_type"); + + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String sort_seq = taskObj.getString("sort_seq"); + String point_code1 = taskObj.getString("point_code1"); + String point_code2 = taskObj.getString("point_code2"); + + JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + //任务取消 + if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + //取空任务取消 + if (StrUtil.equals(sort_seq, "1")) { + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + //取满任务取消 + if (StrUtil.equals(sort_seq, "2")) { + //解锁终点 + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + } + + // 更新任务状态为执行中 + if (StrUtil.equals(status, TaskStatusEnum.EXECUTING.getCode())) { + taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + //任务完成 + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //判断状态, + if (StrUtil.equals("2", taskObj.getString("task_status"))) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + return; + } + + //更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_optname", "acs"); + taskObj.put("update_time", DateUtil.now()); + taskObj.put("finished_type", finished_type); + taskTab.update(taskObj); + + //取空任务完成 + if (StrUtil.equals(sort_seq, "1")) { + //更新起点终点的库存 + JSONObject ivtStart = ivtTab.query("point_code = '" + jsonStart.getString("point_code") + "'").uniqueResult(0); + JSONObject ivtEnd = ivtTab.query("point_code = '" + jsonEnd.getString("point_code") + "'").uniqueResult(0); + + //修改终点库存 + ivtEnd.put("vehicle_type", taskObj.getString("vehicle_type")); + ivtEnd.put("vehicle_code", taskObj.getString("vehicle_code")); + ivtEnd.put("material_id", taskObj.getString("material_id")); + ivtEnd.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtEnd); + + //修改起点库存 + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("point_status", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + + //取满任务完成 + if (StrUtil.equals(sort_seq, "2")) { + + //判断状态, + if (StrUtil.equals("2", taskObj.getString("task_status"))) { + // 更改任务状态为完成 + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + return; + } + + MaterialbaseServiceImpl materialbaseService = SpringContextHolder.getBean(MaterialbaseServiceImpl.class); + KlzhcwUtil klzhcwUtil = SpringContextHolder.getBean(KlzhcwUtil.class); + + //更新终点的库存 + String region_code = jsonEnd.getString("region_code"); + if (!StrUtil.equals(region_code, RegionTypeEnum.KLZHCQ.getCode())) { + MaterialbaseDto materialbaseDto = materialbaseService.findById(Long.parseLong(taskObj.getString("material_id"))); + LinkedList ll = MyLinkedListService.getLinkedList(); + JSONObject param = new JSONObject(); + param.put("vehicle_type", taskObj.getString("vehicle_type")); + param.put("vehicle_code", taskObj.getString("vehicle_code")); + if (ObjectUtil.isNotEmpty(materialbaseDto)) { + param.put("material_code", materialbaseDto.getMaterial_code()); + } + boolean flag = klzhcwUtil.judge(ll, param); + if (flag) { + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("vehicle_type", ""); + jsonEnd.put("vehicle_code", ""); + jsonEnd.put("material_id", ""); + jsonEnd.put("point_status", "1"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + } else { + JSONObject jsonObject = ivtTab.query("point_code = '" + jsonEnd.getString("point_code") + "'").uniqueResult(0); + //修改终点库存信息 + jsonObject.put("vehicle_type", taskObj.getString("vehicle_type")); + jsonObject.put("vehicle_code", taskObj.getString("vehicle_code")); + jsonObject.put("material_id", taskObj.getString("material_id")); + jsonObject.put("instorage_time", DateUtil.now()); + ivtTab.update(jsonObject); + //解锁终点 + jsonEnd.put("point_status", "3"); + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + } + + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void findStartPoint() { + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt");//库存表 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); + for (int i = 0; i < taskArr.size(); i++) { + //确认终点的任务 + JSONObject taskObj = taskArr.getJSONObject(i); + String task_group_id = taskObj.getString("task_group_id"); + //查询跟确认终点任务同一个任务组的确认起点的任务 + JSONObject taskObj2 = taskTab.query("handle_class = '" + THIS_CLASS + "'and task_group_id = '" + task_group_id + "' and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_START.getCode() + "'").uniqueResult(0); + //1、查询未锁定,空料盅,空盅位暂存区的起始点位 如果有取空的点位 再判断取满时 是否有放货位 + JSONObject json1 = pointTab.query("is_used = '1' AND is_delete = '0' AND lock_type = '1' AND point_status = '2' AND region_code = '" + RegionTypeEnum.KLZHCQ.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json1)) { + JSONObject json2 = pointTab.query("is_used = '1' AND is_delete = '0' AND lock_type = '1' AND point_status = '1' AND region_code = '" + RegionTypeEnum.GT1.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json2)) { + //锁定取空任务的起点 + json1.put("lock_type", "2"); + json1.put("task_id", taskObj.getString("task_id")); + json1.put("update_time", DateUtil.now()); + pointTab.update(json1); + + //锁定取满任务的终点 + json2.put("lock_type", "2"); + json2.put("task_id", taskObj.getString("task_id")); + json2.put("update_time", DateUtil.now()); + pointTab.update(json2); + + //更改取空任务中的载具信息 任务状态 + JSONObject ivtJson1 = ivtTab.query("point_code = '" + json1.getString("point_code") + "'").uniqueResult(0); + taskObj.put("point_code1", json1.getString("point_code")); + taskObj.put("vehicle_code", ivtJson1.getString("vehicle_code")); + taskObj.put("vehicle_type", ivtJson1.getString("vehicle_type")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + //更改取满任务中的载具信息 任务状态 + JSONObject ivtJson2 = ivtTab.query("point_code = '" + taskObj2.getString("point_code1") + "'").uniqueResult(0); + taskObj2.put("point_code2", json2.getString("point_code")); + taskObj2.put("vehicle_code", ivtJson2.getString("vehicle_code")); + taskObj2.put("vehicle_type", ivtJson2.getString("vehicle_type")); + taskObj2.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj2.put("update_time", DateUtil.now()); + taskTab.update(taskObj2); + + } else { + JSONObject json3 = pointTab.query("is_used = '1' AND is_delete = '0' AND lock_type = '1' AND point_status = '1' AND region_code = '" + RegionTypeEnum.KLZHCQ.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json3)) { + //锁定取空任务的起点 + json1.put("lock_type", "2"); + json1.put("task_id", taskObj.getString("task_id")); + json1.put("update_time", DateUtil.now()); + pointTab.update(json1); + + //锁定取满任务的终点 + json3.put("lock_type", "2"); + json3.put("task_id", taskObj.getString("task_id")); + json3.put("update_time", DateUtil.now()); + pointTab.update(json3); + + //更改取空任务中的载具信息 任务状态 + JSONObject ivtJson1 = ivtTab.query("point_code = '" + json1.getString("point_code") + "'").uniqueResult(0); + taskObj.put("point_code1", json1.getString("point_code")); + taskObj.put("vehicle_code", ivtJson1.getString("vehicle_code")); + taskObj.put("vehicle_type", ivtJson1.getString("vehicle_type")); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + + //更改取满任务中的载具信息 任务状态 + JSONObject ivtJson3 = ivtTab.query("point_code = '" + json3.getString("point_code") + "'").uniqueResult(0); + taskObj2.put("point_code2", json3.getString("point_code")); + taskObj2.put("vehicle_code", ivtJson3.getString("vehicle_code")); + taskObj2.put("vehicle_type", ivtJson3.getString("vehicle_type")); + taskObj2.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj2.put("update_time", DateUtil.now()); + taskTab.update(taskObj2); + } else { + taskObj.put("remark", "取满任务没找到终点!!!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + } + } else { + taskObj.put("remark", "取空任务没找到起点!!!"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public List addTask() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + // WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase"); + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + //JSONObject jsonMaterial = materialTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + // .material_code(jsonMaterial.getString("material_code")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject whereJson) { + + String point_code1 = whereJson.getString("point_code1"); + String create_mode = whereJson.getString("create_mode"); + String is_auto_issue = whereJson.getString("is_auto_issue"); + + //生产工单表【PDM_BD_WorkOrder】 + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + + //判断当前点是否有未完成的起点任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的起点任务"); + + //判断当前点是否有未完成的终点任务 + JSONObject taskObj1 = taskTab.query("is_delete='0' and point_code2 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj1)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的终点任务"); + + String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("point_code"); + + JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); + + Long task_group_id = IdUtil.getLongId(); + + SchTaskDto emptyDto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_name("混碾机满盅入库之取空") + .task_type("task_type") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code1) + .priority("1") + .handle_class(THIS_CLASS) + .is_auto_issue(is_auto_issue) + .task_group_id(task_group_id) + .sort_seq(1) + .acs_task_type("1") + .create_mode(create_mode) + .create_time(DateUtil.now()) + .request_param(whereJson.toJSONString()) + .build(); + + + SchTaskDto fullDto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_name("混碾机满盅入库之取满") + .task_type("task_type") + .task_status(TaskStatusEnum.SURE_START.getCode()) + .point_code1(point_code1) + .priority("1") + .handle_class(THIS_CLASS) + .is_auto_issue(is_auto_issue) + .task_group_id(task_group_id) + .sort_seq(2) + .acs_task_type("1") + .create_mode(create_mode) + .material_info_id(workOrderObj.getLong("workorder_id")) + .material_id(workOrderObj.getLong("material_id")) + .create_time(DateUtil.now()) + .request_param(whereJson.toJSONString()) + .build(); + + JSONObject emptyJson = JSONObject.parseObject(JSON.toJSONString(emptyDto)); + taskTab.insert(emptyJson); + JSONObject fullJson = JSONObject.parseObject(JSON.toJSONString(fullDto)); + taskTab.insert(fullJson); + + //创建好立即下发 + this.immediateNotifyAcs(); + return String.valueOf(fullDto.getTask_id()); + } + + @Override + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.forceFinishToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")), "200")) { + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + + } + + + @Override + public void cancel(String task_id) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.cancelToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")),"200")){ + this.updateTaskStatus(taskObj, "0"); + }else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java deleted file mode 100644 index e71d70a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java +++ /dev/null @@ -1,263 +0,0 @@ -package org.nl.wms.sch.tasks.sendMaterial; - -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; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.service.PointService; -import org.nl.wms.sch.service.dto.PointDto; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - * 油漆线送物料 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxSendMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxSendMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - /** - *改变任务状态 - **/ - String task_id = taskObj.getString("task_id"); - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - //取消任务,释放相关点位的锁 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code1"); - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - param.put("task_id", ""); - pointTab.update(param, "point_code = '" + point_code1 + "'"); - pointTab.update(param, "point_code = '" + point_code2 + "'"); - - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("remark", "已取消"); - taskTab.update(jsonTask); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - //更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (TaskStatusEnum.FINISHED.getCode().equals(status)) { - // 更新任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("remark", "任务执行完成"); - taskTab.update(jsonTask); - - - //取消任务,释放相关点位的锁 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code1"); - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - param.put("task_id", ""); - - pointTab.update(param, "point_code = '" + point_code1 + "'"); - - param.put("point_status", "3"); - pointTab.update(param, "point_code = '" + point_code2 + "'"); - } - - } - - @Override - public void findNextPoint() { - String task_status = TaskStatusEnum.SURE_START.getCode(); - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - JSONArray taskArry = taskTab.query("task_status='" + task_status + "' AND handle_class='" + THIS_CLASS + "' AND is_delete='0' ").getResultJSONArray(0); - for (int i = 0; i < taskArry.size(); i++) { - JSONObject taskObj = taskArry.getJSONObject(i); - String task_id = taskObj.getString("task_id"); - - JSONObject param = new JSONObject(); - param.put("flag", "1"); - JSONObject endPoint = WQL.getWO("QSCH_yqxSendMaterial_01").addParamMap(param).process().uniqueResult(0); - if (ObjectUtil.isEmpty(endPoint)) { - taskObj.put("remark", "电梯无可用点"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - //锁住点位 - endPoint.put("lock_type", "2"); - endPoint.put("task_id", task_id); - pointTab.update(endPoint); - - //修改任务状态 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); - taskObj.put("update_optname", SecurityUtils.getCurrentNickName()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("油漆线满料") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(vehicle_code) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .material_qty(qty) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - //任务表【SCH_BASE_Task】 - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - - @Override - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void cancel(String task_id) { - - } - - @Transactional(rollbackFor = Exception.class) - public JSONObject findEndPoint(JSONObject json) { - String point_code1 = json.getString("point_code1"); - - WQLObject regionTab = WQLObject.getWQLObject("SCH_BASE_Region"); - - // 根据起点判断是什么区域 然后要入到什么区 - PointDto startDto = SpringContextHolder.getBean(PointService.class).findByCode(point_code1); - if (ObjectUtil.isEmpty(startDto)) throw new BadRequestException("起点点位不存在"); - JSONObject jsonStartRegion = regionTab.query("region_id = '" + startDto.getRegion_id() + "'").uniqueResult(0); - - /* - * 物料入库业务:目前只有2个业务,如果区域不正确则报错 - * 1.共挤线 --> 养生区A - * 2.豪凯线 --> 成品区 - */ - String point_code2 = ""; - if (StrUtil.equals(jsonStartRegion.getString("region_code"), RegionTypeEnum.GJQY.getCode())) { - JSONObject map = new JSONObject(); - map.put("flag", "2"); - map.put("region_code", RegionTypeEnum.YSQA.getCode()); - JSONObject jsonEndPoint = WQL.getWO("ST_REGION_IN_01").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonEndPoint)) throw new BadRequestException("仓位不足"); - point_code2 = jsonEndPoint.getString("point_code"); - } else if (StrUtil.equals(jsonStartRegion.getString("region_code"), RegionTypeEnum.HKQY.getCode())) { - JSONObject map = new JSONObject(); - map.put("flag", "2"); - map.put("region_code", RegionTypeEnum.CPQYA.getCode()); - JSONObject jsonEndPoint = WQL.getWO("ST_REGION_IN_01").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonEndPoint)) throw new BadRequestException("仓位不足"); - point_code2 = jsonEndPoint.getString("point_code"); - } - - JSONObject resuft = new JSONObject(); - resuft.put("point_code2", point_code2); - return resuft; - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/timing/TimingSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/timing/TimingSendMaterialTask.java new file mode 100644 index 0000000..18d0838 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/timing/TimingSendMaterialTask.java @@ -0,0 +1,344 @@ +package org.nl.wms.sch.tasks.timing; + +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; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.service.dto.MaterialbaseDto; +import org.nl.wms.basedata.service.impl.MaterialbaseServiceImpl; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.nl.wms.pda.scanGroup.KlzhcwUtil; +import org.nl.wms.pda.scanGroup.MyLinkedListService; +import org.nl.wms.sch.SchTaskDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.nl.wms.util.IdUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +/** + * 定时任务从空料盅到困料区的任务 + */ +public class TimingSendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = TimingSendMaterialTask.class.getName(); + + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTaskStatus(JSONObject taskObj, String status) { + //任务表 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + //库存表 + WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + + String task_id = taskObj.getString("task_id"); + String finished_type = taskObj.getString("finished_type"); + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String point_code1 = jsonTask.getString("point_code1"); + String point_code2 = jsonTask.getString("point_code2"); + + JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + + + //取消任务 + if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { + throw new BadRequestException("已完成不能取消!"); + } + taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); + taskObj.put("remark", "已取消"); + taskTab.update(taskObj); + + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + + //解锁起点 + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + + // 更新任务状态为执行中 + if (StrUtil.equals(status, TaskStatusEnum.EXECUTING.getCode())) { + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + + //更新任务状态为完成 + if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + //判断状态, + if (StrUtil.equals("2", jsonTask.getString("task_status"))) { + // 更改任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + return; + } + + //更改任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optname", "acs"); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("finished_type", finished_type); + taskTab.update(jsonTask); + + MaterialbaseServiceImpl materialbaseService = SpringContextHolder.getBean(MaterialbaseServiceImpl.class); + KlzhcwUtil klzhcwUtil = SpringContextHolder.getBean(KlzhcwUtil.class); + MaterialbaseDto materialbaseDto = materialbaseService.findById(Long.parseLong(jsonTask.getString("material_id"))); + LinkedList ll = MyLinkedListService.getLinkedList(); + JSONObject param = new JSONObject(); + param.put("vehicle_type", jsonTask.getString("vehicle_type")); + param.put("vehicle_code", jsonTask.getString("vehicle_code")); + if (ObjectUtil.isNotEmpty(materialbaseDto)) { + param.put("material_code", materialbaseDto.getMaterial_code()); + } + boolean flag = klzhcwUtil.judge(ll, param); + if (flag) { + jsonEnd.put("lock_type", "1"); + jsonEnd.put("task_id", ""); + jsonEnd.put("vehicle_type", ""); + jsonEnd.put("vehicle_code", ""); + jsonEnd.put("material_id", ""); + jsonEnd.put("point_status", "1"); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + } + //更新起点库存 + JSONObject ivtStart = ivtTab.query("point_code = '" + jsonStart.getString("point_code") + "'").uniqueResult(0); + ivtStart.put("vehicle_type", ""); + ivtStart.put("vehicle_code", ""); + ivtStart.put("material_id", ""); + ivtStart.put("instorage_time", DateUtil.now()); + ivtTab.update(ivtStart); + //解锁起点 + jsonStart.put("lock_type", "1"); + jsonStart.put("vehicle_type", ""); + jsonStart.put("vehicle_code", ""); + jsonStart.put("material_id", ""); + jsonStart.put("point_status", "1"); + jsonStart.put("task_id", ""); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String createTask(JSONObject form) { + + String point_code2 = form.getString("point_code2"); + String point_code1 = form.getString("point_code1"); + Long material_id = form.getLong("material_id"); + String create_mode = form.getString("create_mode"); + String is_auto_issue = form.getString("is_auto_issue"); + + /* + * 1.先生成确定终点的任务 + * 2.通过findStartPoint()找起点 + * 3.下发给ACS + */ + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 + + //任务表【SCH_BASE_Task】 + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); + + JSONObject taskObj2 = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj2)) + throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); + + + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_name("定时任务生成空料盅区有料到困料区的任务") + .task_type("task_type") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code1(point_code1) + .point_code2(point_code2) + .priority("1") + .handle_class(THIS_CLASS) + .is_auto_issue(is_auto_issue) + .acs_task_type("1") + .material_id(material_id) + .create_mode(create_mode) + .create_time(DateUtil.now()) + .request_param(form.toJSONString()) + .build(); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + + //点位表 + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); + + //锁定 + jsonStart.put("lock_type", "2"); + jsonStart.put("task_id", dto.getTask_id()); + jsonStart.put("update_time", DateUtil.now()); + pointTab.update(jsonStart); + + //锁定 + jsonEnd.put("lock_type", "2"); + jsonEnd.put("task_id", dto.getTask_id()); + jsonEnd.put("update_time", DateUtil.now()); + pointTab.update(jsonEnd); + + this.immediateNotifyAcs(); + return String.valueOf(dto.getTask_id()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.forceFinishToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")), "200")) { + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + + } else { + throw new BadRequestException("任务已删除或者已完成!"); + } + } + + @Override + public void cancel(String task_id) { + WmsToAcsServiceImpl wmsToAcsService = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("task_id", task_id); + map.put("task_code", taskObj.getString("task_code")); + array.add(map); + Map resp = wmsToAcsService.cancelToAcs(array); + if (StrUtil.equals(String.valueOf(resp.get("status")),"200")){ + this.updateTaskStatus(taskObj, "0"); + }else { + throw new BadRequestException(String.valueOf(resp.get("message"))); + } + }else { + throw new BadRequestException("任务已删除或者已完成!"); + } + + } + + @Override + public List addTask() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + // WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase"); + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + ArrayList resultList = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + //JSONObject jsonMaterial = materialTab.query("material_id = '" + json.getString("material_id") + "'").uniqueResult(0); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + // .material_code(jsonMaterial.getString("material_code")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + resultList.add(dto); + } + return resultList; + } + + @Transactional(rollbackFor = Exception.class) + public boolean isTask(String point_code) { + /* + * 判断点位是否有任务存在 + */ + WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); + + boolean result; + + JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { + result = true; + } else { + result = false; + } + + return result; + } + + @Override + public void autoCreate() { + WQLObject wo_ivt = WQLObject.getWQLObject("ST_IVT_StructIvt"); + WQLObject wo_point = WQLObject.getWQLObject("sch_base_point"); + JSONObject jsonObject = wo_ivt.query("region_code = '" + RegionTypeEnum.KLZHCQ.getCode() + "' and (vehicle_code <> '' or vehicle_code is not null) and (material_id <> '' or material_id is not null) ").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) { + Long material_id = jsonObject.getLong("material_id"); + String point_id = jsonObject.getString("point_id"); + JSONObject jsonObject1 = wo_point.query("point_id = '" + point_id + "' and is_delete = '0' and is_used = '1' and lock_type = '1' and point_status = '3'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject1)) { + JSONObject jsonObject2 = wo_point.query("region_code = '" + RegionTypeEnum.GT1.getCode() + "' and is_delete = '0' and is_used = '1' and lock_type = '1'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject2)) { + JSONObject map = new JSONObject(); + map.put("point_code1", jsonObject1.getString("point_code")); + map.put("point_code2", jsonObject2.getString("point_code")); + map.put("material_id", material_id); + map.put("create_mode", "1"); + map.put("is_auto_issue", "1"); + this.createTask(map); + } + } + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql index 729b8ca..1b285be 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/wql/QSCH_TASK_01.wql @@ -17,8 +17,8 @@ 输入.task_status TYPEAS s_string 输入.finished_type TYPEAS s_string 输入.task_type TYPEAS s_string - 输入.point_code1 TYPEAS s_string - 输入.point_code2 TYPEAS s_string + 输入.point_code1 TYPEAS s_string + 输入.point_code2 TYPEAS s_string 输入.task_code TYPEAS s_string 输入.vehicle_code TYPEAS s_string 输入.begin_time TYPEAS s_string @@ -72,7 +72,7 @@ task.create_time <= 输入.end_time ENDOPTION OPTION 输入.unFinish <> "" - task.task_status <> '07' + task.task_status <> '7' ENDOPTION OPTION 输入.task_status <> "" find_in_set( task.task_status, 输入.task_status) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java index 8a910fc..dcd34ee 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java @@ -4,10 +4,6 @@ import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.sch.service.RegionService; -import org.nl.wms.sch.tasks.cpOut.CpOutTask; -import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask; import org.nl.wms.st.bill.service.RegionIoService; import org.nl.wms.st.bill.service.dto.RegionIoDto; import org.springframework.stereotype.Service; @@ -22,7 +18,6 @@ import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.wql.core.bean.ResultBean; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; import lombok.extern.slf4j.Slf4j; @@ -158,8 +153,8 @@ public class RegionIoServiceImpl implements RegionIoService { param.put("vehicle_code", dtoJSONObject.getString("vehicle_code")); // param.put("vehicle_type", vehicle_type); param.put("iostorinv_id", dtoJSONObject.getString("iostorinv_id")); - CpOutTask taskBean = SpringContextHolder.getBean(CpOutTask.class); - String task_id = taskBean.createTask(param); +// CpOutTask taskBean = SpringContextHolder.getBean(CpOutTask.class); +// String task_id = taskBean.createTask(param); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/StructivtService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/StructivtService.java index c753bfb..211e3c0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/StructivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/StructivtService.java @@ -1,8 +1,11 @@ package org.nl.wms.st.structivt.service; import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import org.nl.wms.st.structivt.service.dto.StructivtDto; import org.springframework.data.domain.Pageable; + +import java.util.LinkedList; import java.util.Map; import java.util.List; import java.io.IOException; @@ -68,5 +71,7 @@ public interface StructivtService { * @param jsonArray */ void outInventory(JSONArray jsonArray); + + LinkedList reload(); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/impl/StructivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/impl/StructivtServiceImpl.java index 56cd6cd..8cb77e8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/impl/StructivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/impl/StructivtServiceImpl.java @@ -1,19 +1,28 @@ package org.nl.wms.st.structivt.service.impl; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.RedisUtils; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; +import org.nl.wms.basedata.service.MaterialbaseService; +import org.nl.wms.basedata.service.dto.MaterialbaseDto; +import org.nl.wms.pda.scanGroup.HcwNumEnum; +import org.nl.wms.pda.scanGroup.MyLinkedListService; import org.nl.wms.sch.service.PointService; import org.nl.wms.sch.service.RegionService; import org.nl.wms.sch.service.dto.PointDto; +import org.nl.wms.sch.tasks.RegionTypeEnum; import org.nl.wms.st.structivt.service.StructivtService; import org.nl.wms.st.structivt.service.dto.StructivtDto; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Pageable; + +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -40,45 +49,47 @@ public class StructivtServiceImpl implements StructivtService { private final RegionService regionService; private final PointService pointService; + private final MaterialbaseService materialbaseService; + private final RedisUtils redisUtils; @Override - public Map queryAll(Map whereJson, Pageable page){ - JSONObject map = new JSONObject(); + public Map queryAll(Map whereJson, Pageable page) { + JSONObject map = new JSONObject(); map.put("flag", "1"); - map.put("region_code", "(" + whereJson.get("region_code") + ")"); + map.put("region_code", whereJson.get("region_code")); if (!ObjectUtil.isNull(whereJson.get("point_code"))) { - map.put("point_code", "%" + whereJson.get("point_code") + "%"); + map.put("point_code", "%" + whereJson.get("point_code") + "%"); } - map.put("layer_num", whereJson.get("layer_num")); - map.put("row_num", whereJson.get("row_num")); - map.put("col_num", whereJson.get("col_num")); +// map.put("layer_num", whereJson.get("layer_num")); +// map.put("row_num", whereJson.get("row_num")); +// map.put("col_num", whereJson.get("col_num")); map.put("is_used", whereJson.get("is_used")); map.put("lock_type", whereJson.get("lock_type")); map.put("point_status", whereJson.get("point_status")); map.put("vehicle_type", whereJson.get("vehicle_type")); map.put("begin_time", whereJson.get("begin_time")); map.put("end_time", whereJson.get("end_time")); - JSONObject json = WQL.getWO("ST_IVT_STRUCTIVT").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "point_code asc"); - JSONArray content = json.getJSONArray("content"); - JSONArray res = new JSONArray(); - for (int i = 0; i < content.size(); i++) { - JSONObject cppEntry = content.getJSONObject(i); - String point_status_explain = regionService.findById(cppEntry.getLong("region_id")).getPoint_status_explain(); - String[] split = point_status_explain.split(","); - JSONObject statusMap = new JSONObject(); - for (int j = 0; j < split.length; j++) { - String[] status = split[j].split("-"); - statusMap.put(status[0], status[1]); - } - cppEntry.put("point_status_name", statusMap.getString(cppEntry.getString("point_status"))); - res.add(cppEntry); - } - json.put("content", res); + JSONObject json = WQL.getWO("ST_IVT_STRUCTIVT").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "str.point_code asc"); +// JSONArray content = json.getJSONArray("content"); +// JSONArray res = new JSONArray(); +// for (int i = 0; i < content.size(); i++) { +// JSONObject cppEntry = content.getJSONObject(i); +// String point_status_explain = regionService.findById(cppEntry.getLong("region_id")).getPoint_status_explain(); +// String[] split = point_status_explain.split(","); +// JSONObject statusMap = new JSONObject(); +// for (int j = 0; j < split.length; j++) { +// String[] status = split[j].split("-"); +// statusMap.put(status[0], status[1]); +// } +// cppEntry.put("point_status_name", statusMap.getString(cppEntry.getString("point_status"))); +// res.add(cppEntry); +// } +// json.put("content", res); return json; } @Override - public List queryAll(Map whereJson){ + public List queryAll(Map whereJson) { WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); JSONArray arr = wo.query().getResultJSONArray(0); if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(StructivtDto.class); @@ -89,18 +100,18 @@ public class StructivtServiceImpl implements StructivtService { public StructivtDto findById(Long stockrecord_id) { WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); JSONObject json = wo.query("stockrecord_id = '" + stockrecord_id + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)){ - return json.toJavaObject( StructivtDto.class); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(StructivtDto.class); } return null; } @Override - public StructivtDto findByCode(String code) { + public StructivtDto findByCode(String code) { WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); - JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)){ - return json.toJavaObject( StructivtDto.class); + JSONObject json = wo.query("point_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(StructivtDto.class); } return null; } @@ -128,8 +139,11 @@ public class StructivtServiceImpl implements StructivtService { @Override @Transactional(rollbackFor = Exception.class) public void update(StructivtDto dto) { + WQLObject wo_point = WQLObject.getWQLObject("sch_base_point"); + System.out.println(dto.toString()); // 找主表获取之前的数据 StructivtDto structivtDto = this.findById(dto.getStockrecord_id()); + String region_code = structivtDto.getRegion_code(); if (structivtDto == null) throw new BadRequestException("被删除或无权限,操作失败!"); Long currentUserId = SecurityUtils.getCurrentUserId(); @@ -159,6 +173,10 @@ public class StructivtServiceImpl implements StructivtService { intoBeforeObject.put("vehicle_code", pointDto.getVehicle_code()); intoBeforeObject.put("vehicle_qty", pointDto.getVehicle_qty()); } + // TODO id + if (currentUserId == null) { + currentUserId = 0L; + } intoBeforeObject.put("create_id", currentUserId); intoBeforeObject.put("create_name", nickName); intoBeforeObject.put("create_time", now); @@ -206,7 +224,30 @@ public class StructivtServiceImpl implements StructivtService { // 更新主表 WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + if (ObjectUtil.isEmpty(dto.getMaterial_id())){ + json.put("material_id",""); + } wo.update(json); + + //同时更改点位状态 + String point_status = "1"; + String vehicle_code = dto.getVehicle_code(); + Long material_id = dto.getMaterial_id(); + if (StrUtil.isNotEmpty(vehicle_code)) { + point_status = "2"; + } + if (ObjectUtil.isNotEmpty(material_id)) { + point_status = "3"; + } + JSONObject jsonObject = wo_point.query("point_code = '" + dto.getPoint_code() + "'").uniqueResult(0); + jsonObject.put("point_status",point_status); + jsonObject.put("update_time",DateUtil.now()); + wo_point.update(jsonObject); + + if (StrUtil.equals(region_code, RegionTypeEnum.KLZCQ.getCode()) || StrUtil.equals(region_code, RegionTypeEnum.GT2.getCode())) { + this.reload(); + } + } @Override @@ -217,7 +258,7 @@ public class StructivtServiceImpl implements StructivtService { String now = DateUtil.now(); WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); - for (Long stockrecord_id: ids) { + for (Long stockrecord_id : ids) { JSONObject param = new JSONObject(); param.put("stockrecord_id", String.valueOf(stockrecord_id)); param.put("is_delete", "1"); @@ -243,7 +284,8 @@ public class StructivtServiceImpl implements StructivtService { for (int i = 0; i < jsonArray.size(); i++) { JSONObject structivts = jsonArray.getJSONObject(i); // 如果是空位或者锁定就跳过 - if (structivts.getString("lock_type").equals("2") || !structivts.getString("point_status").equals("3")) continue; + if (structivts.getString("lock_type").equals("2") || !structivts.getString("point_status").equals("3")) + continue; // 插入regionIO - 未锁定,有料位 JSONObject regionIoObj = new JSONObject(); regionIoObj.put("iostorinv_id", IdUtil.getSnowflake(1, 1).nextId()); @@ -259,7 +301,7 @@ public class StructivtServiceImpl implements StructivtService { regionIoObj.put("start_point_code", structivts.getString("point_code")); // 起点 String start_region_id = pointTab.query("point_code = '" + structivts.getString("point_code") + "'").uniqueResult(0).getString("region_id"); if (ObjectUtil.isNotEmpty(start_region_id)) - regionIoObj.put("region_id", structivts.getString("region_id")); + regionIoObj.put("region_id", structivts.getString("region_id")); regionIoObj.put("region_code", structivts.getString("region_code")); regionIoObj.put("region_name", structivts.getString("region_name")); regionIoObj.put("create_mode", "2"); @@ -274,4 +316,66 @@ public class StructivtServiceImpl implements StructivtService { } } + @Override + public LinkedList reload() { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); + WQLObject wo_materia = WQLObject.getWQLObject("md_me_materialbase"); + LinkedList ll = MyLinkedListService.getLinkedList(); + ll.removeAll(ll); + // ll.clear(); + JSONObject jsonObject = wo.query("region_code = '" + HcwNumEnum.GT2.getCode() + "'").uniqueResult(0); + String material_id_gt = jsonObject.getString("material_id"); + JSONObject jsonMa_gt = new JSONObject(); + String material_code_gt2 = ""; + if (StrUtil.isNotEmpty(material_id_gt)) { + jsonMa_gt = wo_materia.query("material_id =" + material_id_gt + "").uniqueResult(0); + material_code_gt2 = jsonMa_gt.getString("material_code"); + } + JSONObject map = new JSONObject(); + if (StrUtil.isNotEmpty(jsonObject.getString("vehicle_code"))) { + map.put("vehicle_code", jsonObject.getString("vehicle_code")); + map.put("vehicle_type", jsonObject.getString("vehicle_type")); + map.put("material_code", material_code_gt2); + ll.addLast(map); + } + JSONArray jsonArray = wo.query("region_code = '" + HcwNumEnum.KLZCQ.getCode() + "'", "point_code").getResultJSONArray(0); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject1 = jsonArray.getJSONObject(i); + String material_id = jsonObject1.getString("material_id"); + String material_code = ""; + if (StrUtil.isNotEmpty(material_id)) { + JSONObject jsonMa = wo_materia.query("material_id =" + material_id + "").uniqueResult(0); + material_code = jsonMa.getString("material_code"); + } + if (StrUtil.isEmpty(jsonObject1.getString("vehicle_code"))) { + int iBefore = i; + boolean flag = false; + for (int j = iBefore - 1; j >= 0; j--) { + JSONObject jsonObject2 = jsonArray.getJSONObject(j); + String vehicle_code = jsonObject2.getString("vehicle_code"); + if (StrUtil.isNotEmpty(vehicle_code)) { + flag = true; + break; + } + } + if (flag) { + map = new JSONObject(); + map.put("vehicle_code", jsonObject1.getString("vehicle_code")); + map.put("vehicle_type", jsonObject1.getString("vehicle_type")); + map.put("material_code", material_code); + ll.addLast(map); + } + } else { + map = new JSONObject(); + map.put("vehicle_code", jsonObject1.getString("vehicle_code")); + map.put("vehicle_type", jsonObject1.getString("vehicle_type")); + map.put("material_code", material_code); + ll.addLast(map); + } + } + redisUtils.set("ll", ll); + System.out.println(ll.size()); + return ll; + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql index 84eaa8e..1b46fd8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql @@ -14,13 +14,13 @@ ## 表字段对应输入参数 ################################################# 输入.flag TYPEAS s_string - 输入.io_region TYPEAS f_string - 输入.region_code TYPEAS f_string + 输入.point_code TYPEAS s_string + 输入.point_status TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + 输入.is_used TYPEAS s_string + 输入.region_code TYPEAS s_string 输入.begin_time TYPEAS s_string 输入.end_time TYPEAS s_string - 输入.bill_code TYPEAS s_string - 输入.bill_status TYPEAS s_string - 输入.io_type TYPEAS s_string 输入.lock_type TYPEAS s_string @@ -49,18 +49,20 @@ PAGEQUERY SELECT str.*, - point.vehicle_type, - point.layer_num, - point.row_num, - point.col_num, point.is_used, point.lock_type, - point.point_status + point.point_status, + materia.material_code, + materia.material_name FROM st_ivt_structivt str LEFT JOIN sch_base_point point ON str.point_id = point.point_id + left join md_me_materialbase materia on materia.material_id = str.material_id WHERE - point.region_code IN 输入.region_code + 1 = 1 + OPTION 输入.region_code <> "" + str.region_code = 输入.region_code + ENDOPTION OPTION 输入.point_code <> "" point.point_code LIKE 输入.point_code ENDOPTION @@ -70,15 +72,6 @@ OPTION 输入.vehicle_type <> "" point.vehicle_type = 输入.vehicle_type ENDOPTION - OPTION 输入.layer_num <> "" - point.layer_num = 输入.layer_num - ENDOPTION - OPTION 输入.row_num <> "" - point.row_num = 输入.row_num - ENDOPTION - OPTION 输入.col_num <> "" - point.col_num = 输入.col_num - ENDOPTION OPTION 输入.lock_type <> "" point.lock_type = 输入.lock_type ENDOPTION diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index 19d2354bfd85d7d85fa9f307756dd234e1738461..c8492d8113edc3df68d0d22893184f1c84ec4021 100644 GIT binary patch delta 40751 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%0A9m2vqa#4~$hoH78D>380Z1KQi_mG~s#@wSguA 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
      lRA+~ zo7J<305=JG*Rue}TBgSVCAX(Fu&^*PExWKir;(+BMa0C?#L3jf)XB^cfv2^xR4^)U zuWSQ0{p=q=1K-S0iI>YIz{yt0+}PaE%-qq<(!j|8f`Kyb&bCUHE|zWK%}63|H-!0X(B7?^h$Rsf42;CM8+9hp*D4rYS}48g5|{ONIhEM}Yy UPeQ;siWyWDsBb^e$Kt>a0N<}zZ2$lO diff --git a/lms/nladmin-system/src/main/resources/config/application-dev.yml b/lms/nladmin-system/src/main/resources/config/application-dev.yml index d3cd31b..b099e46 100644 --- a/lms/nladmin-system/src/main/resources/config/application-dev.yml +++ b/lms/nladmin-system/src/main/resources/config/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 8010 + port: 8011 #配置数据源 spring: datasource: @@ -7,10 +7,10 @@ spring: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy # url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:yongyu_lms2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:yongyu_lms2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hongfeng_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - password: ${DB_PWD:P@ssw0rd} - # password: ${DB_PWD:12356} + #password: ${DB_PWD:P@ssw0rd} + password: ${DB_PWD:password} # 初始连接数 initial-size: 5 # 最小连接数 diff --git a/lms/nladmin-system/src/main/resources/config/application-prod.yml b/lms/nladmin-system/src/main/resources/config/application-prod.yml index ecf4775..37e02e9 100644 --- a/lms/nladmin-system/src/main/resources/config/application-prod.yml +++ b/lms/nladmin-system/src/main/resources/config/application-prod.yml @@ -1,22 +1,26 @@ server: - port: 8010 + port: 8011 #配置数据源 spring: datasource: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:10.16.1.25}:${DB_PORT:3306}/${DB_NAME:whxr_mes}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + # url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:yongyu_lms2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:hongfeng_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - password: ${DB_PWD:whxr_root} + password: ${DB_PWD:P@ssw0rd} + # password: ${DB_PWD:12356} # 初始连接数 initial-size: 5 # 最小连接数 min-idle: 15 # 最大连接数 - max-active: 60 + max-active: 30 + # 超时时间(以秒数为单位) + remove-abandoned-timeout: 180 # 获取连接超时时间 - max-wait: 5000 + max-wait: 3000 # 连接有效性检测时间 time-between-eviction-runs-millis: 60000 # 连接在池中最小生存的时间 @@ -36,11 +40,8 @@ spring: enabled: true stat-view-servlet: enabled: true - # 控制台管理用户名和密码 url-pattern: /druid/* reset-enable: false - login-username: admin - login-password: 123456 filter: stat: enabled: true @@ -51,14 +52,13 @@ spring: wall: config: multi-statement-allow: true - redis: - #数据库索引 - database: ${REDIS_DB:15} - host: ${REDIS_HOST:10.16.1.25} - port: ${REDIS_PORT:6379} - password: ${REDIS_PWD:} - #连接超时时间 - timeout: 5000 +redis: + #数据库索引 + database: ${REDIS_DB:15} + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + password: ${REDIS_PWD:} + # 登录相关配置 login: # 登录缓存 @@ -77,7 +77,7 @@ login: heigth: 36 # 内容长度 length: 2 - # 字体名称,为空则使用默认字体,如遇到线上乱码,设置其他字体即可 + # 字体名称,为空则使用默认字体 font-name: # 字体大小 font-size: 25 @@ -89,36 +89,29 @@ jwt: token-start-with: Bearer # 必须使用最少88位的Base64对该令牌进行编码 base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI= - # 令牌过期时间 此处单位/毫秒 ,默认2小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html - token-validity-in-seconds: 7200000 + # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html + token-validity-in-seconds: 14400000 # 在线用户key online-key: online-token- # 验证码 code-key: code-key- - # token 续期检查时间范围(默认30分钟,单位默认毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期 + # token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期 detect: 1800000 - # 续期时间范围,默认 1小时,这里单位毫秒 + # 续期时间范围,默认1小时,单位毫秒 renew: 3600000 +#是否允许生成代码,生产环境设置为false +generator: + enabled: true + +#是否开启 swagger-ui +swagger: + enabled: true + # IP 本地解析 ip: local-parsing: true -#是否允许生成代码,生产环境设置为false -generator: - enabled: false - -#如果生产环境要开启swagger,需要配置请求地址 -#springfox: -# documentation: -# swagger: -# v2: -# host: # 接口域名或外网ip - -#是否开启 swagger-ui -swagger: - enabled: false - # 文件存储路径 file: mac: @@ -135,5 +128,29 @@ file: avatarMaxSize: 5 logging: file: - path: /app/jar/logs + path: C:\log\wms config: classpath:logback-spring.xml + +# Sa-Token配置 +sa-token: + # token 名称 (同时也是cookie名称) + token-name: Authorization + # token 有效期,单位s 默认30天, -1代表永不过期 + timeout: 2592000 + # token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 + activity-timeout: -1 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # token风格 + token-style: random-128 + # 是否输出操作日志 + is-log: false + jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq + # token 前缀 + token-prefix: Bearer + +loki: + url: http://localhost:3100/loki/api/v1 + systemName: lms diff --git a/lms/nladmin-system/src/main/resources/config/application-test.yml b/lms/nladmin-system/src/main/resources/config/application-test.yml index 250e563..37e02e9 100644 --- a/lms/nladmin-system/src/main/resources/config/application-test.yml +++ b/lms/nladmin-system/src/main/resources/config/application-test.yml @@ -1,38 +1,22 @@ server: - port: 8010 -#ERP系统相关 -erp: - oracle: - enabled: false - jdbcurl: jdbc:oracle:thin:@192.168.81.251:1522:ORCL2 - username: system - password: 123456 - sqlserver: - enabled: false - jdbcurl: jdbc:sqlserver://47.97.157.227:1433;DatabaseName=testdb-lx - username: sa - password: Nl@123 - + port: 8011 #配置数据源 spring: datasource: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - # url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:whxr}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:whxr_mes1}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + # url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:yongyu_lms2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:hongfeng_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - password: ${DB_PWD:Root.123456} - # username: ${DB_USER:root} - # password: ${DB_PWD:root} + password: ${DB_PWD:P@ssw0rd} + # password: ${DB_PWD:12356} # 初始连接数 initial-size: 5 # 最小连接数 min-idle: 15 # 最大连接数 max-active: 30 - # 是否自动回收超时连接 - remove-abandoned: true # 超时时间(以秒数为单位) remove-abandoned-timeout: 180 # 获取连接超时时间 @@ -68,18 +52,17 @@ spring: wall: config: multi-statement-allow: true - redis: - #数据库索引 - database: ${REDIS_DB:1} - host: ${REDIS_HOST:47.111.78.178} - port: ${REDIS_PORT:6379} - password: ${REDIS_PWD:} - #连接超时时间 - timeout: 10000 +redis: + #数据库索引 + database: ${REDIS_DB:15} + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + password: ${REDIS_PWD:} + # 登录相关配置 login: # 登录缓存 - cache-enable: false + cache-enable: true # 是否限制单用户登录 single-login: false # 验证码 @@ -147,3 +130,27 @@ logging: file: path: C:\log\wms config: classpath:logback-spring.xml + +# Sa-Token配置 +sa-token: + # token 名称 (同时也是cookie名称) + token-name: Authorization + # token 有效期,单位s 默认30天, -1代表永不过期 + timeout: 2592000 + # token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 + activity-timeout: -1 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # token风格 + token-style: random-128 + # 是否输出操作日志 + is-log: false + jwt-secret-key: opsjajisdnnca0sdkksdfaaasdfwwq + # token 前缀 + token-prefix: Bearer + +loki: + url: http://localhost:3100/loki/api/v1 + systemName: lms diff --git a/lms/nladmin-ui/.env.development b/lms/nladmin-ui/.env.development index 809e77f..a8d9977 100644 --- a/lms/nladmin-ui/.env.development +++ b/lms/nladmin-ui/.env.development @@ -1,7 +1,7 @@ ENV = 'development' # 接口地址 -VUE_APP_BASE_API = 'http://localhost:8010' +VUE_APP_BASE_API = 'http://localhost:8011' VUE_APP_WS_API = 'ws://localhost:8010' # 是否启用 babel-plugin-dynamic-import-node插件 diff --git a/lms/nladmin-ui/src/App.vue b/lms/nladmin-ui/src/App.vue index 3f8e408..2f82bcc 100644 --- a/lms/nladmin-ui/src/App.vue +++ b/lms/nladmin-ui/src/App.vue @@ -1,5 +1,5 @@ @@ -7,63 +7,29 @@ - - diff --git a/lms/nladmin-ui/src/views/wms/st/cppoint/cppInventory.vue b/lms/nladmin-ui/src/views/wms/st/cppoint/cppInventory.vue deleted file mode 100644 index b43ea6c..0000000 --- a/lms/nladmin-ui/src/views/wms/st/cppoint/cppInventory.vue +++ /dev/null @@ -1,274 +0,0 @@ - - - - - diff --git a/lms/nladmin-ui/src/views/wms/st/cppoint/cppOutRegion.vue b/lms/nladmin-ui/src/views/wms/st/cppoint/cppOutRegion.vue deleted file mode 100644 index 341e3ae..0000000 --- a/lms/nladmin-ui/src/views/wms/st/cppoint/cppOutRegion.vue +++ /dev/null @@ -1,206 +0,0 @@ - - - - - diff --git a/lms/nladmin-ui/src/views/wms/st/cppoint/index.vue b/lms/nladmin-ui/src/views/wms/st/cppoint/index.vue deleted file mode 100644 index 2f86547..0000000 --- a/lms/nladmin-ui/src/views/wms/st/cppoint/index.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - - - diff --git a/lms/nladmin-ui/src/views/wms/st/ysa/index.vue b/lms/nladmin-ui/src/views/wms/st/ysa/index.vue index dac044e..897062a 100644 --- a/lms/nladmin-ui/src/views/wms/st/ysa/index.vue +++ b/lms/nladmin-ui/src/views/wms/st/ysa/index.vue @@ -5,24 +5,24 @@ 库存查询 - - - - - - - + + + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/ysa/inventory.vue b/lms/nladmin-ui/src/views/wms/st/ysa/inventory.vue index 7198832..8a6aaa9 100644 --- a/lms/nladmin-ui/src/views/wms/st/ysa/inventory.vue +++ b/lms/nladmin-ui/src/views/wms/st/ysa/inventory.vue @@ -20,35 +20,22 @@ @keyup.enter.native="crud.toQuery" /> - - + - - - - - - + @change="hand" + > + + - + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + - + @@ -196,16 +236,46 @@ import rrOperation from '@crud/RR.operation' import crudOperation from '@crud/CRUD.operation' import udOperation from '@crud/UD.operation' import pagination from '@crud/Pagination' +import crudPoint from '@/api/wms/sch/point' +import MaterDtl from '@/views/wms/pub/MaterDialog' +import crudVehicle from '@/views/wms/basedata/vehicle/vehicle' -const defaultForm = { point_id: null, point_code: null, pcsn: null, material_id: null, ivt_qty: null, qty_unit_id: null, instorage_time: null, ext_code: null, point_status: null, vehicle_type: null, standing_time: null, block_num: null, row_num: null, col_num: null, layer_num: null, remark: null, is_used: null, is_lock: null, create_id: null, create_name: null, create_time: null, update_optid: null, update_optname: null, update_time: null } +const defaultForm = { + point_id: null, + point_code: null, + pcsn: null, + material_id: null, + ivt_qty: null, + qty_unit_id: null, + instorage_time: null, + ext_code: null, + point_status: null, + vehicle_type: null, + standing_time: null, + block_num: null, + row_num: null, + col_num: null, + layer_num: null, + remark: null, + is_used: null, + is_lock: null, + create_id: null, + create_name: null, + create_time: null, + update_optid: null, + update_optname: null, + update_time: null, + material_code: '', + material_name: '' +} export default { name: 'Inventory', - components: { pagination, crudOperation, rrOperation, udOperation }, + components: { pagination, crudOperation, rrOperation, udOperation, MaterDtl }, dicts: ['sch_point_status', 'vehicle_type', 'is_used', 'd_lock_type'], mixins: [presenter(), header(), form(defaultForm), crud()], cruds() { return CRUD({ - title: '养生A区', + title: '库存查询', url: 'api/structivt', idField: 'point_id', sort: 'point_id,desc', @@ -216,16 +286,15 @@ export default { download: false, reset: true }, - query: { - region_code: "'YSQA01', 'YSAQKTPQ01'" - }, crudMethod: { ...crudStructivt } }) }, data() { return { - permission: { - }, + permission: {}, + region_code_list: [], + vehicleList: [], + materialShow: false, rules: { is_used: [ { required: true, message: '是否启用不能为空', trigger: 'blur' } @@ -236,16 +305,34 @@ export default { } } }, + created() { + crudPoint.getRegion().then(res => { + this.region_code_list = res + }) + }, methods: { // 钩子:在获取表格数据之前执行,false 则代表不获取数据 [CRUD.HOOK.beforeRefresh]() { return true }, + getVehicleByType(type) { + if (type !== '' && type !== null && type !== undefined) { + crudVehicle.getVehicleByType(type).then(res => { + this.vehicleList = res + }) + } + }, + // 新增编辑给form表单物料相关信息赋值 + setMaterValue(row) { + this.form.material_id = row.material_id + this.form.material_code = row.material_code + this.form.material_name = row.material_name + }, hand(value) { // 块排列 的参数整合 - if (this.locations.length > 0) { - this.query.locationsOptions = this.locations[0] + '/' + this.locations[1] + '/' + this.locations[2] - } + // if (this.locations.length > 0) { + // this.query.locationsOptions = this.locations[0] + '/' + this.locations[1] + '/' + this.locations[2] + // } this.crud.toQuery() } }