From 10ef6e83363b1e9e9f45a57b87bfd4619423ebbc Mon Sep 17 00:00:00 2001 From: zhangzq Date: Wed, 8 Apr 2026 13:49:38 +0800 Subject: [PATCH] =?UTF-8?q?init=EF=BC=9A=E7=BB=93=E6=9E=84=E9=87=8D?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- acs2/nladmin-system/doc/wms.xls | Bin 295936 -> 0 bytes ...裕家居LMS系统.postman_collection.json | 489 ------------------ .../src/main/java/org/nl/AppRunInit.java | 35 ++ .../initial => }/ApplicationAutoInitial.java | 2 +- .../controller}/AcsToKitController.java | 5 +- .../controller}/KitToAcsController.java | 4 +- .../service/AcsToKitService.java | 2 +- .../service/KitToAcsService.java | 2 +- .../service}/enums/MsgTypeEnum.java | 2 +- .../service}/enums/TaskPhaseEnum.java | 2 +- .../service}/enums/TaskStateEnum.java | 2 +- .../service/impl/AcsToKitServiceImpl.java | 6 +- .../service/impl/KitToAcsServiceImpl.java | 20 +- .../controller}/AddressController.java | 11 +- .../service/AddressService.java | 8 +- .../service/dto/AddressDto.java | 2 +- .../service/dto/AddressQueryParam.java | 2 +- .../service/entity}/Address.java | 2 +- .../service/impl/AddressServiceImpl.java | 12 +- .../service/mapper/AddressMapper.java | 4 +- .../main/java/org/nl/acs/api/wms/AcsUtil.java | 50 -- .../main/java/org/nl/acs/api/wms/LmsUtil.java | 49 -- .../AcsToWmsController.java | 2 +- .../WmsToAcsController.java | 2 +- .../acs/autoThread/AbstractAutoRunnable.java | 67 +++ .../java/org/nl/acs/autoThread/AcsInit.java | 43 -- .../org/nl/acs/autoThread/StartConfig.java | 21 + .../{ => controller}/AutoRunController.java | 24 +- .../ApplicationAutoInitialExecuter.java | 47 -- .../autoThread/initial/WebAutoInitial.java | 14 - .../initial/WebAutoInitialExecuter.java | 39 -- .../autoThread/run/AbstractAutoRunnable.java | 120 ----- .../nl/acs/autoThread/run/AutoRunService.java | 58 --- .../autoThread/run/AutoRunServiceImpl.java | 249 --------- .../nl/acs/autoThread/run/DevelopConfig.java | 24 - .../nl/acs/autoThread/run/SystemConfig.java | 26 - .../org/nl/acs/autoThread/run/ThreadDto.java | 139 ----- .../run/TwoNDCSocketConnectionAutoRun.java | 354 ------------- .../autoThread/service/AutoRunService.java | 40 ++ .../autoThread/service/dto/AutoRunDto.java | 24 + .../enums}/ThreadStatusEnum.java | 2 +- .../enums}/ThreadUsedStatusEnum.java | 2 +- .../service/impl/AutoRunServiceImpl.java | 133 +++++ .../acs/autoThread/初始化自动线程.md | 15 + .../DeviceAssignedController.java | 2 +- .../DeviceController.java | 30 +- .../DeviceDbitemController.java | 2 +- .../DeviceErpmappingController.java | 2 +- .../DeviceExtraController.java | 2 +- .../DeviceRunpointController.java | 2 +- .../DeviceisonlineController.java | 2 +- .../device/service/DeviceAssignedService.java | 2 +- .../device/service/DeviceDbitemService.java | 2 +- .../DeviceDriverDefinationAppService.java | 6 +- .../service/DeviceErpmappingService.java | 2 +- .../device/service/DeviceExtraService.java | 23 +- .../device/service/DeviceRunpointService.java | 2 +- .../device/device/service/DeviceService.java | 4 +- .../device/service/DeviceisonlineService.java | 2 +- .../device/{ => service}/domain/Device.java | 6 +- .../{ => service}/domain/DeviceAssigned.java | 2 +- .../{ => service}/domain/DeviceDbitem.java | 2 +- .../domain/DeviceErpmapping.java | 2 +- .../{ => service}/domain/DeviceExtra.java | 2 +- .../{ => service}/domain/DeviceMybatis.java | 2 +- .../{ => service}/domain/DeviceRunpoint.java | 2 +- .../{ => service}/domain/Deviceisonline.java | 2 +- .../device/{ => service}/domain/ItemDto.java | 4 +- .../{ => service}/enums/DeviceType.java | 2 +- .../device/{ => service}/enums/ErrorType.java | 2 +- .../impl/DeviceAssignedServiceImpl.java | 2 +- .../service/impl/DeviceDbitemServiceImpl.java | 2 +- .../impl/DeviceErpmappingServiceImpl.java | 4 +- .../service/impl/DeviceExtraServiceImpl.java | 13 +- .../impl/DeviceRunpointServiceImpl.java | 2 +- .../service/impl/DeviceServiceImpl.java | 26 +- .../impl/DeviceisonlineServiceImpl.java | 2 +- .../service/mapper/DeviceAssignedMapper.java | 2 +- .../service/mapper/DeviceDbitemMapper.java | 2 +- .../mapper/DeviceErpmappingMapper.java | 2 +- .../service/mapper/DeviceExtraMapper.java | 2 +- .../device/service/mapper/DeviceMapper.java | 2 +- .../device/service/mapper/DeviceMappers.java | 2 +- .../service/mapper/DeviceRunpointMapper.java | 2 +- .../service/mapper/DeviceisonlineMapper.java | 2 +- .../RequestMethodEnum.java | 2 +- .../controller/DeviceDriverController.java | 53 ++ .../StandardOrdinarySiteDefination.java | 10 +- .../StandardOrdinarySiteDeviceDriver.java | 16 +- .../driver/AbstractDeviceDriver.java | 15 + .../driver/ExecutableDeviceDriver.java | 4 +- .../driver/ItemValue.java | 2 +- .../deviceDriver/driver/OpcDeviceDriver.java | 31 ++ .../设备类型驱动}/DeviceDriver.java | 5 +- .../DeviceDriverDefination.java | 6 +- .../AbstractOpcDeviceDriver.java | 138 ++++- .../impl/opcDefination/ItemProtocolP.java | 24 + .../OpcDeviceDriverDefination.java | 20 + .../standardInspectSite/ItemProtocol.java | 48 ++ .../StandardInspectSiteDefination.java | 14 +- .../StandardInspectSiteDeviceDriver.java | 22 +- .../StandardOrdinarySiteDefination.java | 49 ++ .../StandardOrdinarySiteDeviceDriver.java | 236 +++++++++ .../cotroller/DeviceProtocolController.java | 66 +++ .../service/DeviceProtocolService.java | 55 ++ .../impl/DeviceProtocolServiceImpl.java | 270 ++++++++++ .../acs/device/deviceProtocol/设备协议.md | 7 + .../device_driver/RouteableDeviceDriver.java | 19 - .../standard_inspect_site/ItemProtocol.java | 114 ---- .../defination/OpcDeviceDriverDefination.java | 20 - .../driver/AbstractDeviceDriver.java | 48 -- .../device_driver/driver/OpcDeviceDriver.java | 245 --------- .../controller}/StorageCellController.java | 6 +- .../service/StorageCellService.java | 12 +- .../service/dto/StorageCellDto.java | 7 +- .../service/dto/StorageCellQueryParam.java | 2 +- .../service/entity}/StorageCell.java | 29 +- .../service/impl/StorageCellServiceImpl.java | 168 ++---- .../service/mapper/StorageCellMapper.java | 4 +- .../nl/acs/device/storageMgt/货位管理.md | 7 + .../org/nl/acs/iot/opc/DeviceAppService.java | 6 +- .../nl/acs/iot/opc/DeviceAppServiceImpl.java | 12 +- .../DeviceDriverDefinationAppServiceImpl.java | 6 +- .../nl/acs/iot/opc/DeviceExecuteAutoRun.java | 6 +- .../acs/iot/opc/DeviceManageServiceImpl.java | 4 +- .../iot/opc/DeviceOpcSynchronizeAutoRun.java | 2 +- .../org/nl/acs/iot/opc/OpcServerService.java | 2 +- .../nl/acs/iot/opc/OpcServerServiceImpl.java | 4 +- .../main/java/org/nl/acs/iot/opc/OpcUtl.java | 2 +- .../impl/DeviceStageMonitorServiceImpl.java | 2 +- .../service/impl/InstructionServiceImpl.java | 9 +- .../service/impl/RouteLineServiceImpl.java | 8 +- .../task/service/impl/TaskServiceImpl.java | 8 +- .../java/org/nl/common/db/CommonMapper.java | 1 - .../utils/socket/SocketListenerAutoRun.java | 2 +- .../service/dict/impl/SysDictServiceImpl.java | 2 +- .../log/OneNDCSocketConnectionAutoRun.xml | 2 +- .../log/TwoNDCSocketConnectionAutoRun.xml | 2 +- 138 files changed, 1652 insertions(+), 2538 deletions(-) delete mode 100644 acs2/nladmin-system/doc/wms.xls delete mode 100644 acs2/nladmin-system/doc/永裕家居LMS系统.postman_collection.json create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/AppRunInit.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/{acs/autoThread/initial => }/ApplicationAutoInitial.java (90%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit/rest => agvKit/controller}/AcsToKitController.java (81%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit/rest => agvKit/controller}/KitToAcsController.java (94%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit => agvKit}/service/AcsToKitService.java (83%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit => agvKit}/service/KitToAcsService.java (85%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit => agvKit/service}/enums/MsgTypeEnum.java (96%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit => agvKit/service}/enums/TaskPhaseEnum.java (96%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit => agvKit/service}/enums/TaskStateEnum.java (94%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit => agvKit}/service/impl/AcsToKitServiceImpl.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{kit => agvKit}/service/impl/KitToAcsServiceImpl.java (94%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{address/rest => apiAdd/controller}/AddressController.java (88%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{address => apiAdd}/service/AddressService.java (93%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{address => apiAdd}/service/dto/AddressDto.java (94%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{address => apiAdd}/service/dto/AddressQueryParam.java (76%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{address/domain => apiAdd/service/entity}/Address.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{address => apiAdd}/service/impl/AddressServiceImpl.java (96%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/{address => apiAdd}/service/mapper/AddressMapper.java (68%) delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/AcsUtil.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/LmsUtil.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/{rest => controller}/AcsToWmsController.java (90%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/{rest => controller}/WmsToAcsController.java (90%) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AbstractAutoRunnable.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AcsInit.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/StartConfig.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/{ => controller}/AutoRunController.java (75%) delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/ApplicationAutoInitialExecuter.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/WebAutoInitial.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/WebAutoInitialExecuter.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AbstractAutoRunnable.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AutoRunService.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AutoRunServiceImpl.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/DevelopConfig.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/SystemConfig.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadDto.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/TwoNDCSocketConnectionAutoRun.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/AutoRunService.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/dto/AutoRunDto.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/{run => service/enums}/ThreadStatusEnum.java (91%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/{run => service/enums}/ThreadUsedStatusEnum.java (89%) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/impl/AutoRunServiceImpl.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/初始化自动线程.md rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{rest => controller}/DeviceAssignedController.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{rest => controller}/DeviceController.java (86%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{rest => controller}/DeviceDbitemController.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{rest => controller}/DeviceErpmappingController.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{rest => controller}/DeviceExtraController.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{rest => controller}/DeviceRunpointController.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{rest => controller}/DeviceisonlineController.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/Device.java (95%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/DeviceAssigned.java (96%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/DeviceDbitem.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/DeviceErpmapping.java (96%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/DeviceExtra.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/DeviceMybatis.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/DeviceRunpoint.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/Deviceisonline.java (97%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/domain/ItemDto.java (80%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/enums/DeviceType.java (95%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/{ => service}/enums/ErrorType.java (93%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver => deviceDriver}/RequestMethodEnum.java (99%) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/controller/DeviceDriverController.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver => deviceDriver}/conveyor/standard_ordinary_site/StandardOrdinarySiteDefination.java (75%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver => deviceDriver}/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java (95%) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/AbstractDeviceDriver.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver => deviceDriver}/driver/ExecutableDeviceDriver.java (80%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver => deviceDriver}/driver/ItemValue.java (93%) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/OpcDeviceDriver.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver => deviceDriver/设备类型驱动}/DeviceDriver.java (92%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver => deviceDriver/设备类型驱动}/DeviceDriverDefination.java (79%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver/driver => deviceDriver/设备类型驱动/impl/opcDefination}/AbstractOpcDeviceDriver.java (72%) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/ItemProtocolP.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/OpcDeviceDriverDefination.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/ItemProtocol.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver/conveyor/standard_inspect_site => deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite}/StandardInspectSiteDefination.java (70%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{device_driver/conveyor/standard_inspect_site => deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite}/StandardInspectSiteDeviceDriver.java (96%) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/ordinaryDefination/standardOrdinarySite/StandardOrdinarySiteDefination.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/ordinaryDefination/standardOrdinarySite/StandardOrdinarySiteDeviceDriver.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/cotroller/DeviceProtocolController.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/service/DeviceProtocolService.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/service/impl/DeviceProtocolServiceImpl.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/设备协议.md delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/RouteableDeviceDriver.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/ItemProtocol.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/defination/OpcDeviceDriverDefination.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/AbstractDeviceDriver.java delete mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/OpcDeviceDriver.java rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{storage_cell/rest => storageMgt/controller}/StorageCellController.java (92%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{storage_cell => storageMgt}/service/StorageCellService.java (90%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{storage_cell => storageMgt}/service/dto/StorageCellDto.java (90%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{storage_cell => storageMgt}/service/dto/StorageCellQueryParam.java (74%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{storage_cell/domain => storageMgt/service/entity}/StorageCell.java (78%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{storage_cell => storageMgt}/service/impl/StorageCellServiceImpl.java (56%) rename acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/{storage_cell => storageMgt}/service/mapper/StorageCellMapper.java (83%) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/货位管理.md diff --git a/acs2/nladmin-system/doc/wms.xls b/acs2/nladmin-system/doc/wms.xls deleted file mode 100644 index b03532edec6ba865c1794a2e1f4a1667584acb4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295936 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≶}^AQsmSkvYgtLga(+~(xM}yBBL} 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

{UCXuLUN%g zGUJ@IQR7tlHYR{*Fv06yJ)U4=9^#~`e~icY+&<#v?9}2Ea*$YzrO8rXj6nl1`%wv3 zx!6KJ3Y=-_ki4!;((BreB@%7%`drBfIFGHdO-s$Lgw8+Vu7q3%iNS*_3dqRe zi#=&BoQi|d6m4(i)pZLBX&+Y_W7T}BH-lU?%_inG$g*i!h_a_4V{rLxBmQ3TbiRE* zM}4lHn0QYK0?V)D?U~jNu8{uq)|Mu8iO2icwoSopIU|}EW?jmhkIU{z_&GuMNqXa< zK$)gBbS%Nis>0-h9b2Xj!ZujAyh)I`PNR^_9>&$VqBz zA-r)=#7^~0HOV8;LE1F5eHXf0nsn!pXxYfylYP+n1fZ)4!c}G`grvn+I#NZo0AnKg za862=7ZO@py#^N|@x(<80yA^f8TwsHqumRE z(k&8U;}_k9mtwVRL^6G)=)urBbdBu=?oCG;v_S8V+chC<%$$IaV-k?SKIJ7E;MC^g0;|H95qNDjLL83x!=o)M4U*znkF^$s3QU| zh||$pY#|8qCp9p=Q4d;Z1a~Qm1sBZ4a=Tt?7Tn8?u#t9IK+bbxzI6D9N_Or3tnY7(*gzoyFM& zd?m#J^{D2m#T?I1Gx#HI~D!ULQT`kX2q@>igYa74wENjIBpk8T?1)j{nzW>x-N?`?Si za>>WIkA6iXG^!>}D6Eeq9a(sx9~{4tnUf{rQL8x`yOb<6Y9H82MBV>FK$^O63+#42 zvcN(~RDM$i7sdioHdKR3{;cW0GYiVttf_?^80B@3V=3 zkT@Jq=-TKW$4RE~9;Vd4W%}V?} zfp@6ELm9Jc!f0=zBv%&N5>W>af9!c>4_@k4#maFPZZ$(=(aai}BtZ zcR|cDI#yB;$>n=F!7bm*30yuoSD_a(JDJ4Yy<&S0ZS-d%`YIwI!HgnbT2dfA%FK*O z6~xl~tpP-}*TIVflzExsavWa*$&9e@8XTKtFI%q~Dw{%g+UCOwK&vEDbCAfGYzi`L z*AsCGUQS{1@yexgs|2){hnb8ga$#2H7^|?zHV{-8pMuKNJSeinXxP>~OqSw_MC8Q> z=-9e}cdivLg^1aEJ>;gwP6G$Kmsb$dl)s%&%>A%@*)pRlTU4SkrEPDcwe*=G9^FEz zc!O1cO@vMm3C2(KhA7@LFjsO8&VtFvpZCL~nxg1Hrm$pQO|AY#^n<{3sMC$H%EoMCpfNPceECTE!iXogT$l2BZ^`Xv+-k2q?k$jfSJc zF*u@eoNPNdypPXc>tloJQSQ+J4gT^0{9Jk37~_83mG4pEqSE#uK7~m$;B*8?a5?R} zpiM#ja02iMG}7Vtfe?EHfhNeO2&f5i_d=7k6a%Q6Av0fE#G_HJYGEnVJ%pqdRF%!+ z|C+hO6@?82JPF?;A!|a|*71bz=9Br!k2~w;uFvYa)nwgA!?*6ZmjUP-Z_A_-azKCFlTpS}&&WoTdxzX!f@1)Dgjx2Y2@BT+m)DOEVW+(4n^I&IiJ7G?MY@BO2}1Q~QoJ(Y_PKQSwM;F} z1fvOBVrV{$f?l$X(CB9dx)cSMM~`ct8Ikp$yJZGFwFi8JF33_;9z!@e@|em7Y)QUu zot%Sk0U~)xPD!rKZcH5Lm{FO7h#v$8af+!-q`PAMtX%oIDG%W_@v4aS56%tn#TD;j zV4Z?a{Glza8l3}7?@-Wr+vpbQM^Negehtg{8vVc~Tj~wP6%*??hg`!s?+v;edOv;wpSgag_D+5#wj1g>}s4LiLw7(BhB zhWA_m9RM8xodBHyT>xDH-2gWOx&tVEPh5KedIS0Z`U3g^`U3_41_A~F1_N#Z3;_%U z+zO!d!*PuP!~)^~BLE`-@qh$CB489?G++#1EFcMR8-UV}!*x7h0w4u25s(T<1Ed2o z0NBHfnHCK$Si|%k&XomB0#N!~T=M|=fC4}vU<#lJPz)#mlmf~CQvuTe(*ZL8GXb*z z#Agn!D**EVeLMJ{$T@f*bn8^@b4RV7_z_?H3JUOa8hbFV)P(h4P&fx8z%TjYmzx@~ z^CkT7)d3c7;d)1yul5R_Elo}!)m-<-QO6gC050F*>W6C-m_Wwz%HaMp<$w>++O%Wm zR@0Mod|wQB9^W1GfKlsL{=05;SFsOPm#`6ln?IR8NkAV5ew2pakun`n%>W!pinA^H zmzIvm;{h({!S6r;U3~@jv~SO-Sl8 ziaA={OJRvkb|7NXAR1?J`lNJY>(>p+DKwM`g{S#*>G1^hstMbImz`SXO2JfyZSZW$ zr)}1s*kC}vP4e^jKW(ptnDS9Aa0`b>St!F?QQ{1Gb(qge$ORE&6e@AsEE;lhS?HTg zDrBL4TqTPLIP@Pw=3!bAJVy#VN*uh$P)?74*XU|E zS>`EtKeVHir*ZlYuKRIqf$pK>4&;mLE?h&JcrY6aD99i z8W_5bRnOzp8(in^#wj}W;AvmLX+Y>k+PtV~^U;-bdI={HHH7DW88V|w8TJZvfNo{R zt2l|LiKgAY2dC|zd&z!{pCZ)ob$DPnif?fZhjaP;4fGCZ>#nzO;t=$<=WWOieZBP# z$_YK~dlx+)^mKeLdNb(f`}fcTK`){2quk^HaqSJg9R2{kAoOu*Kb#iy5OV->;rbD- zwV;pD2XPt_uFvB7Gp={H5B^Tdl)?}^zq3N^pZ7^&r#$9y)-(eY01#Xn2&Ih zQXQ1 ze?@sG|A{@$N!BU4RVK<^C*BeGqi==!{Oa;L4BnM)&Xe72Q0;BZD6n9 zwWcS89x=?fxP>Vw#~qN)$N zGUTt@&$qjE!_K~eEx%o`_wK!q%zFL3`&-o6_wmlHqyD@y{AgnTZO%Hm5hpud+1TS; z(W^}>?Rsn7hOM_g{d51DT72K|mhqcUca1x_ee{y~4eIqw-CS+muP^O+CA{mM^M)>2 zAHR9#SA|)_clNq_Wl__Wj~%_*&F6#8Wv%A@J+JD4(vhFl`+mu)Zs+z5IC0+h`5leN z_WJ4kAM09tvGTc>`gDnX^40-?w?F&(J;#37_Q&9Tb^1rX|6=RkA|JbH$)*EIZzldx zf5$fyT%C_}-ge6QbCqQ^-r5noB;`<+vwpj;UhA=O$q%0%Ps)Ae^SgK6J*&%v{jqP9 z*P8fSpKoe@xPNZ)Txf)%KC8YqAK&`*>(Emd=pUx8!8hj?w~wU13s)SP^j1{xofj6p zdi#;tBagmSuVq>L%_|4Ae{{BXHhgY&Si?^ne*bCQ-hj$42QGZbi>Uu9}i^qUpMg_0Mz}{^4(R;!kv)_|%GR`^ukv zD{BA7xHslL9dUk;Uw+qnhv$5mwrN}Ya|y4m+~#`XSd+uMUijnq-zbW`pp&Pst#dmH zcozURsFh^9@?7mre`DA?nnh$G!TVz>zvZmn_w4LVQ&*nsn*MV5ptPMIJoWNrZNP>G z{q{b5^r25roIiJa*Mp~Pee}SvkfewWl|t@v9f(}K`{JyKtqr$*GNjQv5xHmg*8b|- zY4!F!x4h=*q3;!soZbARm5a9T`rLVZ*G(TayAbjDgcn;(>b3NiG2eW6rOg+EzQ3te zWuIbV&c^eGm6)(ed)33*|HCTpsuGKT)aQtPC7F{gbNSjhW;K%Xx2ar{$l#@pQ{_uePpExcy_~p@N)3^D&y(2N|NYzPS)r}~a zko<1LKf<=eCM74G==$2M@p~rD+L1QxuI$7P+pjd-{+~}<&i0)+DfGnmzrFP8jG>3L z!g>o1j$YgLz~H&Bo@$dly6@#FtIBpCf3owqS&RPpZo&TTv0FdPJ->78BLNvr8&>)K zw@+?MpZv}n4OhO?weH2`2S@LI`KvP_?|pHi&c(m~vwhbcOS?Y2?#Qnb9orj!a^dS^ z!`@r?Y~%K`8lU-oSEJsy^y_r*lr2far#-P@+xK5&v~8*XPV5)rS22 z=8i|P=icwu0(2iqUsa53PGHT8ScdVf)~1GV;zI6QpU?N>Sme;d8^%GGyvKb_KZ z0HD{LU;q03NHzS#Thl&QPaQ3)^V6A5Peji8?YGvi&Hba<)gMoed3xilul9b>_MfjW z^uGG--nhT}4%z(T!1jISUj5*gt?gg?{r3|E8>gK~_F3`7#bz;!2kzb%`pMTp-(&`# zyES(37il-$5xwQ3+Q~UBrrg!JZneKR-qrZmAM0m+eEav+Pb|3NcW;fR7vKGLe)EgY zIthb%)hc**iSK9UHud`~UFso7?00lds;{eZwEmooaPwWR0CZ9amf&@Mfcqr(RE3RI};6X0c;GIE#X+jq;C+`FgqRKIVMr(BH*?>J}og`G)Xge`icQt$P6mc#()o}#AN;-X{*V1?CQN$x^&aQDZ~FG3kMfhhJbnD9Ssg!Ju>H_|J$tln zdpYNY)uk_e@Xoq_{`}zAE*rPZ^y`p5<>?v8n@^Aa_Dr9Y&2b-m{lU`*eklrGbKBHK z&;Qxw)oEWm|Hb7U)4tHUZCVy`Y}u;hqtBhI@%*Dxng(?CFAi^czFE7aXGebBX-84v zs@F3^YK)uRcT~^CQv$Zn`n=@NRr`nDQo}Xw&7`BjGjk?yDQq<2a*I!nWz|X^&|>t< zvvTho^IPGRT5a~#dpxZ8=XUkBPxATN_56&^tt-FuckRs5cE?_P@uTJ0TY7f??AA5A zmK^xD@$d;x1l+#4^QJ@n4mX~^=ERvHPba+<8rZSJ@v_~$+kW=Q_S<@<+_f}g+1?gc zRvn*tf`}W0`9IJZUfi;=)`fu2Ed(eiBXQTJM{(b!Jwd)2IHm%(@^{s#QXLL#G zeI@fhBlgEE=>FNVu`jm||KZsD;X`&UcjXRvYxwzQug4$Q_x@`~{hpn$)@S3SlHP4b zpJ-O^pXfHP-~H6&eHs1xk18#54gB=rp076F8&^B@_Gz;g4$f_RIr@c^JKKKKaZ8QJ ze!~YHZeLisb$i~H&%W5udi-y1?mzQGx6GtvzZCr^;koxRs&w6S+xrtwwf$m#{)Cgu zi|USf=dr(9J{})(uKfPCGy2T0vgD&@F82-Gz1OGtgKd7CSEY9Gw*E=O-`X>;&YQ=o zF0S*!KZ|k#+rIEtmvaA`kCo>gOlr_-``K}iU(Q+Rx9IO7?<`o^D|}e1s|TH<4_%2I zcF*~R!v~Ifd(Hi|XAZ0y)bP6oFKoGTS$n7YcU#tf>3aQ4?7I*BxiRZ-_|cfy&Zjrr zI{K$qyHxt;r-OT2bqqg$JoUrFwJx_G)aiIpkESo5ifDiN)DvMd(oSV|zU#?u%j+*2 z^Zeq`n;X@7yI0t_!vE~5J-OexHJQyCO`9?@y zGxG2~5AHo(w^P~44KMz%VcaXj)4#4$mYcUXwsYrcmox5q^YCNcj@H||u6@o&aT8|! zsx^8w%=ZO*&}1e#07U3bp5e*)~aFQ zF|As}het-QE2`T1*3}yh-<9~syr;T7x?=Q~VUKR<_uk8ghg>P0{qUs+9JAhO@oHN2 znICEO*N#|U{_Nk~8Z60b-?Yy7e@6BzKDo$0{E>I}pK1QU6T|)9Pk!m8w@({Iclfl! z9Ga)t6=bH5B9g_qXch)?Fy~H<5vDn`lM~9pkvn01M2)s+!=!$hlN_nIIUQGVVsVSi zLpB08kJm72F-zmcBt{JLN5Dk$JO0{ul>Q|QaB$>GV08d};~zZGmI1d+!rd3xNW0I3 z`?~j*u5qr%`)m$R&j~$2zgUNfQl!%Ys%y8!9jLTV!%zjQPvZA70GhHuO8H?hA97-k+D-VkRD zr7?4@X%UY3c=85@K70!Hc1FFB{cQ#6O!oPzPixcnaD&S?ecG75Z(Df`g8wDvq=u_3u1D{q7^r_A;L6Dx&I;!Dk!LU&a zH!_YYPsWkYkZ~BN+He@7+i)}(l+%*#WE{q;z|n9BA0Z#+AZ&Dq#BDelSIGP@PPgGO z_O;=fDsWB(u9*TCCgJ{ueUb(4V5QiDA%idK^%;ltUm%V}uE%t5#nW9Njt!Sw2e?3{RDi@c4J^PoEO#DnT?r-MpFJg{HiM#*_l zeX4lufs>_roo4wLz{*%33m?;&7O2GaVYlfM@#?(m9(5B+#4J)<-YA3BePF7xIOP+XtgL882$Q z#H*bb_{3rE0Gc%*%g(S>zQ_t%z%AyJvaBD zXVQgA&%}##!g;l1yl8@l>c6E2UZgKiyhv}HS8K+L+BNZN?SU8RbS4&{=-+JPAGd$f ztsAF*ZK@A9kD1zB zZ65ydXH+kLmr!yJS?XN>~Y{GfXO>2~#8X z=V@{EWiE_<^@SV;&S_xlwt;Y#|oU<23mIIJ>TR_L756oYfMtU9OT2 zS%G!6ER(E=SZMvpcOYLAR);*41OJedjYsU>zuEtr!W}B49_HxRN(gl-7VgZ3&hZo0 zTI~P|?#O_G(ReFsqfGZzXpS|={T#cuwNaJ%J%vm3AszBncXEIH`)OjR^%da=_39x~ z2t@=kjylW`bQ-uAY5f#*{t6s*{W3qYEEz|(BIBrQka6V3WE{C88AonK#!*w2ail95 zS51K<4OWtLg(VCd4$Cq&9EBZnTC#N+houi2j%I0PIxOkfa5P*n(@_XPpXVJ^!aZ!K zg#&l)e>`lVN__$Lz-cIKf5GAY7ri9?Wu16hxq zLoLv#@zmZ_^wj25c(O_ro-9#?Cu>sS$zoJ^YKJO3S&<4)?NNoNHmSms^{DXFHdT0P zpECXg_8YB(IiGQ~zz(K**oD+zqmx?uvw!t~@$~Np{K5;o{lzojiedjnvKVTmKI>?I zmG8y(@EtFGTnxw6p#@#!{vS7{kB?TFrK2C)p*BVID{;LinByJ5SBDv_)~Z|_4g6fd zJk75kd5k{zg9!;oICe_C_J7!W4=}B&YkmCenPC`umkz@KL+>CRhAPrT1*8s$V1>~j zpd!lHL8_prs31iJ3s?|KtSLs5*d-)J5~JePBt|qbYGT6web?IMJKvn)-gwRLpXa&X ze9xYly}ony`|h>(+3l>gw=sBbvF!rt*5K@#;8S`PClgm(MMiY-<0iSf3D8hj87;zx zUUc2?Eq`hrVOjCoQUspV&;||5Pw;=OBlrcor`dRNYa?~w%%;TsaARUF5M<#lOtqmy z=0nqpvQctkS<^XYSkqZxC%Po;-?9TPeo=P7m4#6c^s9GK5%|eHjK|oD&@g06^T+uq zi#)fS0aA}|H9%sD`qKt~%t#Zxgfp?mO!-e9B#n#m^Jx&L2D-Y(#zGjzar?D=NV%Iv zK8)i=$`#{alGh!kc%2~Of5+oH{+OKX+;^g#`NNKuRz!u4HdpDHHy1jt5lzX$unWIg z0z<@*Pj2`Qei@qv|FU}4!9N_trYAl8#PO2~qS=+7s`^o#3AMKISuFSG)P!#w4m%?K zaT3PZCF@`Ly=fs6(+8pvqiTWjDWtcRR9X~L)i%mOaH{gYokJO0;2O)4JQ zdt2pt-S(X_a?`F;e)VGMjJGyao;yFg*7m3S-O!*>?(iAC@;2{UIcj8sn(x*7JSVTX zpkn;`;L6srqQgW`%n2~VV|@1O?%+FWxZcNbk@U%_WyG62N$&a)3Sejc-Q4$ zEG^mh?(FQT%QoFOtl5^IKYYou8*YE$hi%?za>pgBb~MW!*ni~Kg>9N%S3G9R{NC4Z z`tSU*U;4(GZC3o|u9KJN z6>ML=bL*wQ@3sEid3%fZyn5R?&;ITYOV7yLec{usOa5{Ad#`n=wf6NFvMT?w>U$TT zJZJID_m&LVu=cxXaYVwP#?io}0ks}XY|K;bO zZr#}6^mR)w7~XU4)Oo*J``E`HOn%_01-t*a=)*aOfArLnb$kA~Y}Dm1-+$5Kw!M}& zfAyQiC;j%&vH{EAe0<`$m%O}i;DPraSh+%f<{Zj?>FdRdzIA=c+?dfoMgtiQWHgY` zKt=-@4P-Qs(LhE684YAKkkLR!0~rl`I}Hqo=KL!!MZX=$|M|P9YS6^H!D-4KCC9(bFbfMia?&8I2y(W%QUym(h?dT}E%1R2fY``SS#<@o7p)9T}Lz zyU+JwF3W4!#64x0BCp{y^0aZEXY4hsm~&y0uV%2cY?>S8`xrg`TKHHtVg){ygIG%+ ztAJQ5AIn9oHDZ@%sXx~|{C{LHInkf%OxZR~V_Dd8j8B%vvSYEFSgb-UmWyr2XlzIX zK08E+ikJ${HHlV6uOO;1v^%mjo5r$Zv7A_}LM%pv_DF>Yd=iO}CkQwbC3-J<-6B*# zTQeo<;A2DxF(QN*5kiaz^!^|MpKBu26a;##oh_aoWSt9yb7U(yjb+DTIk8xUSS%N* zbg>9*C5TX05V$qr+0mk5Mo3KF(S~yk$GU7Lxcu`K=a8J z(Hk}u8cm)9`#MF)Lp?~15g~j>gb*V_58OutwqQhPA_zFv2H*9xX;u=1UOq;I<9&<> z;X5LP7!l}DLIgfpM93EeK0_y(pV(9?1L0iRs*hS?T~3YV#9|daiM4;ae^T4*6d1xgFv*c1dV+A8O{Jb7xO~@>Qg#}u zC#4*|OVv<4@IMQEg(A@Op9nn#;W!{%89i$ejuV8bKE^yu^D*XOx{nbd#E38h-!Tt# zA|OI9L8vczm}&2;F9^jxMub^DMugcuMuZR}!s+;q2(%<8!tsL800`GdZz9gJYXF4# zvel@@vJrC#^z)wY(`?lbDv8 z#I%I7XMo_e)I_vYVi7ndB|?8epfC6W_@63k`hu54zx1(e*y4v+PApa-7R$vJvghMI z=7A$xA`B3OW`gjNO|zLG{M5&YaKOiMqN}6u9T7q-6@lYnA`BD+`k*g}eq>Xj`)Y}7 zXv=bM4lSK8Tia@kdAPt|NrVt1!a{s^5WQ6qI=J~+bir^&Q_PPMr)Kg+YZv+$wYJE|sI~ANwH9L3 z+G1Qu1m=tgg9V|5l*s7_OYDUcNJnWB3yzii9kIOp-2#DrF2d7 znoXrZ5SIE_Hd49N$B3}Z$A}POM7Rv!5rJ9)5rJjMJPeUMv;x9a(Tn!JR)TPqkFgxC_A%z+8XsdGLW~I4;yWU= z#$OQ3+batNVU3RwVXco5A;gHV&VNUQ^@ttBxTaq=_XS9O`u>P92}XWLIDX5wPHqPO zN2BQXlYOKs{{0_2x#6A)xc*;s^x|}YlX?1E8*>;mvk>PGr-b~jJO{7izmvpD zsbw^f(LhE684YAKkkLR!1OK-*knY^|>gcQ?aPIoFaQN%no;%~_yx&i*Icnm_hd#b# z!{NE74_&fnui|wZ!skFWL2WQlHt=E&IPkL?l-`3o}|Lc369)8N@gMZfN z{qvVBId1OqN4~%5A4O9>{-|rmiHlGC`kUOZW-J)9|LM_t_wL`idqK{-ch&##GetFy z{Atb$7hSscFJ~S&@W4|q-F|no9~6$i;ie7G|Fy=?Pg-7O`SR_r%$wZdlYRG{H*)vH zdk>uO%nRL~e&v}7Remz4}9|dc5@0zU}_r=O;DmeqQ@$qh2X2_}g!Pess%+O;?P*ZsM{T zcimLyvCFr;_3ZhdEj@b5sq0_vJ2J1wFR$D)_p|J;-+6xJ+|O3bU2@^UJ2pOZ=F~wg zzPP;gmKz3+oi+Kr>9gLebIXk@hEDr%!iqDVdSmi$Z$IwQI$Iy^H@(UJ53X4J#I?O% z_@LjTtslNVI%Pw(?Vk+lTkyAe-48drTB^2VPJKFR6E4!+*L2d*{dQ9=nnJ>-*eaV(i$3f&R?{S z(UT--V5k3Y7h$UNSLNsrwE2mgjJ7+KQ}*zuK@@+UH82B?W0t4s;;T#RDHgMITh}4=2Xv!$wLwF1|aY!Y2WN2 z;9^iS=x`Jz?4m6qNr`2kKiq5E+FPZH;C7OO3%Ct5{>w?V%AyMjFRfJ0w%fhFl~oq& zh5od}pFb@((FH3^G<)TLvSn8KQEYG}D|0qUjc?`b$r_B)mZfCqoGH$n$Avhb=SlhT z=aqV+VQi|iX8hDqx&x%kXuzK?qse``j7IY5GMcrg%V>z6E~Dvqsw}kmx8WP-teM*42WQP6 zncM9(Y*l`2+~)SV%*GQ~9PRY6Y&dD$g_z!#6V1l|M+Wm`k8HHnv*93+E8p>HVVZc% z;F?4C%ohzA=SX^Y;|q;3y?YR2dhEkz<9|&rCzc+cG^Up)>CqWe)1xD1akLBHFg>0u zb$YZLv1ia`R6u&u<)fVVWHODKk_K&SH4VC27DxBmGCt^Q4RTLSgHJNks4HpE zp;FVJGi7mfzfGf}r15}FqheYbeDaw_14)A}lbQzIC5xjyHVwKA)!Ipw) zG?6seBfTX0r9)(K^q@_nlBDsFO@lpJYF^l~Fpc~o)=>7GKQ+a`OudFJ4X-JXYiOzb zvohDP<>5809YHp?p@gb^!VUTi6OO)t5IPF-cMVav&Dj+blb zmPJ1Cbl8&en%;5^9jl(lHFNNM^P^?TmX+7^k!$E0^@B3ku%+cSedQWDH}RS{7F%9k z(@(CUds5kJn%Zmn%QbW`DtirEW~MVhuAz%iSw3v3dCfq%hE6{5Yv`ua4-cqw)0qhO zfZ_f_*PZ{_=YQj-!?rNr@*E^Q^Aq#i!d^32u4z#wFHEPvUQ;C36yTa4#`Mq8J6q4T zlCQFk3)Ask*^%}%9b2>U3rkuXC{96-8Q1Nd) zOo;e5`G~*1-)bn$3Z*~e@#iP^n`rQJChGf!iGKa|fAVlTbBc{CH~u{}HDdn{^~!ze zB#g5j>0kNdf4OViU-w1w)$ZH$zf9dBxbMJ5z-X$Vat z$#biO`{fjyl<&nbI>nKKjt-M5h3o0)FsW;Z)4ZLI6tv`F`aI*Hv~GxVQ_|8DM~kYs zCQ3=K8g}hZ{k{fGRq?&!o6r4wQ?4)IDFOC-=V(DIok;eCca9cytOG@ zoo)4!YgleHPYl;72F($JOz)-nVUQ^<%?;CKG%rlo3(X1BWwiE6m(g4>T}Jc3bQ#S7 zQ)M(F=FiLK3RJIW#C*;mR{p2D7#>p*YrK&*pXoKx!;mpOgJ)|^^oWmTBSt;zcR7gd z^RWtuJ?dk*i0${WirC@!F(1prcaQs6CB&ZavC4=&>0?z8`@WA=MeHdbtA-fshH|Nn z*wcv7aF9>eg~*l~g=ZlbtIZ`4@=7{q++{BEvFzw>v&6@8qI=9C+)cypELa9UZtuwj z!`4Xg8Pt?4v`QD7qd2kWRqV9Q&+BMMh|4FKxO%P+9eGxpr8aFEqu*sNMvQ6GCFEI2 zI~#3cz@#C%VrHWi3YggzbA40{S1f)uSWLDM#MG01XsrHt^dV%-D-G5kkKlKHV)L=Z6r*-?lTDjO?HdG> z2JOY>54ei?XUl(smFMCL>XwWv0CSP4>|=S+VzUV`8hKYhYhO11Z28DVPYI&U<}C9^ z%SDXi%_kOKgs;ba-orZ zQ}e0iLL>W4l4Ba!Z;LwNF6yNsxNNlYT$I)a{`!j85uF;s*=$JX2;|S;42O!~u@No~ zJLIzy?hX2>E%lMDJ^ASALp0Vu$+WQfp}~Gr^O;Sb2K&l~#`>eo-@M%M$%Af`&oemB zAP>kd;{Nin*{cv+&n2S$>`CTx$e0Hj`ZqOywiq<@S8N*jZ;Sro(^6I3(~1dd8OxYv)WWhYO0~ zb3#5Wlb38ddAQ;$%ZK?apAUOe^3gMo=$sJv@KmJ|v)uCGsY=R+Cn|-qsp9!mfqs+^ z%chF(nR$$|VXsYWJq?LY4>Qf*A)_vM-qK9-4Pwk2o!2@`o;i9OWqNwK(*@5S4A@nV ziTw-=wK+OiW7guc&a5{#m^EgD*=TM={3iLVLmNXL95K9XE`<)*lhL7~{C@0Zdk;qx zp(mrQcIe4CDhxdtPe=+q8Ba(GJy{LtHS}a04Theq2J#nrGMtWx?_5t-1LYlhvKq)k z=*eoJR6SFYB}WbMM5f86z{j$qzeWGV zwfbESu5_&mPh|SLmFL3I$Ms}2k(+NIUmqQoJ|*-j>{p4aJsDk0zCx*K+B~P}>u4=v ztRc0a$$v`PwV=hXBiDP@@|d-t!GKvyFuzLZJvpW$ruJlXS@|kjXEAxKz}L}wi&@)a z){bGakI;P9j$ziem}T?Hu?#V_C!-6@1k)OIjymL7PG3hiSWKSfr1|7IP9dLlJSNX@ zx?fss_MUah#pIZjnA&5}lVCia0mbAAPpi#gi&+<#I!dSu%%i?M>jG0p33Y)v&bVHp zE-;@I?sZW!$D3C2^wfs8LM1T!JMPhs_Tp^6$U}Q8y6wy||Fk@K4pgz}Z+Y+>sP&RA z&wwg6wY|K8m*+-T7}hI}gX)3DX#CG-w=QCNxF_`7TkXh&V{YPW??jiNTl^@EqpVFb zN@E>64)`}qE5uPr(EV{<_s2mGD?|^}{c%?JWk+Zn(-TvBCAt`e(Gt&%3Ztd^z|_%F zePD*sQhl%c`cmF*v{YYo{}i0>+~+x)PtF;LSy04UMURogksB@XB&oxZ8!a^erjAf} ziqzrAjh1+dl#%>50A?7WGyvx9ksB>FfSwOQYt(ve;Bd5*{#n!NBR5*& zDOYbsZnVTxu2dI1;VO)lc*2$Hf~Q*rT{Q8!Xd=3BqopRt)CK3Did zOf2&~J346!KJQE0&=h>aXsIdqyk+INxWbK=nu3pxmYRakTWI5T^w#v4d^rClA3Zma z?s0(+PtbZRT4?z+^L(1c%BGp;(+v7iJ}jGN!so4Hlnv+E#O^B3FWv6O`q2{4)_Mzl zsFpv^)>VH;-XAKPEQa`6i%KoS)Sbr;=WbbAc8`tMOTnbDGx6?`3d( z3*Rlm8AhcES2=gS8foiN1z;Uyy1vmeLDnik);dM@oY8v=Q)Hz^*HzlYWO`lO1X;TT zS^Jnw)9a8R>zE+x6q6}#=a@{>>k^acbzLC~>p8j>)Ga2{>$=BenqCi)#n;?e3sTo< zSRTC+WXC7SdMC*GB*^-TOgD@uwdK(-CeyX5{t2=H39^9+vOywq>t>oB)(ep9$@w^<4u0pTG-jAoM9geO>jQx5(o)_(7^6|Wcemx)0i}rWwmW46VDWQ)>*cB*vGOE zd&I}EhGRH>)GM*NV)pqM);-LlK8BSCv){)s<2PW@}(Z=G6pDwm`(x8APFA-fl5@2HR87 z9f&dQLXTM}m|MKuVHUajP5T|TW; zE*%oNu*V~pf+Di-C|s_!_jeR7yAh+#J9;i1V_Z6VE*)cBItmx3myT$if?hf%a$!$P zE;^&=1TH_1?zLPxfeU6tmP;qkrIXafs$TA9?VZ5oe&5=60+&2#?K^?T0}))|rF=Sp zN7-kBy*qj6Y@)O9cmQ!~sI&0cWAQqB9-YDCC(&(Q?s#;L@#yS%bQT_aaXsrv=R|#Q zL_r=pi|8Ue9z>ixx(JVlEM6DSqf3lO7nIH4?e(ep=;C>FiSg)?s1J@}$U|ooUBM&F zuDgOqm|b@T51n0i1&`1RclA8FLLXsv-4#5(!MMHb?3$w_V(P4+8!*G{x*IUV?7ExJ zdpBT)*>yKyYCqG>mjT3qkGlTBHoMqgz&>fh?#ytz&J!W@c zhBl(Re-^p}Gd!2wff?F}?y+Z~dt%vh^hYi_Q|JLMVMf~nT;7BhwI=icmrdAj!o^Z& zwLQQ`XL3EjXQQ-Pe3pBFkIrg)fJ>Ow_5hdiXSE!Cl9P_cdV*7U2hdYEU5{^>eox`V zdfHR!qnp+C^n7}HKAbuA6h6nA)pC?eY(2}om+0ejo9AAFy~<+u^4PtAy$xwAr(Pbr zm&Yd8US1cyL>FJ+dcFhbbxd7wgiStr^7--L^A=Xyv(a!RLKnKF5Po znAsi=PCBza9-P9=_IPm8neFl56lS)^ACnVD_~g{Hh`7DMX{>)Q(OWpVnQd?3q*tY` zI`sB@dV4-BpWedfSTkGBB#5o2sP_?lJZ$yRN3h+@whyp%X4?n4_^mIWJ|4SI47<-U zu~|}_u~fpFzRIQwLM42vnrir8H;CliVJQfWmx_1A6xzJ zA6xzJA6xzJA6xzB%#1TB9lH-ej?OpTZ21g8jux6?TVDqtM;p*iYV93>9KDP8Hu?+= zK#ty(T0H={xy`pH1CSe?O$|U!4n_NLJ^Qr*$Vu6@oijpm(eeC1;qs{EGElfI0vA4; z1BDCg=|JJ(#?}KpkAcF&jsFG;k3$KVoN*FU$Mb`LSz@Ny91j9!iJ5FM2LV&xkqrXo zDDxZKMJ|JYIabCHgMc~1uapl0W;ZM6JGKG^0xzEXQI8X7%}>D-j86?oFz+7H)%bOmTN zR(kl+_>Hn2#NW%LRel3&L|hBvIztgyhqVlyvkys-4NZ^@i^2`;;$A6cD@1eaad*i-AsNN}kxt>#GRWLMQ<(eEy0!pXIT_$Bp2}dOl-gWi!_E8SDA5Y{m+oV~yb1w-H-sSmOlSjo`-# zwj05Z1GbLf#|gG8n{gg{Tnu~MF|iLu`O%EL2rJnfgXn04@1|DBdntW8mAajJQR;T; zC@k3D9N`KDEN_l*H4|HvAE}AI=|5RfF8m+1jxYvo2Et8@qdB*?T4)&8P}icc!0*6oB z#l9&*Glb>{`3P(vXdcuOp%p@FghGTi2yGGCA+$&6fY1?vi^H5WbV2Bfz^O)egdPYz z5qcpUkI)-|Mx`_$?T64GVF1EFgh2>{5sDCoAPhwqhA=5`?7) zmm(}fxD4TPgyjgO2>4n4PZKq*m4!JTt&nM3Hy8Di|I>;J#f*05o86ziF>cO;!Lvlp zb!`-h{Jv5orMSlZw9d-Gza7mL_~!W>)-_h~tK{md<#!>jK2v@^9NZ@5|F%Arj|R6( z`F~uLpO50eRJGtum!6`NXa0US8u(ZAJG*jb-_Gww>zPzC8pvoMqk)VDG8)KeAfthd2B?9|zMY5m z)~QwN{rb@6Q z*Z*l?6h+Tre>KV&3AW`b6FUsQx8hdWTalI@VZX)gBBK>cx{UT+=`z|}q{}MCWa@WM zqmFQ$+NxJdkl}TGnd_>=WSSl=%tCr9tCk?6*;x8@+=VJ#Mh(`9-WC11y%FfI9rULd zwPW}GRrJg<2yav>%_M(b2UFS!7vO(`Sot6I{h?w%iS1$eNo)_xPhxvmegaIj&onRy z{3N!AQ+VI>z)vLeZ^>t zmD7KmW|Fk{=U$a=CsF>@vS-Up9_pdOJt~8b7x$EyzPXRJdQ|JTnS+P#@f{avm6~KDb|{mIwE% z{4BO#<>&VL+~}wBtWh7_ukxo>&bmPJShrtg>hl-hyOZr8`4kk90r#t%XHK+y*aFNm zG&^Pbd@hv_pO(Of^;r3^Mg=}BU*%I->W1UPe3s9Ly(IaB{VL~~(UuSQtDI+O0!u#J zuTuGNzskUe`&B9*?pOI!zqcv(t5iN!Qux$HI&nT)U)VE~N7%b^o*83#(7tw_p&2fD zaPLax!M!U3kE)&r_pS^)xOb)Us2bx@HIWBL1LVBK#8i(G?u6Og(6F5O^{RGa9p@;CJk+~{yJI#t zBXI|LaCgj|hNkY!J9o!a9^4)CBftL&cgGwf^@_V=j`5yh+#Pd|-?^|3>iAq!inLhA z>m+jFh?iW{cb~gvHa7*93wO=D)wHxa;jWp=g}Y`3Utspd%7wdTjxltH;E0F2X6`}C zI@03KnRCqvRxjK+Gqp|BHi#o_a#5ds?wr}&T!GZ67w(+7!(3_g!ksgf3wO>8 zPd#w?!ncLoIaAAryJj{sRV|Nti99&EClB@C=MI`-pL6b@sr#I>e7J+=-BJ$RK{M<( z&K)#$zYXr7xypQi)cD+U2hHR?&N+J^=J7?$EqBmtZmzO<=MI`X&DA#V+(A?G&K)%W zEUqHt!W}drBt{ueV zuA2H>a#zhzH@T~()(7sY8R{l?)%-HL&Zout(A#q1u9_cXU(Vml=MT0mye7Lh_*z!e^cOzdS#zdY4F;^e+*vd1 z`^}v-b$rR4HAC5OXH9LtxwB^2_nSLwy6aQRMt9aMZ%=m4g2`uq@ZrvyVc&1=tU1#- zZ$a*?sp)fP%}_SnSyTBm^?X=1+*xymIo7`4oNW_(pkQ+s&9Lt`chL;{esdR1-S?Zj zXoh{ixr?S^a~I8xzTM(3n#z@X!_V}4vNtQYY`Dk4WOQ^>vce7rrBSK)64HN=K84)J zKtKGS-i7ovOx*!9)yHr`s*fQaxPRHl5cdQhL(T_^5a2o{zsvP8WG9J+2Hh6^gO4GH z>iYA)_9bj<6N+SQ;kP}rqE|5`**zV9OW^-?MOJjyjqokok?}9f_?Nk=qLt58K_@Nm zuX>loua3vcyE7yIwi@_X^gBD_U-oU)oVhQffs6(+8pvoMqk)VDG8)KeAVC8e|FVpK zSwgkQh%y?;Xdt73j0Q3q$Y>y=fs6(+8pvoMqk)VDG8)KeAftirSOXdVvhP@-iOK!@ z{L2Venv-i_tQcJeyK7n%{Jv(0i@(`%Ax_Vc1G%||J`lW~z8q2I@O=f?;iP^~|At8w z!u2?pE1Fa(Tu=M{NnJy{60DBeR}695&zIH>@hY$_FU9u`zbZIHDd|;%U0>?=HRxG{ z@7?wJQH$911rbh&N%_7A_CWXMi;Rb(;LpUz#UK4R)m=VYn=bd81cbM~AU^{0!=)SoUc zQ-8X+O#SKNGWDm6%W4ScxQv$I?(AZx7g}nk%VkKLM>kKLM>kKIPF3_f#jrN0&UGOQOk6rL7U`wgC%h|vT zJ_XspR69)i*ab}b*d_ZEu!Ue=^ThU(K6WLB8|pK6^sy^3^f{ruG=1#UmXq!BDDx5S zQn|yVkDdBi>D~0R`US4i80|l~wLfjQb5Lr*U&Z-xuw`QYYYG?o-r*!K%Z0voC1w{I zK4Q}MPPx$cE^uKFq4}rpUEopy`43#^dl$G=NaVs6k$MS!c(cqPpffM@!z(reEf@OX zslN_&RBZl$yU39&o!pg$-c3KAe4iHmcs5zR&?_wHWvjI#XG=`I1fRTM&rhGcV9!sV zJhkViPhPO+r%#^R^V26U*z>c;Ot$A|OV9iV|GSyyL&TW_`rpko|AiRyneKn*>P3?O zo!;%rf_{+fqh}`g^w7?hc@BPe!FHa0cTEi~mWfZlJGGss-`yy4(950ed?n;L*o)Ke zPVL1j0lTR=g6o~%UHSIwY#XVM0;!v9^@8m@+kvL$GmA^VJLSVCDA;Gy?@n=9gM#fm z{qBx!JI|hzx(GgY!FHZLc1`_BJM^(rZ2H)3gWrVeh(30TO&`0U3;NhOd8+L^eeBBD z1$%AkqEK|fab2)gr?1^i<4)S4ubn=p9LL^%H#V0w4O^1>1T0+-dssxeH}OpF8DK&GVt{JbmttZ9C7A33U;C?1Jq)ee8nm zJbmoccAh?V!FIm7$F3g3rjK3u*w5e$XO4jOMi1ii5WLzSgfIIe_`NUMjWg!?*$=;T z{nVD{mZPIL%&+j9y*vHn-ZbTX-m<+rM^B-5r=MHs-Rb8RdUyJ{h2EXMZsGJy`nrYQ zo&Ij2cc;Hw=-q4KnGC&qEtGrc-D{!k3B7x*Snpmd*1Ok2$%Wp%7TVF!yL0Tv64TzD zUUb1Ll3sM`70H&0UUZ>%XRj4JBk4(}y?bpbHRl;gPrBsZy$�OSN~W*Ie+7q}N>V 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

QC3z_&WI+J6ar)I$R{&MIx&%aGKJ)l95R7e zh#3awc8?)2#QePFe{ZK;JWa?Q;64hEBIr~VAN{v}CI80r7r>JWamv5}igkFIu&)l}}lO^NM{WBH!zxX%e3)>=*U$XM8F%4zKY-o`D$1t_^1Ww%U~hSD9^T2lFyeCW7;rM^ zBKzJOsu;yraZHVq$unSl6}-G>W>mkrk-6fWFtxmfqv$b_(Re0g>SdVF#GCk39$w|a z_`<&U>dSZIn}n-uZfE>29ngO+D}Vj77JG@CwBRU6f@rjYfi-Q%H2C*QBsU!J|s!`%29Z3mE&yVOshwKhEdoBTUzv!4m;sh2HG`m zR^ct&N@+L9u$l!0P>q<>0T`%<&;Vftgq09hL0Ao84TQB29)Pe8!g>fBAUp^GsjNmg zZ-Vd;gohz)hOh;~BM=^i@EC;0Av^&A^KbQ>pM-N0gk}gW5b)l1IPdVppMvu)2)iLX z4Pg(2XCOQa;W-G;L)Z(U6~aCUSRTUxh#!RTB7{Q_UV`v41iW_`&aXiDv*)@E&MpY; z5RO1N3ZVnSYY<+C@CJlq5ROB56T({%u$~j1GerNNI6N}nVn2ja-U-W_)jkfhQOfjw z1#u&QGKN9f=645Ru01;?|m_mi!ChG%pUHEY3F!jx_oa;Z-tlu)IX&kT|nT~ zJ3)bajBDZw0;C*&8Ye3!3?;)bYUdWN5+N{;3Q)jV9W@!(Eg%_A%4t8g7Rr-cps!j0 z3^D{ofW~fIK3s0Y7ehE$+#l|0mcIup56NVlYd5~oQ8Yz{k`$VTWj}@%K&7cP1GwkL zoP3HOHE`rU3N)bDl=hx*;_5j2*Gg?g@iRwAT_06q+b z)>7nt`2D|olmJD{0=-y4${_}u;(;{oJ1Fuk8A)alppOao!UENY8mP-;_{{)5Pft=H zC7p|Df$p+E%tUm+)d4Nb<;A<;y9+o(J){}PD9CjmiG<$-NQ;DeBH{jMc!HOTb3oh# zG-Vl3mE{nSVy_}L_(kdt?^VJds97Mz2G`k;UI?*Lh=WfrC|3zFq=+qW&V`g>h#`$y z4bQZbB@mDFq_e$uer*H@8DxRi2#1UN1ws>`F5UOX(D04}AxjWVk%16GAU*`np%D1_ z;pH0%`8f-j6A{#O(KZ4SUh7oJ^9LWwvONW=(SD z=o80r#|q*{0aXSa z+~q_{+Cg+qh7wrS8G3`(Vliq|7Iktar8Y6DWWuP_+9crq&H4;=db%ErYQXPV&dj`7 zM;yYu%t=~xc69o%OxBhE_J~9>hA1^@E|Rg3UQl1=OPLp{)t}xMsZL)Q>GE}wCk^w| z@JQ)e7cqrcNP33JoM|?zXfx5M^rJKy6-h}pXR4CZP2f`vyvS+P27xi;^|eTxI%W}# zUX!AqWrBHubnvWfm=LzoSsYtB%d!MWu;heQYG)yxoM2y4w5CWLoa$0K$@v5eD4@HB zC{`xW*7YHid=60WnsvGM;whG*l4?OouItg_AYyU-xy0C}Bg-3{ejO9EdV^-vnyiIW zUeP3I&96*+e8YxW)~bq%>RAnq#z%8qmQ2`RIjtbs834X-0$6iJd3Dv;iqfKvBP1i;0P84OouSgFz!FjEwHk{GR!)*hWl$Sn$)sq(5#A_`?|qT4hX_Eu zUj~Z-$kZy3@ExfN(9KA<%-RuCppD)T;`BGd{In$ylIuE3Wl~+lpMFA|K?YnPOWqq? z-w|=j3?g~>3c5&h1$Yh|@|95gqwqvUpsx9q zvcTs%7X(uKY6{qtGB$-(>=M9f264-6>bJj>Yrm9h4WDr*x4a(}&zQf=iW5jhy zNId2PCTsg_pf9H41%C)~FZyiScrxIR7lEXi_|jC^4^JAY#(a=pymj*JPY4Nsd=dft zY@!Ae5<@Ro{j?F!gbo5I3hjh|w9+aiA#dA&Vgkg&NZ?U$W48dG&mRbBXu?un7~Utf(*x|w z1Ssv5$Muihj?^v^AUY4jQ+i?e6b^sP<=}N00eJ;LT@S61Ds|72F(MQUIk@~JkZ?KdmaVP)p)KffKd`)V6)*b5}-cfiy96auz&$f8TFLN4-G4M%i1Bcw`Y_(Fjn>V^BnQT(m}|Km zdXM8(0X>)n5}&?w4dC8c@MiCX@dh^y@Jx(b;JG)e(E`}85XKmc1fhRPkXsG098y5$ zLn`Q@;VK)RSO8DMx3Tn^aeAefGUz|6bWlhCxzsnmZf{m;xmNTaClI;8oGF6dF6L$u zNZ#NKUd>=O>41uu#a-cjoNHLV8e#>|XAsCi-|?;2KpM`!zIWcgD>1!qTnlq46X+Wd z%EA0Lb5u+^q#!+`fiw+A?WDtf3#>!FpMaF$4(8W;(zP6ogDpwE?Kl3PtdAUMVJ5f* z#dprnfJv}|a^U&im2tDT-+$ixJMaJFe(yg6`fh-+w{R^`!7u6s5WeuEhU1s)$$_J$ zh1rHV%-oo%VN}y0hLqvW-hUS895SFkGoe@bwy%HxnJ~Li6Y=Z)^~wjqrq}b7+nwta z*g1M3D3B-67BJz2-kIS~1%Yor(!)sKY9K9z>l^kz8S>){!BQG1gX4iz^v(O)p921;i8~-}jpzxIT~v zFhGyM6);@!fBj>(2OnRW0Sr_OS2~WXzc!!SeG!Fcc;Hg_9*8jTnhjG1=w|>| z;KCP>C(z4qMtT{mMF4nxwWH`;mvOtF_vjOmxgNQm*K~?|sD3PpvRR#8n z1-!sX!&S()?An)-NZ%~C+x=V^-@+wWE%FW5j+=q2aMVp&_}w)vG(fp16nnza*w;d2 z$SJB761=SW?VPcK+sXIekO!yq?`a3lgx{0@R(bJ#-RjanT6XoZ1AQ}_)L}c^StNB zHy!vh{UB@SRFIhe+|xh3H6ifn^k?pW5@I~`@9!s&fKy|Ye|of#$>KNc%B07cEYoO!K4-u5%ug? zjMo#!sUU6uEogcqWH{N0GY+M_pn1P?0mQh>%#w0VQv3a$s7@=c^+c2OOCTy>CfN%2 zzW}mZERytGq$f7&d5Fm{ZAulVzkjt2q`HJt%-bKfVw_Wx+k9y2}3Lp z5)jOwTxJ#1D-G8D1Ej%H?lwj8Eg+Dt0l{;~hd1b;K!Jq*t1q=f_FjdiCiZ=38>k>F z7W;p9LlG@s zIe~QTW{{ry@K>BqX-mx-92xF5en}wvffxI(?}F>sO;!@jphs=*hXuUf6_|G74Axaa z{<8!1&;C#aiY{<++)iz^km(pq6g()PfRVSV^l*-R>h1pq!t?RDfl%ajpZ^EQYx6up zz)5>EIUW^0MsfQO_T+@;_b%ewef}SzY!t3mIIgw2SPUca`;H*!e-IP_anEh{e;edQ z-5DP1?#as`KsuNxp%bsYGNdm+w1o1bo5_s$GQ&YY1yXAW;Wdha9Bu@`6d%TLNL~Eg z{^e^RPoK<5;CUv?mB)5tdDIVRxso920$G&z**7oCKO5gUmPI}VcKeWQuKdZc-+p!| z_iP!Izr${yIzLyxp?2==JU56dhkYT9KTiFl=(pObAQ6xi7e&GF8}q&k>8q69@dzOi z6c1P79XyN6W67O_+;4=)P2_g`J3#A`-ZJt3f`)m=%>c#VvRBT>=MRPaMkge5?-{0` z(_2PEV#nP2IV>mB915CYlr7e+#Zh0eD0|J7JPW+5T{xF-*+y?!5my#Vw%VV(^UHOg z6I1Zn$<&~`pJs5m(7l z?{IExAfFR~1CFBvK5*zY8^N)5;SIv)gZ?>v;0oIyg?yZv8ru2eplj>He7JD1Z!*Zo zX||!R*?={#ZzJdd<;Wrig;FDqvoD$117m}4Wy{O zyn4L7WbV9b%!PS0n&c!yzq{FX=qz{OU48#s(<&imK=J7Sreq zDg0f|LTY;DlnMu!@ImvqN5Tf8w|+Qt`fTU>r%!iqmEf+$tn%WD8TP8)O7wdCUJLk4 zxaH^((w`o_rOX4&G`-_+6P}*%rhqztw0+VSPhwKPL|7Dj&Xj(MFx&V5xmVv zzeL2SHy&9Tsmf&;7K=fvFgnJH?OC3(~+&lJi`x^4==gadmnbE(bY zfZYO~nbPkuTpx7TJfOD;+`Xj4Yw6D$`}bQZ3ZOp`Ed)cj*&4iA`JIpmWDj>-`}|T6 zaQ(gm=-=N>f4=~az{!9IN@Evsf;L{8hdQeY0>t2L9$^36YyW$@{ofCDukwI1Fgpd> z2X&jgjw}nbRmIQ(w4k`TzUkVA#dw|%*!{N0|4)#&%TrDN$#?DCNcoj{qy3e8hHLJj zg<`6*k9CJtFy3BTiN+1Ey9ig08j=8NH~_c+4N?il@8FkAr%hGrQgm9a78V9%Fi#qn zs!Y-)X-19GXfsRzSNjEASyR$em1dJUIl}_xBzjnOT!1^{%utg?r_&nrN!la~=_!yb zm)$eI!hxS*sRpkK0JIQz&6dl0$3v64OqZJ^byb7rGa1Hr+uyAc=PioRlQ&Vo5s=aBd;rdk1 zM7zZat(E{9++ZWcXAitZdS7LaP+BDIICS2Z`dhIr)VANs@?UU&Gqe)H#2K-a3K|(p zNeFyZ&IaJ36qJ~}R^Y#&mA{7Ff4h0V0COzk=D@XivEN-QoBsJj&OF64nG9K@bhk&>TD19z%7Mzh}Eroz&`3eX~b~i#mvU)3o0T6aWz*)B&a1hG(v5ump zi@7+~?fUAB>);Xoo&v7>Xh?3Q5+kHJ(?ica`%4GK#qEC%`CfH|kIOFm<6aLBdV`$5 ze%z}6*gpE~iL+Z1hAJL@6#5_k!}A%CCcG|fD-6V)5P&=2#stR#$^1JZ02k6b7D(J; zUzS6_F~G4w5?lxzD%wCI4zdI8ss5e#DEZ&Ozpuh`Io=b_)PFAj``!5eZFp`8g#W1n z@xJ%?pQ`is)Z=|No_|j{%)1@}u8qwQaIGZ4TxG4=-e>@c2`ob8l zGd!+8hrwjSvcUS1Ll=(zotvO1I}RRv>)_EV+y#0-L`P8E#epA>eBQAgE|8_)_vKqx z-u;aW#5-v2eILBT!OLiLN{Db za7mIq<70#~jzu<{5q{tr#J*O-8S#-5&RFYuI3rAX49>Vl4|uNe$;dM2n~KI)6z19& zmDm@Xmll@Vvog4Pk+sjal-Wv3VY@EJoZ?gPP36NT!Fd%`+&%7*Nc#0p%mCM{rM9I= zd2vk%#rv=eb5Th}jpHVd!)79@oX@ucK7ur@qN3D+%8l}z@okRhNks+41(?6T{D76R8WQ!55ug cQe2$OiQhToz`JWqNG88ij=(?i|NQU&0?Nb8#Q*>R diff --git a/acs2/nladmin-system/doc/永裕家居LMS系统.postman_collection.json b/acs2/nladmin-system/doc/永裕家居LMS系统.postman_collection.json deleted file mode 100644 index 99857f1..0000000 --- a/acs2/nladmin-system/doc/永裕家居LMS系统.postman_collection.json +++ /dev/null @@ -1,489 +0,0 @@ -{ - "info": { - "_postman_id": "584232a7-9ae4-4ca2-b4e5-d9e66870957e", - "name": "永裕家居LMS系统", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "示例", - "description": "", - "item": [ - { - "name": "LMS登录", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "56672d9d-9bac-4f23-b77e-809647ef5df4", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "48d9e766-7014-4243-80de-81d63be07da5", - "type": "text/javascript", - "exec": [ - "//postman使用:https://blog.csdn.net/wangyiyan315/article/details/122441791", - "", - "var JsonData = JSON.parse(responseBody); //定义一个变量,并且将请求返回的内容赋给该变量", - "pm.globals.set(\"lms_token\", JsonData.token.slice(7)); //7代表去掉token前面的Bearer加空格", - "" - ] - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\n\t\"username\":\"admin\",\n\t\"password\":\"uefvHbyUCADkudW1MV+/yw9XBWR2Z+KDyq+dqQ+ozr1loClUgqm4XQPsUl87IsXetYBWRDLo7HC++20VHlW80g==\"\n}" - }, - "url": { - "raw": "{{lms_url}}/mobile/auth/login", - "host": [ - "{{lms_url}}" - ], - "path": [ - "mobile", - "auth", - "login" - ] - }, - "description": "LMS登录并设置返回的token" - }, - "response": [] - }, - { - "name": "系统参数分页查询-示例", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "4f07b550-ab9c-41a4-8dbf-f889ae50b246", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "{{lms_token}}", - "type": "string" - } - ] - }, - "method": "GET", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "/api/param" - }, - "url": { - "raw": "{{lms_url}}/api/param?sort=id,desc&size=10&page=0", - "host": [ - "{{lms_url}}" - ], - "path": [ - "api", - "param" - ], - "query": [ - { - "key": "sort", - "value": "id,desc" - }, - { - "key": "size", - "value": "10" - }, - { - "key": "page", - "value": "0" - }, - { - "key": null, - "value": null - }, - { - "key": null, - "value": null - } - ] - }, - "description": "求方法参数:{\"whereJson\":{\"sort\":\"id,desc\",\"size\":\"10\",\"page\":\"0\"}}" - }, - "response": [] - }, - { - "name": "根据编码获取值-示例", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "4f07b550-ab9c-41a4-8dbf-f889ae50b246", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "{{lms_token}}", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "IS_CONNECT_ACS" - }, - "url": { - "raw": "{{lms_url}}/api/param/getValueByCode", - "host": [ - "{{lms_url}}" - ], - "path": [ - "api", - "param", - "getValueByCode" - ] - }, - "description": "求方法参数:{\"whereJson\":{\"sort\":\"id,desc\",\"size\":\"10\",\"page\":\"0\"}}" - }, - "response": [] - }, - { - "name": "删除参数-示例", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "4f07b550-ab9c-41a4-8dbf-f889ae50b246", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "{{lms_token}}", - "type": "string" - } - ] - }, - "method": "DELETE", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "[\"0c1d96d335cd4dd6aa0a4bee4b1c45fe\"]" - }, - "url": { - "raw": "{{lms_url}}/api/param", - "host": [ - "{{lms_url}}" - ], - "path": [ - "api", - "param" - ] - }, - "description": "求方法参数:{\"whereJson\":{\"sort\":\"id,desc\",\"size\":\"10\",\"page\":\"0\"}}" - }, - "response": [] - }, - { - "name": "新增参数-示例", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "4f07b550-ab9c-41a4-8dbf-f889ae50b246", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "{{lms_token}}", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\"code\":\"test22\",\"is_active\":\"1\",\"remark\":\"test11\",\"name\":\"test11\",\"value\":\"test11\"}" - }, - "url": { - "raw": "{{lms_url}}/api/param", - "host": [ - "{{lms_url}}" - ], - "path": [ - "api", - "param" - ] - }, - "description": "求方法参数:{\"whereJson\":{\"sort\":\"id,desc\",\"size\":\"10\",\"page\":\"0\"}}" - }, - "response": [] - }, - { - "name": "修改参数-示例", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "4f07b550-ab9c-41a4-8dbf-f889ae50b246", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "{{lms_token}}", - "type": "string" - } - ] - }, - "method": "PUT", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\"code\":\"test22\",\"is_active\":\"8\",\"create_time\":\"2022-10-14 13:33:52\",\"remark\":\"888\",\"update_time\":\"2022-10-14 13:33:52\",\"update_optname\":\"管理员\",\"create_id\":1,\"name\":\"888\",\"id\":\"3f1901b5814d40908bad602854b22aa6\",\"value\":\"8888\",\"update_id\":1,\"create_name\":\"管理员\"}" - }, - "url": { - "raw": "{{lms_url}}/api/param", - "host": [ - "{{lms_url}}" - ], - "path": [ - "api", - "param" - ] - }, - "description": "求方法参数:{\"whereJson\":{\"sort\":\"id,desc\",\"size\":\"10\",\"page\":\"0\"}}" - }, - "response": [] - } - ] - }, - { - "name": "ACS请求LMS", - "description": "", - "item": [ - { - "name": "共挤线申请空盘", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "4f07b550-ab9c-41a4-8dbf-f889ae50b246", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "{{lms_token}}", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\"type\":\"1\",\"point_code\":\"GJX01_K\",\"vehicle_code\":\"001\",\"qty\":\"100\",\"vehicle_type\":\"01\",\"vehicle_num\":\"1\"}" - }, - "url": { - "raw": "{{lms_url}}/api/wms/task/apply", - "host": [ - "{{lms_url}}" - ], - "path": [ - "api", - "wms", - "task", - "apply" - ] - }, - "description": "求方法参数:{\"whereJson\":{\"sort\":\"id,desc\",\"size\":\"10\",\"page\":\"0\"}}" - }, - "response": [] - }, - { - "name": "油漆线空盘入库", - "event": [ - { - "listen": "prerequest", - "script": { - "id": "4f07b550-ab9c-41a4-8dbf-f889ae50b246", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "request": { - "auth": { - "type": "bearer", - "bearer": [ - { - "key": "token", - "value": "{{lms_token}}", - "type": "string" - } - ] - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\"code\":\"test22\",\"is_active\":\"1\",\"remark\":\"test11\",\"name\":\"test11\",\"value\":\"test11\"}" - }, - "url": { - "raw": "{{lms_url}}/api/param", - "host": [ - "{{lms_url}}" - ], - "path": [ - "api", - "param" - ] - }, - "description": "求方法参数:{\"whereJson\":{\"sort\":\"id,desc\",\"size\":\"10\",\"page\":\"0\"}}" - }, - "response": [] - } - ] - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "id": "32f60779-6a66-4d77-80e3-1bc0040e7650", - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "id": "fb339152-4984-49bb-8955-3e24baac67ae", - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "id": "9b318f5e-373b-4f36-93a5-d131f4f76446", - "key": "lms_url", - "value": "http://localhost:8010", - "type": "string", - "description": "" - }, - { - "id": "5557e8ff-f6ac-45b0-a950-4a8c139d1ae0", - "key": "acs_url", - "value": "http://localhost:8010", - "type": "string", - "description": "" - } - ] -} \ No newline at end of file diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/AppRunInit.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/AppRunInit.java new file mode 100644 index 0000000..f0c73ca --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/AppRunInit.java @@ -0,0 +1,35 @@ +package org.nl; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 随项目启动模块 + */ +@Slf4j +@Component +@Order(50) +public class AppRunInit implements ApplicationRunner { + + private final static boolean IS_AUTO_THREAD_CODE = true; + + @Autowired + List applicationAutoInitials; + + @Override + public void run(ApplicationArguments args) throws Exception { + if (!IS_AUTO_THREAD_CODE) { + return; + } + for (ApplicationAutoInitial autoInitial : applicationAutoInitials) { + autoInitial.autoInitial(); + } + } + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/ApplicationAutoInitial.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/ApplicationAutoInitial.java similarity index 90% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/ApplicationAutoInitial.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/ApplicationAutoInitial.java index d51b6ee..2830af7 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/ApplicationAutoInitial.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/ApplicationAutoInitial.java @@ -1,4 +1,4 @@ -package org.nl.acs.autoThread.initial; +package org.nl; /** * Demo class diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/rest/AcsToKitController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/controller/AcsToKitController.java similarity index 81% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/rest/AcsToKitController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/controller/AcsToKitController.java index 5e41b18..a480240 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/rest/AcsToKitController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/controller/AcsToKitController.java @@ -1,5 +1,5 @@ -package org.nl.acs.api.kit.rest; +package org.nl.acs.api.agvKit.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,5 +14,6 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor @RequestMapping("/api/wms") @Slf4j -public class AcsToKitController { +public class +AcsToKitController { } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/rest/KitToAcsController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/controller/KitToAcsController.java similarity index 94% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/rest/KitToAcsController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/controller/KitToAcsController.java index 2cc8a24..afbddec 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/rest/KitToAcsController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/controller/KitToAcsController.java @@ -1,12 +1,12 @@ -package org.nl.acs.api.kit.rest; +package org.nl.acs.api.agvKit.controller; import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.api.kit.service.KitToAcsService; +import org.nl.acs.api.agvKit.service.KitToAcsService; import org.nl.common.exception.BadRequestException; import org.nl.common.logging.annotation.Log; import org.springframework.beans.factory.annotation.Autowired; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/AcsToKitService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/AcsToKitService.java similarity index 83% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/AcsToKitService.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/AcsToKitService.java index 7b55b01..49b3c31 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/AcsToKitService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/AcsToKitService.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.kit.service; +package org.nl.acs.api.agvKit.service; import cn.hutool.http.HttpResponse; import org.nl.acs.task.instruction.domain.Instruction; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/KitToAcsService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/KitToAcsService.java similarity index 85% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/KitToAcsService.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/KitToAcsService.java index 58cd67d..64eac31 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/KitToAcsService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/KitToAcsService.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.kit.service; +package org.nl.acs.api.agvKit.service; import com.alibaba.fastjson.JSONObject; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/MsgTypeEnum.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/MsgTypeEnum.java similarity index 96% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/MsgTypeEnum.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/MsgTypeEnum.java index ebb85cc..dc3993a 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/MsgTypeEnum.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/MsgTypeEnum.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.kit.enums; +package org.nl.acs.api.agvKit.service.enums; public enum MsgTypeEnum { CREATE_TASK_REQ(3, "创建任务"), diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/TaskPhaseEnum.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/TaskPhaseEnum.java similarity index 96% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/TaskPhaseEnum.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/TaskPhaseEnum.java index 00541ad..fe18391 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/TaskPhaseEnum.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/TaskPhaseEnum.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.kit.enums; +package org.nl.acs.api.agvKit.service.enums; public enum TaskPhaseEnum { PICKUP_REQUEST_OR_RESPONSE("1", "取货请求或者取请求应答(允许取货)"), diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/TaskStateEnum.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/TaskStateEnum.java similarity index 94% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/TaskStateEnum.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/TaskStateEnum.java index 73e5881..b84a21d 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/enums/TaskStateEnum.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/enums/TaskStateEnum.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.kit.enums; +package org.nl.acs.api.agvKit.service.enums; public enum TaskStateEnum { NOT_STARTED("0", "任务未启动"), diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/impl/AcsToKitServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/impl/AcsToKitServiceImpl.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/impl/AcsToKitServiceImpl.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/impl/AcsToKitServiceImpl.java index bd31b36..f7487f7 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/impl/AcsToKitServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/impl/AcsToKitServiceImpl.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.kit.service.impl; +package org.nl.acs.api.agvKit.service.impl; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; @@ -7,10 +7,10 @@ import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.acs.AcsConfig; -import org.nl.acs.api.address.service.AddressService; +import org.nl.acs.api.apiAdd.service.AddressService; import org.nl.acs.device.device.service.DeviceService; import org.nl.acs.device.device.service.impl.DeviceServiceImpl; -import org.nl.acs.api.kit.service.AcsToKitService; +import org.nl.acs.api.agvKit.service.AcsToKitService; import org.nl.acs.task.instruction.domain.Instruction; import org.nl.config.MapOf; import org.nl.config.SpringContextHolder; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/impl/KitToAcsServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/impl/KitToAcsServiceImpl.java similarity index 94% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/impl/KitToAcsServiceImpl.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/impl/KitToAcsServiceImpl.java index 955a94b..7f3e1ed 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/kit/service/impl/KitToAcsServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/agvKit/service/impl/KitToAcsServiceImpl.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.kit.service.impl; +package org.nl.acs.api.agvKit.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; @@ -6,18 +6,18 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.api.kit.enums.MsgTypeEnum; -import org.nl.acs.api.kit.enums.TaskPhaseEnum; -import org.nl.acs.api.kit.enums.TaskStateEnum; -import org.nl.acs.api.kit.service.KitToAcsService; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.api.agvKit.service.enums.MsgTypeEnum; +import org.nl.acs.api.agvKit.service.enums.TaskPhaseEnum; +import org.nl.acs.api.agvKit.service.enums.TaskStateEnum; +import org.nl.acs.api.agvKit.service.KitToAcsService; +import org.nl.acs.device.storageMgt.service.entity.StorageCell; import org.nl.acs.task.instruction.domain.Instruction; import org.nl.acs.task.instruction.enums.InstructionStatusEnum; import org.nl.acs.task.instruction.service.InstructionService; import org.nl.acs.iot.opc.DeviceAppService; -import org.nl.acs.device.storage_cell.service.StorageCellService; -import org.nl.acs.device.storage_cell.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.StorageCellService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -74,7 +74,7 @@ public class KitToAcsServiceImpl implements KitToAcsService { switch (taskPhaseEnum){ case ENTER_REQUEST_OR_ALLOWED: case LEAVE_NOTICE_OR_ALLOWED: - StorageCellDto storageCellDto = storageCellService.findByAddress(taskPoint); + StorageCell storageCellDto = storageCellService.findByAddress(taskPoint); if (ObjectUtil.isEmpty(storageCellDto)) { resp.put("code", "400"); resp.put("message", "请求失败,点位信息不存在,点位站点号:" + taskPoint); diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/rest/AddressController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/controller/AddressController.java similarity index 88% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/rest/AddressController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/controller/AddressController.java index f1b341e..297cb02 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/rest/AddressController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/controller/AddressController.java @@ -1,8 +1,8 @@ -package org.nl.acs.api.address.rest; +package org.nl.acs.api.apiAdd.controller; import lombok.RequiredArgsConstructor; -import org.nl.acs.api.address.service.AddressService; -import org.nl.acs.api.address.service.dto.AddressDto; +import org.nl.acs.api.apiAdd.service.AddressService; +import org.nl.acs.api.apiAdd.service.dto.AddressDto; import org.nl.common.logging.annotation.Log; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; @@ -21,18 +21,17 @@ import java.util.Map; @RestController @RequiredArgsConstructor @RequestMapping("/api/Address") -public class AddressController { +public class +AddressController { private final AddressService addressService; @GetMapping - @Log("查询接口方法地址") public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { return new ResponseEntity<>(addressService.queryAll(whereJson, page), HttpStatus.OK); } @GetMapping("/queryAddressCodeList") - @Log("查询接口方法地址编码") public ResponseEntity queryAddressCodeList() { return new ResponseEntity<>(addressService.queryAddressCodeList(), HttpStatus.OK); } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/AddressService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/AddressService.java similarity index 93% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/AddressService.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/AddressService.java index 190b2e4..f2f1124 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/AddressService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/AddressService.java @@ -1,11 +1,11 @@ -package org.nl.acs.api.address.service; +package org.nl.acs.api.apiAdd.service; import com.alibaba.fastjson.JSONObject; -import org.nl.acs.api.address.service.dto.AddressDto; -import org.nl.acs.api.address.service.dto.AddressQueryParam; +import org.nl.acs.api.apiAdd.service.dto.AddressDto; +import org.nl.acs.api.apiAdd.service.dto.AddressQueryParam; import org.nl.common.db.PageInfo; import org.nl.common.db.CommonService; -import org.nl.acs.api.address.domain.Address; +import org.nl.acs.api.apiAdd.service.entity.Address; import org.springframework.data.domain.Pageable; import javax.servlet.http.HttpServletResponse; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/dto/AddressDto.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/dto/AddressDto.java similarity index 94% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/dto/AddressDto.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/dto/AddressDto.java index 7ab129a..283af76 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/dto/AddressDto.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/dto/AddressDto.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.address.service.dto; +package org.nl.acs.api.apiAdd.service.dto; import lombok.*; import lombok.experimental.Accessors; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/dto/AddressQueryParam.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/dto/AddressQueryParam.java similarity index 76% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/dto/AddressQueryParam.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/dto/AddressQueryParam.java index 0ced6c5..615a599 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/dto/AddressQueryParam.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/dto/AddressQueryParam.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.address.service.dto; +package org.nl.acs.api.apiAdd.service.dto; import lombok.Getter; import lombok.Setter; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/domain/Address.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/entity/Address.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/domain/Address.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/entity/Address.java index db43317..01eaf78 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/domain/Address.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/entity/Address.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.address.domain; +package org.nl.acs.api.apiAdd.service.entity; import org.nl.common.db.CommonModel; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/impl/AddressServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/impl/AddressServiceImpl.java similarity index 96% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/impl/AddressServiceImpl.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/impl/AddressServiceImpl.java index 483301b..47b1f33 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/impl/AddressServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/impl/AddressServiceImpl.java @@ -1,4 +1,4 @@ -package org.nl.acs.api.address.service.impl; +package org.nl.acs.api.apiAdd.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; @@ -12,7 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.AllArgsConstructor; -import org.nl.acs.api.address.service.mapper.AddressMapper; +import org.nl.acs.api.apiAdd.service.mapper.AddressMapper; import org.nl.common.db.CommonFinalParam; import org.nl.common.db.PageInfo; import org.nl.common.db.QueryHelpMybatisPlus; @@ -22,10 +22,10 @@ import org.nl.common.utils.ConvertUtil; import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.FileUtil; import org.nl.common.utils.utils.PageUtil; -import org.nl.acs.api.address.domain.Address; -import org.nl.acs.api.address.service.AddressService; -import org.nl.acs.api.address.service.dto.AddressDto; -import org.nl.acs.api.address.service.dto.AddressQueryParam; +import org.nl.acs.api.apiAdd.service.entity.Address; +import org.nl.acs.api.apiAdd.service.AddressService; +import org.nl.acs.api.apiAdd.service.dto.AddressDto; +import org.nl.acs.api.apiAdd.service.dto.AddressQueryParam; import org.nl.config.language.LangProcess; import org.springframework.stereotype.Service; import org.springframework.data.domain.Pageable; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/mapper/AddressMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/mapper/AddressMapper.java similarity index 68% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/mapper/AddressMapper.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/mapper/AddressMapper.java index ab04c01..6372366 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/address/service/mapper/AddressMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/apiAdd/service/mapper/AddressMapper.java @@ -1,7 +1,7 @@ -package org.nl.acs.api.address.service.mapper; +package org.nl.acs.api.apiAdd.service.mapper; import org.nl.common.db.CommonMapper; -import org.nl.acs.api.address.domain.Address; +import org.nl.acs.api.apiAdd.service.entity.Address; import org.springframework.stereotype.Repository; /** diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/AcsUtil.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/AcsUtil.java deleted file mode 100644 index dbe7e9a..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/AcsUtil.java +++ /dev/null @@ -1,50 +0,0 @@ - -package org.nl.acs.api.wms; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpRequest; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.db.CommonFinalParam; -import org.nl.common.exception.BadRequestException; -import org.nl.config.language.LangProcess; -import org.nl.system.service.param.ISysParamService; -import org.nl.config.SpringContextHolder; -import org.nl.system.service.param.impl.SysParamServiceImpl; - -/** - * ACS连接外部系统工具类: - */ -@Slf4j -public class AcsUtil { - - - - public static String notifyAcs(String api, W requestParam) { - ISysParamService paramService = SpringContextHolder.getBean(SysParamServiceImpl.class); - //判断是否连接立库WCS系统 - String isConnect = paramService.findByCode("is_connect_liKu_Wcs").getValue(); - if (StrUtil.equals("0", isConnect)) { - throw new BadRequestException(LangProcess.msg("error_config")); - } - String liKu_wcs_url = paramService.findByCode("liKu_wcs_url").getValue(); - try { - log.info("下发立库任务请求参数:{}", JSON.toJSONString(requestParam)); - String body = HttpRequest - .post(liKu_wcs_url + api).setConnectionTimeout(3000) - .body(JSON.toJSONString(requestParam)) - .execute() - .body(); - log.info("下发立库任务返回参数:{}", body); - return body; - } catch (Exception e) { - JSONObject result = new JSONObject(); - result.put("result", "false"); - result.put("code", CommonFinalParam.ONE); - result.put("comment", e.getMessage()); - log.info("下发立库任务异常返回参数:{}", String.valueOf(result)); - return String.valueOf(result); - } - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/LmsUtil.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/LmsUtil.java deleted file mode 100644 index 5823ebd..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/LmsUtil.java +++ /dev/null @@ -1,49 +0,0 @@ - -package org.nl.acs.api.wms; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpRequest; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import org.nl.config.SpringContextHolder; -import org.nl.system.service.param.ISysParamService; -import org.nl.system.service.param.impl.SysParamServiceImpl; - -/** - * ACS连接外部系统工具类: - */ -@Slf4j -public class LmsUtil { - - public static String notifyAcs(String api, W requestParam) { - ISysParamService paramService = SpringContextHolder.getBean(SysParamServiceImpl.class); - //判断是否连接立库WCS系统 - String isConnect = paramService.findByCode("hasWms").getValue(); - if (StrUtil.equals("0", isConnect)) { - JSONObject result = new JSONObject(); - result.put("400", "500"); - result.put("message", "参数配置表中-hasWms为:0"); - log.info("请求LMS异常返回参数:{}", String.valueOf(result)); - return String.valueOf(result); - //throw new BadRequestException("参数配置表中-hasWms为:0"); - } - String liKu_wcs_url = paramService.findByCode("wmsurl").getValue(); - try { -// log.info("请求LMS参数:{}", JSON.toJSONString(requestParam)); - String body = HttpRequest - .post(liKu_wcs_url + api).setConnectionTimeout(3000) - .body(JSON.toJSONString(requestParam)) - .execute() - .body(); -// log.info("请求LMS参数返回参数:{}", body); - return body; - } catch (Exception e) { - JSONObject result = new JSONObject(); - result.put("code", "500"); - result.put("message", e.getMessage()); -// log.info("请求LMS异常返回参数:{}", String.valueOf(result)); - return String.valueOf(result); - } - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/rest/AcsToWmsController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/controller/AcsToWmsController.java similarity index 90% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/rest/AcsToWmsController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/controller/AcsToWmsController.java index 6609798..c249fa8 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/rest/AcsToWmsController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/controller/AcsToWmsController.java @@ -1,5 +1,5 @@ -package org.nl.acs.api.wms.rest; +package org.nl.acs.api.wms.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/rest/WmsToAcsController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/controller/WmsToAcsController.java similarity index 90% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/rest/WmsToAcsController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/controller/WmsToAcsController.java index f45fc81..6f348ea 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/rest/WmsToAcsController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/api/wms/controller/WmsToAcsController.java @@ -1,5 +1,5 @@ -package org.nl.acs.api.wms.rest; +package org.nl.acs.api.wms.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AbstractAutoRunnable.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AbstractAutoRunnable.java new file mode 100644 index 0000000..506a5a2 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AbstractAutoRunnable.java @@ -0,0 +1,67 @@ +package org.nl.acs.autoThread; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.autoThread.autoRunThread.service.enums.ThreadUsedStatusEnum; +import org.nl.acs.autoThread.service.enums.ThreadStatusEnum; + +import java.util.Date; + +@Slf4j +/** + * Demo class + * + * @author zhoujj + * @date 2023/12/06 + */ +@Data +public abstract class AbstractAutoRunnable implements Runnable { + //线程执行状态 + private ThreadStatusEnum status; + //线程开始时间 + private Date startTime; + //线程结束时间 + private Date stopTime; + //关闭信息 + private String message; + //初始化状态 + private ThreadUsedStatusEnum usedStatus = ThreadUsedStatusEnum.unUsed; + + @Override + public void run() { + this.setStatus(ThreadStatusEnum.run); + this.setStartTime(new Date()); + try { + this.setMessage("自动线程初始化中"); + this.before(); + //子类该方法是个死循环 + this.autoRun(); + this.setMessage("自动线程正常启动"); + } catch (Throwable throwable) { + System.out.println("------"+this.getCode()+"自动线程执行异常"+throwable.getMessage()+"------"); + log.error(this.getCode()+"自动线程执行异常", throwable); + } finally { + this.setStopTime(new Date()); + this.setMessage("自动线程关闭"); + this.setStatus(ThreadStatusEnum.stop); + this.after(); + } + + } + + public void before() throws Exception {} + public void after() {} + public void stop() { + this.after(); + } + + public abstract String getCode(); + /** + *getName + * @return Name + */ + public abstract String getName(); + + public abstract void autoRun() throws Exception; + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AcsInit.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AcsInit.java deleted file mode 100644 index 2f28e74..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AcsInit.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.nl.acs.autoThread; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.autoThread.initial.ApplicationAutoInitialExecuter; -import org.nl.acs.autoThread.initial.WebAutoInitialExecuter; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; -/** - * 随项目启动模块 - */ -@Slf4j -@Component -@RequiredArgsConstructor -@Order(50) -/** - * Demo class - *@ConditionalOnProperty(value = "spring.profiles.active",havingValue = "prod") - * @author zhoujj - * @date 2023/12/06 - */ -public class AcsInit implements ApplicationRunner { - private final ApplicationAutoInitialExecuter applicationAutoInitialExecuter; - private final WebAutoInitialExecuter webAutoInitialExecuter; - - @Override - public void run(ApplicationArguments args) throws Exception { - //随线程启动 - initApplicationAutoInitialExecuter(); - initWebAutoInitialExecuter(); - } - - private void initApplicationAutoInitialExecuter() throws Exception { - applicationAutoInitialExecuter.init(); - } - - private void initWebAutoInitialExecuter() throws Exception { - webAutoInitialExecuter.init(); - } - -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/StartConfig.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/StartConfig.java new file mode 100644 index 0000000..9d092a1 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/StartConfig.java @@ -0,0 +1,21 @@ +package org.nl.acs.autoThread; + +import java.util.ArrayList; +import java.util.List; +//启动过配置 +public class StartConfig { + /** + * 开发的选项只有当开发为true的时候才生效 + */ + public static Boolean Need_Stop = Boolean.TRUE; + /** + * 强制关闭的自启动线程 + */ + public static List AutoRun_Ban = new ArrayList(); + + static { + AutoRun_Ban.add("TaskFeedbackAutoRun"); + //测试socket用的测试类 + AutoRun_Ban.add("SocketListenerAutoRun"); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AutoRunController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/controller/AutoRunController.java similarity index 75% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AutoRunController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/controller/AutoRunController.java index 01476d9..4dbc96e 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/AutoRunController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/controller/AutoRunController.java @@ -1,10 +1,7 @@ -package org.nl.acs.autoThread; +package org.nl.acs.autoThread.controller; - - -import lombok.RequiredArgsConstructor; -import org.nl.acs.autoThread.run.AutoRunService; -import org.nl.acs.autoThread.run.ThreadDto; +import org.nl.acs.autoThread.service.AutoRunService; +import org.nl.acs.autoThread.service.dto.AutoRunDto; import org.nl.common.utils.utils.PageUtil; import org.nl.common.logging.annotation.Log; import org.springframework.beans.factory.annotation.Autowired; @@ -15,20 +12,8 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; -/** - * @author / - * 接口限流测试类 - */ @RestController @RequestMapping("/api/autorun") - -@RequiredArgsConstructor -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ public class AutoRunController { @Autowired @@ -36,9 +21,8 @@ public class AutoRunController { @Log("查询自动线程") - @GetMapping public ResponseEntity query(Map map) throws Exception { - List ThreadDtos = autoRunService.findAll(); + List ThreadDtos = autoRunService.findAll(); return new ResponseEntity<>(PageUtil.toPage(ThreadDtos, ThreadDtos.size()), HttpStatus.OK); } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/ApplicationAutoInitialExecuter.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/ApplicationAutoInitialExecuter.java deleted file mode 100644 index 18234b1..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/ApplicationAutoInitialExecuter.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.nl.acs.autoThread.initial; - -import cn.hutool.core.util.ObjectUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ -@Component -public class ApplicationAutoInitialExecuter { - /** - * 获取所有实现ApplicationAutoInitial接口的bean对象 - */ - @Autowired(required = false) - List applicationAutoInitial; - /** - * - * 是否启动 - * - */ - private final static boolean IS_AUTO_THREAD_CODE = true; - - public void init() throws Exception { - if (!IS_AUTO_THREAD_CODE) { - return; - } - - List services = ObjectUtil.isNotEmpty(applicationAutoInitial) ? this.applicationAutoInitial : new ArrayList(); - Iterator it = services.iterator(); - - while (it.hasNext()) { - ApplicationAutoInitial service = (ApplicationAutoInitial) it.next(); - // 执行实现的autoInitial方法 - service.autoInitial(); - } - - - } - -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/WebAutoInitial.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/WebAutoInitial.java deleted file mode 100644 index aea9df4..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/WebAutoInitial.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.nl.acs.autoThread.initial; -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ -public interface WebAutoInitial { - /** - * autoInitial - * @throws Exception - */ - void autoInitial() throws Exception; -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/WebAutoInitialExecuter.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/WebAutoInitialExecuter.java deleted file mode 100644 index c665e41..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/initial/WebAutoInitialExecuter.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.nl.acs.autoThread.initial; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -@Component -@Lazy(false) -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ -public class WebAutoInitialExecuter { - @Autowired(required = false) - List webAutoInitial; - - private List getWebAutoInitialService() { - return (List) (this.webAutoInitial != null && this.webAutoInitial.size() != 0 - ? this.webAutoInitial - : new ArrayList()); - } - - public void init() throws Exception { - List services = this.getWebAutoInitialService(); - Iterator arg1 = services.iterator(); - - while (arg1.hasNext()) { - WebAutoInitial service = (WebAutoInitial) arg1.next(); - service.autoInitial(); - } - - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AbstractAutoRunnable.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AbstractAutoRunnable.java deleted file mode 100644 index 4efeef6..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AbstractAutoRunnable.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.nl.acs.autoThread.run; - -import lombok.extern.slf4j.Slf4j; - -import java.util.Date; - -@Slf4j -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ -public abstract class AbstractAutoRunnable implements Runnable { - private ThreadStatusEnum status; - private Date startTime; - private Date stopTime; - private String stopMessage; - private ThreadUsedStatusEnum usedStatus; - - @Override - public void run() { - this.setStatus(ThreadStatusEnum.run); - this.setStartTime(new Date()); - this.setStopMessage(""); - String true_clear = "执行完毕"; - - try { - this.before(); - //子类该方法是个死循环 - this.autoRun(); - this.setStopMessage(true_clear); - } catch (Throwable arg5) { - log.warn("", arg5); - } finally { - this.setStopTime(new Date()); - this.setStatus(ThreadStatusEnum.stop); - this.after(); - } - - } - - public void before() throws Exception { - } - - public void after() { - } - - public void stop() { - this.after(); - } - - public Boolean getForbidStop() { - return Boolean.valueOf(false); - } - - public Boolean getForbidDisable() { - return Boolean.valueOf(false); - } - /** - *getCode - * @return Code - */ - public abstract String getCode(); - /** - *getName - * @return Name - */ - public abstract String getName(); - - public String getDescription() { - return this.getName(); - } - - /** - * autoRun - * @throws Exception - */ - public abstract void autoRun() throws Exception; - - public ThreadStatusEnum getStatus() { - return this.status; - } - - public void setStatus(ThreadStatusEnum status) { - this.status = status; - } - - public Date getStartTime() { - return this.startTime; - } - - public void setStartTime(Date startTime) { - this.startTime = startTime; - } - - public Date getStopTime() { - return this.stopTime; - } - - public void setStopTime(Date stopTime) { - this.stopTime = stopTime; - } - - public String getStopMessage() { - return this.stopMessage; - } - - public void setStopMessage(String stopMessage) { - this.stopMessage = stopMessage; - } - - public ThreadUsedStatusEnum getUsedStatus() { - return this.usedStatus; - } - - public void setUsedStatus(ThreadUsedStatusEnum usedStatus) { - this.usedStatus = usedStatus; - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AutoRunService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AutoRunService.java deleted file mode 100644 index ea79aa6..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AutoRunService.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.nl.acs.autoThread.run; - -import java.util.List; -import java.util.Map; -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ - -public interface AutoRunService { - /** - * 开始线程 - * - * @param arg0 条件 - * @return / - */ - void startThread(String arg0); - - /** - * 结束线程 - * - * @param arg0 条件 - * @return / - */ - void stopThread(String arg0); - - /** - * 通过编号查找 - * - * @param arg0 条件 - * @param arg1 条件 - * @return / - */ - ThreadDto findByCode(String arg0, String arg1); - /** - * 查找全部 - * - * - * @return / - */ - List findAll(); - /** - * 通过条件得到 - * - * @param whereJson 条件 - * @return / - */ - List findByCondition(Map whereJson); - /** - * 通过编码得到线程 - * - * @param code 条件 - * @return / - */ - Thread getThreadByCode(String code); -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AutoRunServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AutoRunServiceImpl.java deleted file mode 100644 index 2c7e71c..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/AutoRunServiceImpl.java +++ /dev/null @@ -1,249 +0,0 @@ -package org.nl.acs.autoThread.run; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.autoThread.initial.ApplicationAutoInitial; -import org.nl.common.exception.BadRequestException; - -import org.nl.config.language.LangProcess; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.*; - -/** - * 初始化启动线程 - */ -@Service -@Slf4j -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ -public class AutoRunServiceImpl implements AutoRunService, ApplicationAutoInitial { - @Autowired(required = false) - private List abstractAutoRunnableList; - /** - * 线程类 - */ - private List thread_autoRun = new ArrayList(); - /** - * key - */ - private List autoRun_code_index = new ArrayList(); - /** - * 运行线程 - */ - private List threads = new ArrayList(); - /** - * key - */ - private List thread_code_index = new ArrayList(); - - @Override - public synchronized void startThread(String threadCode) { - Thread thread = this.getThreadByCode(threadCode); - if (thread == null) { - throw new BadRequestException(LangProcess.msg("error_isNull", threadCode)); - } else if (thread.isAlive()) { - throw new BadRequestException(LangProcess.msg("error_status", threadCode)); - } else { - int index = this.thread_code_index.indexOf(threadCode); - thread = new Thread(this.getRunablebyCode(threadCode)); - this.threads.set(index, thread); - thread.start(); - } - } - - @Override - public synchronized void stopThread(String threadCode) { - Thread thread = this.getThreadByCode(threadCode); - if (thread == null) { - throw new BadRequestException(LangProcess.msg("error_isNull", threadCode)); - } - try { - AbstractAutoRunnable runable = this.getRunablebyCode(threadCode); - runable.stop(); - thread.stop(); - thread.interrupt(); - thread.join(); - runable.setStopMessage("人工停止"); - runable.setStopTime(new Date()); - } catch (Exception arg4) { - arg4.printStackTrace(); - throw new BadRequestException(LangProcess.msg("error_status", threadCode)); - } - - - - - } - - @Override - public Thread getThreadByCode(String code) { - int index = this.thread_code_index.indexOf(code); - return index < 0 ? null : (Thread) this.threads.get(index); - } - - private AbstractAutoRunnable getRunablebyCode(String code) { - int index = this.thread_code_index.indexOf(code); - return index < 0 ? null : (AbstractAutoRunnable) this.thread_autoRun.get(index); - } - - @Override - public List findAll() { - ArrayList list = new ArrayList(); - List list2 = this.getAllAutoThread(); - Iterator arg2 = list2.iterator(); - - AbstractAutoRunnable t; - ThreadDto e; - while (arg2.hasNext()) { - t = (AbstractAutoRunnable) arg2.next(); - if (ThreadUsedStatusEnum.unUsed.equals(t.getUsedStatus())) { - e = new ThreadDto(); - BeanUtil.copyProperties(t, e, true); - list.add(e); - } - } - - arg2 = this.thread_autoRun.iterator(); - - while (arg2.hasNext()) { - t = (AbstractAutoRunnable) arg2.next(); - e = new ThreadDto(); - BeanUtil.copyProperties(t, e, true); - Thread thread = this.getThreadByCode(t.getCode()); - e.setCode(t.getCode()); - e.setName(t.getName()); - - e.setThread_alive(Boolean.valueOf(thread.isAlive())); - e.setThread_name(thread.getName()); - e.setThread_id(thread.getId() + ""); - e.setThread_state(thread.getState().toString()); - list.add(e); - } - - return list; - } - - @Override - public List findByCondition(Map whereJson) { - List ori_threads = this.findAll(); - ArrayList return_threads = new ArrayList(); - if (CollectionUtil.isEmpty(whereJson)) { - return ori_threads; - } else { - Iterator it = ori_threads.iterator(); - - while (it.hasNext()) { - ThreadDto thread = (ThreadDto) it.next(); - Map properties = BeanUtil.beanToMap(thread); - - Iterator> entries = whereJson.entrySet().iterator(); - - while (entries.hasNext()) { - Map.Entry entry = entries.next(); - String column = entry.getKey(); - String value = (String) entry.getValue(); - if (properties.containsKey(column)) { - String propert = (String) properties.get(column); - - if (!StrUtil.isEmpty(propert) - && propert.contains(value)) { - return_threads.add(thread); - } - } - } - } - - return return_threads; - } - - } - - - @Override - public ThreadDto findByCode(String thread_code, String thread_id) { - List ori_threads = this.findAll(); - Iterator arg3 = ori_threads.iterator(); - - ThreadDto thread; - do { - if (!arg3.hasNext()) { - return null; - } - - thread = (ThreadDto) arg3.next(); - } while (!StrUtil.equals(thread.getCode(), thread_code) - || !StrUtil.equals(thread.getThread_id(), thread_id)); - - return thread; - } - - - private List getAllAutoThread() { - return ObjectUtil.isNotEmpty(abstractAutoRunnableList) - ? this.abstractAutoRunnableList - : new LinkedList(); - } - - /** - * 自动初始化线程 - * - * @throws Exception - */ - @Override - public void autoInitial() throws Exception { - // 获取所有的类型为AbstractAutoRunnable的bean - List list = this.getAllAutoThread(); - Iterator it = list.iterator(); - - AbstractAutoRunnable t; - while (it.hasNext()) { - t = (AbstractAutoRunnable) it.next(); - t.setUsedStatus(ThreadUsedStatusEnum.unUsed); - String a; - if (StrUtil.isEmpty(t.getCode())) { - a = "code 因为空而未加载"; - log.warn(a); - t.setStopMessage(a); - this.autoRun_code_index.add(t.getCode()); - } else if (this.autoRun_code_index.contains(t.getCode())) { - a = String.format("code:%s 因为重复而未加载", new Object[]{t.getCode()}); - log.warn(a); - t.setStopMessage(a); - this.autoRun_code_index.add(t.getCode()); - } else { - t.setUsedStatus(ThreadUsedStatusEnum.used); - this.thread_autoRun.add(t); - this.autoRun_code_index.add(t.getCode()); - } - } - - it = this.thread_autoRun.iterator(); - - while (it.hasNext()) { - t = (AbstractAutoRunnable) it.next(); - this.threads.add(new Thread(t)); - this.thread_code_index.add(t.getCode()); - } - - for (int i = 0; i < this.threads.size(); ++i) { - Thread thread = (Thread) this.threads.get(i); - AbstractAutoRunnable runnable = (AbstractAutoRunnable) this.thread_autoRun.get(i); - if (runnable.getForbidStop().booleanValue()) { - thread.start(); - } else if (SystemConfig.thread_auto_run.booleanValue() && (!DevelopConfig.develop.booleanValue() - || !DevelopConfig.thread_auto_run_force_stop.contains(this.thread_code_index.get(i)))) { - thread.start(); - } - } - - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/DevelopConfig.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/DevelopConfig.java deleted file mode 100644 index 23b23df..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/DevelopConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.nl.acs.autoThread.run; - -import java.util.ArrayList; -import java.util.List; -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ -public class DevelopConfig { - /** - * 开发的选项只有当开发为true的时候才生效 - */ - public static Boolean develop = Boolean.valueOf(true); - /** - * 强制关闭的自启动线程 - */ - public static List thread_auto_run_force_stop = new ArrayList(); - - static { - thread_auto_run_force_stop.add("TaskFeedbackAutoRun"); - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/SystemConfig.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/SystemConfig.java deleted file mode 100644 index 13b6f3c..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/SystemConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.nl.acs.autoThread.run; - -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ -public class SystemConfig { - /** - * 当前系统编码与其他系统通信对接的时候需要用到此编码 - */ - public static String system_code = "wcs10"; - /** - * 默认用户密码 - */ - public static String default_password = "1"; - /** - * 默认序列创建初始值 - */ - public static Integer sequence_initial_value = Integer.valueOf(1); - /** - * 主线程是否自动开启选项 - */ - public static Boolean thread_auto_run = Boolean.valueOf(true); -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadDto.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadDto.java deleted file mode 100644 index dbb87c6..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadDto.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.nl.acs.autoThread.run; - -import java.util.Date; -/** - * Demo class - * - * @author zhoujj - * @date 2023/12/06 - */ -public class ThreadDto { - - private String code; - private String name; - private String description; - private ThreadStatusEnum status; - private ThreadUsedStatusEnum usedStatus; - private Date startTime; - private Date stopTime; - private String stopMessage; - private Boolean thread_alive; - private String thread_name; - private String thread_id; - private String thread_state; - private Boolean forbidStop = Boolean.valueOf(false); - private Boolean forbidDisable = Boolean.valueOf(false); - - public String getCode() { - return this.code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return this.description; - } - - public void setDescription(String description) { - this.description = description; - } - - public ThreadStatusEnum getStatus() { - return this.status; - } - - public void setStatus(ThreadStatusEnum status) { - this.status = status; - } - - public ThreadUsedStatusEnum getUsedStatus() { - return this.usedStatus; - } - - public void setUsedStatus(ThreadUsedStatusEnum usedStatus) { - this.usedStatus = usedStatus; - } - - public Date getStartTime() { - return this.startTime; - } - - public void setStartTime(Date startTime) { - this.startTime = startTime; - } - - public Date getStopTime() { - return this.stopTime; - } - - public void setStopTime(Date stopTime) { - this.stopTime = stopTime; - } - - public String getStopMessage() { - return this.stopMessage; - } - - public void setStopMessage(String stopMessage) { - this.stopMessage = stopMessage; - } - - public Boolean getThread_alive() { - return this.thread_alive; - } - - public void setThread_alive(Boolean thread_alive) { - this.thread_alive = thread_alive; - } - - public String getThread_name() { - return this.thread_name; - } - - public void setThread_name(String thread_name) { - this.thread_name = thread_name; - } - - public String getThread_id() { - return this.thread_id; - } - - public void setThread_id(String thread_id) { - this.thread_id = thread_id; - } - - public String getThread_state() { - return this.thread_state; - } - - public void setThread_state(String thread_state) { - this.thread_state = thread_state; - } - - public Boolean getForbidStop() { - return this.forbidStop; - } - - public void setForbidStop(Boolean forbidStop) { - this.forbidStop = forbidStop; - } - - public Boolean getForbidDisable() { - return this.forbidDisable; - } - - public void setForbidDisable(Boolean forbidDisable) { - this.forbidDisable = forbidDisable; - } - -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/TwoNDCSocketConnectionAutoRun.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/TwoNDCSocketConnectionAutoRun.java deleted file mode 100644 index d5c1161..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/TwoNDCSocketConnectionAutoRun.java +++ /dev/null @@ -1,354 +0,0 @@ -package org.nl.acs.autoThread.run; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.AcsConfig; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device.service.DeviceService; - -import org.nl.acs.api.wms.service.AcsToWmsService; -import org.nl.acs.api.wms.service.impl.AcsToWmsServiceImpl; -import org.nl.acs.task.instruction.domain.Instruction; -import org.nl.acs.task.instruction.service.InstructionService; -import org.nl.acs.task.instruction.service.impl.InstructionServiceImpl; -import org.nl.acs.log.service.DeviceExecuteLogService; -import org.nl.acs.iot.opc.DeviceAppService; -import org.nl.config.SpringContextHolder; -import org.nl.config.lucene.service.LuceneExecuteLogService; -import org.nl.system.service.dict.ISysDictService; -import org.nl.system.service.dict.dao.Dict; -import org.nl.system.service.param.ISysParamService; -import org.nl.system.service.param.impl.SysParamServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.util.Date; - - - -@Slf4j -@Component -public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { - - Socket socket; - String ip = "192.168.46.225"; - int port = 1234; - static DataOutputStream dos; - static DataInputStream dis; - private int recordTimeOut = 10000; - private Date recordTime; - String[] ERROR = new String[]{ - "货叉尖部传感器触发", "S300传感器触发", "载货状态改变", "急停按钮触发", "触边开关出发", "需要复位", - "停在充电位", "取货失败", "放货失败", "轮子打滑", "没有动作码不能进入站点", "取货时有货", "丢失定位", - "抬叉停止"}; - boolean bConnected = true; - - boolean isReConnect = false; - int i = 1; - boolean requireSucessRegion = false; - boolean requireSucessTake = false; - boolean requireSucessPut = false; - - - @Autowired - ISysParamService paramService; - @Autowired - AutoRunService autoRunService; - @Autowired - LuceneExecuteLogService luceneExecuteLogService; - @Autowired - ISysDictService dictService; - - public TwoNDCSocketConnectionAutoRun() { - this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); - } - - @Override - public String getCode() { - return TwoNDCSocketConnectionAutoRun.class.getSimpleName(); - } - - @Override - public String getName() { - return "2楼1区域AGV系统"; - } - - @Override - public void autoRun() throws IOException { - ISysParamService paramService = SpringContextHolder.getBean(SysParamServiceImpl.class); - InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); - AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); - DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); - DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); - DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); - - try { - log.info("AGV系统链接开始"); - ip = paramService.findByCode(AcsConfig.AGVURL).getValue(); - port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT).getValue()); -// byte[] b = new byte[1024]; -// s = new Socket(ip, port); -// System.out.println("2楼1区域Agv链接成功"); -// dos = new DataOutputStream(s.getOutputStream()); -// dis = new DataInputStream(s.getInputStream()); - - InetSocketAddress socketAddress = new InetSocketAddress(ip, port); - - byte[] b = new byte[1024]; - socket = new Socket(); - socket.connect(socketAddress, 5 * 1000); - socket.setKeepAlive(true);//长链接 - socket.setSoTimeout(30000);//读取超时时间 - dos = new DataOutputStream(socket.getOutputStream()); - dis = new DataInputStream(socket.getInputStream()); - - while (socket.isConnected()) { - System.out.println("当前socket状态:"+socket.isConnected()); - int count = dis.read(b); -// System.out.println("当前count值:"+count); - if (count == -1) { - log.error("agv连接出现异常:服务端被关闭"); - if (ObjectUtil.isNotEmpty(socket)) { - socket.close(); - } - break; - } - - int[] arr = new int[count]; - StringBuffer bs = new StringBuffer(); - - for (int i = 0; i < count; i++) { - int temp = b[i]; - if (temp < 0) - temp += 256; - arr[i] = temp; - StringBuffer bs1 = new StringBuffer("0"); - bs.append(temp < 16 ? bs1.append(Integer.toHexString(temp)) : Integer.toHexString(temp)); - } - - System.out.println("收到请求参数:" + bs); - - boolean flag = false; - if (arr.length < 10) { - - log.info("接收agv上报信息:" + bs); - } else { - if (arr[8] * 256 + arr[9] == 0x73) { - byte[] data = null; - System.out.println("接收agv上报信息:" + bs); - //执行阶段 - int phase = arr[16] * 256 + arr[17]; - // agv任务号 - int index = arr[12] * 256 + arr[13]; - //任务号 - int ikey = arr[26] * 256 + arr[27]; - //站点号 - int agvaddr = arr[18] * 256 + arr[19]; - //车号 - int carno = arr[20]; - //充电桩站点号 - int station = arr[25]; - Instruction inst = null; - if (ikey != 0) { - inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); - } - log.info("接收agv上报信息:" + bs); - log.info("接收agv上报信息:" + "phase--" + phase + " index--" + index + " ikey--" + ikey + " agvaddr--" + agvaddr + " Car--" + carno); - Device device = null; - String device_code = null; - String old_device_code = null; - String emptyNum = null; - - if (agvaddr != 0) { - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, "-")) { - String[] point = old_device_code.split("-"); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, ".")) { - String[] point = old_device_code.split("\\."); - device_code = point[0]; - emptyNum = point[1]; - } else { - device_code = old_device_code; - } - device = deviceAppService.findDeviceByCode(device_code); - } - - - //开始任务 - if (phase == 0x01) { - if (!ObjectUtil.isEmpty(inst)) { - inst.setInstruction_status("1"); - inst.setAgv_jobno(String.valueOf(index)); - inst.setSend_status("1"); - instructionService.update(inst); - // data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - } - flag = true; - } - //任务完毕 - //(无车id及状态) - else if (phase == 0x14) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - } else { - String agvcar = inst.getCarno(); - Device agvDevice = deviceAppService.findDeviceByCode(agvcar); - - inst.setInstruction_status("2"); - try { - instructionService.finish(inst); - } catch (Exception e) { - e.printStackTrace(); - } - } - // data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - } - //请求删除任务 - //(需要WCS反馈) - else if (phase == 0x30) { -// data = ndcAgvService.sendAgvTwoModeInst(0x8F, index, 0); - // data = ndcAgvService.sendAgvTwoModeInst(0x8F, index, 0, 0, 0); - } - //任务删除确认 - //(需要WCS反馈) - else if (phase == 0xFF) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - } else { - instructionService.cancelNOSendAgv(inst.getInstruction_id()); - } - // data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } else if (phase == 0x50) { - if (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - - - } else if (phase == 0x51) { - if (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - - } else if (phase == 0x64){ - log.info("AGV车号{}反馈充电任务下发成功,锁定充电桩{}",agvaddr,station); - Dict dict = dictService.getDictByName3("station",String.valueOf(agvaddr),null); - if (ObjectUtil.isNotEmpty(dict)){ - dict.setValue("1"); - dict.setPara2(String.valueOf(agvaddr)); - dict.setPara3("下发成功"); - dictService.updateDetail(dict); - } - //充电成功 - }else if (phase == 0x65){ - log.info("AGV车号{}反馈充电中,充电桩{}",agvaddr,station); - //充电取消上报 - }else if (phase == 0x66){ - log.info("AGV车号{}反馈充电任务已取消,释放充电桩{}",agvaddr,station); - Dict dict = dictService.getDictByName3("station",String.valueOf(agvaddr),null); - if (ObjectUtil.isNotEmpty(dict)){ - dict.setValue("0"); - dict.setPara2(""); - dict.setPara3("充电桩空闲"); - dictService.updateDetail(dict); - } - } - else { - //上报异常信息 - //(不需要WCS反馈) - if (phase == 0x67 || phase == 0x70 || phase == 0x71 || phase == 0x72 || phase == 0x73 || phase == 0x74) { - device = deviceAppService.findDeviceByCode(Integer.toString(arr[18] * 256 + arr[19])); - } else { - device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); - } - try { - - } catch (Exception e) { - log.info("processSocket出错:{},{}", e, e.getMessage()); - e.printStackTrace(); - } - } - if (!ObjectUtil.isEmpty(data)) { - write(data); - } - } else { - System.out.println("agv上报不是0073类型动作,不处理"); - } - } - } - } catch (Exception e) { - System.out.println("TwoAgv链接异常"); - log.info("TwoAgv链接异常"); - log.error("agv连接出现异常:{}", e); - logServer.deviceExecuteLog("NDC2", "", "", "agv异常" + e.getMessage()); - logServer.deviceExecuteLog("NDC2", "", "", "agv异常" + e); - if (ObjectUtil.isNotEmpty(socket)) { - socket.close(); - } - System.out.println(e.getMessage()); - } finally { - closeResources(); - } - - } - - - @Override - public void stop() { - super.after(); - closeResources(); - } - - - private void closeResources() { - try { - if (dis != null) dis.close(); - if (dos != null) dos.close(); - if (socket != null && !socket.isClosed()) socket.close(); - } catch (IOException e) { - log.error("关闭资源时发生错误: {}", e.getMessage(), e); - } - } - - - public static void write(byte[] b) { - try { - log.info("下发agv数据:" + Bytes2HexString(b)); - System.out.println("下发agv数据:" + Bytes2HexString(b)); - dos.write(b); - dos.flush(); - } catch (Exception e) { - // TODO Auto-generated catch block - try { - Thread.sleep(1000); - log.info("再次下发agv数据:" + Bytes2HexString(b)); - System.out.println("再次下发agv数据:" + Bytes2HexString(b)); - dos.write(b); - dos.flush(); - } catch (Exception e1) { - e1.printStackTrace(); - } - - } - } - - public static String Bytes2HexString(byte[] b) { - String ret = ""; - for (int i = 0; i < b.length; i++) { - String hex = Integer.toHexString(b[i] & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - ret += hex.toUpperCase(); - } - return ret; - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/AutoRunService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/AutoRunService.java new file mode 100644 index 0000000..4278554 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/AutoRunService.java @@ -0,0 +1,40 @@ +package org.nl.acs.autoThread.service; + +import org.nl.acs.autoThread.service.dto.AutoRunDto; + +import java.util.List; +import java.util.Map; +/** + * Demo class + * + * @author zhoujj + * @date 2023/12/06 + */ + +public interface AutoRunService { + /** + * 开始线程 + * + * @param arg0 条件 + * @return / + */ + void startThread(String arg0); + + /** + * 结束线程 + * + * @param arg0 条件 + * @return / + */ + void stopThread(String arg0); + + /** + * 查找全部 + * + * + * @return / + */ + List findAll(); + + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/dto/AutoRunDto.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/dto/AutoRunDto.java new file mode 100644 index 0000000..0cf1b13 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/dto/AutoRunDto.java @@ -0,0 +1,24 @@ +package org.nl.acs.autoThread.service.dto; + +import lombok.Data; +import org.nl.acs.autoThread.autoRunThread.service.enums.ThreadUsedStatusEnum; +import org.nl.acs.autoThread.service.enums.ThreadStatusEnum; + +import java.util.Date; +@Data +public class AutoRunDto { + + private String code; + private String name; + private String description; + private ThreadStatusEnum status; + private ThreadUsedStatusEnum usedStatus; + private Date startTime; + private Date stopTime; + private String message; + private Boolean thread_alive; + private String thread_name; + private String thread_id; + private String thread_state; + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadStatusEnum.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/enums/ThreadStatusEnum.java similarity index 91% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadStatusEnum.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/enums/ThreadStatusEnum.java index a9b8750..f21e7cf 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadStatusEnum.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/enums/ThreadStatusEnum.java @@ -1,4 +1,4 @@ -package org.nl.acs.autoThread.run; +package org.nl.acs.autoThread.service.enums; /** * Demo class * diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadUsedStatusEnum.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/enums/ThreadUsedStatusEnum.java similarity index 89% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadUsedStatusEnum.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/enums/ThreadUsedStatusEnum.java index c62dde9..b4c444f 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/run/ThreadUsedStatusEnum.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/enums/ThreadUsedStatusEnum.java @@ -1,4 +1,4 @@ -package org.nl.acs.autoThread.run; +package org.nl.acs.autoThread.autoRunThread.service.enums; /** * Demo class * diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/impl/AutoRunServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/impl/AutoRunServiceImpl.java new file mode 100644 index 0000000..61c0cc7 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/service/impl/AutoRunServiceImpl.java @@ -0,0 +1,133 @@ +package org.nl.acs.autoThread.service.impl; + +import cn.hutool.core.bean.BeanUtil; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.nl.ApplicationAutoInitial; +import org.nl.acs.autoThread.AbstractAutoRunnable; +import org.nl.acs.autoThread.StartConfig; +import org.nl.acs.autoThread.autoRunThread.service.enums.ThreadUsedStatusEnum; +import org.nl.acs.autoThread.service.AutoRunService; +import org.nl.acs.autoThread.service.dto.AutoRunDto; +import org.nl.common.exception.BadRequestException; +import org.nl.config.language.LangProcess; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 初始化启动线程 + */ +@Service +@Slf4j +/** + * Demo class + * + * @author zhoujj + * @date 2023/12/06 + */ +public class AutoRunServiceImpl implements AutoRunService, ApplicationAutoInitial { + @Autowired(required = false) + private List abstractAutoRunnableList; + /** + * 自动线程类 + */ + private static Map code_autoRun_Map = new HashMap(); + /** + * 自动线程 + */ + private static Map code_Thread_Map = new HashMap(); + + @Override + public synchronized void startThread(String code) { + Thread thread = code_Thread_Map.get(code); + if (thread == null) { + throw new BadRequestException(LangProcess.msg("error_isNull", code)); + } else if (thread.isAlive()) { + throw new BadRequestException(LangProcess.msg("error_status", code)); + } else { + thread = new Thread(code_autoRun_Map.get(code)); + code_Thread_Map.put(code, thread); + thread.start(); + } + } + @Override + public synchronized void stopThread(String threadCode) { + final Thread thread = code_Thread_Map.get(threadCode); + if (thread == null) { + throw new BadRequestException(LangProcess.msg("error_isNull", threadCode)); + } + try { + AbstractAutoRunnable runable = code_autoRun_Map.get(threadCode); + runable.stop(); + thread.stop(); + thread.interrupt(); + thread.join(); + runable.setMessage("人工停止"); + runable.setStopTime(new Date()); + } catch (Exception exception) { + System.out.println("stopThread异常"+exception.getMessage()); + throw new BadRequestException(LangProcess.msg("error_status", threadCode)); + } + } + @Override + public List findAll() { + List result = new ArrayList<>(); + for (AbstractAutoRunnable autoRunnable : abstractAutoRunnableList) { + AutoRunDto autoRunDto = new AutoRunDto(); + BeanUtil.copyProperties(autoRunnable, autoRunDto, true); + Thread thread = code_Thread_Map.get(autoRunnable.getCode()); + autoRunDto.setCode(autoRunnable.getCode()); + autoRunDto.setName(autoRunnable.getName()); + autoRunDto.setThread_alive(thread.isAlive()); + autoRunDto.setThread_name(thread.getName()); + autoRunDto.setThread_id(thread.getId() + ""); + autoRunDto.setThread_state(thread.getState().toString()); + result.add(autoRunDto); + } + return result; + } + /** + * 自动初始化线程 + * + * @throws Exception + */ + @Override + public void autoInitial() throws Exception { + // 获取所有的类型为AbstractAutoRunnable的bean + if (StartConfig.Need_Stop){ + System.out.println("---未开启自动线程,AutoRun初始化终止---"); + } + List partialJudg = new ArrayList(); + //所有自动线程初始化 + for (AbstractAutoRunnable autoRunnable : abstractAutoRunnableList) { + if (StringUtils.isEmpty(autoRunnable.getCode())){ + autoRunnable.setMessage("code 因为空而未加载"); + System.out.println(autoRunnable.getName()+"code为空未加载"); + continue; + } + if (partialJudg.contains(autoRunnable.getCode())){ + autoRunnable.setMessage("code重复而未加载"); + System.out.println(autoRunnable.getName()+"code重复而未加载"); + continue; + } + if (StartConfig.AutoRun_Ban.contains(autoRunnable.getCode())){ + autoRunnable.setMessage(autoRunnable.getCode()+"配置了禁止启动"); + System.out.println(autoRunnable.getName()+"配置了禁止启动"); + continue; + } + autoRunnable.setUsedStatus(ThreadUsedStatusEnum.used); + partialJudg.add(autoRunnable.getCode()); + code_autoRun_Map.put(autoRunnable.getCode(),autoRunnable); + } + //自动线程启动 + for (AbstractAutoRunnable autoRunnable : code_autoRun_Map.values()) { + final Thread thread = new Thread(autoRunnable); + code_Thread_Map.put(autoRunnable.getCode(),thread); + thread.start(); + } + + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/初始化自动线程.md b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/初始化自动线程.md new file mode 100644 index 0000000..9958b15 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/autoThread/初始化自动线程.md @@ -0,0 +1,15 @@ +### appInit +项目启动时候对项目进行初始化,初始化器包括6项目 +1.AutoRunService :根据配置判断哪些自动线程需要启动 +2.自动线程继承AbstractAutoRunnable,目前系统一共有4个自动线程 +#### DeviceExecuteAutoRun +设备自动线程,完成每个设备驱动的加载 + 设备驱动通过while循环判断信号状态 +#### NDCAutoRun +NDC自动线程,通过该线程与NDC创建socket通讯,做phace逻辑交互 +该版本废弃:统一改agvKit交互 +#### DeviceOpcSynchronizeAutoRun + 同步所有OpcService信号, +该版本固定使用KEP-SERVER 进行信号同步 +#### SocketListenerAutoRun + socket同步监听测试类,在startconfig中配置不用 diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceAssignedController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceAssignedController.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceAssignedController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceAssignedController.java index c6c1d92..43ddf99 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceAssignedController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceAssignedController.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.rest; +package org.nl.acs.device.device.controller; import lombok.RequiredArgsConstructor; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceController.java similarity index 86% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceController.java index 8078edf..6908c76 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceController.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.rest; +package org.nl.acs.device.device.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -38,23 +38,6 @@ public class DeviceController { return new ResponseEntity<>(deviceService.queryAll(whereJson, page), HttpStatus.OK); } - @GetMapping("/protocol") - @Log("查询设备协议") - public ResponseEntity protocol(@RequestParam Map whereJson, Pageable page) { - return new ResponseEntity<>(deviceService.queryDeviceProtocol(whereJson, page), HttpStatus.OK); - } - - @Log("导出设备协议") - @GetMapping(value = "/protocol/download") - public void downDeviceDBload(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { - deviceService.downDeviceDBload(deviceService.queryDeviceProtocol(whereJson), response); - } - - @Log("导出设备协议") - @GetMapping(value = "/protocol/downloadCSV") - public void downDeviceDBloadCSV(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { - deviceService.downDeviceDBloadCSV(deviceService.queryDeviceProtocol(whereJson), response); - } @GetMapping("/selectCarList") @Log("下拉选车号") @@ -256,17 +239,6 @@ public class DeviceController { // return new ResponseEntity<>(DriverTypeEnum.getList(), HttpStatus.OK); // } - @Log("导出Smart设备协议CSV") - @GetMapping(value = "/protocol/downloadSmartCSV") - public void downDeviceDBloadOumulongCSV(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { - deviceService.downDeviceDBloadSmartCSV(deviceService.queryDeviceProtocol(whereJson), response); - } - - @Log("导出FX5U设备协议CSV") - @GetMapping(value = "/protocol/downloadFX5UCSV") - public void downDeviceDBloadFX5UCSV(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { - deviceService.downDeviceDBloadFX5UCSV(deviceService.queryDeviceProtocol(whereJson), response); - } @PostMapping("/excelImport") @Log("excel导入") diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceDbitemController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceDbitemController.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceDbitemController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceDbitemController.java index 1ecdc1c..40e3723 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceDbitemController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceDbitemController.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.rest; +package org.nl.acs.device.device.controller; import org.nl.common.logging.annotation.Log; import org.nl.acs.device.device.service.DeviceDbitemService; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceErpmappingController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceErpmappingController.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceErpmappingController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceErpmappingController.java index 49d7cf9..61a0dc1 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceErpmappingController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceErpmappingController.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.rest; +package org.nl.acs.device.device.controller; import org.nl.common.logging.annotation.Log; import org.nl.acs.device.device.service.DeviceErpmappingService; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceExtraController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceExtraController.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceExtraController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceExtraController.java index 12f4afd..b3af203 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceExtraController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceExtraController.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.rest; +package org.nl.acs.device.device.controller; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceRunpointController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceRunpointController.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceRunpointController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceRunpointController.java index fae66a8..cf2bd46 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceRunpointController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceRunpointController.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.rest; +package org.nl.acs.device.device.controller; import org.nl.common.logging.annotation.Log; import org.nl.acs.device.device.service.DeviceRunpointService; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceisonlineController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceisonlineController.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceisonlineController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceisonlineController.java index 0f2b494..586fde9 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/rest/DeviceisonlineController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/controller/DeviceisonlineController.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.rest; +package org.nl.acs.device.device.controller; import org.nl.common.logging.annotation.Log; import org.nl.acs.device.device.service.DeviceisonlineService; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceAssignedService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceAssignedService.java index f696a5c..758af8d 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceAssignedService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceAssignedService.java @@ -1,6 +1,6 @@ package org.nl.acs.device.device.service; -import org.nl.acs.device.device.domain.DeviceAssigned; +import org.nl.acs.device.device.service.domain.DeviceAssigned; import org.nl.acs.device.device.service.dto.DeviceAssignedDto; import org.nl.acs.device.device.service.dto.DeviceAssignedQueryParam; import org.nl.common.db.CommonService; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceDbitemService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceDbitemService.java index 8435654..a742cbf 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceDbitemService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceDbitemService.java @@ -1,6 +1,6 @@ package org.nl.acs.device.device.service; -import org.nl.acs.device.device.domain.DeviceDbitem; +import org.nl.acs.device.device.service.domain.DeviceDbitem; import org.nl.acs.device.device.service.dto.DeviceDbitemDto; import org.nl.common.db.PageInfo; import org.nl.common.db.CommonService; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceDriverDefinationAppService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceDriverDefinationAppService.java index 4787ddf..2ab1ef2 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceDriverDefinationAppService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceDriverDefinationAppService.java @@ -1,8 +1,8 @@ package org.nl.acs.device.device.service; -import org.nl.acs.device.device.enums.DeviceType; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.device.device_driver.DeviceDriverDefination; +import org.nl.acs.device.device.service.enums.DeviceType; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; import java.util.List; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceErpmappingService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceErpmappingService.java index 21fb970..2bc0b23 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceErpmappingService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceErpmappingService.java @@ -2,7 +2,7 @@ package org.nl.acs.device.device.service; import org.nl.common.db.PageInfo; import org.nl.common.db.CommonService; -import org.nl.acs.device.device.domain.DeviceErpmapping; +import org.nl.acs.device.device.service.domain.DeviceErpmapping; import org.nl.acs.device.device.service.dto.AcsDeviceErpmappingDto; import org.nl.acs.device.device.service.dto.DeviceErpmappingQueryParam; import org.springframework.data.domain.Pageable; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceExtraService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceExtraService.java index 95af949..b22867a 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceExtraService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceExtraService.java @@ -1,7 +1,11 @@ package org.nl.acs.device.device.service; import com.alibaba.fastjson.JSONObject; -import org.nl.acs.device.device.domain.DeviceExtra; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.nl.acs.device.device.service.domain.DeviceExtra; import org.nl.acs.device.device.service.dto.DeviceExtraDto; import org.nl.acs.device.device.service.dto.DeviceExtraQueryParam; import org.nl.common.db.CommonService; @@ -151,4 +155,21 @@ public interface DeviceExtraService extends CommonService { * @param filed_type:扩展字段类型,01、表单,02:DB读,03:DB写 */ void createByDeviceConfig(JSONObject json, String filed_type); + + + + /** + * 设备协议分页查询 + * @param page + * @param queryWrapper + * @return + */ + IPage queryDeviceProtocolPage(IPage page, @Param("ew") Wrapper queryWrapper); + + /** + * 获取扩展类 + * @param queryWrapper + * @return + */ + List selectDeviceProtocolList(@Param("ew") Wrapper queryWrapper); } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceRunpointService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceRunpointService.java index 1aa98bc..a9b0cd7 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceRunpointService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceRunpointService.java @@ -1,6 +1,6 @@ package org.nl.acs.device.device.service; -import org.nl.acs.device.device.domain.DeviceRunpoint; +import org.nl.acs.device.device.service.domain.DeviceRunpoint; import org.nl.common.db.PageInfo; import org.nl.common.db.CommonService; import org.nl.acs.device.device.service.dto.DeviceRunpointDto; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceService.java index 5dccdac..061235f 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceService.java @@ -2,10 +2,10 @@ package org.nl.acs.device.device.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.service.domain.Device; import org.nl.acs.device.device.service.dto.DeviceDto; import org.nl.acs.device.device.service.dto.DeviceQueryParam; -import org.nl.acs.device.storage_cell.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; import org.nl.common.db.PageInfo; import org.nl.common.db.CommonService; import org.springframework.data.domain.Pageable; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceisonlineService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceisonlineService.java index c6ca932..a0609f9 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceisonlineService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/DeviceisonlineService.java @@ -1,6 +1,6 @@ package org.nl.acs.device.device.service; -import org.nl.acs.device.device.domain.Deviceisonline; +import org.nl.acs.device.device.service.domain.Deviceisonline; import org.nl.common.db.PageInfo; import org.nl.common.db.CommonService; import org.nl.acs.device.device.service.dto.DeviceisonlineDto; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/Device.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/Device.java similarity index 95% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/Device.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/Device.java index 47f8b10..61189eb 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/Device.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/Device.java @@ -1,7 +1,7 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.device.device_driver.DeviceDriverDefination; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; import org.nl.acs.iot.opc.DeviceExtraManageDto; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.FieldFill; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceAssigned.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceAssigned.java similarity index 96% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceAssigned.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceAssigned.java index b68e34f..cdc937c 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceAssigned.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceAssigned.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceDbitem.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceDbitem.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceDbitem.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceDbitem.java index 598ae35..ae642e8 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceDbitem.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceDbitem.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; import org.nl.common.db.CommonModel; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceErpmapping.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceErpmapping.java similarity index 96% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceErpmapping.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceErpmapping.java index bb489a7..558f848 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceErpmapping.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceErpmapping.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; import org.nl.common.db.CommonModel; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceExtra.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceExtra.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceExtra.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceExtra.java index 90fcaad..85b7ba5 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceExtra.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceExtra.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceMybatis.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceMybatis.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceMybatis.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceMybatis.java index 93fdf8c..df81b19 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceMybatis.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceMybatis.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; import org.nl.common.db.CommonModel; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceRunpoint.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceRunpoint.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceRunpoint.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceRunpoint.java index 5b8b9b6..51a1168 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/DeviceRunpoint.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/DeviceRunpoint.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; import org.nl.common.db.CommonModel; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/Deviceisonline.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/Deviceisonline.java similarity index 97% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/Deviceisonline.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/Deviceisonline.java index 05ab3d5..f59f716 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/Deviceisonline.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/Deviceisonline.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; import org.nl.common.db.CommonModel; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/ItemDto.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/ItemDto.java similarity index 80% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/ItemDto.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/ItemDto.java index a2bd1d0..fa9798e 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/domain/ItemDto.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/domain/ItemDto.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.domain; +package org.nl.acs.device.device.service.domain; import lombok.Data; @@ -10,14 +10,12 @@ public class ItemDto { private Boolean need_tips; public ItemDto(String code, String name, String db) { - this.need_tips = Boolean.FALSE; this.code = code; this.name = name; this.db = db; } public ItemDto(String code, String name, String db, Boolean need_tips) { - this.need_tips = Boolean.FALSE; this.code = code; this.name = name; this.db = db; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/DeviceType.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/enums/DeviceType.java similarity index 95% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/DeviceType.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/enums/DeviceType.java index 93c4056..e8fa993 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/DeviceType.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/enums/DeviceType.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.enums; +package org.nl.acs.device.device.service.enums; import cn.hutool.core.util.StrUtil; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/ErrorType.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/enums/ErrorType.java similarity index 93% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/ErrorType.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/enums/ErrorType.java index cffa7bf..bbbdfec 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/enums/ErrorType.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/enums/ErrorType.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device.enums; +package org.nl.acs.device.device.service.enums; public enum ErrorType { // diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceAssignedServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceAssignedServiceImpl.java index 5560d9b..b3ffe76 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceAssignedServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceAssignedServiceImpl.java @@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.AllArgsConstructor; -import org.nl.acs.device.device.domain.DeviceAssigned; +import org.nl.acs.device.device.service.domain.DeviceAssigned; import org.nl.acs.device.device.service.DeviceAssignedService; import org.nl.acs.device.device.service.mapper.DeviceAssignedMapper; import org.nl.common.db.CommonFinalParam; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceDbitemServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceDbitemServiceImpl.java index 68778dd..7b9f77f 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceDbitemServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceDbitemServiceImpl.java @@ -2,7 +2,7 @@ package org.nl.acs.device.device.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; -import org.nl.acs.device.device.domain.DeviceDbitem; +import org.nl.acs.device.device.service.domain.DeviceDbitem; import org.nl.acs.device.device.service.mapper.DeviceDbitemMapper; import org.nl.common.db.PageInfo; import org.nl.common.db.QueryHelpMybatisPlus; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceErpmappingServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceErpmappingServiceImpl.java index 63b4f53..2a08be3 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceErpmappingServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceErpmappingServiceImpl.java @@ -8,8 +8,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.AllArgsConstructor; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device.domain.DeviceErpmapping; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.domain.DeviceErpmapping; import org.nl.acs.device.device.service.DeviceErpmappingService; import org.nl.acs.device.device.service.mapper.DeviceErpmappingMapper; import org.nl.acs.device.device.service.mapper.DeviceMapper; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceExtraServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceExtraServiceImpl.java index 4a1e720..2dabccd 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceExtraServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceExtraServiceImpl.java @@ -4,11 +4,12 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.AllArgsConstructor; -import org.nl.acs.device.device.domain.DeviceExtra; +import org.nl.acs.device.device.service.domain.DeviceExtra; import org.nl.acs.device.device.service.DeviceExtraService; import org.nl.acs.device.device.service.mapper.DeviceExtraMapper; import org.nl.common.db.PageInfo; @@ -188,4 +189,14 @@ public class DeviceExtraServiceImpl extends CommonServiceImpl queryWrapper) { + return deviceExtraMapper.queryDeviceProtocolPage(page,queryWrapper); + } + + @Override + public List selectDeviceProtocolList(Wrapper queryWrapper) { + return deviceExtraMapper.selectDeviceProtocolList(queryWrapper); + } } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceRunpointServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceRunpointServiceImpl.java index 67b4261..97b151e 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceRunpointServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceRunpointServiceImpl.java @@ -2,7 +2,7 @@ package org.nl.acs.device.device.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; -import org.nl.acs.device.device.domain.DeviceRunpoint; +import org.nl.acs.device.device.service.domain.DeviceRunpoint; import org.nl.acs.device.device.service.DeviceRunpointService; import org.nl.acs.device.device.service.mapper.DeviceRunpointMapper; import org.nl.common.db.PageInfo; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceServiceImpl.java index 100b1f5..15ce74c 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceServiceImpl.java @@ -18,28 +18,28 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.map.ListOrderedMap; -import org.nl.acs.autoThread.initial.ApplicationAutoInitial; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device.domain.DeviceExtra; -import org.nl.acs.device.device.domain.DeviceRunpoint; -import org.nl.acs.device.device.domain.ItemDto; -import org.nl.acs.device.device.enums.DeviceType; +import org.nl.ApplicationAutoInitial; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.domain.DeviceExtra; +import org.nl.acs.device.device.service.domain.DeviceRunpoint; +import org.nl.acs.device.device.service.domain.ItemDto; +import org.nl.acs.device.device.service.enums.DeviceType; import org.nl.acs.device.device.service.mapper.DeviceExtraMapper; import org.nl.acs.device.device.service.mapper.DeviceMapper; import org.nl.acs.device.device.service.mapper.DeviceRunpointMapper; import org.nl.acs.task.route.domain.RouteLine; import org.nl.acs.task.route.service.mapper.RouteLineMapper; -import org.nl.acs.device.storage_cell.domain.StorageCell; -import org.nl.acs.device.storage_cell.service.mapper.StorageCellMapper; +import org.nl.acs.device.storageMgt.service.entity.StorageCell; +import org.nl.acs.device.storageMgt.service.mapper.StorageCellMapper; import org.nl.common.utils.ConvertUtil; import org.nl.common.utils.utils.PageUtil; import org.nl.common.utils.ReadUtil; import org.nl.acs.device.device.service.DeviceDriverDefinationAppService; import org.nl.acs.device.device.service.DeviceExtraService; -import org.nl.acs.device.device_driver.DeviceDriverDefination; -import org.nl.acs.device.device_driver.conveyor.standard_inspect_site.StandardInspectSiteDeviceDriver; -import org.nl.acs.device.device_driver.conveyor.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; -import org.nl.acs.device.device_driver.defination.OpcDeviceDriverDefination; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; +import org.nl.acs.device.deviceDriver.conveyor.standard_inspect_site.StandardInspectSiteDeviceDriver; +import org.nl.acs.device.deviceDriver.conveyor.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination.OpcDeviceDriverDefination; import org.nl.acs.device.device.service.dto.DeviceRunpointDto; import org.nl.acs.iot.opc.DeviceAppService; import org.nl.acs.iot.opc.DeviceAppServiceImpl; @@ -47,7 +47,7 @@ import org.nl.acs.iot.opc.service.OpcService; import org.nl.acs.iot.opc.service.dto.OpcDto; import org.nl.acs.iot.plc.service.OpcPlcService; import org.nl.acs.iot.opc.service.dto.OpcPlcDto; -import org.nl.acs.device.storage_cell.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; import org.nl.common.utils.ExportCSVUtil; import org.nl.common.db.PageInfo; import org.nl.common.db.QueryHelpMybatisPlus; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceisonlineServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceisonlineServiceImpl.java index 5d1e5ff..638e537 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceisonlineServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/impl/DeviceisonlineServiceImpl.java @@ -2,7 +2,7 @@ package org.nl.acs.device.device.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; -import org.nl.acs.device.device.domain.Deviceisonline; +import org.nl.acs.device.device.service.domain.Deviceisonline; import org.nl.acs.device.device.service.DeviceisonlineService; import org.nl.acs.device.device.service.mapper.DeviceisonlineMapper; import org.nl.common.db.PageInfo; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceAssignedMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceAssignedMapper.java index 3b6289e..6e27ef8 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceAssignedMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceAssignedMapper.java @@ -1,6 +1,6 @@ package org.nl.acs.device.device.service.mapper; -import org.nl.acs.device.device.domain.DeviceAssigned; +import org.nl.acs.device.device.service.domain.DeviceAssigned; import org.nl.common.db.CommonMapper; import org.springframework.stereotype.Repository; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceDbitemMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceDbitemMapper.java index fc13b3e..959c2cc 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceDbitemMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceDbitemMapper.java @@ -1,6 +1,6 @@ package org.nl.acs.device.device.service.mapper; -import org.nl.acs.device.device.domain.DeviceDbitem; +import org.nl.acs.device.device.service.domain.DeviceDbitem; import org.nl.common.db.CommonMapper; import org.springframework.stereotype.Repository; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceErpmappingMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceErpmappingMapper.java index dd83747..8f5437c 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceErpmappingMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceErpmappingMapper.java @@ -1,7 +1,7 @@ package org.nl.acs.device.device.service.mapper; import org.nl.common.db.CommonMapper; -import org.nl.acs.device.device.domain.DeviceErpmapping; +import org.nl.acs.device.device.service.domain.DeviceErpmapping; import org.springframework.stereotype.Repository; /** diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceExtraMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceExtraMapper.java index 594cc1b..8aa8d3c 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceExtraMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceExtraMapper.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; -import org.nl.acs.device.device.domain.DeviceExtra; +import org.nl.acs.device.device.service.domain.DeviceExtra; import org.nl.common.db.CommonMapper; import org.springframework.stereotype.Repository; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceMapper.java index 801862d..40084af 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceMapper.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; -import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.service.domain.Device; import org.nl.common.db.CommonMapper; import org.springframework.stereotype.Repository; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceMappers.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceMappers.java index d33e23b..406ed60 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceMappers.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceMappers.java @@ -2,7 +2,7 @@ package org.nl.acs.device.device.service.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.service.domain.Device; @Mapper public interface DeviceMappers extends BaseMapper { diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceRunpointMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceRunpointMapper.java index 05bc319..103d838 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceRunpointMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceRunpointMapper.java @@ -1,6 +1,6 @@ package org.nl.acs.device.device.service.mapper; -import org.nl.acs.device.device.domain.DeviceRunpoint; +import org.nl.acs.device.device.service.domain.DeviceRunpoint; import org.nl.common.db.CommonMapper; import org.springframework.stereotype.Repository; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceisonlineMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceisonlineMapper.java index cc4260d..99f3b3e 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceisonlineMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device/service/mapper/DeviceisonlineMapper.java @@ -1,6 +1,6 @@ package org.nl.acs.device.device.service.mapper; -import org.nl.acs.device.device.domain.Deviceisonline; +import org.nl.acs.device.device.service.domain.Deviceisonline; import org.nl.common.db.CommonMapper; import org.springframework.stereotype.Repository; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/RequestMethodEnum.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/RequestMethodEnum.java similarity index 99% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/RequestMethodEnum.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/RequestMethodEnum.java index d0ea1d6..5ce547f 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/RequestMethodEnum.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/RequestMethodEnum.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device_driver; +package org.nl.acs.device.deviceDriver; import cn.hutool.core.util.StrUtil; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/controller/DeviceDriverController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/controller/DeviceDriverController.java new file mode 100644 index 0000000..9745c94 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/controller/DeviceDriverController.java @@ -0,0 +1,53 @@ +package org.nl.acs.device.deviceDriver.controller; + +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.device.device.service.DeviceService; +import org.nl.common.logging.annotation.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +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; +@RestController +@RequestMapping("/api/device/driver") +public class DeviceDriverController { + + @Autowired + DeviceService deviceService; + + @PostMapping({"/updateConfig"}) + @Log("配置设备驱动") + @Transactional(rollbackFor = Exception.class) + public ResponseEntity updateConfig(@RequestBody Map map) { + JSONObject jsonObject = (JSONObject) JSONObject.toJSON(map); + deviceService.updateConfig(jsonObject); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping({"/driverConfig"}) + @Log("配置驱动查询") + public ResponseEntity queryDriverConfigByDeviceId(@RequestBody Map map) { + return new ResponseEntity(deviceService.queryDriverConfigByDeviceId((String) map.get("device_id"), (String) map.get("driver_code")), HttpStatus.OK); + } + + + + @PostMapping({"/testRead"}) + @Log("读信号") + public ResponseEntity testRead(@RequestBody Map map) { + return new ResponseEntity(deviceService.testRead(map), HttpStatus.OK); + } + + + @PostMapping({"/testWrite"}) + @Log("写信号") + public ResponseEntity testWrite(@RequestBody Map map) { + deviceService.testWrite(map); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDefination.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/conveyor/standard_ordinary_site/StandardOrdinarySiteDefination.java similarity index 75% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDefination.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/conveyor/standard_ordinary_site/StandardOrdinarySiteDefination.java index efcfaa7..37b9ca5 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDefination.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/conveyor/standard_ordinary_site/StandardOrdinarySiteDefination.java @@ -1,9 +1,9 @@ -package org.nl.acs.device.device_driver.conveyor.standard_ordinary_site; +package org.nl.acs.device.deviceDriver.conveyor.standard_ordinary_site; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.device.device_driver.DeviceDriverDefination; -import org.nl.acs.device.device.enums.DeviceType; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; +import org.nl.acs.device.device.service.enums.DeviceType; import org.springframework.stereotype.Service; import java.util.LinkedList; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java similarity index 95% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java index bffb4b9..4d11ba5 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/conveyor/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device_driver.conveyor.standard_ordinary_site; +package org.nl.acs.device.deviceDriver.conveyor.standard_ordinary_site; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -8,17 +8,17 @@ import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.device.device_driver.RouteableDeviceDriver; -import org.nl.acs.device.device_driver.driver.AbstractDeviceDriver; -import org.nl.acs.device.device_driver.driver.ExecutableDeviceDriver; -import org.nl.acs.api.kit.service.AcsToKitService; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.RouteableDeviceDriver; +import org.nl.acs.device.deviceDriver.driver.AbstractDeviceDriver; +import org.nl.acs.device.deviceDriver.driver.ExecutableDeviceDriver; +import org.nl.acs.api.agvKit.service.AcsToKitService; import org.nl.acs.task.instruction.domain.Instruction; import org.nl.acs.task.instruction.service.InstructionService; import org.nl.acs.layout.device.DeviceStageMonitor; import org.nl.acs.iot.opc.DeviceAppService; -import org.nl.acs.device.storage_cell.service.dto.StorageCellDto; -import org.nl.acs.device.storage_cell.service.impl.StorageCellServiceImpl; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.impl.StorageCellServiceImpl; import org.nl.acs.task.task.service.TaskService; import org.nl.acs.task.task.service.dto.TaskDto; import org.nl.config.SpringContextHolder; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/AbstractDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/AbstractDeviceDriver.java new file mode 100644 index 0000000..50d16a2 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/AbstractDeviceDriver.java @@ -0,0 +1,15 @@ +package org.nl.acs.device.deviceDriver.driver; + +import lombok.Data; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; +import org.nl.acs.device.device.service.domain.Device; + +@Data +public class AbstractDeviceDriver implements DeviceDriver { + + public Device device; + private DeviceDriverDefination driverDefination; + private boolean stop = false; + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/ExecutableDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/ExecutableDeviceDriver.java similarity index 80% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/ExecutableDeviceDriver.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/ExecutableDeviceDriver.java index 665b324..43acc80 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/ExecutableDeviceDriver.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/ExecutableDeviceDriver.java @@ -1,6 +1,6 @@ -package org.nl.acs.device.device_driver.driver; +package org.nl.acs.device.deviceDriver.driver; -import org.nl.acs.device.device_driver.DeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; public interface ExecutableDeviceDriver extends DeviceDriver { /** diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/ItemValue.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/ItemValue.java similarity index 93% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/ItemValue.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/ItemValue.java index 5b704db..576a850 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/ItemValue.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/ItemValue.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device_driver.driver; +package org.nl.acs.device.deviceDriver.driver; /** * @author ldjun diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/OpcDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/OpcDeviceDriver.java new file mode 100644 index 0000000..0fa3110 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/driver/OpcDeviceDriver.java @@ -0,0 +1,31 @@ +package org.nl.acs.device.deviceDriver.driver; + + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.domain.DeviceExtra; +import org.nl.acs.device.device.service.mapper.DeviceExtraMapper; +import org.nl.acs.iot.opc.OpcItemDto; +import org.nl.acs.iot.udw.UnifiedDataAccessor; +import org.nl.config.SpringContextHolder; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public interface OpcDeviceDriver extends DeviceDriver { + /** + * getOpcValueAccessor + * + * @return + */ + UnifiedDataAccessor getOpcValueAccessor(); + + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/DeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/DeviceDriver.java similarity index 92% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/DeviceDriver.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/DeviceDriver.java index 784ac56..f49a1ae 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/DeviceDriver.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/DeviceDriver.java @@ -1,9 +1,10 @@ -package org.nl.acs.device.device_driver; +package org.nl.acs.device.deviceDriver.设备类型驱动; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import org.nl.acs.device.deviceDriver.RequestMethodEnum; import org.nl.common.db.CommonFinalParam; -import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.service.domain.Device; import java.util.ArrayList; import java.util.List; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/DeviceDriverDefination.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/DeviceDriverDefination.java similarity index 79% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/DeviceDriverDefination.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/DeviceDriverDefination.java index e86ce72..20415e4 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/DeviceDriverDefination.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/DeviceDriverDefination.java @@ -1,7 +1,7 @@ -package org.nl.acs.device.device_driver; +package org.nl.acs.device.deviceDriver.设备类型驱动; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device.enums.DeviceType; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.enums.DeviceType; import java.util.List; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/AbstractOpcDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/AbstractOpcDeviceDriver.java similarity index 72% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/AbstractOpcDeviceDriver.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/AbstractOpcDeviceDriver.java index 5d2b7c9..6fdecc8 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/AbstractOpcDeviceDriver.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/AbstractOpcDeviceDriver.java @@ -1,7 +1,18 @@ -package org.nl.acs.device.device_driver.driver; +package org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.iot.opc.*; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.domain.DeviceExtra; +import org.nl.acs.device.device.service.mapper.DeviceExtraMapper; +import org.nl.acs.device.deviceDriver.driver.ItemValue; +import org.nl.acs.device.deviceDriver.driver.OpcDeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; import org.nl.acs.iot.opc.*; import org.nl.acs.iot.udw.UnifiedDataAccessor; import org.nl.acs.iot.udw.UnifiedDataAccessorFactory; @@ -14,9 +25,14 @@ import org.openscada.opc.lib.da.ItemState; import java.util.*; @Slf4j -public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements OpcDeviceDriver { - UnifiedDataAccessor opcUdw; +public abstract class AbstractOpcDeviceDriver implements DeviceDriver { + public UnifiedDataAccessor opcUdw; + public Device device; + private DeviceDriverDefination driverDefination; + private boolean stop = false; + + DeviceExtraMapper deviceExtraMapper = SpringContextHolder.getBean("deviceExtraMapper"); private OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerService.class); public AbstractOpcDeviceDriver() { @@ -286,4 +302,118 @@ public class AbstractOpcDeviceDriver extends AbstractDeviceDriver implements Opc throw new RuntimeException("下发 无内容"); } } + + + /** + * getOpcItems + * + * @return + */ + default List getOpcItems() { + + List returns = new ArrayList(); + Map map = this.getExtraValue(); + Iterator var3 = map.keySet().iterator(); + + //设备扩展表【acs_device_extra】 +// WQLObject extraTab = WQLObject.getWQLObject("acs_device_extra"); +// JSONArray arr = extraTab.query(" (filed_type='02' or filed_type='03' )and device_id = '" + this.getDevice().getDevice_id() + "'").getResultJSONArray(0); + List deviceExtraList = new LambdaQueryChainWrapper<>(deviceExtraMapper) + .apply(" (filed_type='02' or filed_type='03' )and device_id = '" + this.getDevice().getDevice_id() + "'") + .list(); + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(deviceExtraList)); + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + OpcItemDto dto = new OpcItemDto(); + dto.setDevice_code(this.getDeviceCode()); + dto.setDevice_name(this.getDevice().getDevice_name()); + dto.setDriver_code(this.getDevice().getDriver_code()); + dto.setOpc_plc_code(this.getOpcPlc()); + dto.setOpc_server_code(this.getOpcServer()); + + dto.setItem_code(json.getString("extra_code")); + dto.setItem_value(json.getString("extra_value")); + returns.add(dto); + } + return returns; + } + + /** + * getExtraValue + * + * @return + */ + default Map getExtraValue() { + return this.getDevice().getExtraValue(); + } + + /** + * getOpcServer + * + * @return + */ + default String getOpcServer() { + return this.getDevice().getOpc_server_code(); + } + + /** + * getDevice + * + * @return + */ + @Override + Device getDevice(); + + /** + * getOpcPlc + * + * @return + */ + default String getOpcPlc() { + return this.getDevice().getOpc_plc_code(); + } + + /** + * getIntegeregerValue + * + * @param protocol + * @return + */ + default Integer getIntegeregerValue(String protocol) { + if (ObjectUtil.isEmpty(this.getValue(protocol)) && "heartbeat".equals(protocol)) { + return null; + } + return (Integer) (ObjectUtil.isEmpty(this.getValue(protocol)) ? 0 : this.getValue(protocol)); + } + + /** + * getValue + * + * @param protocol + * @return + */ + default Object getValue(String protocol) { + return this.getOpcValueAccessor().getValue(this.getItem(protocol)); + } + + /** + * getItem + * + * @param item + * @return + */ + default String getItem(String item) { + return this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDeviceCode() + "." + item; + } + + /** + * getUdwValue + * + * @param protocol + * @return + */ + default Object getUdwValue(String protocol) { + return this.getOpcValueAccessor().getValue(protocol); + } + } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/ItemProtocolP.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/ItemProtocolP.java new file mode 100644 index 0000000..a4e0a6b --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/ItemProtocolP.java @@ -0,0 +1,24 @@ +package org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination; + +import java.util.HashMap; +import java.util.Map; + +public abstract class ItemProtocolP { + + public static Map itemDB = new HashMap<>(); + + public AbstractOpcDeviceDriver device = null; + + public Boolean isonline = Boolean.FALSE; + + public int getOpcIntegerValue(String protocol) { + Integer value = device.getIntegeregerValue(protocol); + if (value == null) { + isonline=Boolean.FALSE; + } else { + isonline=Boolean.TRUE; + return value; + } + return -1; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/OpcDeviceDriverDefination.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/OpcDeviceDriverDefination.java new file mode 100644 index 0000000..4aa3835 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/OpcDeviceDriverDefination.java @@ -0,0 +1,20 @@ +package org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination; + +import org.nl.acs.device.device.service.domain.ItemDto; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; + +import java.util.List; + +public abstract class OpcDeviceDriverDefination implements DeviceDriverDefination { + /** + * getReadableItemDtos + * @return + */ + public abstract List getReadableItemDtos(); + + /** + * getWriteableItemDtos + * @return + */ + public abstract List getWriteableItemDtos(); +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/ItemProtocol.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/ItemProtocol.java new file mode 100644 index 0000000..ca3e300 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/ItemProtocol.java @@ -0,0 +1,48 @@ +package org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination.standardInspectSite; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device.service.domain.ItemDto; +import org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination.ItemProtocolP; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Data +public class ItemProtocol extends ItemProtocolP { + //------读信号------ + 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_error = "error"; + //------写信号------ + 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_weight = "weight"; + //------读写信号------ + + + + public ItemProtocol(StandardInspectSiteDeviceDriver driver) { + device = driver; + } + public static List getReadableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_heartbeat, "心跳", itemDB.get(item_heartbeat))); + list.add(new ItemDto(item_mode, "工作状态", itemDB.get(item_mode), Boolean.TRUE)); + list.add(new ItemDto(item_move, "光电开关信号", itemDB.get(item_move))); + list.add(new ItemDto(item_action, "取放信号", itemDB.get(item_action))); + list.add(new ItemDto(item_error, "报警信号", itemDB.get(item_error))); + return list; + } + public static List getWriteableItemDtos() { + ArrayList list = new ArrayList(); + list.add(new ItemDto(item_to_command, "作业命令", itemDB.get(item_to_command), Boolean.TRUE)); + return list; + } + +} + diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/StandardInspectSiteDefination.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/StandardInspectSiteDefination.java similarity index 70% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/StandardInspectSiteDefination.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/StandardInspectSiteDefination.java index 1b6d26f..87b0df0 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/StandardInspectSiteDefination.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/StandardInspectSiteDefination.java @@ -1,10 +1,10 @@ -package org.nl.acs.device.device_driver.conveyor.standard_inspect_site; +package org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination.standardInspectSite; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.device.device_driver.defination.OpcDeviceDriverDefination; -import org.nl.acs.device.device.domain.ItemDto; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device.enums.DeviceType; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.domain.ItemDto; +import org.nl.acs.device.device.service.enums.DeviceType; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination.OpcDeviceDriverDefination; import org.springframework.stereotype.Service; import java.util.LinkedList; @@ -15,7 +15,7 @@ import java.util.List; * 说明:该站点为普通带光电检测站点 */ @Service -public class StandardInspectSiteDefination implements OpcDeviceDriverDefination { +public class StandardInspectSiteDefination extends OpcDeviceDriverDefination { @Override public String getDriverCode() { return "standard_inspect_site"; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/StandardInspectSiteDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/StandardInspectSiteDeviceDriver.java similarity index 96% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/StandardInspectSiteDeviceDriver.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/StandardInspectSiteDeviceDriver.java index 0bc7a70..05d1e6e 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/StandardInspectSiteDeviceDriver.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/opcDefination/standardInspectSite/StandardInspectSiteDeviceDriver.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.device_driver.conveyor.standard_inspect_site; +package org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination.standardInspectSite; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -8,19 +8,19 @@ import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.device.device_driver.RouteableDeviceDriver; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device_driver.driver.AbstractOpcDeviceDriver; -import org.nl.acs.device.device_driver.driver.ExecutableDeviceDriver; -import org.nl.acs.api.kit.service.AcsToKitService; +import org.nl.acs.api.agvKit.service.AcsToKitService; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.RouteableDeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.impl.opcDefination.AbstractOpcDeviceDriver; +import org.nl.acs.device.deviceDriver.driver.ExecutableDeviceDriver; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.impl.StorageCellServiceImpl; +import org.nl.acs.iot.opc.DeviceAppService; +import org.nl.acs.layout.device.DeviceStageMonitor; import org.nl.acs.task.history.ErrorUtil; import org.nl.acs.task.instruction.domain.Instruction; import org.nl.acs.task.instruction.service.InstructionService; -import org.nl.acs.layout.device.DeviceStageMonitor; -import org.nl.acs.iot.opc.DeviceAppService; -import org.nl.acs.device.storage_cell.service.dto.StorageCellDto; -import org.nl.acs.device.storage_cell.service.impl.StorageCellServiceImpl; import org.nl.acs.task.task.service.TaskService; import org.nl.acs.task.task.service.dto.TaskDto; import org.nl.config.SpringContextHolder; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/ordinaryDefination/standardOrdinarySite/StandardOrdinarySiteDefination.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/ordinaryDefination/standardOrdinarySite/StandardOrdinarySiteDefination.java new file mode 100644 index 0000000..25116fa --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/ordinaryDefination/standardOrdinarySite/StandardOrdinarySiteDefination.java @@ -0,0 +1,49 @@ +package org.nl.acs.device.deviceDriver.设备类型驱动.impl.ordinaryDefination.standardOrdinarySite; + +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.enums.DeviceType; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; +import org.springframework.stereotype.Service; + +import java.util.LinkedList; +import java.util.List; + +/** + * 普通站点定义 + */ +@Service +public class StandardOrdinarySiteDefination implements DeviceDriverDefination { + @Override + public String getDriverCode() { + return "standard_ordinary_site"; + } + + @Override + public String getDriverName() { + return "标准版-无光电普通站点"; + } + + @Override + public String getDriverDescription() { + return "标准版-无光电普通站点"; + } + + @Override + public DeviceDriver getDriverInstance(Device device) { + return (new StandardOrdinarySiteDeviceDriver()).setDevice(device).setDriverDefination(this); + + } + + @Override + public Class getDeviceDriverType() { + return StandardOrdinarySiteDeviceDriver.class; + } + + @Override + public List getFitDeviceTypes() { + List types = new LinkedList(); + types.add(DeviceType.conveyor); + return types; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/ordinaryDefination/standardOrdinarySite/StandardOrdinarySiteDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/ordinaryDefination/standardOrdinarySite/StandardOrdinarySiteDeviceDriver.java new file mode 100644 index 0000000..c9ed27e --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceDriver/设备类型驱动/impl/ordinaryDefination/standardOrdinarySite/StandardOrdinarySiteDeviceDriver.java @@ -0,0 +1,236 @@ +package org.nl.acs.device.deviceDriver.设备类型驱动.impl.ordinaryDefination.standardOrdinarySite; + +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.apache.commons.lang3.ObjectUtils; +import org.nl.acs.api.agvKit.service.AcsToKitService; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriver; +import org.nl.acs.device.deviceDriver.RouteableDeviceDriver; +import org.nl.acs.device.deviceDriver.driver.AbstractDeviceDriver; +import org.nl.acs.device.deviceDriver.driver.ExecutableDeviceDriver; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.impl.StorageCellServiceImpl; +import org.nl.acs.iot.opc.DeviceAppService; +import org.nl.acs.layout.device.DeviceStageMonitor; +import org.nl.acs.task.instruction.domain.Instruction; +import org.nl.acs.task.instruction.service.InstructionService; +import org.nl.acs.task.task.service.TaskService; +import org.nl.acs.task.task.service.dto.TaskDto; +import org.nl.config.SpringContextHolder; + +/** + * 普通站点 + */ +@Slf4j +@Data +@RequiredArgsConstructor +public class StandardOrdinarySiteDeviceDriver extends AbstractDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor { + + private final InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); + private final DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); + private final AcsToKitService acsToKitService = SpringContextHolder.getBean(AcsToKitService.class); + + private int flag; + + private String deviceCode = null; + /** + * 备注 + */ + private String remark = ""; + /** + * 数量 + */ + private String qty = ""; + /** + * 批次 + */ + private String batch = ""; + /** + * 物料 + */ + private String material = ""; + /** + * 当前指令 + */ + private Instruction inst = null; + + private boolean requireSuccess = false; + + private int agvPhase = 0; + /** + * agv请求标志和任务号 + */ + private volatile String reqTakeInstCode = null; + private volatile Boolean reqTakeRequireSuccess = false; + private volatile String lastTakeInstCode = null; // 上次处理的taskId,处理完成后更新 + private final Object lock = new Object(); + + @Override + public void execute() { + try { + Thread.sleep(2000); + this.deviceCode = this.getDevice().getDevice_code(); + if (this.reqTakeRequireSuccess && ObjectUtil.isNotEmpty(this.reqTakeInstCode)) { + Instruction instruction = instructionService.findByCodeFromCache(this.reqTakeInstCode); + //取货申请F + log.info("点位上报状态,{},{}", instruction.getTask_code(), agvPhase); + + if (ObjectUtil.isNotEmpty(instruction) && StrUtil.equals(instruction.getStart_point_code(), this.deviceCode)) { + if (agvPhase == 1) { + device = deviceAppService.findDeviceByCode(this.deviceCode); + StorageCellDto dto = StorageCellServiceImpl.Storage_Cache_Map.get(instruction.getStart_point_code()); + if (dto == null) { + log.error(instruction.getStart_point_code() + "Storage_Cache_Map数据不存在"); + return; + } + instruction.setOffSet(dto.getAddress()); + instruction.setOffSetName(instruction.getStart_point_code()); + HttpResponse result = acsToKitService.genAgvSchedulingTask(instruction, 10); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + return; + } else { + resetInstTask(agvPhase); + } + } + if (agvPhase == 2) { + device = deviceAppService.findDeviceByCode(this.deviceCode); + TaskService taskService = SpringContextHolder.getBean("taskServiceImpl"); + TaskDto task = taskService.findByCode(instruction.getTask_code()); + StorageCellDto dto = StorageCellServiceImpl.Storage_Cache_Map.get(instruction.getStart_point_code()); + if (dto == null) { + log.error(instruction.getStart_point_code() + "Storage_Cache_Map数据不存在"); + return; + } + instruction.setOffSet(dto.getAddress()); + instruction.setOffSetName(instruction.getStart_point_code()); + if ((StrUtil.startWith(task.getTask_code(), "-"))) { + log.info("定点任务下发agv允许取货信号"); + HttpResponse result = acsToKitService.genAgvSchedulingTask(instruction, 10); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + return; + } else { + resetInstTask(agvPhase); + } + } else { + HttpResponse result = acsToKitService.genAgvSchedulingTask(instruction, 10); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + return; + } else { + resetInstTask(agvPhase); + } + } + } + } + //放货申请 + else if (ObjectUtil.isNotEmpty(instruction) && StrUtil.equals(instruction.getNext_point_code(), this.deviceCode)) { + if (agvPhase == 3) { + StorageCellDto dto = StorageCellServiceImpl.Storage_Cache_Map.get(instruction.getNext_point_code()); + if (dto == null) { + log.error(instruction.getStart_point_code() + "Storage_Cache_Map数据不存在"); + return; + } + instruction.setOffSet(dto.getAddress1()); + instruction.setOffSetName(instruction.getNext_point_code()); + device = deviceAppService.findDeviceByCode(this.deviceCode); + HttpResponse result = acsToKitService.genAgvSchedulingTask(instruction, 10); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + return; + } else { + resetInstTask(agvPhase); + } + } + if (agvPhase == 4) { + device = deviceAppService.findDeviceByCode(this.deviceCode); + TaskService taskService = SpringContextHolder.getBean("taskServiceImpl"); + TaskDto task = taskService.findByCode(instruction.getTask_code()); + StorageCellDto dto = StorageCellServiceImpl.Storage_Cache_Map.get(instruction.getNext_point_code()); + if (dto == null) { + log.error(instruction.getStart_point_code() + "Storage_Cache_Map数据不存在"); + return; + } + instruction.setOffSet(dto.getAddress1()); + instruction.setOffSetName(instruction.getNext_point_code()); + if ((StrUtil.startWith(task.getTask_code(), "-"))) { + log.info("定点任务下发agv允许取货信号"); + HttpResponse result = acsToKitService.genAgvSchedulingTask(instruction, 10); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + return; + } else { + try { + instructionService.finish(instruction.getInstruction_id()); + } catch (Exception e) { + e.printStackTrace(); + } + resetInstTask(agvPhase); + } + } else { + log.info("放货完成申请成功,指令号:" + instruction.getInstruction_code()); + HttpResponse result = acsToKitService.genAgvSchedulingTask(instruction, 10); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + return; + } else { + try { + instructionService.finish(instruction.getInstruction_id()); + } catch (Exception e) { + e.printStackTrace(); + } + resetInstTask(agvPhase); + } + } + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + log.info("设备执行失败" + ex.getMessage()); + } + } + + @Override + public JSONObject getDeviceStatusName() { + JSONObject jo = new JSONObject(); + return jo; + } + + + @Override + public void setDeviceStatus(JSONObject data) { + + } + + // B设置新任务 + @Override + public void setDeviceInnerParam(String taskId, String agvphase) { + synchronized (lock) { + // 不允许设置和上次处理相同的taskId + if (taskId.equals(lastTakeInstCode)) { + // 可以记录日志并返回,或者抛出异常 + return; + } + // 设置新任务 + this.agvPhase = Integer.valueOf(agvphase); + this.reqTakeInstCode = taskId; + this.reqTakeRequireSuccess = true; + } + } + + // B设置新任务 + public void resetInstTask(Integer agvphase) { + synchronized (lock) { + // 设置新任务 + // 处理完成,更新状态 + if (Integer.valueOf(4).equals(agvphase)){ + this.lastTakeInstCode = reqTakeInstCode; + } + this.reqTakeRequireSuccess = false; + this.reqTakeInstCode = null; + this.agvPhase = 0; + } + } +} + diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/cotroller/DeviceProtocolController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/cotroller/DeviceProtocolController.java new file mode 100644 index 0000000..9205539 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/cotroller/DeviceProtocolController.java @@ -0,0 +1,66 @@ +package org.nl.acs.device.deviceProtocol.cotroller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.nl.acs.device.device.service.DeviceService; +import org.nl.acs.device.device.service.dto.DeviceDto; +import org.nl.acs.device.deviceProtocol.service.DeviceProtocolService; +import org.nl.common.logging.annotation.Log; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +/** + * @author jiaolm + * @date 2023-05-09 + **/ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/device/protocol") +public class DeviceProtocolController { + + private final DeviceProtocolService deviceProtocolService; + + @GetMapping() + @Log("查询设备协议") + public ResponseEntity protocol(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(deviceProtocolService.queryDeviceProtocol(whereJson, page), HttpStatus.OK); + } + + @Log("导出设备协议") + @GetMapping(value = "/download") + public void downDeviceDBload(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + deviceProtocolService.downDeviceDBload(deviceProtocolService.queryDeviceProtocol(whereJson), response); + } + + @Log("导出设备协议") + @GetMapping(value = "/downloadCSV") + public void downDeviceDBloadCSV(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + deviceProtocolService.downDeviceDBloadCSV(deviceProtocolService.queryDeviceProtocol(whereJson), response); + } + + + @Log("导出Smart设备协议CSV") + @GetMapping(value = "/downloadSmartCSV") + public void downDeviceDBloadOumulongCSV(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + deviceProtocolService.downDeviceDBloadSmartCSV(deviceProtocolService.queryDeviceProtocol(whereJson), response); + } + + @Log("导出FX5U设备协议CSV") + @GetMapping(value = "/protocol/downloadFX5UCSV") + public void downDeviceDBloadFX5UCSV(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + deviceProtocolService.downDeviceDBloadFX5UCSV(deviceProtocolService.queryDeviceProtocol(whereJson), response); + } + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/service/DeviceProtocolService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/service/DeviceProtocolService.java new file mode 100644 index 0000000..bc280c1 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/service/DeviceProtocolService.java @@ -0,0 +1,55 @@ +package org.nl.acs.device.deviceProtocol.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.dto.DeviceDto; +import org.nl.acs.device.device.service.dto.DeviceQueryParam; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; +import org.nl.common.db.CommonService; +import org.nl.common.db.PageInfo; +import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author jiaolm + * @date 2023-05-09 + */ +public interface DeviceProtocolService { + + /** + * 导出设备db协议 + * + * @param jsonarr + * @param response + * @throws IOException + */ + void downDeviceDBload(JSONArray jsonarr, HttpServletResponse response) throws IOException; + + public Map queryDeviceProtocol(Map whereJson, Pageable page); + public JSONArray queryDeviceProtocol(Map whereJson); + + /** + * 导出Smart设备协议CSV + * @param queryDeviceProtocol + * @param response + */ + void downDeviceDBloadSmartCSV(JSONArray queryDeviceProtocol, HttpServletResponse response); + + /** + * 导出FX5U设备协议CSV + * @param queryDeviceProtocol + * @param response + */ + void downDeviceDBloadFX5UCSV(JSONArray queryDeviceProtocol, HttpServletResponse response); + void downDeviceDBloadCSV(JSONArray queryDeviceProtocol, HttpServletResponse response); + + +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/service/impl/DeviceProtocolServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/service/impl/DeviceProtocolServiceImpl.java new file mode 100644 index 0000000..1aac4ba --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/service/impl/DeviceProtocolServiceImpl.java @@ -0,0 +1,270 @@ +package org.nl.acs.device.deviceProtocol.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device.service.DeviceExtraService; +import org.nl.acs.device.device.service.domain.DeviceExtra; +import org.nl.acs.device.deviceProtocol.service.DeviceProtocolService; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.*; +import org.nl.common.utils.utils.PageUtil; +import org.nl.config.language.LangProcess; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.*; + +/** + * @author jiaolm + * @date 2023-05-09 + */ +@Service +@Slf4j +public class DeviceProtocolServiceImpl implements DeviceProtocolService { + + @Autowired + private DeviceExtraService deviceExtraService; + + @Override + public Map queryDeviceProtocol(Map whereJson, Pageable page) { + IPage queryPage = PageUtil.toMybatisPage(page); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank((String) whereJson.get("device_types")), "d.device_type", whereJson.get("device_types")); + wrapper.nested(StringUtils.isNotBlank((String) whereJson.get("blurry")), i -> i.like("d.device_code", whereJson.get("blurry")).or().like("d.device_name", whereJson.get("blurry"))); + wrapper.eq(StringUtils.isNotBlank((String) whereJson.get("opc_id")), "d.opc_server_id", whereJson.get("opc_id")); + wrapper.eq("d.is_delete", "0"); + wrapper.ne("e.filed_type", "01"); + IPage devicePage = deviceExtraService.queryDeviceProtocolPage(queryPage, wrapper); + final JSONObject json = (JSONObject) JSON.toJSON(ConvertUtil.convertPage(devicePage, DeviceExtra.class)); + return json; + } + + @Override + public JSONArray queryDeviceProtocol(Map whereJson) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank((String) whereJson.get("device_types")), "d.device_type", whereJson.get("device_types")); + wrapper.nested(StringUtils.isNotBlank((String) whereJson.get("blurry")), i -> i.like("d.device_code", whereJson.get("blurry")).or().like("d.device_name", whereJson.get("blurry"))); + wrapper.eq(StringUtils.isNotBlank((String) whereJson.get("opc_id")), "d.opc_server_id", whereJson.get("opc_id")); + wrapper.eq("d.is_delete", "0"); + wrapper.ne("e.filed_type", "01"); + List deviceProtocolList = deviceExtraService.selectDeviceProtocolList(wrapper); + JSONArray jsonArray = JSONArray.parseArray(JSON.toJSONString(deviceProtocolList)); + return jsonArray; + } + @Override + public void downDeviceDBloadSmartCSV(JSONArray jsonarr, HttpServletResponse response) { + List cellList = new ArrayList<>(); + for (int i = 0; i < jsonarr.size(); i++) { + List item = new ArrayList(); + JSONObject jo = jsonarr.getJSONObject(i); + String extra_code = jo.getString("extra_code"); + //校验数据 格式为: RD1.RD1.A1.mode + int num = countStr(extra_code, "."); + if (num != 3) { + throw new BadRequestException(LangProcess.msg("error_config", extra_code)); + } + + extra_code = extra_code.substring(extra_code.indexOf(".") + 1, extra_code.length()); + extra_code = extra_code.substring(extra_code.indexOf(".") + 1, extra_code.length()); + item.add(extra_code); + item.add(jo.get("extra_name")); + String datatype = jo.getString("extra_name"); + //西门子200 + if (!datatype.contains(".")) { + String[] split = datatype.split(""); + if (split[1].equals("W")) { + datatype = "Word"; + } else if (split[1].equals("D")) { + datatype = "DWord"; + } + } else { + datatype = "Boolean"; + } + + item.add(datatype); + item.add("1"); + item.add("R/W"); + item.add("100"); + + cellList.add(item.toArray()); + } + + String[] tableHeaderArr = {"Tag Name", "Address", "Data Type", "Respect Data Type", + "Client Access", "Scan Rate"}; + String fileName = "导出文件.csv"; + byte[] bytes = ExportCSVUtil.writeCsvAfterToBytes(tableHeaderArr, cellList); + ExportCSVUtil.responseSetProperties(fileName, bytes, response); + } + + @Override + public void downDeviceDBloadFX5UCSV(JSONArray jsonarr, HttpServletResponse response) { + List cellList = new ArrayList<>(); + for (int i = 0; i < jsonarr.size(); i++) { + List item = new ArrayList(); + JSONObject jo = jsonarr.getJSONObject(i); + String extra_code = jo.getString("extra_code"); + //校验数据 格式为: RD1.RD1.A1.mode + int num = countStr(extra_code, "."); + if (num != 3) { + throw new BadRequestException(LangProcess.msg("error_config", extra_code)); + } + + extra_code = extra_code.substring(extra_code.indexOf(".") + 1, extra_code.length()); + extra_code = extra_code.substring(extra_code.indexOf(".") + 1, extra_code.length()); + item.add(extra_code); + item.add(jo.get("extra_name")); + String datatype = jo.getString("extra_name"); + //FX5U + if (!datatype.contains(".")) { + String[] split = datatype.split(""); + if (split[1].equals("D")) { + datatype = "Long"; + } + } else { + datatype = "Boolean"; + } + + item.add(datatype); + item.add("1"); + item.add("R/W"); + item.add("100"); + + cellList.add(item.toArray()); + } + + String[] tableHeaderArr = {"Tag Name", "Address", "Data Type", "Respect Data Type", + "Client Access", "Scan Rate"}; + String fileName = "导出文件.csv"; + byte[] bytes = ExportCSVUtil.writeCsvAfterToBytes(tableHeaderArr, cellList); + ExportCSVUtil.responseSetProperties(fileName, bytes, response); + } + @Override + public void downDeviceDBloadCSV(JSONArray jsonarr, HttpServletResponse response) { + List cellList = new ArrayList<>(); + for (int i = 0; i < jsonarr.size(); i++) { + List item = new ArrayList(); + JSONObject jo = jsonarr.getJSONObject(i); + String extra_code = jo.getString("extra_code"); + //校验数据 格式为: RD1.RD1.A1.mode + int num = countStr(extra_code, "."); + if (num != 3) { + throw new BadRequestException(LangProcess.msg("error_config", extra_code)); + } + + extra_code = extra_code.substring(extra_code.indexOf(".") + 1, extra_code.length()); + extra_code = extra_code.substring(extra_code.indexOf(".") + 1, extra_code.length()); + item.add(extra_code); + item.add(jo.get("extra_name")); + String datatype = jo.getString("extra_name"); + //西门子1200、1500 为DB + if (datatype.startsWith("DB")) { + //校验数据 格式为:DB600.B1 +// if(datatype.indexOf(".") == -1 ){ +// throw new BadRequestException(jo.getString("extra_code") + "点位数据格式不正确"); +// } +// int count = countStr(datatype,"."); +// if(count != 1){ +// throw new BadRequestException(jo.getString("extra_code") + "点位数据格式不正确"); +// } + + String str1 = datatype.substring(0, datatype.indexOf(".")); + String headtype = datatype.substring(str1.length() + 1, datatype.length()); + if (headtype.startsWith("B")) { + if (headtype.contains(".")) { + datatype = "Boolean"; + } else { + datatype = "Byte"; + } + } else if (headtype.startsWith("W")) { + datatype = "Word"; + } else if (headtype.startsWith("D")) { + datatype = "DWord"; + } else if (headtype.startsWith("S")) { + datatype = "String"; + } else if (headtype.startsWith("REAL")) { + datatype = "REAL"; + } + } else { + //西门子200 + if (datatype.indexOf(".") == -1) { + datatype = "Byte"; + } else { + datatype = "Boolean"; + } + } + + item.add(datatype); + item.add("1"); + item.add("R/W"); + item.add("100"); + + cellList.add(item.toArray()); + } + + String[] tableHeaderArr = {"Tag Name", "Address", "Data Type", "Respect Data Type", + "Client Access", "Scan Rate"}; + String fileName = "导出文件.csv"; + byte[] bytes = ExportCSVUtil.writeCsvAfterToBytes(tableHeaderArr, cellList); + ExportCSVUtil.responseSetProperties(fileName, bytes, response); + } + + + @Override + public void downDeviceDBload(JSONArray jsonarr, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + + for (int i = 0; i < jsonarr.size(); i++) { + JSONObject jo = jsonarr.getJSONObject(i); + Map map = new LinkedHashMap<>(); + System.out.println(jo.getString("extra_code")); + String extra_code = jo.getString("extra_code"); + extra_code = extra_code.substring(extra_code.indexOf(".") + 1, extra_code.length()); + extra_code = extra_code.substring(extra_code.indexOf(".") + 1, extra_code.length()); + map.put("Tag Name", extra_code); + map.put("Address", jo.get("extra_name")); + String datatype = jo.getString("extra_name"); + String str1 = datatype.substring(0, datatype.indexOf(".")); + String headtype = datatype.substring(str1.length() + 1, datatype.length()); + if (headtype.startsWith("B")) { + datatype = "Byte"; + } else if (headtype.startsWith("W")) { + datatype = "Word"; + } else if (headtype.startsWith("D")) { + datatype = "DWord"; + } + map.put("Data Type", datatype); + map.put("Respect Data Type", "1"); + map.put("Client Access", "R/W"); + map.put("Scan Rate", "100"); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } + + /** + * 判断字符串中某个字符存在的个数 + * + * @param str1 完整字符串 + * @param str2 要统计匹配个数的字符 + * @return + */ + private static int countStr(String str1, String str2) { + int count = 0; + if (str1.indexOf(str2) == -1) { + return 0; + } + while (str1.indexOf(str2) != -1) { + count++; + str1 = str1.substring(str1.indexOf(str2) + str2.length()); + } + return count; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/设备协议.md b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/设备协议.md new file mode 100644 index 0000000..df08fbc --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/deviceProtocol/设备协议.md @@ -0,0 +1,7 @@ +### storageMgt +货位管理模块:主要是AGV取放货的点 +1.货位编码与上位系统保持一致 +2.AGV地址有2个,正常逻辑取放地址是同一个,如果取放货位不一样需要配合adress1共同使用 +3.offset:货位偏移量:主要用于ACSKit套件对接,AGV到达取放货位时会请求取放货,这时通过offset偏移量来下发给kit +4.has:有无货状态,AGV取放货完成后更新该状态 + diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/RouteableDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/RouteableDeviceDriver.java deleted file mode 100644 index dc5ac16..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/RouteableDeviceDriver.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.nl.acs.device.device_driver; - -public interface RouteableDeviceDriver extends DeviceDriver { - /** - * isEntrance - * @return - */ - default boolean isEntrance() { - return this.getDevice().getIs_entrance(); - } - - /** - * isExist - * @return - */ - default boolean isExist() { - return this.getDevice().getIs_exist(); - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/ItemProtocol.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/ItemProtocol.java deleted file mode 100644 index ddbfa50..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/conveyor/standard_inspect_site/ItemProtocol.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.nl.acs.device.device_driver.conveyor.standard_inspect_site; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.device.device.domain.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_error = "error"; - 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_weight = "weight"; - /*public static String item_material_type = "material_type"; - public static String item_barcode = "barcode";*/ - - private StandardInspectSiteDeviceDriver driver; - - public ItemProtocol(StandardInspectSiteDeviceDriver 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 getError() { - return this.getOpcIntegerValue(item_error); - } - - - /*public int getMaterialType() { - return this.getOpcIntegerValue(item_material_type); - } - - public int getBarcode() { - return this.getOpcIntegerValue(item_barcode); - }*/ - - public int getToCommand() { - return this.getOpcIntegerValue(item_to_command); - } - - public int getToTarget() { - return this.getOpcIntegerValue(item_to_target); - } - - public int getToTask() { - return this.getOpcIntegerValue(item_to_task); - } - - /** - *是否有货 - */ - 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 static List getReadableItemDtos() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(item_heartbeat, "心跳", "DB600.B0")); - list.add(new ItemDto(item_mode, "工作状态", "DB600.B2", Boolean.valueOf(true))); - list.add(new ItemDto(item_move, "光电开关信号", "DB600.B3")); - list.add(new ItemDto(item_action, "取放信号", "DB600.B4")); - /*list.add(new ItemDto(item_material_type, "物料类型", "DB600.D6"));*/ - list.add(new ItemDto(item_error, "报警信号", "DB600.B7")); - /*list.add(new ItemDto(item_barcode, "条码", "DB600.D8"));*/ - return list; - } - - public static List getWriteableItemDtos() { - ArrayList list = new ArrayList(); - list.add(new ItemDto(item_to_command, "作业命令", "DB601.W2", Boolean.valueOf(true))); - return list; - } - -} - diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/defination/OpcDeviceDriverDefination.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/defination/OpcDeviceDriverDefination.java deleted file mode 100644 index 34b7d9b..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/defination/OpcDeviceDriverDefination.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.nl.acs.device.device_driver.defination; - -import org.nl.acs.device.device.domain.ItemDto; -import org.nl.acs.device.device_driver.DeviceDriverDefination; - -import java.util.List; - -public interface OpcDeviceDriverDefination extends DeviceDriverDefination { - /** - * getReadableItemDtos - * @return - */ - List getReadableItemDtos(); - - /** - * getWriteableItemDtos - * @return - */ - List getWriteableItemDtos(); -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/AbstractDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/AbstractDeviceDriver.java deleted file mode 100644 index b9bb20d..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/AbstractDeviceDriver.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.nl.acs.device.device_driver.driver; - -import lombok.Data; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.device.device_driver.DeviceDriverDefination; -import org.nl.acs.device.device.domain.Device; - -@Data -public class AbstractDeviceDriver implements DeviceDriver { - - public Device device; - private DeviceDriverDefination driverDefination; - private boolean stop = false; - - - public AbstractDeviceDriver() { -// this.execute_log = new BusinessLoggerImpl(BusinessDomain.device_execute.name()); -// this.device_log = BusinessLoggerFactory.getNoRepeatBusinessLogger(BusinessDomain.device_execute.name()); - - } - - @Override - public Device getDevice() { - return this.device; - } - - - @Override - public DeviceDriverDefination getDriverDefination() { - return this.driverDefination; - } - - @Override - public DeviceDriver setDriverDefination(DeviceDriverDefination var1) { - this.driverDefination = driverDefination; - return this; - } - - public DeviceDriver setDevice(Device device) { - this.device = device; - return this; - } - - @Override - public String toString() { - return ""; - } -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/OpcDeviceDriver.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/OpcDeviceDriver.java deleted file mode 100644 index f120bfa..0000000 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/device_driver/driver/OpcDeviceDriver.java +++ /dev/null @@ -1,245 +0,0 @@ -package org.nl.acs.device.device_driver.driver; - - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; -import org.nl.acs.device.device_driver.DeviceDriver; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device.domain.DeviceExtra; -import org.nl.acs.device.device.service.mapper.DeviceExtraMapper; -import org.nl.acs.iot.opc.OpcItemDto; -import org.nl.acs.iot.udw.UnifiedDataAccessor; -import org.nl.config.SpringContextHolder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -public interface OpcDeviceDriver extends DeviceDriver { - /** - * getOpcValueAccessor - * - * @return - */ - UnifiedDataAccessor getOpcValueAccessor(); - - DeviceExtraMapper deviceExtraMapper = SpringContextHolder.getBean("deviceExtraMapper"); - - /** - * getOpcItems - * - * @return - */ - default List getOpcItems() { - - List returns = new ArrayList(); - Map map = this.getExtraValue(); - Iterator var3 = map.keySet().iterator(); - - //设备扩展表【acs_device_extra】 -// WQLObject extraTab = WQLObject.getWQLObject("acs_device_extra"); -// JSONArray arr = extraTab.query(" (filed_type='02' or filed_type='03' )and device_id = '" + this.getDevice().getDevice_id() + "'").getResultJSONArray(0); - List deviceExtraList = new LambdaQueryChainWrapper<>(deviceExtraMapper) - .apply(" (filed_type='02' or filed_type='03' )and device_id = '" + this.getDevice().getDevice_id() + "'") - .list(); - JSONArray arr = JSONArray.parseArray(JSON.toJSONString(deviceExtraList)); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - OpcItemDto dto = new OpcItemDto(); - dto.setDevice_code(this.getDeviceCode()); - dto.setDevice_name(this.getDevice().getDevice_name()); - dto.setDriver_code(this.getDevice().getDriver_code()); - dto.setOpc_plc_code(this.getOpcPlc()); - dto.setOpc_server_code(this.getOpcServer()); - - dto.setItem_code(json.getString("extra_code")); - dto.setItem_value(json.getString("extra_value")); - returns.add(dto); - } - return returns; - } - - /** - * getExtraValue - * - * @return - */ - default Map getExtraValue() { - return this.getDevice().getExtraValue(); - } - - /** - * getOpcServer - * - * @return - */ - default String getOpcServer() { - return this.getDevice().getOpc_server_code(); - } - - /** - * getDevice - * - * @return - */ - @Override - Device getDevice(); - - /** - * getOpcPlc - * - * @return - */ - default String getOpcPlc() { - return this.getDevice().getOpc_plc_code(); - } - - /** - * getIntegeregerValue - * - * @param protocol - * @return - */ - default Integer getIntegeregerValue(String protocol) { - if (ObjectUtil.isEmpty(this.getValue(protocol)) && "heartbeat".equals(protocol)) { - return null; - } - return (Integer) (ObjectUtil.isEmpty(this.getValue(protocol)) ? 0 : this.getValue(protocol)); - } - - /** - * getStringgerValue - * - * @param protocol - * @return - */ - default String getStringgerValue(String protocol) { - return (String) this.getValue(protocol); - } - - /** - * getLongValue - * - * @param protocol - * @return - */ - default Long getLongValue(String protocol) { - return (Long) this.getValue(protocol); - } - - /** - * getByteArrayValue - * - * @param protocol - * @return - */ - default Byte[] getByteArrayValue(String protocol) { - return (Byte[]) this.getValue(protocol); - } - - /** - * getIntegerArrayValue - * - * @param protocol - * @return - */ - default int[] getIntegerArrayValue(String protocol) { - return (int[]) this.getValue(protocol); - } - - default Float getDoubleValue(String protocol) { - if (ObjectUtil.isEmpty(this.getValue(protocol))) { - return null; - } else { - return Float.valueOf(this.getValue(protocol).toString()); - } -// return Float.valueOf(this.getValue(protocol).toString()); -// return (Float) this.getValue(protocol); - } - - /** - * getFloatValue - * - * @param protocol - * @return - */ - default Float getFloatValue(String protocol) { - return (Float) this.getOpcValueAccessor().getValue(this.getItem(protocol)); - } - - /** - * getIntegerValue - * - * @param protocol - * @return - */ - default Integer getIntegerValue(String protocol) { - return (Integer) this.getValue(protocol); - } - - /** - * getShortValue - * - * @param protocol - * @return - */ - default Short getShortValue(String protocol) { - return (Short) this.getOpcValueAccessor().getValue(this.getItem(protocol)); - } - - /** - * getIntegeregerArrayValue - * - * @param protocol - * @return - */ - default int[] getIntegeregerArrayValue(String protocol) { - return (int[]) this.getOpcValueAccessor().getValue(this.getItem(protocol)); - } - - /** - * getStringValue - * - * @param protocol - * @return - */ - default String getStringValue(String protocol) { - return String.valueOf(this.getOpcValueAccessor().getValue(this.getItem(protocol))); - } - - /** - * getValue - * - * @param protocol - * @return - */ - default Object getValue(String protocol) { - return this.getOpcValueAccessor().getValue(this.getItem(protocol)); - } - - /** - * getItem - * - * @param item - * @return - */ - default String getItem(String item) { - return this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDeviceCode() + "." + item; - } - - /** - * getUdwValue - * - * @param protocol - * @return - */ - default Object getUdwValue(String protocol) { - return this.getOpcValueAccessor().getValue(protocol); - } - - -} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/rest/StorageCellController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/controller/StorageCellController.java similarity index 92% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/rest/StorageCellController.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/controller/StorageCellController.java index 46cf551..e6919af 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/rest/StorageCellController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/controller/StorageCellController.java @@ -1,8 +1,8 @@ -package org.nl.acs.device.storage_cell.rest; +package org.nl.acs.device.storageMgt.controller; import org.nl.common.logging.annotation.Log; -import org.nl.acs.device.storage_cell.service.StorageCellService; -import org.nl.acs.device.storage_cell.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.StorageCellService; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; import org.springframework.data.domain.Pageable; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/StorageCellService.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/StorageCellService.java similarity index 90% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/StorageCellService.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/StorageCellService.java index d61391c..66d76e6 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/StorageCellService.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/StorageCellService.java @@ -1,10 +1,10 @@ -package org.nl.acs.device.storage_cell.service; +package org.nl.acs.device.storageMgt.service; import org.nl.common.db.PageInfo; import org.nl.common.db.CommonService; -import org.nl.acs.device.storage_cell.domain.StorageCell; -import org.nl.acs.device.storage_cell.service.dto.StorageCellDto; -import org.nl.acs.device.storage_cell.service.dto.StorageCellQueryParam; +import org.nl.acs.device.storageMgt.service.entity.StorageCell; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.dto.StorageCellQueryParam; import org.springframework.data.domain.Pageable; import javax.servlet.http.HttpServletResponse; @@ -52,7 +52,7 @@ public interface StorageCellService extends CommonService { * @param id ID * @return StorageCellDto */ - StorageCellDto findById(String id); + StorageCell findById(String id); /** * 新增数据 @@ -156,5 +156,5 @@ public interface StorageCellService extends CommonService { */ void download(List dtos, HttpServletResponse response) throws IOException; - StorageCellDto findByAddress(String taskPoint); + StorageCell findByAddress(String taskPoint); } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/dto/StorageCellDto.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/dto/StorageCellDto.java similarity index 90% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/dto/StorageCellDto.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/dto/StorageCellDto.java index ca11327..52f0548 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/dto/StorageCellDto.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/dto/StorageCellDto.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.storage_cell.service.dto; +package org.nl.acs.device.storageMgt.service.dto; import lombok.AllArgsConstructor; import lombok.Builder; @@ -8,9 +8,6 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; -import java.util.Date; -import java.sql.Timestamp; - /** @@ -44,6 +41,8 @@ public class StorageCellDto implements Serializable { private Integer address; private Integer address1; + private String offset; + private Boolean has; private String remark; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/dto/StorageCellQueryParam.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/dto/StorageCellQueryParam.java similarity index 74% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/dto/StorageCellQueryParam.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/dto/StorageCellQueryParam.java index c69a16d..6dfc333 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/dto/StorageCellQueryParam.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/dto/StorageCellQueryParam.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.storage_cell.service.dto; +package org.nl.acs.device.storageMgt.service.dto; import lombok.Getter; import lombok.Setter; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/domain/StorageCell.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/entity/StorageCell.java similarity index 78% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/domain/StorageCell.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/entity/StorageCell.java index e700d23..ae45bf3 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/domain/StorageCell.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/entity/StorageCell.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.storage_cell.domain; +package org.nl.acs.device.storageMgt.service.entity; import org.nl.common.db.CommonModel; import com.baomidou.mybatisplus.annotation.TableName; @@ -37,7 +37,9 @@ public class StorageCell extends CommonModel implements Serializabl @TableId(type = IdType.ASSIGN_ID) private String storage_id; - + /** + * 货位编码 + */ @NotBlank private String storage_code; @@ -53,23 +55,31 @@ public class StorageCell extends CommonModel implements Serializabl @NotBlank private String z; - + /** + * AGV地址,默认取这个 + */ private Integer address; - + /** + * AGV地址1,涉及取放不同地址时与address配合 + */ private Integer address1; - + /** + * 偏移量:如进行二次分配时根据二次分配点便宜多少距离,可以传address + */ + private String offset; + /** + * 货位库存状态,默认无货,AGV动作交互后更新 + */ + private Boolean has; private String remark; - @NotBlank private String is_active; - @NotBlank private String is_delete; - @NotBlank @TableField(fill = FieldFill.INSERT) private String create_by; @@ -90,7 +100,4 @@ public class StorageCell extends CommonModel implements Serializabl private String parent_storage_code; - public void copyFrom(StorageCell source) { - BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); - } } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/impl/StorageCellServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/impl/StorageCellServiceImpl.java similarity index 56% rename from acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/impl/StorageCellServiceImpl.java rename to acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/impl/StorageCellServiceImpl.java index 0e4b4f7..2720158 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storage_cell/service/impl/StorageCellServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/storageMgt/service/impl/StorageCellServiceImpl.java @@ -1,4 +1,4 @@ -package org.nl.acs.device.storage_cell.service.impl; +package org.nl.acs.device.storageMgt.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; @@ -11,20 +11,20 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.AllArgsConstructor; -import org.nl.acs.autoThread.initial.ApplicationAutoInitial; +import org.nl.ApplicationAutoInitial; import org.nl.common.db.PageInfo; import org.nl.common.db.QueryHelpMybatisPlus; import org.nl.common.db.impl.CommonServiceImpl; import org.nl.acs.device.device.service.DeviceService; -import org.nl.acs.device.storage_cell.domain.StorageCell; -import org.nl.acs.device.storage_cell.service.mapper.StorageCellMapper; +import org.nl.acs.device.storageMgt.service.entity.StorageCell; +import org.nl.acs.device.storageMgt.service.mapper.StorageCellMapper; import org.nl.common.exception.BadRequestException; import org.nl.common.utils.ConvertUtil; import org.nl.common.utils.FileUtil; import org.nl.common.utils.utils.PageUtil; -import org.nl.acs.device.storage_cell.service.StorageCellService; -import org.nl.acs.device.storage_cell.service.dto.StorageCellDto; -import org.nl.acs.device.storage_cell.service.dto.StorageCellQueryParam; +import org.nl.acs.device.storageMgt.service.StorageCellService; +import org.nl.acs.device.storageMgt.service.dto.StorageCellDto; +import org.nl.acs.device.storageMgt.service.dto.StorageCellQueryParam; import org.nl.common.utils.SecurityUtils; import org.nl.config.language.LangProcess; import org.springframework.beans.factory.annotation.Autowired; @@ -46,201 +46,124 @@ import java.util.*; * @date 2023-05-09 */ @Service -@AllArgsConstructor -// @CacheConfig(cacheNames = StorageCellService.CACHE_KEY) -@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) public class StorageCellServiceImpl extends CommonServiceImpl implements StorageCellService , ApplicationAutoInitial { public static Map Storage_Cache_Map = new HashMap<>(); - private final StorageCellMapper storageCellMapper; - - @Autowired - private DeviceService deviceServiceImpl; - @Override public PageInfo queryAll(StorageCellQueryParam query, Pageable pageable) { IPage queryPage = PageUtil.toMybatisPage(pageable); - IPage page = storageCellMapper.selectPage(queryPage, QueryHelpMybatisPlus.getPredicate(query)); + IPage page = this.baseMapper.selectPage(queryPage, QueryHelpMybatisPlus.getPredicate(query)); return ConvertUtil.convertPage(page, StorageCellDto.class); } @Override public List queryAll(StorageCellQueryParam query) { - return ConvertUtil.convertList(storageCellMapper.selectList(QueryHelpMybatisPlus.getPredicate(query)), StorageCellDto.class); + return ConvertUtil.convertList(this.baseMapper.selectList(QueryHelpMybatisPlus.getPredicate(query)), StorageCellDto.class); } @Override public StorageCell getById(String id) { - return storageCellMapper.selectById(id); + return this.baseMapper.selectById(id); } -// @Override -// -// public StorageCellDto findById(String id) { -// return ConvertUtil.convert(getById(id), StorageCellDto.class); -// } - @Override - @Transactional(rollbackFor = Exception.class) public int insert(StorageCellDto resources) { StorageCell entity = ConvertUtil.convert(resources, StorageCell.class); - return storageCellMapper.insert(entity); + final int insert = this.baseMapper.insert(entity); + initCache(); + return insert; } @Override - @Transactional(rollbackFor = Exception.class) public int updateById(StorageCellDto resources) { StorageCell entity = ConvertUtil.convert(resources, StorageCell.class); - int ret = storageCellMapper.updateById(entity); - // delCaches(resources.id); + int ret = this.baseMapper.updateById(entity); + initCache(); return ret; } @Override - @Transactional(rollbackFor = Exception.class) + public int removeByIds(Set ids) { - // delCaches(ids); - return storageCellMapper.deleteBatchIds(ids); + final int i = this.baseMapper.deleteBatchIds(ids); + initCache(); + return i; } @Override - @Transactional(rollbackFor = Exception.class) + public int removeById(String id) { Set set = new HashSet<>(1); set.add(id); return this.removeByIds(set); } - /* - private void delCaches(String id) { - redisUtils.delByKey(CACHE_KEY + "::id:", id); - } - - private void delCaches(Set ids) { - for (String id: ids) { - delCaches(id); - } - }*/ - - /* - @Override - public void download(List all, HttpServletResponse response) throws IOException { - List> list = new ArrayList<>(); - for (StorageCellDto storageCell : all) { - Map map = new LinkedHashMap<>(); - map.put("货位编码", storageCell.getStorageCode()); - map.put("排", storageCell.getX()); - map.put("列", storageCell.getY()); - map.put("层", storageCell.getZ()); - map.put("地址", storageCell.getAddress()); - map.put("备注", storageCell.getRemark()); - map.put("是否启用", storageCell.getIsActive()); - map.put("是否删除", storageCell.getIsDelete()); - map.put("创建者", storageCell.getCreateBy()); - map.put("创建时间", storageCell.getCreateTime()); - map.put("修改者", storageCell.getUpdateBy()); - map.put("修改时间", storageCell.getUpdateTime()); - map.put("父级货位编码", storageCell.getParentStorageCode()); - list.add(map); - } - FileUtil.downloadExcel(list, response); - }*/ - @Override public Map queryAll(Map whereJson, Pageable page) { String storage_code = MapUtil.getStr(whereJson, "storage_code"); String parent_storage_code = MapUtil.getStr(whereJson, "parent_storage_code"); String address = MapUtil.getStr(whereJson, "address"); - IPage queryPage = PageUtil.toMybatisPage(page); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(storage_code), StorageCell::getStorage_code, storage_code); wrapper.like(StringUtils.isNotBlank(parent_storage_code), StorageCell::getParent_storage_code, parent_storage_code); wrapper.like(StringUtils.isNotBlank(address), StorageCell::getAddress, address); - IPage storageCellIPage = storageCellMapper.selectPage(queryPage, wrapper); + IPage storageCellIPage = this.baseMapper.selectPage(queryPage, wrapper); final JSONObject json = (JSONObject) JSON.toJSON(ConvertUtil.convertPage(storageCellIPage, StorageCell.class)); return json; } @Override public List queryAll(Map whereJson) { - List list = new LambdaQueryChainWrapper<>(storageCellMapper) + List list = new LambdaQueryChainWrapper<>(this.baseMapper) .list(); return ConvertUtil.convertList(list, StorageCellDto.class); } @Override - public StorageCellDto findById(String storage_id) { - - StorageCell storageCell = storageCellMapper.selectById(storage_id); - if (ObjectUtil.isNotEmpty(storageCell)) { - final StorageCellDto obj = ConvertUtil.convert(storageCell, StorageCellDto.class); - return obj; - } - return null; + public StorageCell findById(String storage_id) { + StorageCell storageCell = this.baseMapper.selectById(storage_id); + return storageCell; } -// @Override -// public StorageCellDto findByCode(String code) { -// WQLObject wo = WQLObject.getWQLObject("acs_storage_cell"); -// JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); -// if (ObjectUtil.isNotEmpty(json)){ -// final StorageCellDto obj = json.toJavaObject(StorageCellDto.class); -// return obj; -// } -// return null; -// } - - @Override - @Transactional(rollbackFor = Exception.class) public void create(StorageCellDto dto) { String currentUsername = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); - dto.setStorage_id(IdUtil.simpleUUID()); dto.setCreate_by(currentUsername); dto.setUpdate_by(currentUsername); dto.setUpdate_time(now); dto.setCreate_time(now); - StorageCell entity = ConvertUtil.convert(dto, StorageCell.class); - storageCellMapper.insert(entity); + this.baseMapper.insert(entity); + initCache(); } @Override - @Transactional(rollbackFor = Exception.class) + public void update(StorageCellDto dto) { - StorageCellDto entity = this.findById(dto.getStorage_id()); + StorageCell entity = this.findById(dto.getStorage_id()); if (entity == null) { throw new BadRequestException(LangProcess.msg("error_sysAuth")); } - String currentUsername = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); dto.setUpdate_time(now); dto.setUpdate_by(currentUsername); - StorageCell storageCell = ConvertUtil.convert(dto, StorageCell.class); - storageCellMapper.updateById(storageCell); - - List allStorageCellFromCache = deviceServiceImpl.findAllStorageCellFromCache(); - allStorageCellFromCache.forEach(storageCellDto -> { - if(storageCellDto.getStorage_id().equals(storageCell.getStorage_id())){ - storageCellDto.setAddress(storageCell.getAddress()); - } - }); + this.baseMapper.updateById(storageCell); + initCache(); } @Override - @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { - for (String storage_id : ids) { - this.removeById(storage_id); - } + this.removeByIds(Arrays.asList(ids)); + initCache(); } @Override @@ -253,6 +176,9 @@ public class StorageCellServiceImpl extends CommonServiceImpl().eq( + public StorageCell findByAddress(String address) { + StorageCell storageCell = this.baseMapper.selectOne(new LambdaQueryWrapper().eq( StorageCell::getAddress, address )); - if (ObjectUtil.isNotEmpty(storageCell)) { - final StorageCellDto obj = ConvertUtil.convert(storageCell, StorageCellDto.class); - return obj; - } - return null; + return storageCell; } - @Override - public void autoInitial() throws Exception { - initCache(); - } public void initCache(){ List list = this.list(); @@ -291,4 +209,10 @@ public class StorageCellServiceImpl extends CommonServiceImpl(ConvertUtil.convertList(list, Instruction.class)); } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/route/service/impl/RouteLineServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/route/service/impl/RouteLineServiceImpl.java index 9515216..1df5b31 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/route/service/impl/RouteLineServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/route/service/impl/RouteLineServiceImpl.java @@ -13,18 +13,18 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.AllArgsConstructor; -import org.nl.acs.autoThread.initial.ApplicationAutoInitial; +import org.nl.ApplicationAutoInitial; import org.nl.acs.task.route.domain.RouteLine; import org.nl.acs.task.route.service.RouteLineService; import org.nl.acs.task.route.service.RoutePlanService; import org.nl.acs.task.route.service.mapper.RouteLineMapper; import org.nl.common.db.CommonFinalParam; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device.enums.DeviceType; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.enums.DeviceType; import org.nl.acs.device.device.service.DeviceService; import org.nl.acs.device.device.service.dto.DeviceDto; import org.nl.acs.device.device.service.mapper.DeviceMapper; -import org.nl.acs.device.device_driver.RouteableDeviceDriver; +import org.nl.acs.device.deviceDriver.RouteableDeviceDriver; import org.nl.acs.iot.opc.DeviceAppService; import org.nl.acs.task.route.service.dto.RoutePlanDto; import org.nl.common.db.PageInfo; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/impl/TaskServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/impl/TaskServiceImpl.java index c5eda0b..ec70e6f 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/impl/TaskServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/task/service/impl/TaskServiceImpl.java @@ -17,17 +17,17 @@ import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapp import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.nl.acs.AcsConfig; -import org.nl.acs.autoThread.initial.ApplicationAutoInitial; +import org.nl.ApplicationAutoInitial; import org.nl.acs.task.task.enums.TaskStatusEnum; import org.nl.acs.task.task.service.mapper.TaskMapper; import org.nl.common.db.CommonFinalParam; -import org.nl.acs.device.device.domain.Device; -import org.nl.acs.device.device.enums.DeviceType; +import org.nl.acs.device.device.service.domain.Device; +import org.nl.acs.device.device.service.enums.DeviceType; import org.nl.acs.device.device.service.DeviceAssignedService; import org.nl.acs.device.device.service.DeviceService; import org.nl.acs.device.device.service.dto.DeviceAssignedDto; import org.nl.acs.device.device.service.impl.DeviceServiceImpl; -import org.nl.acs.device.device_driver.DeviceDriverDefination; +import org.nl.acs.device.deviceDriver.设备类型驱动.DeviceDriverDefination; import org.nl.acs.api.wms.service.AcsToWmsService; import org.nl.acs.task.instruction.domain.Instruction; import org.nl.acs.task.instruction.domain.InstructionMybatis; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/common/db/CommonMapper.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/common/db/CommonMapper.java index 0eaa7e7..bea8015 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/common/db/CommonMapper.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/common/db/CommonMapper.java @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWra import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers; import org.apache.ibatis.annotations.Mapper; -import org.nl.acs.task.instruction.domain.Instruction; /** * 公共抽象Mapper接口类 diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/socket/SocketListenerAutoRun.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/socket/SocketListenerAutoRun.java index 8bfbdc8..b56e7b3 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/socket/SocketListenerAutoRun.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/socket/SocketListenerAutoRun.java @@ -2,7 +2,7 @@ package org.nl.common.utils.socket; import cn.hutool.core.util.StrUtil; import org.dromara.dynamictp.core.support.ThreadPoolBuilder; -import org.nl.acs.autoThread.run.AbstractAutoRunnable; +import org.nl.acs.autoThread.AbstractAutoRunnable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/dict/impl/SysDictServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/dict/impl/SysDictServiceImpl.java index 5e80161..fad89a7 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/dict/impl/SysDictServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/dict/impl/SysDictServiceImpl.java @@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.service.domain.Device; import org.nl.acs.device.device.service.mapper.DeviceMapper; import org.nl.common.domain.query.PageQuery; import org.nl.common.exception.BadRequestException; diff --git a/acs2/nladmin-system/nlsso-server/src/main/resources/log/OneNDCSocketConnectionAutoRun.xml b/acs2/nladmin-system/nlsso-server/src/main/resources/log/OneNDCSocketConnectionAutoRun.xml index ec40da7..d9835a0 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/resources/log/OneNDCSocketConnectionAutoRun.xml +++ b/acs2/nladmin-system/nlsso-server/src/main/resources/log/OneNDCSocketConnectionAutoRun.xml @@ -27,7 +27,7 @@ --> - + diff --git a/acs2/nladmin-system/nlsso-server/src/main/resources/log/TwoNDCSocketConnectionAutoRun.xml b/acs2/nladmin-system/nlsso-server/src/main/resources/log/TwoNDCSocketConnectionAutoRun.xml index 6cc4f07..6ef021b 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/resources/log/TwoNDCSocketConnectionAutoRun.xml +++ b/acs2/nladmin-system/nlsso-server/src/main/resources/log/TwoNDCSocketConnectionAutoRun.xml @@ -27,7 +27,7 @@ --> - +