From 0c1e0e693b37a53764f1550bec3057d856e7809b Mon Sep 17 00:00:00 2001 From: tuqiang <437016993@qq.com> Date: Mon, 28 Oct 2024 13:20:22 +0800 Subject: [PATCH] =?UTF-8?q?add:=E6=96=B0=E5=A2=9E=E4=B8=80=E4=BD=93?= =?UTF-8?q?=E6=9C=BA=E6=8E=A5=E5=8F=A3=E3=80=81=E6=89=8B=E6=8C=81=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=BB=A5=E5=8F=8A=E8=87=AA=E5=8A=A8=E9=97=A8=E5=92=8C?= =?UTF-8?q?=E6=8A=A5=E8=AD=A6=E7=81=AF=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../run/TwoNDCSocketConnectionAutoRun.java | 90 +- .../nl/acs/common/base/CommonFinalParam.java | 1 + .../controller/MaterialbaseController.java | 75 + .../org/nl/acs/data/domain/Materialbase.java | 69 + .../nl/acs/data/domain/MaterialbaseQuery.java | 10 + .../acs/data/mapper/MaterialbaseMapper.java | 16 + .../data/service/IMaterialbaseService.java | 59 + .../service/impl/MaterialbaseServiceImpl.java | 115 ++ .../agv/ndctwo/AgvNdcTwoDeviceDriver.java | 1807 +---------------- .../lamp_three_color/ItemProtocol.java | 6 + .../LampThreecolorDefination.java | 6 +- .../LampThreecolorDeviceDriver.java | 22 +- .../acs/ext/wms/rest/AcsToSpxController.java | 4 + .../acs/ext/wms/rest/SpxToAcsController.java | 31 + .../acs/ext/wms/service/AcsToSpxService.java | 4 + .../acs/ext/wms/service/SpxToAcsService.java | 7 + .../wms/service/impl/AcsToSpxServiceImpl.java | 4 + .../wms/service/impl/SpxToAcsServiceImpl.java | 149 ++ .../service/impl/InstructionServiceImpl.java | 199 +- .../acs/materialbase/domain/Materialbase.java | 254 +-- .../rest/MaterialbaseController.java | 188 +- .../service/MaterialbaseService.java | 178 +- .../service/dto/MaterialbaseDto.java | 208 +- .../service/dto/MaterialbaseQueryParam.java | 40 +- .../service/impl/MaterialbaseServiceImpl.java | 266 +-- .../service/mapper/MaterialbaseMapper.java | 28 +- .../nl/acs/opc/DeviceOpcProtocolRunable.java | 4 + .../main/java/org/nl/acs/opc/TestOpcUA.java | 5 + .../acs/order/mapper/OrderDetailMapper.java | 8 + .../org/nl/acs/order/mapper/OrderMapper.java | 20 + .../org/nl/acs/order/mapper/OrderMapper.xml | 43 + .../nl/acs/order/rest/OrderController.java | 96 + .../acs/order/rest/OrderDetailController.java | 57 + .../acs/order/service/OrderDetailService.java | 37 + .../nl/acs/order/service/OrderService.java | 94 + .../acs/order/service/dto/OrderDetailDto.java | 62 + .../order/service/dto/OrderDetailQuery.java | 9 + .../nl/acs/order/service/dto/OrderDto.java | 124 ++ .../nl/acs/order/service/dto/OrderQuery.java | 17 + .../service/impl/OrderDetailServiceImpl.java | 37 + .../order/service/impl/OrderServiceImpl.java | 275 +++ .../point/controller/AcsPointController.java | 84 + .../org/nl/acs/point/domain/AcsPoint.java | 66 + .../org/nl/acs/point/domain/PointQuery.java | 12 + .../nl/acs/point/mapper/AcsPointMapper.java | 28 + .../nl/acs/point/mapper/AcsPointMapper.xml | 17 + .../acs/point/service/IAcsPointService.java | 76 + .../service/impl/AcsPointServiceImpl.java | 132 ++ .../product/controller/ProductController.java | 75 + .../controller/ProductdtlController.java | 71 + .../org/nl/acs/product/domain/Product.java | 70 + .../nl/acs/product/domain/ProductQuery.java | 10 + .../org/nl/acs/product/domain/Productdtl.java | 69 + .../acs/product/domain/ProductdtlQuery.java | 9 + .../nl/acs/product/mapper/ProductMapper.java | 16 + .../nl/acs/product/mapper/ProductMapper.xml | 5 + .../acs/product/mapper/ProductdtlMapper.java | 16 + .../acs/product/service/IProductService.java | 55 + .../product/service/IProductdtlService.java | 45 + .../service/impl/ProductServiceImpl.java | 156 ++ .../service/impl/ProductdtlServiceImpl.java | 83 + .../controller/SchBaseRegionController.java | 78 + .../region/service/ISchBaseRegionService.java | 67 + .../sch/region/service/dao/SchBaseRegion.java | 59 + .../dao/mapper/SchBaseRegionMapper.java | 7 + .../region/service/dto/SchBaseRegionDto.java | 79 + .../impl/SchBaseRegionServiceImpl.java | 130 ++ .../controller/SchBaseTaskController.java | 75 + .../SchBaseTaskconfigController.java | 62 + .../sch/task/controller/WorkController.java | 86 + .../sch/task/service/ISchBaseTaskService.java | 73 + .../service/ISchBaseTaskconfigService.java | 44 + .../nl/acs/sch/task/service/WorkService.java | 52 + .../acs/sch/task/service/dao/SchBaseTask.java | 124 ++ .../task/service/dao/SchBaseTaskconfig.java | 146 ++ .../org/nl/acs/sch/task/service/dao/Work.java | 83 + .../service/dao/mapper/SchBaseTaskMapper.java | 13 + .../service/dao/mapper/SchBaseTaskMapper.xml | 44 + .../dao/mapper/SchBaseTaskconfigMapper.java | 7 + .../task/service/dao/mapper/WorkMapper.java | 13 + .../task/service/dao/mapper/WorkMapper.xml | 33 + .../sch/task/service/dto/SchBaseTaskDto.java | 171 ++ .../task/service/dto/SchBaseTaskQuery.java | 18 + .../service/dto/SchBaseTaskconfigDto.java | 209 ++ .../service/dto/SchBaseTaskconfigQuery.java | 8 + .../nl/acs/sch/task/service/dto/WorkDto.java | 69 + .../acs/sch/task/service/dto/WorkQuery.java | 13 + .../service/impl/SchBaseTaskServiceImpl.java | 170 ++ .../impl/SchBaseTaskconfigServiceImpl.java | 131 ++ .../task/service/impl/WorkServiceImpl.java | 199 ++ .../nl/acs/sch/task_manage/AbstractTask.java | 45 + .../nl/acs/sch/task_manage/AcsTaskDto.java | 4 + .../acs/sch/task_manage/AutoCreateTask.java | 4 + .../sch/task_manage/GeneralDefinition.java | 168 ++ .../sch/task_manage/task/core/TaskStatus.java | 67 + .../task_manage/task/tasks/TaskFactory.java | 42 + .../task/service/impl/TaskServiceImpl.java | 133 +- .../org/nl/common/domain/query/PageQuery.java | 4 + .../nl/hand/controller/HandController.java | 42 + .../MobileAuthorizationController.java | 2 +- .../org/nl/hand/controller/PdaController.java | 94 + .../main/java/org/nl/hand/dto/B2HeadDto.java | 37 - .../java/org/nl/hand/dto/HeadDeviceDto.java | 26 - .../java/org/nl/hand/dto/HeadInstDto.java | 40 - .../java/org/nl/hand/dto/HeadTaskDto.java | 39 - .../main/java/org/nl/hand/dto/RegionDto.java | 17 - .../org/nl/hand/rest/B2HandController.java | 83 - .../java/org/nl/hand/rest/HandController.java | 99 - .../org/nl/hand/service/B2HandService.java | 25 - .../java/org/nl/hand/service/HandService.java | 37 +- .../java/org/nl/hand/service/PdaService.java | 37 + .../dao/dto/PdaDto.java} | 10 +- .../nl/hand/service/dao/mapper/PdaMapper.java | 13 + .../nl/hand/service/dao/mapper/PdaMapper.xml | 35 + .../nl/hand/service/dao/vo/PdaResponseVo.java | 23 + .../hand/service/impl/B2HandServiceImpl.java | 185 -- .../nl/hand/service/impl/HandServiceImpl.java | 454 +---- .../nl/hand/service/impl/PdaServiceImpl.java | 190 ++ .../java/org/nl/hand/service/vo/OrderVo.java | 20 + .../java/org/nl/hand/service/vo/WorkVo.java | 21 + .../controller/monitor/MonitorController.java | 1 - .../service/quartz/task/AutoCreateInst.java | 55 +- .../main/resources/config/application-dev.yml | 2 +- .../src/main/resources/config/application.yml | 3 + .../resources/mapper/MaterialbaseMapper.xml | 5 + .../resources/mapper/ProductdtlMapper.xml | 5 + acs/nladmin-ui/src/assets/images/1.png | Bin 0 -> 90229 bytes acs/nladmin-ui/src/assets/images/2.jpeg | Bin 0 -> 17269 bytes acs/nladmin-ui/src/assets/images/picture.png | Bin 0 -> 14149 bytes acs/nladmin-ui/src/components/Crud/crud.js | 19 +- acs/nladmin-ui/src/components/Crud/crud1.js | 974 +++++++++ .../src/layout/components/Sidebar/Logo.vue | 6 +- .../src/views/acs/basetask/config/index.vue | 521 +++++ .../acs/basetask/config/schBaseTaskconfig.js | 33 + .../views/acs/history/instRecord/index.vue | 12 - .../views/acs/history/taskRecord/index.vue | 89 +- .../acs/history/taskTreeRecord/index.vue | 61 +- .../src/views/acs/instruction/index.vue | 64 - .../src/views/acs/material/index.vue | 377 ++++ .../src/views/acs/material/materialbase.js | 57 + .../src/views/acs/order/AddDialog.vue | 430 ++++ acs/nladmin-ui/src/views/acs/order/AddDtl.vue | 162 ++ acs/nladmin-ui/src/views/acs/order/index.vue | 330 +++ acs/nladmin-ui/src/views/acs/order/order.js | 51 + acs/nladmin-ui/src/views/acs/point/index.vue | 322 +++ acs/nladmin-ui/src/views/acs/point/point.js | 51 + .../src/views/acs/product/AddDialog.vue | 446 ++++ .../src/views/acs/product/AddDtl.vue | 162 ++ .../src/views/acs/product/index.vue | 215 ++ .../src/views/acs/product/product.js | 69 + acs/nladmin-ui/src/views/acs/region/index.vue | 201 ++ .../src/views/acs/region/schBaseRegion.js | 51 + acs/nladmin-ui/src/views/acs/task/index.vue | 420 +--- .../views/acs/work/HandleCommandDialog.vue | 119 ++ acs/nladmin-ui/src/views/acs/work/index.vue | 346 ++++ acs/nladmin-ui/src/views/acs/work/work.js | 83 + 156 files changed, 11504 insertions(+), 4316 deletions(-) create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/controller/MaterialbaseController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/domain/Materialbase.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/domain/MaterialbaseQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/mapper/MaterialbaseMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/service/IMaterialbaseService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/service/impl/MaterialbaseServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/rest/AcsToSpxController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/rest/SpxToAcsController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/AcsToSpxService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/SpxToAcsService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToSpxServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/SpxToAcsServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderDetailMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/rest/OrderController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/rest/OrderDetailController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/OrderDetailService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/OrderService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDetailDto.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDetailQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDto.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/impl/OrderDetailServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/impl/OrderServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/controller/AcsPointController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/domain/AcsPoint.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/domain/PointQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/mapper/AcsPointMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/mapper/AcsPointMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/service/IAcsPointService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/service/impl/AcsPointServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/controller/ProductController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/controller/ProductdtlController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/Product.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/ProductQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/Productdtl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/ProductdtlQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductdtlMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/IProductService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/IProductdtlService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/impl/ProductServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/impl/ProductdtlServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/controller/SchBaseRegionController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/ISchBaseRegionService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dao/SchBaseRegion.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dao/mapper/SchBaseRegionMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dto/SchBaseRegionDto.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/impl/SchBaseRegionServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/SchBaseTaskController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/SchBaseTaskconfigController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/WorkController.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/ISchBaseTaskService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/ISchBaseTaskconfigService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/WorkService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/SchBaseTask.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/SchBaseTaskconfig.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/Work.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskconfigMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/WorkMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/WorkMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskDto.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskconfigDto.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskconfigQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/WorkDto.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/WorkQuery.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/SchBaseTaskServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/SchBaseTaskconfigServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/WorkServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AbstractTask.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AcsTaskDto.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AutoCreateTask.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/GeneralDefinition.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/task/core/TaskStatus.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/task/tasks/TaskFactory.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/HandController.java rename acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/{rest => controller}/MobileAuthorizationController.java (99%) create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/PdaController.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/B2HeadDto.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadDeviceDto.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadInstDto.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadTaskDto.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/RegionDto.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/B2HandController.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/HandController.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/B2HandService.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/PdaService.java rename acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/{dto/HeadDto.java => service/dao/dto/PdaDto.java} (68%) create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/mapper/PdaMapper.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/mapper/PdaMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/vo/PdaResponseVo.java delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/B2HandServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/PdaServiceImpl.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/vo/OrderVo.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/vo/WorkVo.java create mode 100644 acs/nladmin-system/nlsso-server/src/main/resources/mapper/MaterialbaseMapper.xml create mode 100644 acs/nladmin-system/nlsso-server/src/main/resources/mapper/ProductdtlMapper.xml create mode 100644 acs/nladmin-ui/src/assets/images/1.png create mode 100644 acs/nladmin-ui/src/assets/images/2.jpeg create mode 100644 acs/nladmin-ui/src/assets/images/picture.png create mode 100644 acs/nladmin-ui/src/components/Crud/crud1.js create mode 100644 acs/nladmin-ui/src/views/acs/basetask/config/index.vue create mode 100644 acs/nladmin-ui/src/views/acs/basetask/config/schBaseTaskconfig.js create mode 100644 acs/nladmin-ui/src/views/acs/material/index.vue create mode 100644 acs/nladmin-ui/src/views/acs/material/materialbase.js create mode 100644 acs/nladmin-ui/src/views/acs/order/AddDialog.vue create mode 100644 acs/nladmin-ui/src/views/acs/order/AddDtl.vue create mode 100644 acs/nladmin-ui/src/views/acs/order/index.vue create mode 100644 acs/nladmin-ui/src/views/acs/order/order.js create mode 100644 acs/nladmin-ui/src/views/acs/point/index.vue create mode 100644 acs/nladmin-ui/src/views/acs/point/point.js create mode 100644 acs/nladmin-ui/src/views/acs/product/AddDialog.vue create mode 100644 acs/nladmin-ui/src/views/acs/product/AddDtl.vue create mode 100644 acs/nladmin-ui/src/views/acs/product/index.vue create mode 100644 acs/nladmin-ui/src/views/acs/product/product.js create mode 100644 acs/nladmin-ui/src/views/acs/region/index.vue create mode 100644 acs/nladmin-ui/src/views/acs/region/schBaseRegion.js create mode 100644 acs/nladmin-ui/src/views/acs/work/HandleCommandDialog.vue create mode 100644 acs/nladmin-ui/src/views/acs/work/index.vue create mode 100644 acs/nladmin-ui/src/views/acs/work/work.js diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java index 5d1cc66..a94f235 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java @@ -10,6 +10,7 @@ import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.agv.ndcone.AgvNdcOneDeviceDriver; import org.nl.acs.device_driver.agv.ndctwo.AgvNdcTwoDeviceDriver; import org.nl.acs.device_driver.autodoor.standard_autodoor.StandardAutodoorDeviceDriver; +import org.nl.acs.device_driver.two_conveyor.lamp_three_color.LampThreecolorDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; import org.nl.acs.instruction.domain.Instruction; @@ -171,6 +172,8 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { String emptyNum = null; //自动门 StandardAutodoorDeviceDriver standardAutodoorDeviceDriver; + //报警灯 + LampThreecolorDeviceDriver lampThreecolorDeviceDriver; if (agvaddr != 0) { old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); if (StrUtil.contains(old_device_code, "-")) { @@ -201,7 +204,7 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } //任务完毕 //(无车id及状态) - else if (phase == 0x14) { + else if (phase == 0x0A) { if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); } else { @@ -248,18 +251,41 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (ObjectUtil.isNotEmpty(device)) { if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); - try { - standardAutodoorDeviceDriver.writing("to_open", "1"); - standardAutodoorDeviceDriver.writing("to_close", "0"); - } catch (Exception e) { - log.info("下发电气信号失败:" + e.getMessage()); - e.printStackTrace(); - } - if (standardAutodoorDeviceDriver.getOpen() == 1 && standardAutodoorDeviceDriver.getToOpen() == 1) { - log.info("下发开门信号值为:{},读取开门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getOpen()); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + String link_three_lamp = device.getExtraValue().get("link_three_lamp").toString(); + if (StrUtil.isNotEmpty(link_three_lamp)) { + Device code = deviceAppService.findDeviceByCode(link_three_lamp); + if (code.getDeviceDriver() instanceof LampThreecolorDeviceDriver) { + lampThreecolorDeviceDriver = (LampThreecolorDeviceDriver) code.getDeviceDriver(); + lampThreecolorDeviceDriver.writing("to_command", "1"); + } + Thread.sleep(5000); + try { + standardAutodoorDeviceDriver.writing("to_open", "0"); + standardAutodoorDeviceDriver.writing("to_close", "1"); + } catch (Exception e) { + log.info("下发电气信号失败:" + e.getMessage()); + e.printStackTrace(); + } + if (standardAutodoorDeviceDriver.getClose() == 1) { + log.info("读取关门信号值为:{}", standardAutodoorDeviceDriver.getClose()); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + } else { + log.info("未下发NDC信号原因: 读取关门信号值为:{}", standardAutodoorDeviceDriver.getClose()); + } } else { - log.info("未下发NDC信号原因: 下发开门信号值为:{},读取开门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getToClose()); + try { + standardAutodoorDeviceDriver.writing("to_open", "1"); + standardAutodoorDeviceDriver.writing("to_close", "0"); + } catch (Exception e) { + log.info("下发电气信号失败:" + e.getMessage()); + e.printStackTrace(); + } + if (standardAutodoorDeviceDriver.getOpen() == 1 && standardAutodoorDeviceDriver.getToOpen() == 1) { + log.info("下发开门信号值为:{},读取开门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getOpen()); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + } else { + log.info("未下发NDC信号原因: 下发开门信号值为:{},读取开门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getToClose()); + } } } } else { @@ -274,18 +300,35 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (ObjectUtil.isNotEmpty(device)) { if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); - try { - standardAutodoorDeviceDriver.writing("to_close", "1"); - standardAutodoorDeviceDriver.writing("to_open", "0"); - } catch (Exception e) { - log.info("下发电气信号失败:" + e.getMessage()); - e.printStackTrace(); - } - if (standardAutodoorDeviceDriver.getClose() == 1) { - log.info("读取关门信号值为:{}", standardAutodoorDeviceDriver.getClose()); + String link_three_lamp = device.getExtraValue().get("link_three_lamp").toString(); + if (StrUtil.isNotEmpty(link_three_lamp)) { + Device code = deviceAppService.findDeviceByCode(link_three_lamp); + if (code.getDeviceDriver() instanceof LampThreecolorDeviceDriver) { + lampThreecolorDeviceDriver = (LampThreecolorDeviceDriver) code.getDeviceDriver(); + lampThreecolorDeviceDriver.writing("to_command", "0"); + } + try { + standardAutodoorDeviceDriver.writing("to_open", "0"); + standardAutodoorDeviceDriver.writing("to_close", "0"); + } catch (Exception e) { + log.info("下发电气信号失败:" + e.getMessage()); + e.printStackTrace(); + } data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); } else { - log.info("未下发NDC信号原因: 读取关门信号值为:{}", standardAutodoorDeviceDriver.getClose()); + try { + standardAutodoorDeviceDriver.writing("to_close", "1"); + standardAutodoorDeviceDriver.writing("to_open", "0"); + } catch (Exception e) { + log.info("下发电气信号失败:" + e.getMessage()); + e.printStackTrace(); + } + if (standardAutodoorDeviceDriver.getClose() == 1) { + log.info("读取关门信号值为:{}", standardAutodoorDeviceDriver.getClose()); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + } else { + log.info("未下发NDC信号原因: 读取关门信号值为:{}", standardAutodoorDeviceDriver.getClose()); + } } } } else { @@ -304,9 +347,6 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); agvNdcTwoDeviceDriver.processSocket(arr); - } else if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) { - agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver(); - agvNdcOneDeviceDriver.processSocket(arr); } } else { log.info("当前phase:" + phase + "未找到对应设备"); diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/common/base/CommonFinalParam.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/common/base/CommonFinalParam.java index ba3609b..d136e02 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/common/base/CommonFinalParam.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/common/base/CommonFinalParam.java @@ -20,6 +20,7 @@ public class CommonFinalParam { public static final String ONE = "1"; public static final String TWO = "2"; + public static final String FINISHED = "2"; public static final String THREE = "3"; public static final String FOUR = "4"; diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/controller/MaterialbaseController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/controller/MaterialbaseController.java new file mode 100644 index 0000000..0fcfd6e --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/controller/MaterialbaseController.java @@ -0,0 +1,75 @@ +package org.nl.acs.data.controller; + + +import com.alibaba.fastjson.JSONArray; +import org.nl.acs.data.domain.Materialbase; +import org.nl.acs.data.domain.MaterialbaseQuery; +import org.nl.acs.data.service.IMaterialbaseService; +import org.nl.acs.point.domain.AcsPoint; +import org.nl.acs.point.domain.PointQuery; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; + +/** + *

+ * 物料基本信息表 前端控制器 + *

+ * + * @author tuqiang + * @since 2024-10-10 + */ +@RestController +@RequestMapping("/api/materialbase") +public class MaterialbaseController { + + @Autowired + private IMaterialbaseService materialbaseService; + + @GetMapping + @Log("查询物料管理") + //@SaCheckPermission("@el.check('schBasePoint:list')") + public ResponseEntity query(MaterialbaseQuery whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(materialbaseService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增物料管理") + //@SaCheckPermission("@el.check('schBasePoint:add')") + public ResponseEntity create(@Validated @RequestBody Materialbase entity) { + materialbaseService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改物料管理") + //@SaCheckPermission("@el.check('schBasePoint:edit')") + public ResponseEntity update(@Validated @RequestBody Materialbase entity) { + materialbaseService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除物料管理") + //@SaCheckPermission("@el.check('schBasePoint:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + materialbaseService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/getBoxIvt") + @Log("查询所有物料") + + public ResponseEntity getBoxIvt() { + return new ResponseEntity<>(materialbaseService.getBoxIvt(), HttpStatus.OK); + } + + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/domain/Materialbase.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/domain/Materialbase.java new file mode 100644 index 0000000..bf8ff57 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/domain/Materialbase.java @@ -0,0 +1,69 @@ +package org.nl.acs.data.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + *

+ * 物料基本信息表 + *

+ * + * @author tuqiang + * @since 2024-10-10 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("materialbase") +@ApiModel(value="Materialbase对象", description="物料基本信息表") +public class Materialbase implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "物料标识") + @TableId + private String material_id; + + @ApiModelProperty(value = "物料编码") + private String material_code; + + @ApiModelProperty(value = "物料名称 ") + private String material_name; + + @ApiModelProperty(value = "基本计量单位") + private String base_unit_id; + + @ApiModelProperty(value = "创建人") + private Long create_id; + + @ApiModelProperty(value = "创建人姓名") + private String create_name; + + @ApiModelProperty(value = "创建时间") + private String create_time; + + @ApiModelProperty(value = "修改人") + private Long update_optid; + + @ApiModelProperty(value = "修改人姓名") + private String update_optname; + + @ApiModelProperty(value = "修改时间") + private String update_time; + + private float qty; + + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/domain/MaterialbaseQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/domain/MaterialbaseQuery.java new file mode 100644 index 0000000..c57245a --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/domain/MaterialbaseQuery.java @@ -0,0 +1,10 @@ +package org.nl.acs.data.domain; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class MaterialbaseQuery implements Serializable { + private String search; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/mapper/MaterialbaseMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/mapper/MaterialbaseMapper.java new file mode 100644 index 0000000..a68e7cf --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/mapper/MaterialbaseMapper.java @@ -0,0 +1,16 @@ +package org.nl.acs.data.mapper; + +import org.nl.acs.data.domain.Materialbase; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 物料基本信息表 Mapper 接口 + *

+ * + * @author tuqiang + * @since 2024-10-10 + */ +public interface MaterialbaseMapper extends BaseMapper { + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/service/IMaterialbaseService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/service/IMaterialbaseService.java new file mode 100644 index 0000000..d95ce19 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/service/IMaterialbaseService.java @@ -0,0 +1,59 @@ +package org.nl.acs.data.service; + +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.nl.acs.data.domain.Materialbase; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.data.domain.MaterialbaseQuery; +import org.nl.acs.data.mapper.MaterialbaseMapper; +import org.nl.acs.point.domain.AcsPoint; +import org.nl.acs.point.domain.PointQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.Set; + +/** + *

+ * 物料基本信息表 服务类 + *

+ * + * @author tuqiang + * @since 2024-10-10 + */ +public interface IMaterialbaseService extends IService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(MaterialbaseQuery whereJson, PageQuery pageable); + + /** + * 创建 + * + * @param entity / + */ + void create(Materialbase entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(Materialbase entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + JSONArray getBoxIvt(); + + Materialbase findByCode(String code); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/service/impl/MaterialbaseServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/service/impl/MaterialbaseServiceImpl.java new file mode 100644 index 0000000..0d32445 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/data/service/impl/MaterialbaseServiceImpl.java @@ -0,0 +1,115 @@ +package org.nl.acs.data.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.nl.acs.data.domain.Materialbase; +import org.nl.acs.data.domain.MaterialbaseQuery; +import org.nl.acs.data.mapper.MaterialbaseMapper; +import org.nl.acs.data.service.IMaterialbaseService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.acs.point.domain.AcsPoint; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; + +/** + *

+ * 物料基本信息表 服务实现类 + *

+ * + * @author tuqiang + * @since 2024-10-10 + */ +@Service +public class MaterialbaseServiceImpl extends ServiceImpl implements IMaterialbaseService { + + @Autowired + private MaterialbaseMapper materialbaseMapper; + + @Override + public IPage queryAll(MaterialbaseQuery whereJson, PageQuery page) { + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + LambdaQueryWrapper materialbaseLambdaQueryWrapper = Wrappers.lambdaQuery(Materialbase.class); + if (StrUtil.isNotEmpty(whereJson.getSearch())) { + materialbaseLambdaQueryWrapper.and(wrapper -> { + wrapper.like(StrUtil.isNotEmpty(whereJson.getSearch()), Materialbase::getMaterial_code, whereJson.getSearch()) + .or() + .like(StrUtil.isNotEmpty(whereJson.getSearch()), Materialbase::getMaterial_name, whereJson.getSearch()); + }); + } + pages = materialbaseMapper.selectPage(pages, materialbaseLambdaQueryWrapper); + return pages; + } + + @Override + public void create(Materialbase entity) { + String material_code = entity.getMaterial_code(); + Materialbase materialbase = materialbaseMapper.selectOne(new LambdaQueryWrapper().eq(Materialbase::getMaterial_code, material_code)); + if (ObjectUtil.isNotEmpty(materialbase)) { + throw new RuntimeException("存在相同的物料编码"); + } + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String currentUserId = SecurityUtils.getCurrentUserId(); + entity.setMaterial_id(IdUtil.getSnowflake(1, 1).nextId()+""); + entity.setCreate_id(Long.getLong(currentUserId)); + entity.setCreate_name(nickName); + entity.setCreate_time(now); + entity.setUpdate_optid(Long.getLong(currentUserId)); + entity.setUpdate_optname(nickName); + entity.setUpdate_time(now); + materialbaseMapper.insert(entity); + } + + @Override + public void update(Materialbase entity) { + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String currentUserId = SecurityUtils.getCurrentUserId(); + entity.setUpdate_optname(nickName); + entity.setUpdate_time(now); + entity.setUpdate_optid(Long.getLong(currentUserId)); + materialbaseMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + materialbaseMapper.deleteBatchIds(ids); + } + + @Override + public JSONArray getBoxIvt() { + List list = materialbaseMapper.selectList(null); + if (list != null){ + ObjectMapper objectMapper = new ObjectMapper(); + String value = null; + try { + value = objectMapper.writeValueAsString(list); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return JSON.parseArray(value); + } + return null; + } + + @Override + public Materialbase findByCode(String code) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper().eq(Materialbase::getMaterial_code, code); + return materialbaseMapper.selectOne(wrapper); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/agv/ndctwo/AgvNdcTwoDeviceDriver.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/agv/ndctwo/AgvNdcTwoDeviceDriver.java index 8052ea6..25ee36a 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/agv/ndctwo/AgvNdcTwoDeviceDriver.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/agv/ndctwo/AgvNdcTwoDeviceDriver.java @@ -15,15 +15,8 @@ import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.FeedLmsRealFailed; import org.nl.acs.device_driver.agv.utils.TwoAgvPhase; -import org.nl.acs.device_driver.conveyor.standard_inspect_site.StandardInspectSiteDeviceDriver; import org.nl.acs.device_driver.conveyor.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; -import org.nl.acs.device_driver.paper_tube_pick_site.PaperTubePickSiteDeviceDriver; -import org.nl.acs.device_driver.storage.standard_storage.StandardStorageDeviceDriver; import org.nl.acs.device_driver.driver.AbstractDeviceDriver; -import org.nl.acs.device_driver.two_conveyor.hongxiang_conveyor.HongXiangStationDeviceDriver; -import org.nl.acs.device_driver.two_conveyor.manipulator_agv_station.ManipulatorAgvStationDeviceDriver; -import org.nl.acs.device_driver.two_conveyor.ranging_stations.RangingStationsDeviceDriver; -import org.nl.acs.device_driver.two_conveyor.waste_foil_weighing_station.WasteFoilWeighingStationDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; import org.nl.acs.history.ErrorUtil; @@ -41,14 +34,10 @@ import org.nl.acs.task.service.dto.TaskDto; import org.nl.acs.task.service.impl.TaskServiceImpl; import org.nl.config.lucene.service.LuceneExecuteLogService; import org.nl.config.lucene.service.dto.LuceneLogDto; -import org.nl.config.thread.ThreadPoolExecutorUtil; import org.nl.system.service.param.ISysParamService; import org.nl.config.SpringContextHolder; - -import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.Map; -import java.util.concurrent.ThreadPoolExecutor; + /** @@ -165,20 +154,7 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //普通站点 StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; - //货架 - StandardStorageDeviceDriver standardStorageDeviceDriver; - //纸管抓取位 - PaperTubePickSiteDeviceDriver paperTubePickSiteDeviceDriver; - //标准-光电检测 - StandardInspectSiteDeviceDriver standardInspectSiteDeviceDriver; - //烘箱对接位 - HongXiangStationDeviceDriver hongXiangStationDeviceDriver; - //行架-agv对接位 - ManipulatorAgvStationDeviceDriver manipulatorAgvStationDeviceDriver; - //行架-agv对接位 - RangingStationsDeviceDriver rangingStationsDeviceDriver; - //废箔称重位 - WasteFoilWeighingStationDriver wasteFoilWeighingStationDriver; + if (phase == 0x02) { if (ObjectUtil.isEmpty(inst)) { @@ -236,129 +212,8 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - if (ObjectUtil.isNotEmpty(device.getExtraValue().get("wait")) - && StrUtil.equals("true", device.getExtraValue().get("wait").toString()) - && StrUtil.equals(task.getTask_type(), "1")) { - if (standardOrdinarySiteDeviceDriver.getOption() == 1) { - String task_code = standardOrdinarySiteDeviceDriver.getTask_code(); - log.info("当前任务号{},创建任务号{}", task.getTask_code(), task_code); - if (StrUtil.isEmpty(task_code) || !task_code.equals(task.getTask_code())) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("任务号为空") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - log.info("等待LMS系统进行确认允许取货,设备号{},option值{}", standardOrdinarySiteDeviceDriver.getDevice_code(), standardOrdinarySiteDeviceDriver.getOption()); - logServer.deviceExecuteLog(this.device_code, "", "", "等待LMS系统进行确认允许取货,设备号" + device.getDevice_code() + ",指令号" + ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(standardOrdinarySiteDeviceDriver.getDevice_code()) - .content("等待LMS系统进行确认允许取货,设备号" + standardOrdinarySiteDeviceDriver.getDevice_code() + ",option当前值" + standardOrdinarySiteDeviceDriver.getOption()) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { - standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); - try { - standardInspectSiteDeviceDriver.writing(1); - } catch (Exception e) { - e.printStackTrace(); - } - if ((standardInspectSiteDeviceDriver.getMove() == 1 && standardInspectSiteDeviceDriver.getAction() == 1 - && standardInspectSiteDeviceDriver.getError() == 0)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + standardInspectSiteDeviceDriver.getMove() + ",动作信号:" + standardInspectSiteDeviceDriver.getAction() + "报警信号:" + standardInspectSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - try { - manipulatorAgvStationDeviceDriver.writing(2); - } catch (Exception e) { - e.printStackTrace(); - } - if ((manipulatorAgvStationDeviceDriver.getAction() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - log.info("设备{},动作信号{} ,不满足取货条件,指令号{}", manipulatorAgvStationDeviceDriver.getDeviceCode(), manipulatorAgvStationDeviceDriver.getAction(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDeviceCode()) - .content(manipulatorAgvStationDeviceDriver.getDevice_code() + "动作信号不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { - hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); - try { - hongXiangStationDeviceDriver.writing(1); - } catch (Exception e) { - e.printStackTrace(); - } - if (hongXiangStationDeviceDriver.getMove() > 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + hongXiangStationDeviceDriver.getMove() + "无货不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { - paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); - try { - paperTubePickSiteDeviceDriver.writing(2); - } catch (Exception e) { - e.printStackTrace(); - } - if (paperTubePickSiteDeviceDriver.getAction() == 1 - && paperTubePickSiteDeviceDriver.getError() == 0 && paperTubePickSiteDeviceDriver.getMode() == 2) { + //放货确认 + if (standardOrdinarySiteDeviceDriver.getOption() == 1) { data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); LuceneLogDto logDto = LuceneLogDto.builder() .device_code(this.getDeviceCode()) @@ -366,95 +221,13 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic .build(); logDto.setLog_level(4); luceneExecuteLogService.deviceExecuteLog(logDto); + standardOrdinarySiteDeviceDriver.setOption(0); } else { - message = "设备号:" + device_code + ",动作信号:" + paperTubePickSiteDeviceDriver.getAction() + "报警信号:" + paperTubePickSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - }/* else if (device.getDeviceDriver() instanceof RangingStationsDeviceDriver) { - rangingStationsDeviceDriver = (RangingStationsDeviceDriver) device.getDeviceDriver(); - ISysParamService paramService = SpringContextHolder.getBean(ISysParamService.class); - String device_code1 = device.getDevice_code(); - String length1 = rangingStationsDeviceDriver.getLength1(); - String length2 = rangingStationsDeviceDriver.getLength2(); - Float len1 = 0.0F; - Float len2 = 0.0F; - if (ObjectUtil.isNotEmpty(length1) && !"null".equals(length1) && ObjectUtil.isNotEmpty(length2) && !"null".equals(length2)) { - len1 = Float.parseFloat(length1); - len2 = Float.parseFloat(length2); - } - if (len1 * len2 < 0) { - if (ObjectUtil.isNotEmpty(device_code1) && (('A') == (device_code1.charAt(device_code1.length() - 1)))) { - String offSet_A = paramService.findByCode(AcsConfig.OFFSET_A).getValue(); - if (ObjectUtil.isNotEmpty(offSet_A) && !"null".equals(offSet_A)) { - Integer integer = Integer.valueOf(offSet_A); - len1 = len1 - integer; - } - } else if (ObjectUtil.isNotEmpty(device_code1) && (('B') == (device_code1.charAt(device_code1.length() - 1)))) { - String offSet_B = paramService.findByCode(AcsConfig.OFFSET_B).getValue(); - if (ObjectUtil.isNotEmpty(offSet_B) && !"null".equals(offSet_B)) { - Integer integer = Integer.valueOf(offSet_B); - len1 = integer + len1; - } - } else { - log.info("{}设备名不符合条件,指令号{}", device_code, ikey); - } - int roundedNumber = ObjectUtil.isNotEmpty(len1) ? NumberUtil.round(len1, 0).intValue() : 0; - if (roundedNumber == 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, roundedNumber); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (roundedNumber > -50 || roundedNumber < 50) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 1, roundedNumber); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (roundedNumber > 50 || roundedNumber < -50) { - log.info("设备{},偏移数据超出范围导致未反馈{},指令号{}", device_code, roundedNumber, ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content(device_code + "设备,偏移数据超出范围导致未反馈" + roundedNumber + "指令号" + ikey) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - log.info("设备{},偏移数据出错导致未反馈{},指令号{}", device_code, rangingStationsDeviceDriver.getLength1() + "," + rangingStationsDeviceDriver.getLength2(), ikey); - } - }*/ else if (device.getDeviceDriver() instanceof WasteFoilWeighingStationDriver) { - wasteFoilWeighingStationDriver = (WasteFoilWeighingStationDriver) device.getDeviceDriver(); - if (wasteFoilWeighingStationDriver.getMove() == 1 && wasteFoilWeighingStationDriver.getAction() == 1 - && wasteFoilWeighingStationDriver.getError() == 0 && wasteFoilWeighingStationDriver.getMode() == 2) { - try { - Map map = new LinkedHashMap<>(); - map.put("to_command", "2"); - wasteFoilWeighingStationDriver.writing(map); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - message = "设备号:" + device_code + "光电信号:" + wasteFoilWeighingStationDriver.getMove() + ",动作信号:" + wasteFoilWeighingStationDriver.getAction() + "报警信号:" + wasteFoilWeighingStationDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; + log.info("等待一体机进行放货确认,设备号{},option值{}", standardOrdinarySiteDeviceDriver.getDevice_code(), standardOrdinarySiteDeviceDriver.getOption()); + logServer.deviceExecuteLog(this.device_code, "", "", "等待一体机进行放货确认,设备号" + device.getDevice_code() + ",指令号" + ikey); LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) + .device_code(standardOrdinarySiteDeviceDriver.getDevice_code()) + .content("等待一体机进行放货确认,设备号" + standardOrdinarySiteDeviceDriver.getDevice_code() + ",option当前值" + standardOrdinarySiteDeviceDriver.getOption()) .build(); logDto.setLog_level(4); luceneExecuteLogService.deviceExecuteLog(logDto); @@ -522,169 +295,6 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - if (ObjectUtil.isNotEmpty(this.device.getExtraValue().get("wait")) - && StrUtil.equals("true", this.device.getExtraValue().get("wait").toString()) - && StrUtil.equals(task.getTask_type(), "1")) { - standardOrdinarySiteDeviceDriver.setOption(0); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - String task_code = inst.getTask_code(); - if (ObjectUtil.isNotEmpty(standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("feedbackToLms")) - && StrUtil.equals("true", standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("feedbackToLms").toString())) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("task_code", task_code); - LuceneLogDto logDto1 = LuceneLogDto.builder() - .device_code(standardOrdinarySiteDeviceDriver.getDevice_code()) - .content("取货完成反馈:" + jsonObject.toJSONString() + ";设备:" + standardOrdinarySiteDeviceDriver.getDeviceCode()) - .build(); - logDto1.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto1); - acsToWmsService.actionFinishRequest2(jsonObject); - } - this.setPhase(phase); - } else if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - try { - manipulatorAgvStationDeviceDriver.writing(3); - } catch (Exception e) { - e.printStackTrace(); - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - String task_code = inst.getTask_code(); - if (ObjectUtil.isNotEmpty(manipulatorAgvStationDeviceDriver.getDevice().getExtraValue().get("feedbackToLms")) - && StrUtil.equals("true", manipulatorAgvStationDeviceDriver.getDevice().getExtraValue().get("feedbackToLms").toString())) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("task_code", task_code); - LuceneLogDto logDto1 = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDevice_code()) - .content("取货完成反馈:" + jsonObject.toJSONString() + ";设备:" + manipulatorAgvStationDeviceDriver.getDeviceCode()) - .build(); - logDto1.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto1); - acsToWmsService.actionFinishRequest2(jsonObject); - } - } else if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { - hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); - try { - hongXiangStationDeviceDriver.writing(0); - } catch (Exception e) { - e.printStackTrace(); - } - if (hongXiangStationDeviceDriver.getMove() > 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + hongXiangStationDeviceDriver.getMove() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { - paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); - try { - paperTubePickSiteDeviceDriver.writing(3); - } catch (Exception e) { - e.printStackTrace(); - } - if (paperTubePickSiteDeviceDriver.getAction() == 1 - && paperTubePickSiteDeviceDriver.getError() == 0 && paperTubePickSiteDeviceDriver.getMode() == 2) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + paperTubePickSiteDeviceDriver.getAction() + "报警信号:" + paperTubePickSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { - standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); - - try { - standardInspectSiteDeviceDriver.writing(0); - } catch (Exception e) { - e.printStackTrace(); - } - if ((standardInspectSiteDeviceDriver.getMove() != 1 && standardInspectSiteDeviceDriver.getAction() == 1 && standardInspectSiteDeviceDriver.getError() == 0)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + standardInspectSiteDeviceDriver.getMove() + ",动作信号:" + standardInspectSiteDeviceDriver.getAction() + "报警信号:" + standardInspectSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof WasteFoilWeighingStationDriver) { - wasteFoilWeighingStationDriver = (WasteFoilWeighingStationDriver) device.getDeviceDriver(); - if (wasteFoilWeighingStationDriver.getMove() == 0 && wasteFoilWeighingStationDriver.getAction() == 1 - && wasteFoilWeighingStationDriver.getError() == 0 && wasteFoilWeighingStationDriver.getMode() == 2) { - try { - Map map = new LinkedHashMap<>(); - map.put("to_command", "3"); - wasteFoilWeighingStationDriver.writing(map); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - message = "设备号:" + device_code + "光电信号:" + wasteFoilWeighingStationDriver.getMove() + ",动作信号:" + wasteFoilWeighingStationDriver.getAction() + "报警信号:" + wasteFoilWeighingStationDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); LuceneLogDto logDto = LuceneLogDto.builder() .device_code(this.getDeviceCode()) @@ -692,10 +302,15 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic .build(); logDto.setLog_level(4); luceneExecuteLogService.deviceExecuteLog(logDto); + standardOrdinarySiteDeviceDriver.setAgvphase(phase); + standardOrdinarySiteDeviceDriver.setIndex(index); + standardOrdinarySiteDeviceDriver.setInst(inst); } } - //到达取货点(Itype=1、3,需要WCS反馈) - else if (phase == 0x08) { + + // 到达放货点 + //(Itype=1/2/3,需要WCS反馈) + else if (phase == 0x07) { if (agvaddr == 0) { agvaddr = agvaddr_copy; } @@ -709,8 +324,8 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic return; } if (agvaddr != 0) { - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); CommonFinalParam commonFinalParam = new CommonFinalParam(); + old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); if (StrUtil.contains(old_device_code, commonFinalParam.getBARRE())) { String[] point = old_device_code.split(commonFinalParam.getBARRE()); device_code = point[0]; @@ -722,6 +337,7 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic device_code = old_device_code; } } + device = deviceAppService.findDeviceByCode(device_code); if (ObjectUtil.isEmpty(device_code)) { log.info(agvaddr + "对应设备号为空!"); @@ -731,115 +347,10 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic log.info("未找到指令号{}对应的指令", ikey); return; } - if (ObjectUtil.isEmpty(inst.getCarno())) { - inst.setCarno(String.valueOf(carno)); - instructionService.update(inst); - } - - String agv_inst_type = inst.getAgv_inst_type(); if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - standardOrdinarySiteDeviceDriver.setAgvphase(phase); - if (ObjectUtil.isNotEmpty(standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait")) - && StrUtil.equals("true", standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait").toString())) { - if (standardOrdinarySiteDeviceDriver.getOption() == 1) { - standardOrdinarySiteDeviceDriver.setAgvphase(0); - String task_code = standardOrdinarySiteDeviceDriver.getTask_code(); - log.info("当前任务号{},创建任务号{}", task.getTask_code(), task_code); - if (StrUtil.isEmpty(task_code) || !task_code.equals(task.getTask_code())) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("任务号为空!") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - log.info("等待LMS系统进行确认允许取货,设备号{},option值{}", standardOrdinarySiteDeviceDriver.getDeviceCode(), standardOrdinarySiteDeviceDriver.getOption()); - message = "等待LMS系统进行确认允许取货,设备号:" + standardOrdinarySiteDeviceDriver.getDeviceCode() + ",option值:" + standardOrdinarySiteDeviceDriver.getOption(); - logServer.deviceExecuteLog(standardOrdinarySiteDeviceDriver.getDeviceCode(), "", "", "等待LMS系统进行确认允许取货,设备号" + device.getDevice_code()); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(standardOrdinarySiteDeviceDriver.getDeviceCode()) - .content(standardOrdinarySiteDeviceDriver.getDevice_code() + "option值不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - - try { - manipulatorAgvStationDeviceDriver.writing(2); - } catch (Exception e) { - e.printStackTrace(); - } - if ((manipulatorAgvStationDeviceDriver.getAction() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + manipulatorAgvStationDeviceDriver.getAction() + "报警信号:" + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDevice_code()) - .content(manipulatorAgvStationDeviceDriver.getDevice_code() + "动作信号不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { - paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); - try { - paperTubePickSiteDeviceDriver.writing(2); - } catch (Exception e) { - e.printStackTrace(); - } - if (paperTubePickSiteDeviceDriver.getAction() == 1 - && paperTubePickSiteDeviceDriver.getError() == 0 && paperTubePickSiteDeviceDriver.getMode() == 2) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + paperTubePickSiteDeviceDriver.getAction() + "报警信号:" + paperTubePickSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { - hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); - try { - hongXiangStationDeviceDriver.writing(1); - } catch (Exception e) { - e.printStackTrace(); - } - if (hongXiangStationDeviceDriver.getMove() > 0) { + //卸货确认 + if (standardOrdinarySiteDeviceDriver.getOption() == 2) { data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); LuceneLogDto logDto = LuceneLogDto.builder() .device_code(this.getDeviceCode()) @@ -847,102 +358,33 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic .build(); logDto.setLog_level(4); luceneExecuteLogService.deviceExecuteLog(logDto); + standardOrdinarySiteDeviceDriver.setOption(0); } else { - message = "设备号:" + device_code + "光电信号:" + hongXiangStationDeviceDriver.getMove() + ",指令号:" + ikey + "不满足取货条件"; + log.info("等待一体机进行卸货确认,设备号{},option值{}", standardOrdinarySiteDeviceDriver.getDevice_code(), standardOrdinarySiteDeviceDriver.getOption()); + logServer.deviceExecuteLog(this.device_code, "", "", "等待一体机进行卸货确认,设备号" + device.getDevice_code() + ",指令号" + ikey); LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) + .device_code(standardOrdinarySiteDeviceDriver.getDevice_code()) + .content("等待一体机进行卸货确认,设备号" + standardOrdinarySiteDeviceDriver.getDevice_code() + ",option当前值" + standardOrdinarySiteDeviceDriver.getOption()) .build(); logDto.setLog_level(4); luceneExecuteLogService.deviceExecuteLog(logDto); } - } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { - standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); - try { - standardInspectSiteDeviceDriver.writing(1); - } catch (Exception e) { - e.printStackTrace(); - } - if ((standardInspectSiteDeviceDriver.getMove() == 1 && standardInspectSiteDeviceDriver.getAction() == 1 && standardInspectSiteDeviceDriver.getError() == 0)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + standardInspectSiteDeviceDriver.getMove() + ",动作信号:" + standardInspectSiteDeviceDriver.getAction() + "报警信号:" + standardInspectSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - }/* else if (device.getDeviceDriver() instanceof RangingStationsDeviceDriver) { - rangingStationsDeviceDriver = (RangingStationsDeviceDriver) device.getDeviceDriver(); - ISysParamService paramService = SpringContextHolder.getBean(ISysParamService.class); - String device_code1 = device.getDevice_code(); - String length1 = rangingStationsDeviceDriver.getLength1(); - String length2 = rangingStationsDeviceDriver.getLength2(); - Float len1 = 0.0F; - Float len2 = 0.0F; - if (ObjectUtil.isNotEmpty(length1) && !"null".equals(length1) && ObjectUtil.isNotEmpty(length2) && !"null".equals(length2)) { - len1 = Float.parseFloat(length1); - len2 = Float.parseFloat(length2); - } - if (len1 * len2 < 1) { - if (ObjectUtil.isNotEmpty(device_code1) && device_code1.contains("A")) { - String offSet_A = paramService.findByCode(AcsConfig.OFFSET_A).getValue(); - if (ObjectUtil.isNotEmpty(offSet_A) && !"null".equals(offSet_A)) { - Integer integer = Integer.valueOf(offSet_A); - len1 = len1 - integer; - } - } else if (ObjectUtil.isNotEmpty(device_code1) && device_code1.contains("B")) { - String offSet_B = paramService.findByCode(AcsConfig.OFFSET_B).getValue(); - if (ObjectUtil.isNotEmpty(offSet_B) && !"null".equals(offSet_B)) { - Integer integer = Integer.valueOf(offSet_B); - len1 = integer + len1; - } - } else { - log.info("{}设备名不符合条件,指令号{}", device_code, ikey); - } - int roundedNumber = ObjectUtil.isNotEmpty(len1) ? NumberUtil.round(len1, 0).intValue() : 0; - if (roundedNumber == 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, roundedNumber); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (roundedNumber > -50 || roundedNumber < 50) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 1, roundedNumber); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (roundedNumber > 50 || roundedNumber < -50) { - log.info("设备{},偏移数据超出范围导致未反馈{},指令号{}", device_code, roundedNumber, ikey); - } - } else { - log.info("设备{},偏移数据出错导致未反馈{},指令号{}", device_code, rangingStationsDeviceDriver.getLength1() + "," + rangingStationsDeviceDriver.getLength2(), ikey); - } - }*/ else { + } else { data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) + .device_code(this.getDeviceCode()) .content("agvphase:" + phase + "反馈:" + data) .build(); logDto.setLog_level(4); luceneExecuteLogService.deviceExecuteLog(logDto); } + } + - } else if (phase == 0x4D) { + //放货完成 + //(Itype=1/2/3,需要WCS反馈) + else if (phase == 0x09) { if (agvaddr == 0) { agvaddr = agvaddr_copy; } @@ -979,1159 +421,26 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic log.info("未找到指令号{}对应的指令", ikey); return; } - - String start_device_code = inst.getStart_device_code(); - String next_device_code = inst.getNext_device_code(); - String start_device_code2 = inst.getStart_device_code2(); - String next_device_code2 = inst.getNext_device_code2(); - - if (ObjectUtil.isNotEmpty(start_device_code) && StrUtil.equals(device_code, start_device_code)) { - if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - - try { - manipulatorAgvStationDeviceDriver.writing(2); - } catch (Exception e) { - e.printStackTrace(); - } - if ((manipulatorAgvStationDeviceDriver.getAction() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + manipulatorAgvStationDeviceDriver.getAction() + "报警信号:" + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDeviceCode()) - .content(manipulatorAgvStationDeviceDriver.getDevice_code() + "动作信号不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } - } else if (ObjectUtil.isNotEmpty(start_device_code) && StrUtil.equals(device_code, next_device_code)) { - if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - - try { - manipulatorAgvStationDeviceDriver.writing(4); - } catch (Exception e) { - e.printStackTrace(); - } - if ((manipulatorAgvStationDeviceDriver.getAction() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + manipulatorAgvStationDeviceDriver.getAction() + "报警信号:" + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDeviceCode()) - .content(manipulatorAgvStationDeviceDriver.getDevice_code() + "动作信号不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } - } else if (ObjectUtil.isNotEmpty(start_device_code) && StrUtil.equals(device_code, start_device_code2)) { - if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - - try { - manipulatorAgvStationDeviceDriver.writing(4); - } catch (Exception e) { - e.printStackTrace(); - } - if ((manipulatorAgvStationDeviceDriver.getAction() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + manipulatorAgvStationDeviceDriver.getAction() + "报警信号:" + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(manipulatorAgvStationDeviceDriver.getDevice_code() + "动作信号不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } - } else if (ObjectUtil.isNotEmpty(start_device_code) && StrUtil.equals(device_code, next_device_code2)) { - if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - - try { - manipulatorAgvStationDeviceDriver.writing(2); - } catch (Exception e) { - e.printStackTrace(); - } - if ((manipulatorAgvStationDeviceDriver.getAction() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + manipulatorAgvStationDeviceDriver.getDevice_code() + ",动作信号:" + manipulatorAgvStationDeviceDriver.getAction() + "报警信号:" + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDeviceCode()) - .content(manipulatorAgvStationDeviceDriver.getDevice_code() + "动作信号不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); + LuceneLogDto logDto = LuceneLogDto.builder() + .device_code(this.getDeviceCode()) + .content("agvphase:" + phase + "反馈:" + data) + .build(); + logDto.setLog_level(4); + luceneExecuteLogService.deviceExecuteLog(logDto); + standardOrdinarySiteDeviceDriver.setAgvphase(phase); + standardOrdinarySiteDeviceDriver.setIndex(index); + standardOrdinarySiteDeviceDriver.setInst(inst); } -// else { -// data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); -// LuceneLogDto logDto = LuceneLogDto.builder() -// .device_code(this.getDeviceCode()) -// .content("agvphase:" + phase + "反馈:" + data) -// .build(); -// logDto.setLog_level(4); -// luceneExecuteLogService.deviceExecuteLog(logDto); -// } } - // 取货完毕 - //(Itype=1、3,需要WCS反馈) - else if (phase == 0x0A) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agv地址参数有误,phase:" + phase) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - return; - } - if (agvaddr != 0) { - CommonFinalParam commonFinalParam = new CommonFinalParam(); - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, commonFinalParam.getBARRE())) { - String[] point = old_device_code.split(commonFinalParam.getBARRE()); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, commonFinalParam.getPOINT())) { - 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 (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - return; - } - String agv_inst_type = inst.getAgv_inst_type(); - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - if (ObjectUtil.isNotEmpty(standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait")) - && StrUtil.equals("true", standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait").toString())) { - standardOrdinarySiteDeviceDriver.setOption(0); - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - standardOrdinarySiteDeviceDriver.setAgvphase(phase); - standardOrdinarySiteDeviceDriver.setIndex(index); - standardOrdinarySiteDeviceDriver.setInst(inst); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - String task_code = inst.getTask_code(); - if (ObjectUtil.isNotEmpty(standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("feedbackToLms")) - && StrUtil.equals("true", standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("feedbackToLms").toString())) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("task_code", task_code); - LuceneLogDto logDto1 = LuceneLogDto.builder() - .device_code(standardOrdinarySiteDeviceDriver.getDevice_code()) - .content("取货完成反馈:" + jsonObject.toJSONString() + ";设备:" + standardOrdinarySiteDeviceDriver.getDeviceCode()) - .build(); - logDto1.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto1); - acsToWmsService.actionFinishRequest2(jsonObject); - } - - } else if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { - hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); - try { - hongXiangStationDeviceDriver.writing(0); - } catch (Exception e) { - e.printStackTrace(); - } - if (hongXiangStationDeviceDriver.getMove() == 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + hongXiangStationDeviceDriver.getMove() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - try { - manipulatorAgvStationDeviceDriver.writing(3); - } catch (Exception e) { - e.printStackTrace(); - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - String task_code = inst.getTask_code(); - if (ObjectUtil.isNotEmpty(manipulatorAgvStationDeviceDriver.getDevice().getExtraValue().get("feedbackToLms")) - && StrUtil.equals("true", manipulatorAgvStationDeviceDriver.getDevice().getExtraValue().get("feedbackToLms").toString())) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("task_code", task_code); - LuceneLogDto logDto1 = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDevice_code()) - .content("取货完成反馈:" + jsonObject.toJSONString() + ";设备:" + manipulatorAgvStationDeviceDriver.getDeviceCode()) - .build(); - logDto1.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto1); - acsToWmsService.actionFinishRequest2(jsonObject); - } - } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { - paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); - try { - paperTubePickSiteDeviceDriver.writing(3); - } catch (Exception e) { - e.printStackTrace(); - } - if (paperTubePickSiteDeviceDriver.getAction() == 1 - && paperTubePickSiteDeviceDriver.getError() == 0 && paperTubePickSiteDeviceDriver.getMode() == 2) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + paperTubePickSiteDeviceDriver.getAction() + "报警信号:" + paperTubePickSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { - standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); - - try { - standardInspectSiteDeviceDriver.writing(1); - } catch (Exception e) { - e.printStackTrace(); - } - if ((standardInspectSiteDeviceDriver.getMove() == 1 && standardInspectSiteDeviceDriver.getAction() == 1 && standardInspectSiteDeviceDriver.getError() == 0)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + standardInspectSiteDeviceDriver.getMove() + ",动作信号:" + standardInspectSiteDeviceDriver.getAction() + "报警信号:" + standardInspectSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - - } - //(Itype=1,上传称重数据) - else if (phase == 0x64) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - return; - } - String instruction_type = inst.getInstruction_type(); - //上传称重数据 - if (StrUtil.equals(instruction_type, CommonFinalParam.ONE)) { - weight = agvaddr; - inst.setWeight(String.valueOf(weight)); - instructionService.update(inst); - - if (ObjectUtil.isNotEmpty(task)) { - logServer.deviceExecuteLog(this.device_code, "", "", "上报满卷重量,weight:" + weight); - message = "上报满卷重量,weight:" + weight + ",指令号:" + ikey; - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - task.setWeight(String.valueOf(weight)); - task.setCarno(this.device_code); - taskService.update(task); - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } - // 到达放货点 - //(Itype=1/2/3,需要WCS反馈) - else if (phase == 0x0C) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agv地址参数有误,phase:" + phase) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - return; - } - if (agvaddr != 0) { - CommonFinalParam commonFinalParam = new CommonFinalParam(); - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, commonFinalParam.getBARRE())) { - String[] point = old_device_code.split(commonFinalParam.getBARRE()); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, commonFinalParam.getPOINT())) { - 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 (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - return; - } - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - standardOrdinarySiteDeviceDriver.setAgvphase(phase); - standardOrdinarySiteDeviceDriver.setIndex(index); - standardOrdinarySiteDeviceDriver.setInst(inst); - - } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { - paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); - try { - paperTubePickSiteDeviceDriver.writing(4); - } catch (Exception e) { - e.printStackTrace(); - } - if (paperTubePickSiteDeviceDriver.getAction() == 1 - && paperTubePickSiteDeviceDriver.getError() == 0 && paperTubePickSiteDeviceDriver.getMode() == 2) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + paperTubePickSiteDeviceDriver.getAction() + "报警信号:" + paperTubePickSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},设备状态{},不满足放货条件,指令号{}", device_code, paperTubePickSiteDeviceDriver.getMove(), paperTubePickSiteDeviceDriver.getAction() - , paperTubePickSiteDeviceDriver.getError(), paperTubePickSiteDeviceDriver.getMode(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - - try { - manipulatorAgvStationDeviceDriver.writing(4); - } catch (Exception e) { - e.printStackTrace(); - } - if ((manipulatorAgvStationDeviceDriver.getAction() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + manipulatorAgvStationDeviceDriver.getAction() + "报警信号:" + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{},动作信号{} ,不满足取货条件,指令号{}", device_code, manipulatorAgvStationDeviceDriver.getAction(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDeviceCode()) - .content(manipulatorAgvStationDeviceDriver.getDevice_code() + "动作信号不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { - hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); - try { - hongXiangStationDeviceDriver.writing(1); - } catch (Exception e) { - e.printStackTrace(); - } - if (hongXiangStationDeviceDriver.getMove() == 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + hongXiangStationDeviceDriver.getMove() + ",动作信号:" + hongXiangStationDeviceDriver.getAction() + "报警信号:" + hongXiangStationDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},不满足取货条件,指令号{}", device_code, hongXiangStationDeviceDriver.getMove(), hongXiangStationDeviceDriver.getAction() - , hongXiangStationDeviceDriver.getError(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { - standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); - standardInspectSiteDeviceDriver.writing(1); - if ((standardInspectSiteDeviceDriver.getMove() == 0 && standardInspectSiteDeviceDriver.getAction() == 1 && standardInspectSiteDeviceDriver.getError() == 0)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + standardInspectSiteDeviceDriver.getMove() + ",动作信号:" + standardInspectSiteDeviceDriver.getAction() + "报警信号:" + standardInspectSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足放货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,报警信号{},不满足放货条件,指令号{}", device_code, standardInspectSiteDeviceDriver.getMove(), standardInspectSiteDeviceDriver.getAction() - , standardInspectSiteDeviceDriver.getError(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - }/* else if (device.getDeviceDriver() instanceof RangingStationsDeviceDriver) { - rangingStationsDeviceDriver = (RangingStationsDeviceDriver) device.getDeviceDriver(); - ISysParamService paramService = SpringContextHolder.getBean(ISysParamService.class); - String device_code1 = device.getDevice_code(); - String length1 = rangingStationsDeviceDriver.getLength1(); - String length2 = rangingStationsDeviceDriver.getLength2(); - Float len1 = 0.0F; - Float len2 = 0.0F; - if (ObjectUtil.isNotEmpty(length1) && !"null".equals(length1) && ObjectUtil.isNotEmpty(length2) && !"null".equals(length2)) { - len1 = Float.parseFloat(length1); - len2 = Float.parseFloat(length2); - } - if (len1 * len2 < 1) { - if (ObjectUtil.isNotEmpty(device_code1) && device_code1.contains("A")) { - String offSet_A = paramService.findByCode(AcsConfig.OFFSET_A).getValue(); - if (ObjectUtil.isNotEmpty(offSet_A) && !"null".equals(offSet_A)) { - Integer integer = Integer.valueOf(offSet_A); - len1 = len1 - integer; - } - } else if (ObjectUtil.isNotEmpty(device_code1) && device_code1.contains("B")) { - String offSet_B = paramService.findByCode(AcsConfig.OFFSET_B).getValue(); - if (ObjectUtil.isNotEmpty(offSet_B) && !"null".equals(offSet_B)) { - Integer integer = Integer.valueOf(offSet_B); - len1 = integer + len1; - } - } else { - log.info("{}设备名不符合条件,指令号{}", device_code, ikey); - } - int roundedNumber = ObjectUtil.isNotEmpty(len1) ? NumberUtil.round(len1, 0).intValue() : 0; - if (roundedNumber == 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, roundedNumber); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (roundedNumber > -50 || roundedNumber < 50) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 1, roundedNumber); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (roundedNumber > 50 || roundedNumber < -50) { - log.info("设备{},偏移数据超出范围导致未反馈{},指令号{}", device_code, roundedNumber, ikey); - } - } else { - log.info("设备{},偏移数据出错导致未反馈{},指令号{}", device_code, rangingStationsDeviceDriver.getLength1() + "," + rangingStationsDeviceDriver.getLength2(), ikey); - } - }*/ else if (device.getDeviceDriver() instanceof WasteFoilWeighingStationDriver) { - wasteFoilWeighingStationDriver = (WasteFoilWeighingStationDriver) device.getDeviceDriver(); - if (wasteFoilWeighingStationDriver.getMove() == 0 && wasteFoilWeighingStationDriver.getAction() == 1 - && wasteFoilWeighingStationDriver.getError() == 0 && wasteFoilWeighingStationDriver.getMode() == 2) { - try { - Map map = new LinkedHashMap<>(); - map.put("to_command", "4"); - wasteFoilWeighingStationDriver.writing(map); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - message = "设备号:" + device_code + "光电信号:" + wasteFoilWeighingStationDriver.getMove() + ",动作信号:" + wasteFoilWeighingStationDriver.getAction() + "报警信号:" + wasteFoilWeighingStationDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},设备状态{},不满足取货条件,指令号{}", device_code, wasteFoilWeighingStationDriver.getMove(), wasteFoilWeighingStationDriver.getAction() - , wasteFoilWeighingStationDriver.getError(), wasteFoilWeighingStationDriver.getMode(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } - //放货完成 - //(Itype=1/2/3,需要WCS反馈) - else if (phase == 0x0E) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agv地址参数有误,phase:" + phase) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - return; - } - if (agvaddr != 0) { - CommonFinalParam commonFinalParam = new CommonFinalParam(); - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, commonFinalParam.getBARRE())) { - String[] point = old_device_code.split(commonFinalParam.getBARRE()); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, commonFinalParam.getPOINT())) { - 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 (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - return; - } - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { -// standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); -// if (ObjectUtil.isNotEmpty(standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait")) -// && StrUtil.equals("true", standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait").toString()) -// && StrUtil.equals(task.getTask_type(), "1")) { -// // -// if (standardOrdinarySiteDeviceDriver.getOption() == 2) { -// data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); -// standardOrdinarySiteDeviceDriver.setOption(0); -// } else { -// log.info("等待LMS系统进行确认离开,设备号{},指令号:{}", device_code, ikey); -// message = "等待LMS系统进行确认离开,设备号:" + device_code + ",指令号:" + ikey; -// } -// } else { -// data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); -// } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - this.setPhase(phase); - } else if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - - try { - manipulatorAgvStationDeviceDriver.writing(5); - } catch (Exception e) { - e.printStackTrace(); - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { - hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); - try { - hongXiangStationDeviceDriver.writing(0); - } catch (Exception e) { - e.printStackTrace(); - } - if (hongXiangStationDeviceDriver.getMove() > 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + hongXiangStationDeviceDriver.getMove() + ",动作信号:" + hongXiangStationDeviceDriver.getAction() + "报警信号:" + hongXiangStationDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},不满足放货完成反馈,指令号{}", device_code, hongXiangStationDeviceDriver.getMove(), hongXiangStationDeviceDriver.getAction() - , hongXiangStationDeviceDriver.getError(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { - paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); - try { - TaskDto byTaskCode = taskService.findByTaskCode(inst.getTask_code()); - Map map = new HashMap(); - if (StrUtil.isNotEmpty(byTaskCode.getInteraction_json())) { - String interaction_json = byTaskCode.getInteraction_json(); - JSONObject jsonObject = JSONObject.parseObject(interaction_json); - String to_material = jsonObject.getString("to_material"); - String to_spec = jsonObject.getString("to_spec"); - String to_qty = jsonObject.getString("to_qty"); - map.put("to_command", 5); - map.put("to_material", to_material); - map.put("to_spec", to_spec); - map.put("to_qty", to_qty); - paperTubePickSiteDeviceDriver.writing(map); - } else { - map.put("to_command", 5); - paperTubePickSiteDeviceDriver.writing(map); - } - } catch (Exception e) { - e.printStackTrace(); - } - if (paperTubePickSiteDeviceDriver.getAction() == 1 - && paperTubePickSiteDeviceDriver.getError() == 0 && paperTubePickSiteDeviceDriver.getMode() == 2) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - paperTubePickSiteDeviceDriver.setFlag(3); - } else { - message = "设备号:" + device_code + ",动作信号:" + paperTubePickSiteDeviceDriver.getAction() + "报警信号:" + paperTubePickSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},设备状态{},不满足取货条件,指令号{}", device_code, paperTubePickSiteDeviceDriver.getMove(), paperTubePickSiteDeviceDriver.getAction() - , paperTubePickSiteDeviceDriver.getError(), paperTubePickSiteDeviceDriver.getMode(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { - standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) device.getDeviceDriver(); - standardInspectSiteDeviceDriver.writing(0); - if ((standardInspectSiteDeviceDriver.getMove() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof WasteFoilWeighingStationDriver) { - wasteFoilWeighingStationDriver = (WasteFoilWeighingStationDriver) device.getDeviceDriver(); - if (wasteFoilWeighingStationDriver.getMove() == 1 && wasteFoilWeighingStationDriver.getAction() == 1 - && wasteFoilWeighingStationDriver.getError() == 0 && wasteFoilWeighingStationDriver.getMode() == 2) { - try { - Map map = new LinkedHashMap<>(); - map.put("to_command", "5"); - wasteFoilWeighingStationDriver.writing(map); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - message = "设备号:" + device_code + "光电信号:" + wasteFoilWeighingStationDriver.getMove() + ",动作信号:" + wasteFoilWeighingStationDriver.getAction() + "报警信号:" + wasteFoilWeighingStationDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},设备状态{},不满足取货条件,指令号{}", device_code, wasteFoilWeighingStationDriver.getMove(), wasteFoilWeighingStationDriver.getAction() - , wasteFoilWeighingStationDriver.getError(), wasteFoilWeighingStationDriver.getMode(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } - //到达放货点 - //(Itype=1、3,需要WCS反馈) - else if (phase == 0x10) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agv地址参数有误,phase:" + phase) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - return; - } - if (agvaddr != 0) { - CommonFinalParam commonFinalParam = new CommonFinalParam(); - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, commonFinalParam.getBARRE())) { - String[] point = old_device_code.split(commonFinalParam.getBARRE()); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, commonFinalParam.getPOINT())) { - 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 (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - return; - } - String agv_inst_type = inst.getAgv_inst_type(); - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { -// standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); -// if (ObjectUtil.isNotEmpty(standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait")) -// && StrUtil.equals("true", standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait").toString()) -// && StrUtil.equals(task.getTask_type(), "1")) { -// // -// if (standardOrdinarySiteDeviceDriver.getOption() == 2) { -// data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); -// standardOrdinarySiteDeviceDriver.setOption(0); -// } else { -// log.info("等待LMS系统进行确认离开,设备号{},指令号:{}", device_code, ikey); -// message = "等待LMS系统进行确认离开,设备号:" + device_code + ",指令号:" + ikey; -// } -// } else { -// data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); -// } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - this.setPhase(phase); - - } else if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - - try { - manipulatorAgvStationDeviceDriver.writing(4); - } catch (Exception e) { - e.printStackTrace(); - } - if ((manipulatorAgvStationDeviceDriver.getAction() == 1)) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + ",动作信号:" + manipulatorAgvStationDeviceDriver.getAction() + "报警信号:" + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{},动作信号{} ,不满足取货条件,指令号{}", device_code, manipulatorAgvStationDeviceDriver.getAction(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(manipulatorAgvStationDeviceDriver.getDeviceCode()) - .content(manipulatorAgvStationDeviceDriver.getDevice_code() + "动作信号不为1") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { - hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); - try { - hongXiangStationDeviceDriver.writing(1); - } catch (Exception e) { - e.printStackTrace(); - } - if (hongXiangStationDeviceDriver.getMove() == 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + hongXiangStationDeviceDriver.getMove() + ",动作信号:" + hongXiangStationDeviceDriver.getAction() + "报警信号:" + hongXiangStationDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},不满足取货条件,指令号{}", device_code, hongXiangStationDeviceDriver.getMove(), hongXiangStationDeviceDriver.getAction() - , hongXiangStationDeviceDriver.getError(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { - paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); - try { - paperTubePickSiteDeviceDriver.writing(4); - } catch (Exception e) { - e.printStackTrace(); - } - if (paperTubePickSiteDeviceDriver.getAction() == 1 - && paperTubePickSiteDeviceDriver.getError() == 0 && paperTubePickSiteDeviceDriver.getMode() == 2) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + paperTubePickSiteDeviceDriver.getMove() + ",动作信号:" + paperTubePickSiteDeviceDriver.getAction() + "报警信号:" + paperTubePickSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},不满足取货条件,指令号{}", device_code, paperTubePickSiteDeviceDriver.getMove(), paperTubePickSiteDeviceDriver.getAction() - , paperTubePickSiteDeviceDriver.getError(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - }/* else if (device.getDeviceDriver() instanceof RangingStationsDeviceDriver) { - rangingStationsDeviceDriver = (RangingStationsDeviceDriver) device.getDeviceDriver(); - ISysParamService paramService = SpringContextHolder.getBean(ISysParamService.class); - String device_code1 = device.getDevice_code(); - String length1 = rangingStationsDeviceDriver.getLength1(); - String length2 = rangingStationsDeviceDriver.getLength2(); - Float len1 = 0.0F; - Float len2 = 0.0F; - if (ObjectUtil.isNotEmpty(length1) && !"null".equals(length1) && ObjectUtil.isNotEmpty(length2) && !"null".equals(length2)) { - len1 = Float.parseFloat(length1); - len2 = Float.parseFloat(length2); - } - if (len1 * len2 < 1) { - if (ObjectUtil.isNotEmpty(device_code1) && device_code1.contains("A")) { - String offSet_A = paramService.findByCode(AcsConfig.OFFSET_A).getValue(); - if (ObjectUtil.isNotEmpty(offSet_A) && !"null".equals(offSet_A)) { - Integer integer = Integer.valueOf(offSet_A); - len1 = len1 - integer; - } - } else if (ObjectUtil.isNotEmpty(device_code1) && device_code1.contains("B")) { - String offSet_B = paramService.findByCode(AcsConfig.OFFSET_B).getValue(); - if (ObjectUtil.isNotEmpty(offSet_B) && !"null".equals(offSet_B)) { - Integer integer = Integer.valueOf(offSet_B); - len1 = integer + len1; - } - } else { - log.info("{}设备名不符合条件,指令号{}", device_code, ikey); - } - int roundedNumber = ObjectUtil.isNotEmpty(len1) ? NumberUtil.round(len1, 0).intValue() : 0; - if (roundedNumber == 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, roundedNumber); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (roundedNumber > -50 || roundedNumber < 50) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 1, roundedNumber); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (roundedNumber > 50 || roundedNumber < -50) { - log.info("设备{},偏移数据超出范围导致未反馈{},指令号{}", device_code, roundedNumber, ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("设备" + device_code + "偏移数据超出范围导致未反馈" + roundedNumber + "指令号" + ikey) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - log.info("设备{},偏移数据出错导致未反馈{},指令号{}", device_code, rangingStationsDeviceDriver.getLength1() + "," + rangingStationsDeviceDriver.getLength2(), ikey); - } - }*/ else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } - //放货完成 - //(Itype=1、3,需要WCS反馈) - else if (phase == 0x12) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agv地址参数有误,phase:" + phase) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - return; - } - if (agvaddr != 0) { - CommonFinalParam commonFinalParam = new CommonFinalParam(); - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, commonFinalParam.getBARRE())) { - String[] point = old_device_code.split(commonFinalParam.getBARRE()); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, commonFinalParam.getPOINT())) { - 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 (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - return; - } - String agv_inst_type = inst.getAgv_inst_type(); - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { -// standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); -// if (ObjectUtil.isNotEmpty(standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait")) -// && StrUtil.equals("true", standardOrdinarySiteDeviceDriver.getDevice().getExtraValue().get("wait").toString()) -// && StrUtil.equals(task.getTask_type(), "1")) { -// // -// if (standardOrdinarySiteDeviceDriver.getOption() == 2) { -// data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); -// standardOrdinarySiteDeviceDriver.setOption(0); -// } else { -// log.info("等待LMS系统进行确认离开,设备号{},指令号:{}", device_code, ikey); -// message = "等待LMS系统进行确认离开,设备号:" + device_code + ",指令号:" + ikey; -// } -// } else { -// data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); -// } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - this.setPhase(phase); - - } else if (device.getDeviceDriver() instanceof ManipulatorAgvStationDeviceDriver) { - manipulatorAgvStationDeviceDriver = (ManipulatorAgvStationDeviceDriver) device.getDeviceDriver(); - try { - manipulatorAgvStationDeviceDriver.writing(5); - } catch (Exception e) { - e.printStackTrace(); - } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else if (device.getDeviceDriver() instanceof PaperTubePickSiteDeviceDriver) { - paperTubePickSiteDeviceDriver = (PaperTubePickSiteDeviceDriver) device.getDeviceDriver(); - try { - paperTubePickSiteDeviceDriver.writing(5); - } catch (Exception e) { - e.printStackTrace(); - } - if (paperTubePickSiteDeviceDriver.getAction() == 1 - && paperTubePickSiteDeviceDriver.getError() == 0 && paperTubePickSiteDeviceDriver.getMode() == 2) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + paperTubePickSiteDeviceDriver.getMove() + ",动作信号:" + paperTubePickSiteDeviceDriver.getAction() + "报警信号:" + paperTubePickSiteDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},不满足取货条件,指令号{}", device_code, paperTubePickSiteDeviceDriver.getMove(), paperTubePickSiteDeviceDriver.getAction() - , paperTubePickSiteDeviceDriver.getError(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else if (device.getDeviceDriver() instanceof HongXiangStationDeviceDriver) { - hongXiangStationDeviceDriver = (HongXiangStationDeviceDriver) device.getDeviceDriver(); - try { - hongXiangStationDeviceDriver.writing(0); - } catch (Exception e) { - e.printStackTrace(); - } - if (hongXiangStationDeviceDriver.getMove() > 0) { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } else { - message = "设备号:" + device_code + "光电信号:" + hongXiangStationDeviceDriver.getMove() + ",动作信号:" + hongXiangStationDeviceDriver.getAction() + "报警信号:" + hongXiangStationDeviceDriver.getError() + ",指令号:" + ikey + "不满足取货条件"; - log.info("设备{}当前光电信号{},动作信号{} ,错误信号{},不满足取货条件,指令号{}", device_code, hongXiangStationDeviceDriver.getMove(), hongXiangStationDeviceDriver.getAction() - , hongXiangStationDeviceDriver.getError(), ikey); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content(message) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } else { - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0, 0, 0); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) - .content("agvphase:" + phase + "反馈:" + data) - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); - } - } - //上传AGV电量 else if (phase == 0x70) { //x坐标 x = ikey; LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) + .device_code(device_code) .content("agvphase:" + phase + "x坐标:" + x) .build(); logDto.setLog_level(4); @@ -2140,7 +449,7 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //y坐标 y = ikey; LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) + .device_code(device_code) .content("agvphase:" + phase + "y坐标:" + y) .build(); logDto.setLog_level(4); @@ -2149,7 +458,7 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //车辆角度 angle = ikey; LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) + .device_code(device_code) .content("agvphase:" + phase + "车辆角度:" + angle) .build(); logDto.setLog_level(4); @@ -2158,7 +467,7 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //agv电量 electric_qty = ikey; LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) + .device_code(device_code) .content("agvphase:" + phase + "agv电量:" + electric_qty) .build(); logDto.setLog_level(4); @@ -2167,7 +476,7 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //三色灯状态 status = ikey; LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(this.getDeviceCode()) + .device_code(device_code) .content("agvphase:" + phase + "三色灯状态:" + status) .build(); logDto.setLog_level(4); @@ -2198,21 +507,9 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic last_status = status; } //进入区域(phase值) else if (phase == 0x50) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "自动门开门") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); } //离开区域(phase值) else if (phase == 0x51) { - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code(device_code) - .content("agvphase:" + phase + "自动门关门") - .build(); - logDto.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto); } //上报异常信息 //(不需要WCS反馈) @@ -2257,12 +554,6 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic .build(); logDto.setLog_level(4); luceneExecuteLogService.deviceExecuteLog(logDto); -// if (StrUtil.equals(inst.getAgv_system_type(), "2")) { -// TwoNDCSocketConnectionAutoRun.write(data); -// } -// else if (StrUtil.equals(inst.getAgv_system_type(), "3")) { -// TwoNDC2SocketConnectionAutoRun.write(data); -// } if (StrUtil.equals(inst.getAgv_system_type(), "2")) { TwoNDCSocketConnectionAutoRun.write(data); } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/ItemProtocol.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/ItemProtocol.java index cd262b0..0a86dff 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/ItemProtocol.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/ItemProtocol.java @@ -9,6 +9,7 @@ import java.util.List; @Slf4j public class ItemProtocol { + public static String item_mode = "mode"; public static String item_to_command = "to_command"; @@ -18,6 +19,10 @@ public class ItemProtocol { this.driver = driver; } + public int getMode() { + return this.getOpcIntegerValue(item_mode); + } + public int getToCommand() { return this.getOpcIntegerValue(item_to_command); } @@ -35,6 +40,7 @@ public class ItemProtocol { public static List getReadableItemDtos() { ArrayList list = new ArrayList(); + list.add(new ItemDto(item_mode, "模式", "08010")); return list; } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/LampThreecolorDefination.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/LampThreecolorDefination.java index 97cf318..cd793a6 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/LampThreecolorDefination.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/LampThreecolorDefination.java @@ -11,7 +11,7 @@ import java.util.LinkedList; import java.util.List; /** - * 标准版-三色灯 + * 标准版-报警灯 */ @Service public class LampThreecolorDefination implements OpcDeviceDriverDefination { @@ -22,12 +22,12 @@ public class LampThreecolorDefination implements OpcDeviceDriverDefination { @Override public String getDriverName() { - return "标准版-三色灯"; + return "标准版-报警灯"; } @Override public String getDriverDescription() { - return "标准版-三色灯"; + return "标准版-报警灯"; } @Override diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/LampThreecolorDeviceDriver.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/LampThreecolorDeviceDriver.java index a3e6013..0415a80 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/LampThreecolorDeviceDriver.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device_driver/two_conveyor/lamp_three_color/LampThreecolorDeviceDriver.java @@ -30,10 +30,10 @@ public class LampThreecolorDeviceDriver extends AbstractOpcDeviceDriver implemen DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); @Autowired LuceneExecuteLogService luceneExecuteLogService = SpringContextHolder.getBean(LuceneExecuteLogService.class); - String container; - String container_type_desc; - String last_container_type_desc; - String last_container; + int mode; + int to_command; + int last_mode; + int last_to_command; /** * 放货准备锁 */ @@ -43,16 +43,6 @@ public class LampThreecolorDeviceDriver extends AbstractOpcDeviceDriver implemen */ protected boolean has_goods_tag = false; String devicecode; - int mode = 0; - int action = 0; - int error = 0; - int move = 0; - int task = 0; - int last_action = 0; - int last_mode = 0; - int last_error = 0; - int last_move = 0; - int last_task = 0; boolean hasVehicle = false; boolean isReady = false; @@ -93,6 +83,10 @@ public class LampThreecolorDeviceDriver extends AbstractOpcDeviceDriver implemen public void execute() { String message = null; device_code = this.getDevice().getDevice_code(); + mode = this.itemProtocol.getOpcIntegerValue(ItemProtocol.item_mode); + to_command = this.itemProtocol.getOpcIntegerValue(ItemProtocol.item_to_command); + last_mode = mode; + last_to_command = to_command; } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/rest/AcsToSpxController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/rest/AcsToSpxController.java new file mode 100644 index 0000000..3b3794f --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/rest/AcsToSpxController.java @@ -0,0 +1,4 @@ +package org.nl.acs.ext.wms.rest; + +public class AcsToSpxController { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/rest/SpxToAcsController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/rest/SpxToAcsController.java new file mode 100644 index 0000000..02c63eb --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/rest/SpxToAcsController.java @@ -0,0 +1,31 @@ +package org.nl.acs.ext.wms.rest; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.ext.wms.service.SpxToAcsService; +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.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/spx") +@Slf4j +public class SpxToAcsController { + @Autowired + private SpxToAcsService spxToAcsService; + + @PostMapping("/task") + @Log(value = "ACS接收SPX任务") + @SaIgnore + public ResponseEntity createFromWms(@RequestBody String whereJson) { + return new ResponseEntity<>(spxToAcsService.crateTask(whereJson), HttpStatus.OK); + } + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/AcsToSpxService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/AcsToSpxService.java new file mode 100644 index 0000000..862b21a --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/AcsToSpxService.java @@ -0,0 +1,4 @@ +package org.nl.acs.ext.wms.service; + +public interface AcsToSpxService { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/SpxToAcsService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/SpxToAcsService.java new file mode 100644 index 0000000..00a221c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/SpxToAcsService.java @@ -0,0 +1,7 @@ +package org.nl.acs.ext.wms.service; + +import java.util.Map; + +public interface SpxToAcsService { + Map crateTask(String whereJson); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToSpxServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToSpxServiceImpl.java new file mode 100644 index 0000000..9de723e --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToSpxServiceImpl.java @@ -0,0 +1,4 @@ +package org.nl.acs.ext.wms.service.impl; + +public class AcsToSpxServiceImpl { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/SpxToAcsServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/SpxToAcsServiceImpl.java new file mode 100644 index 0000000..4863d42 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/SpxToAcsServiceImpl.java @@ -0,0 +1,149 @@ +package org.nl.acs.ext.wms.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.ext.wms.service.SpxToAcsService; +import org.nl.acs.order.mapper.OrderMapper; +import org.nl.acs.order.service.OrderDetailService; +import org.nl.acs.order.service.OrderService; +import org.nl.acs.order.service.dto.OrderDetailDto; +import org.nl.acs.order.service.dto.OrderDto; +import org.nl.acs.product.domain.Productdtl; +import org.nl.acs.product.service.IProductService; +import org.nl.acs.product.service.IProductdtlService; +import org.nl.acs.sch.task.service.ISchBaseTaskService; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SpxToAcsServiceImpl implements SpxToAcsService { + + @Autowired + private OrderMapper orderMapper; + + @Autowired + private ISchBaseTaskService schBaseTaskService; + + @Autowired + private OrderDetailService orderDetailService; + + + @Override + public Map crateTask(String whereJson) { + try { + JSONArray datas = JSONArray.parseArray(whereJson); + JSONArray errArr = new JSONArray(); + String currentNickName = SecurityUtils.getCurrentNickName(); + String currentTime = DateUtil.now(); + if (datas.size() > 0) { + for (int i = 0; i < datas.size(); i++) { + processSingleTask(datas.getJSONObject(i), errArr, currentNickName, currentTime); + } + } + return buildResultJson(errArr); + } catch (Exception e) { + // 记录异常日志 + log.error("创建工单时发生异常: ", e); + JSONObject resultJson = new JSONObject(); + resultJson.put("status", HttpStatus.BAD_REQUEST.value()); + resultJson.put("message", "操作失败"); + return resultJson; + } + } + + + private void processSingleTask(JSONObject jsonObject, JSONArray errArr, String currentNickName, String currentTime) { + String id = jsonObject.getString("ID"); + if (orderMapper.selectById(id) != null) { + JSONObject jo = new JSONObject(); + jo.put("ID", id); + jo.put("message", "已存在对应工单"); + errArr.add(jo); + return; + } + String productionNr = jsonObject.getString("ProductionNr"); + String recipeName = jsonObject.getString("RecipeName"); + String recipeCode = jsonObject.getString("RecipeCode"); + Float quantity = jsonObject.getFloatValue("Quantity"); + if (quantity == null) { + quantity = 0.0f; + } + Integer lineID = jsonObject.getIntValue("LineID"); + if (lineID == null) { + lineID = 0; + } + String startTime = jsonObject.getString("StartTime"); + JSONArray components = Optional.ofNullable(jsonObject.getJSONArray("Components")).orElse(new JSONArray()); + List list = new ArrayList<>(); + // 工单明细表插入 + for (int j = 0; j < components.size(); j++) { + JSONObject jo = components.getJSONObject(j); + String product_code = jo.getString("ComponentNr"); + String componentName = jo.getString("ComponentName"); + Float quantity1 = jo.getFloatValue("Quantity"); + if (quantity1 == null) { + quantity1 = 0.0f; + } + String unit = jo.getString("Unit"); + OrderDetailDto orderDetailDto = new OrderDetailDto(); + orderDetailDto.setMaterial_id(IdUtil.getSnowflake(1, 1).nextId() + "") + .setSeq_no(j + 1) + .setMaterial_code(product_code) + .setWorkorder_id(id) + .setMfg_order_name(productionNr) + .setMaterial_name(componentName) + .setBase_unit_id(unit) + .setProductin_qty(quantity1) + .setCreate_by(currentNickName) + .setCreate_time(currentTime); + list.add(orderDetailDto); + } + orderDetailService.saveBatch(list); + // 插入工单表 + OrderDto dto = new OrderDto(); + dto.setWorkorder_id(id) + .setResource_name(String.valueOf(lineID)) + .setMfg_order_name(productionNr) + .setProduct_name(recipeCode) + .setDescription(recipeName) + .setDetail_count(list.size()) + .setTotal_qty(quantity) + .setCreate_time(currentTime) + .setStatus("0") + .setRealstart_time(startTime) + .setCreate_name(currentNickName); + orderMapper.insert(dto); + } + + private JSONObject buildResultJson(JSONArray errArr) { + JSONObject resultJson = new JSONObject(); + if (ObjectUtil.isEmpty(errArr)) { + resultJson.put("status", HttpStatus.OK.value()); + resultJson.put("message", "操作成功"); + } else { + resultJson.put("status", HttpStatus.BAD_REQUEST.value()); + resultJson.put("message", "操作失败"); + if (ObjectUtil.isNotEmpty(errArr)) { + resultJson.put("errArr", errArr); + } + } + return resultJson; + } + + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index ee91a38..a90e6e9 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -385,7 +385,6 @@ public class InstructionServiceImpl extends CommonServiceImpl 0 && StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && dto.getAgv_system_type().equals(AgvSystemTypeEnum.Two_NDC_System_Type.getIndex())) { + if (shortPathsList.size() > 0 && StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE)) { // 0为输送、立库任务 1 1楼叉车系统 2 2楼1区域AGV系统 3 2楼2区域AGV系统 - if (!StrUtil.equals(task.getAgv_system_type(), "0") - && ObjectUtil.isNotEmpty(task.getAgv_system_type())) { - if (StrUtil.isBlank(dto.getAgv_inst_type())) { - String agv_system_type = task.getAgv_system_type(); - String task_type = task.getTask_type(); - if (!StrUtil.equals(agv_system_type, "1")) { - // task_type - //1、生箔; Itype=1:取空,取满,放空,放满; - //2、分切 Itype=3取满、取空、放满、放空; - //3、普通任务 Itype=2:取货、放货; - //4、叉车任务 - //5、输送任务 - //6、行架 - //7、立库 - if (StrUtil.equals(task_type, "1")) { - dto.setAgv_inst_type("1"); - } else if (StrUtil.equals(task_type, "3")) { - dto.setAgv_inst_type("2"); - } else if (StrUtil.equals(task_type, "2")) { - dto.setAgv_inst_type("3"); - } else if (StrUtil.equals(task_type, "8")) { - dto.setAgv_inst_type("2"); - } else { - log.info("未找到对应的AGV指令类型,任务号:" + task.getTask_code() + ",task_type:" + task.getTask_type()); - } - } else { - dto.setAgv_inst_type("4"); - } - dto.setAgv_system_type(task.getAgv_system_type()); + if (StrUtil.isBlank(dto.getAgv_inst_type())) { + String task_type = task.getTask_type(); + // task_type + //1、生箔; Itype=1:取空,取满,放空,放满; + //2、分切 Itype=3取满、取空、放满、放空; + //3、普通任务 Itype=2:取货、放货; + //4、叉车任务 + //5、输送任务 + //6、行架 + //7、立库 + if (StrUtil.equals(task_type, "1")) { + dto.setAgv_inst_type("1"); + } else if (StrUtil.equals(task_type, "3")) { + dto.setAgv_inst_type("2"); + } else if (StrUtil.equals(task_type, "2")) { + dto.setAgv_inst_type("3"); + } else if (StrUtil.equals(task_type, "8")) { + dto.setAgv_inst_type("2"); + } else { + log.info("未找到对应的AGV指令类型,任务号:" + task.getTask_code() + ",task_type:" + task.getTask_type()); + } + } + NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); + log.warn("下发AGV指令数据," + "指令号:" + dto.getInstruction_code() + ",AGV系统类型:" + dto.getAgv_system_type() + + ",AGV指令类型:" + dto.getInstruction_type()); + try { + if (StrUtil.isEmpty(dto.getAgv_inst_type()) || StrUtil.isEmpty(dto.getAgv_system_type())) { + log.info("sendAgvInstToNDC 指令校验:" + dto.getInstruction_code() + ",inst_type:" + dto.getInstruction_type() + + ",inst_system_type:" + dto.getAgv_system_type()); } - NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); - log.warn("下发AGV指令数据," + "指令号:" + dto.getInstruction_code() + ",AGV系统类型:" + dto.getAgv_system_type() - + ",AGV指令类型:" + dto.getInstruction_type()); - try { - if (StrUtil.isEmpty(dto.getAgv_inst_type()) || StrUtil.isEmpty(dto.getAgv_system_type())) { - log.info("sendAgvInstToNDC 指令校验:" + dto.getInstruction_code() + ",inst_type:" + dto.getInstruction_type() - + ",inst_system_type:" + dto.getAgv_system_type()); - } // log.info("2楼1区域AGV系统链接开始"); // String ip = paramService.findByCode(AcsConfig.AGVURL).getValue(); // int port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT).getValue()); @@ -527,57 +508,21 @@ public class InstructionServiceImpl extends CommonServiceImpl 0 && StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE)) { - Device deviceByCode = deviceAppService.findDeviceByCode(dto.getStart_device_code()); - - if (dto.getAgv_system_type().equals(AgvSystemTypeEnum.XG_System_Type.getIndex())) { - String interactionJson = task.getInteraction_json(); - if (StrUtil.isEmpty(interactionJson)) { - throw new BadRequestException("agv叉车调整长宽参数为空"); - } - InteractionJsonDTO interactionJsonDTO = JSON.parseObject(interactionJson, InteractionJsonDTO.class); - //仙工叉车 - HttpResponse response = xiangGongAgvService.sendOrderSequencesToForklift(dto, interactionJsonDTO); - if (ObjectUtils.isEmpty(response) || response.getStatus() != 200) { - dto.setSend_status("2"); - } else { - dto.setSend_status("1"); - } - } else if (dto.getAgv_system_type().equals(AgvSystemTypeEnum.One_NDC_System_Type.getIndex())) { - //一楼agv任务创建运单序列 - HttpResponse response = xiangGongAgvService.sendOrderSequencesToXZ(dto); - if (ObjectUtils.isEmpty(response) || response.getStatus() != 200) { - dto.setSend_status("2"); - } else { - dto.setSend_status("1"); - } + } catch (Exception e) { + dto.setSend_status("2"); + dto.setRemark(e.getMessage()); + e.printStackTrace(); + log.warn("下发AGV指令异常:" + e); + LuceneLogDto logDto1 = LuceneLogDto.builder() + .device_code(start_device_code) + .content("下发AGV指令异常") + .build(); + logDto1.setLog_level(4); + luceneExecuteLogService.deviceExecuteLog(logDto1); } } } catch (Exception e) { @@ -716,46 +661,22 @@ public class InstructionServiceImpl extends CommonServiceImpl 0 && StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE)) { - Device deviceByCode = deviceAppService.findDeviceByCode(dto.getStart_device_code()); - if (dto.getAgv_system_type().equals(AgvSystemTypeEnum.XG_System_Type.getIndex())) { - String interactionJson = task.getInteraction_json(); - if (StrUtil.isEmpty(interactionJson)) { - throw new BadRequestException("agv叉车调整长宽参数为空"); - } - InteractionJsonDTO interactionJsonDTO = JSON.parseObject(interactionJson, InteractionJsonDTO.class); - //仙工叉车 - HttpResponse response = xiangGongAgvService.sendOrderSequencesToForklift(dto, interactionJsonDTO); - if (ObjectUtils.isEmpty(response) || response.getStatus() != 200) { - dto.setSend_status("2"); - } else { - dto.setSend_status("1"); - } - } else if (dto.getAgv_system_type().equals(AgvSystemTypeEnum.One_NDC_System_Type.getIndex())) { - //一楼agv任务创建运单序列 - HttpResponse response = xiangGongAgvService.sendOrderSequencesToXZ(dto); - if (ObjectUtils.isEmpty(response) || response.getStatus() != 200) { - dto.setSend_status("2"); - } else { - dto.setSend_status("1"); - } - } else if (dto.getAgv_system_type().equals(AgvSystemTypeEnum.Two_NDC_System_Type.getIndex())) { - NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); - log.warn("下发AGV指令数据," + "指令号:" + dto.getInstruction_code() + ",AGV系统类型:" + dto.getAgv_system_type()); - try { - ndcAgvService.sendAgvInstToNDC(task.getAgv_system_type(), dto); - dto.setSend_status("1"); - } catch (Exception e) { - dto.setSend_status("2"); - dto.setRemark(e.getMessage()); - e.printStackTrace(); - log.warn("下发AGV指令异常:" + e); - LuceneLogDto logDto1 = LuceneLogDto.builder() - .device_code(start_device_code) - .content("下发AGV指令异常") - .build(); - logDto1.setLog_level(4); - luceneExecuteLogService.deviceExecuteLog(logDto1); - } + NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); + log.warn("下发AGV指令数据," + "指令号:" + dto.getInstruction_code() + ",AGV系统类型:" + dto.getAgv_system_type()); + try { + ndcAgvService.sendAgvInstToNDC(task.getAgv_system_type(), dto); + dto.setSend_status("1"); + } catch (Exception e) { + dto.setSend_status("2"); + dto.setRemark(e.getMessage()); + e.printStackTrace(); + log.warn("下发AGV指令异常:" + e); + LuceneLogDto logDto1 = LuceneLogDto.builder() + .device_code(start_device_code) + .content("下发AGV指令异常") + .build(); + logDto1.setLog_level(4); + luceneExecuteLogService.deviceExecuteLog(logDto1); } } } catch (Exception e) { diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/domain/Materialbase.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/domain/Materialbase.java index ddf6e1e..5255df8 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/domain/Materialbase.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/domain/Materialbase.java @@ -1,127 +1,127 @@ -package org.nl.acs.materialbase.domain; - -import org.nl.acs.common.base.CommonModel; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.IdType; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; - -import javax.validation.constraints.*; -import java.math.BigDecimal; -import java.io.Serializable; - -/** - * @author jiaolm - * @date 2023-05-09 - */ -@Data -@Builder -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -@TableName("acs_materialbase") -public class Materialbase extends CommonModel implements Serializable { - private static final long serialVersionUID = 1L; - - - @TableId(type = IdType.ASSIGN_ID) - private String material_id; - - - @NotBlank - private String material_code; - - - @NotBlank - private String material_name; - - - private String material_spec; - - - private String material_model; - - - @NotBlank - private String base_unit_id; - - - private String print_no; - - - private String len_unit_id; - - - private BigDecimal length; - - - private BigDecimal width; - - - private BigDecimal height; - - - private String weight_unit_id; - - - private BigDecimal gross_weight; - - - private BigDecimal net_weight; - - - private String cubage_unit_id; - - - private BigDecimal cubage; - - - private BigDecimal outer_diameter; - - - private BigDecimal wall_thickness; - - - @NotBlank - @TableField(fill = FieldFill.INSERT) - private String create_by; - - - @NotBlank - @TableField(fill = FieldFill.INSERT) - private String create_time; - - - @TableField(fill = FieldFill.INSERT_UPDATE) - private String update_by; - - - @TableField(fill = FieldFill.INSERT_UPDATE) - private String update_time; - - - private String is_used_time; - - - @NotBlank - private String is_used; - - - @NotBlank - private String is_delete; - - public void copyFrom(Materialbase source) { - BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); - } -} +//package org.nl.acs.materialbase.domain; +// +//import org.nl.acs.common.base.CommonModel; +//import com.baomidou.mybatisplus.annotation.TableName; +//import com.baomidou.mybatisplus.annotation.FieldFill; +//import com.baomidou.mybatisplus.annotation.TableField; +//import com.baomidou.mybatisplus.annotation.TableId; +//import com.baomidou.mybatisplus.annotation.IdType; +// +//import lombok.AllArgsConstructor; +//import lombok.Builder; +//import lombok.Data; +//import lombok.NoArgsConstructor; +//import lombok.EqualsAndHashCode; +//import lombok.experimental.Accessors; +//import cn.hutool.core.bean.BeanUtil; +//import cn.hutool.core.bean.copier.CopyOptions; +// +//import javax.validation.constraints.*; +//import java.math.BigDecimal; +//import java.io.Serializable; +// +///** +// * @author jiaolm +// * @date 2023-05-09 +// */ +//@Data +//@Builder +//@Accessors(chain = true) +//@NoArgsConstructor +//@AllArgsConstructor +//@EqualsAndHashCode(callSuper = false) +//@TableName("acs_materialbase") +//public class Materialbase extends CommonModel implements Serializable { +// private static final long serialVersionUID = 1L; +// +// +// @TableId(type = IdType.ASSIGN_ID) +// private String material_id; +// +// +// @NotBlank +// private String material_code; +// +// +// @NotBlank +// private String material_name; +// +// +// private String material_spec; +// +// +// private String material_model; +// +// +// @NotBlank +// private String base_unit_id; +// +// +// private String print_no; +// +// +// private String len_unit_id; +// +// +// private BigDecimal length; +// +// +// private BigDecimal width; +// +// +// private BigDecimal height; +// +// +// private String weight_unit_id; +// +// +// private BigDecimal gross_weight; +// +// +// private BigDecimal net_weight; +// +// +// private String cubage_unit_id; +// +// +// private BigDecimal cubage; +// +// +// private BigDecimal outer_diameter; +// +// +// private BigDecimal wall_thickness; +// +// +// @NotBlank +// @TableField(fill = FieldFill.INSERT) +// private String create_by; +// +// +// @NotBlank +// @TableField(fill = FieldFill.INSERT) +// private String create_time; +// +// +// @TableField(fill = FieldFill.INSERT_UPDATE) +// private String update_by; +// +// +// @TableField(fill = FieldFill.INSERT_UPDATE) +// private String update_time; +// +// +// private String is_used_time; +// +// +// @NotBlank +// private String is_used; +// +// +// @NotBlank +// private String is_delete; +// +// public void copyFrom(Materialbase source) { +// BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); +// } +//} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/rest/MaterialbaseController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/rest/MaterialbaseController.java index f5b7cdc..0fd7ccf 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/rest/MaterialbaseController.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/rest/MaterialbaseController.java @@ -1,94 +1,94 @@ -package org.nl.acs.materialbase.rest; - -import org.nl.common.logging.annotation.Log; -import org.nl.acs.materialbase.domain.Materialbase; -import org.nl.acs.materialbase.service.MaterialbaseService; -import org.nl.acs.materialbase.service.dto.MaterialbaseDto; -import org.nl.acs.materialbase.service.dto.MaterialbaseQueryParam; -import org.springframework.data.domain.Pageable; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - - -import java.util.Set; - -/** - * @author jiaolm - * @date 2023-05-09 - **/ -@RestController -@RequiredArgsConstructor - -@RequestMapping("/api/materialbase") -public class MaterialbaseController { - - private final MaterialbaseService materialbaseService; - - /** - * 查询物料基本信息 - * @param query - * @param pageable - * @return - */ - @GetMapping - @Log("查询物料基本信息") - - //@PreAuthorize("@el.check('materialbase:list')") - public ResponseEntity query(MaterialbaseQueryParam query, Pageable pageable) { - return new ResponseEntity<>(materialbaseService.queryAll(query, pageable), HttpStatus.OK); - } - - /** - * 新增物料基本信息 - * @param resources - * @return - */ - @PostMapping - @Log("新增物料基本信息") - - //@PreAuthorize("@el.check('materialbase:add')") - public ResponseEntity create(@Validated @RequestBody MaterialbaseDto resources) { - return new ResponseEntity<>(materialbaseService.insert(resources), HttpStatus.CREATED); - } - - /** - * 修改物料基本信息 - * @param resources - * @return - */ - @PutMapping - @Log("修改物料基本信息") - - //@PreAuthorize("@el.check('materialbase:edit')") - public ResponseEntity update(@Validated @RequestBody MaterialbaseDto resources) { - materialbaseService.updateById(resources); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - /** - * 删除物料基本信息 - * @param ids - * @return - */ - @DeleteMapping - @Log("删除物料基本信息") - - //@PreAuthorize("@el.check('materialbase:del')") - public ResponseEntity delete(@RequestBody Set ids) { - materialbaseService.removeByIds(ids); - return new ResponseEntity<>(HttpStatus.OK); - } - - /* - @Log("导出物料基本信息") - - @GetMapping(value = "/download") - //@PreAuthorize("@el.check('materialbase:list')") - public void download(HttpServletResponse response, MaterialbaseQueryParam query) throws IOException { - materialbaseService.download(materialbaseService.queryAll(query), response); - }*/ - -} +//package org.nl.acs.materialbase.rest; +// +//import org.nl.common.logging.annotation.Log; +//import org.nl.acs.materialbase.domain.Materialbase; +//import org.nl.acs.materialbase.service.MaterialbaseService; +//import org.nl.acs.materialbase.service.dto.MaterialbaseDto; +//import org.nl.acs.materialbase.service.dto.MaterialbaseQueryParam; +//import org.springframework.data.domain.Pageable; +//import lombok.RequiredArgsConstructor; +//import org.springframework.http.HttpStatus; +//import org.springframework.http.ResponseEntity; +//import org.springframework.validation.annotation.Validated; +//import org.springframework.web.bind.annotation.*; +// +// +//import java.util.Set; +// +///** +// * @author jiaolm +// * @date 2023-05-09 +// **/ +//@RestController +//@RequiredArgsConstructor +// +//@RequestMapping("/api/materialbase") +//public class MaterialbaseController { +// +// private final MaterialbaseService materialbaseService; +// +// /** +// * 查询物料基本信息 +// * @param query +// * @param pageable +// * @return +// */ +// @GetMapping +// @Log("查询物料基本信息") +// +// //@PreAuthorize("@el.check('materialbase:list')") +// public ResponseEntity query(MaterialbaseQueryParam query, Pageable pageable) { +// return new ResponseEntity<>(materialbaseService.queryAll(query, pageable), HttpStatus.OK); +// } +// +// /** +// * 新增物料基本信息 +// * @param resources +// * @return +// */ +// @PostMapping +// @Log("新增物料基本信息") +// +// //@PreAuthorize("@el.check('materialbase:add')") +// public ResponseEntity create(@Validated @RequestBody MaterialbaseDto resources) { +// return new ResponseEntity<>(materialbaseService.insert(resources), HttpStatus.CREATED); +// } +// +// /** +// * 修改物料基本信息 +// * @param resources +// * @return +// */ +// @PutMapping +// @Log("修改物料基本信息") +// +// //@PreAuthorize("@el.check('materialbase:edit')") +// public ResponseEntity update(@Validated @RequestBody MaterialbaseDto resources) { +// materialbaseService.updateById(resources); +// return new ResponseEntity<>(HttpStatus.NO_CONTENT); +// } +// +// /** +// * 删除物料基本信息 +// * @param ids +// * @return +// */ +// @DeleteMapping +// @Log("删除物料基本信息") +// +// //@PreAuthorize("@el.check('materialbase:del')") +// public ResponseEntity delete(@RequestBody Set ids) { +// materialbaseService.removeByIds(ids); +// return new ResponseEntity<>(HttpStatus.OK); +// } +// +// /* +// @Log("导出物料基本信息") +// +// @GetMapping(value = "/download") +// //@PreAuthorize("@el.check('materialbase:list')") +// public void download(HttpServletResponse response, MaterialbaseQueryParam query) throws IOException { +// materialbaseService.download(materialbaseService.queryAll(query), response); +// }*/ +// +//} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/MaterialbaseService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/MaterialbaseService.java index 1d5f43d..409a8dd 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/MaterialbaseService.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/MaterialbaseService.java @@ -1,89 +1,89 @@ -package org.nl.acs.materialbase.service; - -import org.nl.acs.common.base.PageInfo; -import org.nl.acs.common.base.CommonService; -import org.nl.acs.materialbase.domain.Materialbase; -import org.nl.acs.materialbase.service.dto.MaterialbaseDto; -import org.nl.acs.materialbase.service.dto.MaterialbaseQueryParam; -import org.springframework.data.domain.Pageable; - -import java.util.List; -import java.util.Set; - -/** - * @author jiaolm - * @date 2023-05-09 - */ -public interface MaterialbaseService extends CommonService { - - static final String CACHE_KEY = "materialbase"; - - /** - * 查询数据分页 - * - * @param query 条件 - * @param pageable 分页参数 - * @return PageInfo - */ - PageInfo queryAll(MaterialbaseQueryParam query, Pageable pageable); - - /** - * 查询所有数据不分页 - * - * @param query 条件参数 - * @return List - */ - List queryAll(MaterialbaseQueryParam query); - - /** - * 根据ID查询 - * - * @param id ID - * @return MaterialbaseDto - */ - Materialbase getById(String id); - - /** - * 根据ID查询 - * - * @param id ID - * @return MaterialbaseDto - */ - MaterialbaseDto findById(String id); - - /** - * 插入一条新数据。 - * @param resources - * @return - */ - int insert(MaterialbaseDto resources); - - /** - * 根据id修改 - * @param resources - * @return - */ - int updateById(MaterialbaseDto resources); - - /** - * 根据id删除 - * @param id - * @return - */ - int removeById(String id); - - /** - * 多选删除 - * @param ids - * @return - */ - int removeByIds(Set ids); - - /** - * 导出数据 - * @param all 待导出的数据 - * @param response / - * @throws IOException / - */ - // void download(List all, HttpServletResponse response) throws IOException; -} +//package org.nl.acs.materialbase.service; +// +//import org.nl.acs.common.base.PageInfo; +//import org.nl.acs.common.base.CommonService; +//import org.nl.acs.materialbase.domain.Materialbase; +//import org.nl.acs.materialbase.service.dto.MaterialbaseDto; +//import org.nl.acs.materialbase.service.dto.MaterialbaseQueryParam; +//import org.springframework.data.domain.Pageable; +// +//import java.util.List; +//import java.util.Set; +// +///** +// * @author jiaolm +// * @date 2023-05-09 +// */ +//public interface MaterialbaseService extends CommonService { +// +// static final String CACHE_KEY = "materialbase"; +// +// /** +// * 查询数据分页 +// * +// * @param query 条件 +// * @param pageable 分页参数 +// * @return PageInfo +// */ +// PageInfo queryAll(MaterialbaseQueryParam query, Pageable pageable); +// +// /** +// * 查询所有数据不分页 +// * +// * @param query 条件参数 +// * @return List +// */ +// List queryAll(MaterialbaseQueryParam query); +// +// /** +// * 根据ID查询 +// * +// * @param id ID +// * @return MaterialbaseDto +// */ +// Materialbase getById(String id); +// +// /** +// * 根据ID查询 +// * +// * @param id ID +// * @return MaterialbaseDto +// */ +// MaterialbaseDto findById(String id); +// +// /** +// * 插入一条新数据。 +// * @param resources +// * @return +// */ +// int insert(MaterialbaseDto resources); +// +// /** +// * 根据id修改 +// * @param resources +// * @return +// */ +// int updateById(MaterialbaseDto resources); +// +// /** +// * 根据id删除 +// * @param id +// * @return +// */ +// int removeById(String id); +// +// /** +// * 多选删除 +// * @param ids +// * @return +// */ +// int removeByIds(Set ids); +// +// /** +// * 导出数据 +// * @param all 待导出的数据 +// * @param response / +// * @throws IOException / +// */ +// // void download(List all, HttpServletResponse response) throws IOException; +//} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/dto/MaterialbaseDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/dto/MaterialbaseDto.java index 1884875..f8bea21 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/dto/MaterialbaseDto.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/dto/MaterialbaseDto.java @@ -1,104 +1,104 @@ -package org.nl.acs.materialbase.service.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; -import java.io.Serializable; -import java.util.Date; -import java.sql.Timestamp; - - - -/** - * @author jiaolm - * @date 2023-05-09 - */ -@Data -@Builder -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(callSuper = false) -public class MaterialbaseDto implements Serializable { - private static final long serialVersionUID = 1L; - - - private String material_id; - - - private String material_code; - - - private String material_name; - - - private String material_spec; - - - private String material_model; - - - private String base_unit_id; - - - private String print_no; - - - private String len_unit_id; - - - private BigDecimal length; - - - private BigDecimal width; - - - private BigDecimal height; - - - private String weight_unit_id; - - - private BigDecimal gross_weight; - - - private BigDecimal net_weight; - - - private String cubage_unit_id; - - - private BigDecimal cubage; - - - private BigDecimal outer_diameter; - - - private BigDecimal wall_thickness; - - - private String create_by; - - - private String create_time; - - - private String update_by; - - - private String update_time; - - - private String is_used_time; - - - private String is_used; - - - private String is_delete; -} +//package org.nl.acs.materialbase.service.dto; +// +//import lombok.AllArgsConstructor; +//import lombok.Builder; +//import lombok.Data; +//import lombok.NoArgsConstructor; +//import lombok.EqualsAndHashCode; +//import lombok.experimental.Accessors; +// +//import java.math.BigDecimal; +//import java.io.Serializable; +//import java.util.Date; +//import java.sql.Timestamp; +// +// +// +///** +// * @author jiaolm +// * @date 2023-05-09 +// */ +//@Data +//@Builder +//@Accessors(chain = true) +//@NoArgsConstructor +//@AllArgsConstructor +//@EqualsAndHashCode(callSuper = false) +//public class MaterialbaseDto implements Serializable { +// private static final long serialVersionUID = 1L; +// +// +// private String material_id; +// +// +// private String material_code; +// +// +// private String material_name; +// +// +// private String material_spec; +// +// +// private String material_model; +// +// +// private String base_unit_id; +// +// +// private String print_no; +// +// +// private String len_unit_id; +// +// +// private BigDecimal length; +// +// +// private BigDecimal width; +// +// +// private BigDecimal height; +// +// +// private String weight_unit_id; +// +// +// private BigDecimal gross_weight; +// +// +// private BigDecimal net_weight; +// +// +// private String cubage_unit_id; +// +// +// private BigDecimal cubage; +// +// +// private BigDecimal outer_diameter; +// +// +// private BigDecimal wall_thickness; +// +// +// private String create_by; +// +// +// private String create_time; +// +// +// private String update_by; +// +// +// private String update_time; +// +// +// private String is_used_time; +// +// +// private String is_used; +// +// +// private String is_delete; +//} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/dto/MaterialbaseQueryParam.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/dto/MaterialbaseQueryParam.java index e3eec01..ad3c6af 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/dto/MaterialbaseQueryParam.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/dto/MaterialbaseQueryParam.java @@ -1,20 +1,20 @@ -package org.nl.acs.materialbase.service.dto; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.Date; - -import org.nl.common.annotation.Query; -import org.springframework.format.annotation.DateTimeFormat; - -/** - * @author jiaolm - * @date 2023-05-09 - */ -@Getter -@Setter -public class MaterialbaseQueryParam { - -} +//package org.nl.acs.materialbase.service.dto; +// +//import lombok.Getter; +//import lombok.Setter; +// +//import java.util.List; +//import java.util.Date; +// +//import org.nl.common.annotation.Query; +//import org.springframework.format.annotation.DateTimeFormat; +// +///** +// * @author jiaolm +// * @date 2023-05-09 +// */ +//@Getter +//@Setter +//public class MaterialbaseQueryParam { +// +//} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/impl/MaterialbaseServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/impl/MaterialbaseServiceImpl.java index 1c76ee7..2186687 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/impl/MaterialbaseServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/impl/MaterialbaseServiceImpl.java @@ -1,133 +1,133 @@ -package org.nl.acs.materialbase.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import lombok.AllArgsConstructor; -import org.nl.acs.common.base.PageInfo; -import org.nl.acs.common.base.QueryHelpMybatisPlus; -import org.nl.acs.common.base.impl.CommonServiceImpl; -import org.nl.acs.utils.ConvertUtil; -import org.nl.acs.utils.PageUtil; -import org.nl.acs.materialbase.domain.Materialbase; -import org.nl.acs.materialbase.service.MaterialbaseService; -import org.nl.acs.materialbase.service.dto.MaterialbaseDto; -import org.nl.acs.materialbase.service.dto.MaterialbaseQueryParam; -import org.nl.acs.materialbase.service.mapper.MaterialbaseMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.data.domain.Pageable; - -import java.util.*; - -/** - * @author jiaolm - * @date 2023-05-09 - */ -@Service -@AllArgsConstructor -// @CacheConfig(cacheNames = MaterialbaseService.CACHE_KEY) -@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) -public class MaterialbaseServiceImpl extends CommonServiceImpl implements MaterialbaseService { - - private final MaterialbaseMapper materialbaseMapper; - - @Override - public PageInfo queryAll(MaterialbaseQueryParam query, Pageable pageable) { - IPage queryPage = PageUtil.toMybatisPage(pageable); - IPage page = materialbaseMapper.selectPage(queryPage, QueryHelpMybatisPlus.getPredicate(query)); - return ConvertUtil.convertPage(page, MaterialbaseDto.class); - } - - @Override - public List queryAll(MaterialbaseQueryParam query) { - return ConvertUtil.convertList(materialbaseMapper.selectList(QueryHelpMybatisPlus.getPredicate(query)), MaterialbaseDto.class); - } - - @Override - public Materialbase getById(String id) { - return materialbaseMapper.selectById(id); - } - - @Override - - public MaterialbaseDto findById(String id) { - return ConvertUtil.convert(getById(id), MaterialbaseDto.class); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public int insert(MaterialbaseDto resources) { - Materialbase entity = ConvertUtil.convert(resources, Materialbase.class); - return materialbaseMapper.insert(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public int updateById(MaterialbaseDto resources) { - Materialbase entity = ConvertUtil.convert(resources, Materialbase.class); - int ret = materialbaseMapper.updateById(entity); - // delCaches(resources.id); - return ret; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public int removeByIds(Set ids) { - // delCaches(ids); - return materialbaseMapper.deleteBatchIds(ids); - } - - @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 (MaterialbaseDto materialbase : all) { - Map map = new LinkedHashMap<>(); - map.put("物料编码", materialbase.getMaterialCode()); - map.put("物料名称 ", materialbase.getMaterialName()); - map.put("规格", materialbase.getMaterialSpec()); - map.put("型号", materialbase.getMaterialModel()); - map.put("基本计量单位", materialbase.getBaseUnitId()); - map.put("工程图号", materialbase.getPrintNo()); - map.put("长度单位", materialbase.getLenUnitId()); - map.put("物料长度", materialbase.getLength()); - map.put("物料宽度", materialbase.getWidth()); - map.put("物料高度", materialbase.getHeight()); - map.put("重量单位", materialbase.getWeightUnitId()); - map.put("物料毛重", materialbase.getGrossWeight()); - map.put("物料净重", materialbase.getNetWeight()); - map.put("体积单位", materialbase.getCubageUnitId()); - map.put("物料体积", materialbase.getCubage()); - map.put("外径", materialbase.getOuterDiameter()); - map.put("壁厚", materialbase.getWallThickness()); - map.put("创建者", materialbase.getCreateBy()); - map.put("创建时间", materialbase.getCreateTime()); - map.put("修改者", materialbase.getUpdateBy()); - map.put("修改时间", materialbase.getUpdateTime()); - map.put("启用时间", materialbase.getIsUsedTime()); - map.put("是否启用", materialbase.getIsUsed()); - map.put("是否删除", materialbase.getIsDelete()); - list.add(map); - } - FileUtil.downloadExcel(list, response); - }*/ -} +//package org.nl.acs.materialbase.service.impl; +// +//import com.baomidou.mybatisplus.core.metadata.IPage; +//import lombok.AllArgsConstructor; +//import org.nl.acs.common.base.PageInfo; +//import org.nl.acs.common.base.QueryHelpMybatisPlus; +//import org.nl.acs.common.base.impl.CommonServiceImpl; +//import org.nl.acs.utils.ConvertUtil; +//import org.nl.acs.utils.PageUtil; +//import org.nl.acs.materialbase.domain.Materialbase; +//import org.nl.acs.materialbase.service.MaterialbaseService; +//import org.nl.acs.materialbase.service.dto.MaterialbaseDto; +//import org.nl.acs.materialbase.service.dto.MaterialbaseQueryParam; +//import org.nl.acs.materialbase.service.mapper.MaterialbaseMapper; +//import org.springframework.stereotype.Service; +//import org.springframework.transaction.annotation.Propagation; +//import org.springframework.transaction.annotation.Transactional; +//import org.springframework.data.domain.Pageable; +// +//import java.util.*; +// +///** +// * @author jiaolm +// * @date 2023-05-09 +// */ +//@Service +//@AllArgsConstructor +//// @CacheConfig(cacheNames = MaterialbaseService.CACHE_KEY) +//@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) +//public class MaterialbaseServiceImpl extends CommonServiceImpl implements MaterialbaseService { +// +// private final MaterialbaseMapper materialbaseMapper; +// +// @Override +// public PageInfo queryAll(MaterialbaseQueryParam query, Pageable pageable) { +// IPage queryPage = PageUtil.toMybatisPage(pageable); +// IPage page = materialbaseMapper.selectPage(queryPage, QueryHelpMybatisPlus.getPredicate(query)); +// return ConvertUtil.convertPage(page, MaterialbaseDto.class); +// } +// +// @Override +// public List queryAll(MaterialbaseQueryParam query) { +// return ConvertUtil.convertList(materialbaseMapper.selectList(QueryHelpMybatisPlus.getPredicate(query)), MaterialbaseDto.class); +// } +// +// @Override +// public Materialbase getById(String id) { +// return materialbaseMapper.selectById(id); +// } +// +// @Override +// +// public MaterialbaseDto findById(String id) { +// return ConvertUtil.convert(getById(id), MaterialbaseDto.class); +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public int insert(MaterialbaseDto resources) { +// Materialbase entity = ConvertUtil.convert(resources, Materialbase.class); +// return materialbaseMapper.insert(entity); +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public int updateById(MaterialbaseDto resources) { +// Materialbase entity = ConvertUtil.convert(resources, Materialbase.class); +// int ret = materialbaseMapper.updateById(entity); +// // delCaches(resources.id); +// return ret; +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public int removeByIds(Set ids) { +// // delCaches(ids); +// return materialbaseMapper.deleteBatchIds(ids); +// } +// +// @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 (MaterialbaseDto materialbase : all) { +// Map map = new LinkedHashMap<>(); +// map.put("物料编码", materialbase.getMaterialCode()); +// map.put("物料名称 ", materialbase.getMaterialName()); +// map.put("规格", materialbase.getMaterialSpec()); +// map.put("型号", materialbase.getMaterialModel()); +// map.put("基本计量单位", materialbase.getBaseUnitId()); +// map.put("工程图号", materialbase.getPrintNo()); +// map.put("长度单位", materialbase.getLenUnitId()); +// map.put("物料长度", materialbase.getLength()); +// map.put("物料宽度", materialbase.getWidth()); +// map.put("物料高度", materialbase.getHeight()); +// map.put("重量单位", materialbase.getWeightUnitId()); +// map.put("物料毛重", materialbase.getGrossWeight()); +// map.put("物料净重", materialbase.getNetWeight()); +// map.put("体积单位", materialbase.getCubageUnitId()); +// map.put("物料体积", materialbase.getCubage()); +// map.put("外径", materialbase.getOuterDiameter()); +// map.put("壁厚", materialbase.getWallThickness()); +// map.put("创建者", materialbase.getCreateBy()); +// map.put("创建时间", materialbase.getCreateTime()); +// map.put("修改者", materialbase.getUpdateBy()); +// map.put("修改时间", materialbase.getUpdateTime()); +// map.put("启用时间", materialbase.getIsUsedTime()); +// map.put("是否启用", materialbase.getIsUsed()); +// map.put("是否删除", materialbase.getIsDelete()); +// list.add(map); +// } +// FileUtil.downloadExcel(list, response); +// }*/ +//} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/mapper/MaterialbaseMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/mapper/MaterialbaseMapper.java index 4793869..dfacf09 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/mapper/MaterialbaseMapper.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/materialbase/service/mapper/MaterialbaseMapper.java @@ -1,14 +1,14 @@ -package org.nl.acs.materialbase.service.mapper; - -import org.nl.acs.common.base.CommonMapper; -import org.nl.acs.materialbase.domain.Materialbase; -import org.springframework.stereotype.Repository; - -/** - * @author jiaolm - * @date 2023-05-09 - */ -@Repository -public interface MaterialbaseMapper extends CommonMapper { - -} +//package org.nl.acs.materialbase.service.mapper; +// +//import org.nl.acs.common.base.CommonMapper; +//import org.nl.acs.materialbase.domain.Materialbase; +//import org.springframework.stereotype.Repository; +// +///** +// * @author jiaolm +// * @date 2023-05-09 +// */ +//@Repository +//public interface MaterialbaseMapper extends CommonMapper { +// +//} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java index 5d41ea7..321da0e 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java @@ -25,6 +25,7 @@ import org.nl.acs.udw.UnifiedDataAccessor; import org.nl.acs.udw.UnifiedDataAccessorFactory; import org.nl.acs.udw.UnifiedDataAppService; import org.nl.common.enums.LogTypeEnum; +import org.nl.common.exception.BadRequestException; import org.nl.config.SpringContextHolder; import org.nl.config.lucene.service.LuceneExecuteLogService; import org.nl.config.lucene.service.dto.LuceneLogDto; @@ -351,6 +352,9 @@ public class DeviceOpcProtocolRunable implements Runnable, DataCallback, ServerC private static OpcUaClient createClient() throws Exception { ISysParamService paramService = SpringContextHolder.getBean(ISysParamService.class); String endPointUrl = paramService.findByCode(AcsConfig.OPCURL).getValue(); + if (StrUtil.isEmpty(endPointUrl)){ + throw new BadRequestException("opc地址未配置!"); + } //opc ua服务端地址 Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security"); Files.createDirectories(securityTempDir); diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/TestOpcUA.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/TestOpcUA.java index b6b72f0..223bea8 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/TestOpcUA.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/TestOpcUA.java @@ -1,6 +1,7 @@ package org.nl.acs.opc; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; import org.eclipse.milo.opcua.sdk.client.OpcUaClient; import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider; import org.eclipse.milo.opcua.sdk.client.api.subscriptions.UaSubscription; @@ -20,6 +21,7 @@ import org.eclipse.milo.opcua.stack.core.types.structured.MonitoredItemCreateReq import org.eclipse.milo.opcua.stack.core.types.structured.MonitoringParameters; import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId; import org.nl.acs.AcsConfig; +import org.nl.common.exception.BadRequestException; import org.nl.config.SpringContextHolder; import org.nl.system.service.param.ISysParamService; @@ -44,6 +46,9 @@ public class TestOpcUA { private static OpcUaClient createClient() throws Exception { ISysParamService paramService = SpringContextHolder.getBean(ISysParamService.class); String endPointUrl = paramService.findByCode(AcsConfig.OPCURL).getValue(); + if (StrUtil.isEmpty(endPointUrl)){ + throw new BadRequestException("opc地址未配置!"); + } //opc ua服务端地址 Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security"); diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderDetailMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderDetailMapper.java new file mode 100644 index 0000000..377a90a --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderDetailMapper.java @@ -0,0 +1,8 @@ +package org.nl.acs.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.acs.order.service.dto.OrderDetailDto; + + +public interface OrderDetailMapper extends BaseMapper { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderMapper.java new file mode 100644 index 0000000..a126fd0 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderMapper.java @@ -0,0 +1,20 @@ +package org.nl.acs.order.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.acs.common.base.CommonMapper; +import org.nl.acs.order.service.dto.OrderDto; +import org.nl.acs.order.service.dto.OrderQuery; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +@Repository +public interface OrderMapper extends CommonMapper { + + + List findList(Map whereJson, Pageable page); + + IPage selectPage(IPage pages, OrderQuery query); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderMapper.xml b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderMapper.xml new file mode 100644 index 0000000..e9bc9e4 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/mapper/OrderMapper.xml @@ -0,0 +1,43 @@ + + + + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/rest/OrderController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/rest/OrderController.java new file mode 100644 index 0000000..ff41e6e --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/rest/OrderController.java @@ -0,0 +1,96 @@ +package org.nl.acs.order.rest; + +import cn.hutool.core.map.MapUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.order.service.OrderService; +import org.nl.acs.order.service.dto.OrderDto; +import org.nl.acs.order.service.dto.OrderQuery; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/order") +@Slf4j +public class OrderController { + + private final OrderService orderService; + + @GetMapping + @Log("查询工序工单") + + //@SaCheckPermission("@el.check('rawfoilworkorder:list')") + public ResponseEntity query(@RequestParam Map whereJson,PageQuery page) { + String resource_name = MapUtil.getStr(whereJson, "resource_name"); + String status = MapUtil.getStr(whereJson, "status"); + String begin_time = MapUtil.getStr(whereJson, "begin_time"); + String end_time = MapUtil.getStr(whereJson, "end_time"); + OrderQuery query = new OrderQuery(); + query.setResource_name(resource_name); + query.setBegin_time(begin_time); + query.setEnd_time(end_time); + query.setStatus(status); + return new ResponseEntity<>(TableDataInfo.build(orderService.queryAll(query, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增工序工单") + + //@SaCheckPermission("@el.check('rawfoilworkorder:add')") + public ResponseEntity create(@Validated @RequestBody JSONObject whereJson) { + orderService.create(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改工序工单") + + //@SaCheckPermission("@el.check('rawfoilworkorder:edit')") + public ResponseEntity update(@Validated @RequestBody OrderDto dto) { + orderService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除工序工单") + + //@SaCheckPermission("@el.check('rawfoilworkorder:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + orderService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("强制完成") + + @PostMapping("/forceFinish") + public ResponseEntity forceFinish(@RequestBody JSONObject whereJson) { + orderService.forceFinish(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("开始") + + @PostMapping("/start") + public ResponseEntity start(@RequestBody JSONObject whereJson) { + orderService.start(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getOutBillDtl") + @Log("查询明细") + + public ResponseEntity getOutBillDtl(@RequestParam Map whereJson) { + return new ResponseEntity<>(orderService.getOutBillDtl(whereJson), HttpStatus.OK); + } + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/rest/OrderDetailController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/rest/OrderDetailController.java new file mode 100644 index 0000000..0a2ebca --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/rest/OrderDetailController.java @@ -0,0 +1,57 @@ +package org.nl.acs.order.rest; + +import org.nl.acs.order.service.OrderDetailService; +import org.nl.acs.order.service.dto.OrderDetailDto; +import org.nl.acs.order.service.dto.OrderDetailQuery; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; + +@RestController +@RequestMapping("/orderDetail") +public class OrderDetailController { + @Autowired + private OrderDetailService orderDetailService; + + @GetMapping + @Log("查询物料") + + //@PreAuthorize("@el.check('Materialbase:list')") + public ResponseEntity query(OrderDetailQuery whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(orderDetailService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增物料") + + //@PreAuthorize("@el.check('Materialbase:add')") + public ResponseEntity create(@Validated @RequestBody OrderDetailDto dto) { + orderDetailService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改物料") + + //@PreAuthorize("@el.check('Materialbase:edit')") + public ResponseEntity update(@Validated @RequestBody OrderDetailDto dto) { + orderDetailService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除物料") + + //@PreAuthorize("@el.check('Materialbase:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + orderDetailService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/OrderDetailService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/OrderDetailService.java new file mode 100644 index 0000000..791dbb6 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/OrderDetailService.java @@ -0,0 +1,37 @@ +package org.nl.acs.order.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.order.service.dto.OrderDetailDto; +import org.nl.acs.order.service.dto.OrderDetailQuery; +import org.nl.acs.product.domain.Productdtl; +import org.nl.acs.product.domain.ProductdtlQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.Set; + +public interface OrderDetailService extends IService { + + IPage queryAll(OrderDetailQuery whereJson, PageQuery page); + + /** + * 创建 + * + * @param entity / + */ + void create(OrderDetailDto entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(OrderDetailDto entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/OrderService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/OrderService.java new file mode 100644 index 0000000..2eeedac --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/OrderService.java @@ -0,0 +1,94 @@ +package org.nl.acs.order.service; + +import cn.hutool.json.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.acs.common.base.CommonService; +import org.nl.acs.order.service.dto.OrderDto; +import org.nl.acs.order.service.dto.OrderQuery; +import org.nl.common.domain.query.PageQuery; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +public interface OrderService extends CommonService { + + /** + * 查询数据分页 + * + * @param query 条件 + * @param pageable 分页参数 + * @return Map + */ + IPage queryAll(OrderQuery query, PageQuery pageable); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param workorder_id ID + * @return Rawfoilworkorder + */ + OrderDto findById(Long workorder_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Rawfoilworkorder + */ + OrderDto findByCode(String code); + + + /** + * 创建 + * + * @param whereJson / + */ + void create(JSONObject whereJson); + + /** + * 编辑 + * + * @param dto / + */ + void update(OrderDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 强制确认 + * + * @param whereJson / + */ + void forceFinish(JSONObject whereJson); + + /** + * 称重 + * + * @param whereJson / + */ + void start(JSONObject whereJson); + + /** + * 查询工单明细 + * + * @param whereJson / + * @return + */ + JSONArray getOutBillDtl(Map whereJson); + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDetailDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDetailDto.java new file mode 100644 index 0000000..59d679c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDetailDto.java @@ -0,0 +1,62 @@ +package org.nl.acs.order.service.dto; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("acs_orderdetail") +@ApiModel(value="Acs_orderdetail对象", description="工单明细表") +public class OrderDetailDto implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "物料标识") + @TableId + private String material_id; + + @ApiModelProperty(value = "工单标识") + private String workorder_id; + + @ApiModelProperty(value = "工单编码") + private String mfg_order_name; + + @ApiModelProperty(value = "明细序号") + private int seq_no; + + @ApiModelProperty(value = "物料编码") + private String material_code; + + @ApiModelProperty(value = "物料名称") + private String material_name; + + @ApiModelProperty(value = "物料重量") + private float productin_qty; + + @ApiModelProperty(value = "单位") + private String base_unit_id; + + @ApiModelProperty(value = "创建者") + private String create_by; + + @ApiModelProperty(value = "创建时间") + private String create_time; + + @ApiModelProperty(value = "修改者") + private String update_by; + + @ApiModelProperty(value = "修改时间") + private String update_time; + + /** + * 是否删除 + */ + private String is_delete; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDetailQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDetailQuery.java new file mode 100644 index 0000000..ef1a91c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDetailQuery.java @@ -0,0 +1,9 @@ +package org.nl.acs.order.service.dto; + +import lombok.Data; + +@Data +public class OrderDetailQuery { + private String blurry; + private String material_id; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDto.java new file mode 100644 index 0000000..704bbb4 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderDto.java @@ -0,0 +1,124 @@ +package org.nl.acs.order.service.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.*; +import lombok.experimental.Accessors; +import org.nl.acs.common.base.CommonModel; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@Builder +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = false) +@TableName("acs_workorder") +public class OrderDto extends CommonModel implements Serializable { + /** 工单标识 */ + /** + * 防止精度丢失 + */ + @TableId + private String workorder_id; + + + /** + * 机台编码 + */ + private String resource_name; + + /** + * 工单编号 + */ + private String mfg_order_name; + + /** + * 产品编码 + */ + private String product_name; + + /** + * 产品名称 + */ + private String description; + + + + /** + * 产品总重量 + */ + private float total_qty; + + /** + * 开始时间 + */ + private String realstart_time; + + /** + * 结束时间 + */ + private String realend_time; + + /** + * 状态 + */ + private String status; + + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String create_id; + + /** + * 创建人 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_optid; + + /** + * 修改人 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 是否删除 + */ + private String is_delete; + + + /** + * 点位编码 + */ + private String point_code; + + /** + * 明细数量 + */ + private int detail_count; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderQuery.java new file mode 100644 index 0000000..9e8dff1 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/dto/OrderQuery.java @@ -0,0 +1,17 @@ +package org.nl.acs.order.service.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OrderQuery implements Serializable { + private String status; + private String begin_time; + private String end_time; + private String resource_name; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/impl/OrderDetailServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/impl/OrderDetailServiceImpl.java new file mode 100644 index 0000000..e15f3db --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/impl/OrderDetailServiceImpl.java @@ -0,0 +1,37 @@ +package org.nl.acs.order.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.acs.order.mapper.OrderDetailMapper; +import org.nl.acs.order.service.OrderDetailService; +import org.nl.acs.order.service.dto.OrderDetailDto; +import org.nl.acs.order.service.dto.OrderDetailQuery; +import org.nl.acs.product.domain.Productdtl; +import org.nl.common.domain.query.PageQuery; +import org.springframework.stereotype.Service; + +import java.util.Set; + +@Service +public class OrderDetailServiceImpl extends ServiceImpl implements OrderDetailService { + + @Override + public IPage queryAll(OrderDetailQuery whereJson, PageQuery page) { + return null; + } + + @Override + public void create(OrderDetailDto entity) { + + } + + @Override + public void update(OrderDetailDto entity) { + + } + + @Override + public void deleteAll(Set ids) { + + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/impl/OrderServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..846108d --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/order/service/impl/OrderServiceImpl.java @@ -0,0 +1,275 @@ +package org.nl.acs.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; +import org.nl.acs.common.base.impl.CommonServiceImpl; +import org.nl.acs.data.domain.Materialbase; +import org.nl.acs.data.service.IMaterialbaseService; +import org.nl.acs.order.mapper.OrderDetailMapper; +import org.nl.acs.order.mapper.OrderMapper; +import org.nl.acs.order.service.OrderService; +import org.nl.acs.order.service.dto.OrderDetailDto; +import org.nl.acs.order.service.dto.OrderDto; +import org.nl.acs.order.service.dto.OrderQuery; +import org.nl.acs.product.domain.Product; +import org.nl.acs.product.domain.Productdtl; +import org.nl.acs.sch.task.service.WorkService; +import org.nl.acs.sch.task.service.dao.Work; +import org.nl.acs.sch.task.service.dao.mapper.WorkMapper; +import org.nl.acs.task.domain.Task; +import org.nl.acs.utils.PageUtil; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@Slf4j +@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) +public class OrderServiceImpl extends CommonServiceImpl implements OrderService { + @Autowired + private OrderMapper orderMapper; + + @Autowired + private OrderDetailMapper orderDetailMapper; + + @Autowired + private WorkService workService; + + @Autowired + private IMaterialbaseService materialbaseService; + + + @Override + public IPage queryAll(OrderQuery query, PageQuery page) { + IPage pages = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page.getPage() + 1, page.getSize()); + pages = orderMapper.selectPage(pages, query); + return pages; + } + + @Override + public List queryAll(Map whereJson) { + List list = orderMapper.findList(whereJson, null); + if (CollUtil.isNotEmpty(list)) { + return list; + } + return null; + } + + @Override + public OrderDto findById(Long workorder_id) { + return orderMapper.selectById(workorder_id); + } + + + @Override + public OrderDto findByCode(String code) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(OrderDto::getMfg_order_name, code); + return orderMapper.selectOne(wrapper); + } + + @Override + public void create(JSONObject map) { + JSONArray rows = map.getJSONArray("tableData"); + map.remove("tableData"); + OrderDto orderDto = orderMapper.selectById(MapUtil.getStr(map, "workorder_id")); + if (orderDto != null) { + throw new BadRequestException("工单已存在!"); + } + OrderDto dto = new OrderDto(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + dto.setWorkorder_id(IdUtil.getSnowflake(1, 1).nextId() + ""); + dto.setMfg_order_name(CodeUtil.getNewCode("ORDER_NO")); + dto.setProduct_name(CodeUtil.getNewCode("PRODUCT_CODE")); + dto.setResource_name("A"); + //todo 后期确定名称需要修改 + dto.setDescription("1"); + dto.setStatus("0"); + dto.setCreate_name(nickName); + dto.setCreate_time(now); + dto.setDetail_count(rows.size()); + //处理工单明细 + float qtySum = this.insertDtlByRows(dto, rows); + dto.setTotal_qty(qtySum); + orderMapper.insert(dto); + } + + private float insertDtlByRows(OrderDto entity, JSONArray rows) { + float sum = 0; + for (int i = 0; i < rows.size(); i++) { + JSONObject json = rows.getJSONObject(i); + OrderDetailDto orderDetailDto = new OrderDetailDto(); + orderDetailDto.setMaterial_id(IdUtil.getSnowflake(1, 1).nextId() + "") + .setSeq_no(i) + .setMaterial_code(CodeUtil.getNewCode("MATERIAL_NO")) + .setWorkorder_id(entity.getWorkorder_id()) + .setMfg_order_name(entity.getMfg_order_name()) + .setMaterial_name(json.getString("material_name")) + .setBase_unit_id(json.getString("base_unit_id")) + .setProductin_qty(json.getFloatValue("qty")) + .setCreate_by(SecurityUtils.getCurrentNickName()) + .setCreate_time(DateUtil.now()) + .setUpdate_by(SecurityUtils.getCurrentNickName()) + .setUpdate_time(DateUtil.now()); + orderDetailMapper.insert(orderDetailDto); + String jsonString = json.getString("qty"); + float qty = Float.parseFloat(jsonString); + sum += qty; + } + return sum; + } + + @Override + public void update(OrderDto dto) { + OrderDto orderDto = orderMapper.selectById(dto.getWorkorder_id()); + if (orderDto == null) { + throw new BadRequestException("工单不存在!"); + } + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + orderMapper.updateById(dto); + } + + @Transactional + @Override + public void deleteAll(String[] ids) { + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + // 批量查询 + List orderDtos = orderMapper.selectBatchIds(Arrays.asList(ids)); + + if (CollUtil.isEmpty(orderDtos)) { + log.warn("未找到对应的工单,无需删除"); + return; + } + + // 批量查询 + List mfgOrderNames = orderDtos.stream().map(OrderDto::getMfg_order_name).collect(Collectors.toList()); + List orderDetailDtos = orderDetailMapper.selectList(new LambdaQueryWrapper().in(OrderDetailDto::getMfg_order_name, mfgOrderNames)); + + for (OrderDto dto : orderDtos) { + if (dto == null) { + log.warn("工单 {} 不存在", dto.getWorkorder_id()); + continue; + } + + dto.setIs_delete("1"); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + + for (OrderDetailDto orderDetailDto : orderDetailDtos) { + if (orderDetailDto.getMfg_order_name().equals(dto.getMfg_order_name())) { + orderDetailDto.setIs_delete("1"); + orderDetailDto.setUpdate_by(nickName); + orderDetailDto.setUpdate_time(now); + orderDetailMapper.updateById(orderDetailDto); + } + } + orderMapper.updateById(dto); + } + } + + @Override + public void forceFinish(JSONObject whereJson) { + String workorder_id = whereJson.getString("workorder_id"); + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + OrderDto orderDto = orderMapper.selectById(workorder_id); + orderDto.setStatus("2"); + orderDto.setRealend_time(DateUtil.now()); + orderDto.setUpdate_optid(currentUserId); + orderDto.setUpdate_optname(currentUsername); + orderDto.setUpdate_time(DateUtil.now()); + orderMapper.updateById(orderDto); + } + + @Override + public void start(JSONObject whereJson) { + String workorder_id = whereJson.getString("workorder_id"); + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + OrderDto orderDto = orderMapper.selectById(workorder_id); + orderDto.setStatus("1"); + orderDto.setRealstart_time(DateUtil.now()); + orderDto.setUpdate_optid(currentUserId); + orderDto.setUpdate_optname(currentUsername); + orderDto.setUpdate_time(DateUtil.now()); + //生成配料任务 + List list = orderDetailMapper.selectList(Wrappers.lambdaQuery(OrderDetailDto.class).eq(OrderDetailDto::getWorkorder_id, workorder_id)); + List works = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + OrderDetailDto orderDetailDto = list.get(i); + String material_code = orderDetailDto.getMaterial_code(); + Materialbase materialbase = materialbaseService.findByCode(material_code); + if (materialbase == null) { + throw new BadRequestException("不存在物料编码为" + material_code + "的物料!"); + } + int count = (int) Math.ceil((double) orderDetailDto.getProductin_qty() / materialbase.getQty()); + Work work = new Work(); + work.setWork_id(IdUtil.getSnowflake(1, 1).nextId() + "") + .setWork_code(CodeUtil.getNewCode("WORK_CODE")) + .setStatus("0") + .setSeq_no(orderDetailDto.getSeq_no()) + .setMfg_order_name(orderDetailDto.getMfg_order_name()) + .setMaterial_code(orderDetailDto.getMaterial_code()) + .setMaterial_name(orderDetailDto.getMaterial_name()) + .setResource_name(orderDto.getResource_name()) + .setRequire_num(count) + .setRemain_num(count) + .setQty(orderDetailDto.getProductin_qty()) + .setCreate_by(currentUsername) + .setCreate_time(DateUtil.now()) + .setUpdate_by(currentUsername) + .setUpdate_time(DateUtil.now()); + works.add(work); + } + workService.saveBatch(works); + orderMapper.updateById(orderDto); + } + + @Override + public cn.hutool.json.JSONArray getOutBillDtl(Map whereJson) { + List list = orderDetailMapper.selectList(Wrappers.lambdaQuery(OrderDetailDto.class).eq(OrderDetailDto::getWorkorder_id, whereJson.get("workorder_id"))); + if (list != null) { + return JSONUtil.parseArray(list); + } + return null; + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/controller/AcsPointController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/controller/AcsPointController.java new file mode 100644 index 0000000..4013e22 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/controller/AcsPointController.java @@ -0,0 +1,84 @@ +package org.nl.acs.point.controller; + + +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.point.domain.AcsPoint; +import org.nl.acs.point.domain.PointQuery; +import org.nl.acs.point.service.IAcsPointService; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; + +/** + *

+ * 点位基础表 前端控制器 + *

+ * + * @author tuqiang + * @since 2024-09-27 + */ +@RestController +@RequestMapping("/api/point") +public class AcsPointController { + @Autowired + private IAcsPointService pointService; + + @GetMapping + @Log("查询点位管理") + //@SaCheckPermission("@el.check('schBasePoint:list')") + public ResponseEntity query(PointQuery whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(pointService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增点位管理") + //@SaCheckPermission("@el.check('schBasePoint:add')") + public ResponseEntity create(@Validated @RequestBody AcsPoint entity) { + pointService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改点位管理") + //@SaCheckPermission("@el.check('schBasePoint:edit')") + public ResponseEntity update(@Validated @RequestBody AcsPoint entity) { + pointService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除点位管理") + //@SaCheckPermission("@el.check('schBasePoint:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + pointService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("启动与禁用") + @PostMapping("/changeUsed") + public ResponseEntity changeUsedOn(@RequestBody JSONObject jsonObject) { + pointService.changeUsed(jsonObject); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/getPointList") + @Log("获取区域下拉框") + //@SaCheckPermission("@el.check('schBaseRegion:list')") + public ResponseEntity getPointList(@RequestBody(required = false) AcsPoint region) { + return new ResponseEntity<>(pointService.getPointList(region), HttpStatus.OK); + } + + @Log("锁定与解锁") + @PostMapping("/changeLock") + public ResponseEntity changeLock(@RequestBody JSONObject points) { + pointService.changeLock(points); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/domain/AcsPoint.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/domain/AcsPoint.java new file mode 100644 index 0000000..5de827c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/domain/AcsPoint.java @@ -0,0 +1,66 @@ +package org.nl.acs.point.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import lombok.experimental.Accessors; + +/** + *

+ * 点位基础表 + *

+ * + * @author tuqiang + * @since 2024-09-27 + */ +@Data +@Builder +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("acs_point") +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value="AcsPoint对象", description="点位基础表") +public class AcsPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + private String point_code; + + @ApiModelProperty(value = "点位名称") + private String point_name; + + @ApiModelProperty(value = "点位状态") + private String point_status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "是否启用") + private Boolean is_used; + + @ApiModelProperty(value = "创建人") + private String create_id; + + @ApiModelProperty(value = "创建人") + private String create_name; + + @ApiModelProperty(value = "创建时间") + private String create_time; + + @ApiModelProperty(value = "修改人") + private String update_id; + + @ApiModelProperty(value = "修改人") + private String update_name; + + @ApiModelProperty(value = "修改时间") + private String update_time; + + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/domain/PointQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/domain/PointQuery.java new file mode 100644 index 0000000..9cc6afb --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/domain/PointQuery.java @@ -0,0 +1,12 @@ +package org.nl.acs.point.domain; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class PointQuery implements Serializable { + private String blurry; + private String point_status; + private Boolean is_used; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/mapper/AcsPointMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/mapper/AcsPointMapper.java new file mode 100644 index 0000000..3401fcc --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/mapper/AcsPointMapper.java @@ -0,0 +1,28 @@ +package org.nl.acs.point.mapper; + + +import org.nl.acs.point.domain.AcsPoint; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + *

+ * 点位基础表 Mapper 接口 + *

+ * + * @author tuqiang + * @since 2024-09-27 + */ +@Repository +public interface AcsPointMapper extends BaseMapper { + + /** + * 批量禁用启用 + * + * @param pointCodes + * @param used + */ + void batchChangeUsed(List pointCodes, Boolean used); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/mapper/AcsPointMapper.xml b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/mapper/AcsPointMapper.xml new file mode 100644 index 0000000..b774937 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/mapper/AcsPointMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + UPDATE acs_point + SET is_used = #{used} + + point_code IN + + #{code} + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/service/IAcsPointService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/service/IAcsPointService.java new file mode 100644 index 0000000..6c92d8c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/service/IAcsPointService.java @@ -0,0 +1,76 @@ +package org.nl.acs.point.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.acs.point.domain.AcsPoint; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.point.domain.PointQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.List; +import java.util.Set; + +/** + *

+ * 点位基础表 服务类 + *

+ * + * @author tuqiang + * @since 2024-09-27 + */ +public interface IAcsPointService extends IService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(PointQuery whereJson, PageQuery pageable); + + /** + * 创建 + * + * @param entity / + */ + void create(AcsPoint entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(AcsPoint entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + /** + * 改变启用状态 + * + * @param jsonObject + */ + void changeUsed(JSONObject jsonObject); + + /** + * 获取点位 + * + * @param region + * @return + */ + List getPointList(AcsPoint region); + + /** + * 解锁/上锁 + * + * @param points + */ + void changeLock(JSONObject points); + + AcsPoint findByCode(String code); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/service/impl/AcsPointServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/service/impl/AcsPointServiceImpl.java new file mode 100644 index 0000000..dc2f2ad --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/point/service/impl/AcsPointServiceImpl.java @@ -0,0 +1,132 @@ +package org.nl.acs.point.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.point.domain.AcsPoint; +import org.nl.acs.point.domain.PointQuery; +import org.nl.acs.point.mapper.AcsPointMapper; +import org.nl.acs.point.service.IAcsPointService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + *

+ * 点位基础表 服务实现类 + *

+ * + * @author tuqiang + * @since 2024-09-27 + */ +@Slf4j +@Service +public class AcsPointServiceImpl extends ServiceImpl implements IAcsPointService { + + @Autowired + private AcsPointMapper pointMapper; + + @Override + public IPage queryAll(PointQuery whereJson, PageQuery page) { + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + LambdaQueryWrapper acsPointLambdaQueryWrapper = Wrappers.lambdaQuery(AcsPoint.class); + acsPointLambdaQueryWrapper.eq(StrUtil.isNotEmpty(whereJson.getPoint_status()), AcsPoint::getPoint_status, whereJson.getPoint_status()); + acsPointLambdaQueryWrapper.eq(ObjectUtil.isNotNull(whereJson.getIs_used()), AcsPoint::getIs_used, whereJson.getIs_used()); + if (StrUtil.isNotEmpty(whereJson.getBlurry())) { + acsPointLambdaQueryWrapper.and(wrapper -> { + wrapper.like(StrUtil.isNotEmpty(whereJson.getBlurry()), AcsPoint::getPoint_code, whereJson.getBlurry()) + .or() + .like(StrUtil.isNotEmpty(whereJson.getBlurry()), AcsPoint::getPoint_name, whereJson.getBlurry()); + }); + } + pages = pointMapper.selectPage(pages, acsPointLambdaQueryWrapper); + return pages; + } + + @Override + public void create(AcsPoint entity) { + String point_code = entity.getPoint_code(); + AcsPoint pointObj = pointMapper.selectById(point_code); + if (ObjectUtil.isNotEmpty(pointObj) && !pointObj.getPoint_code().equals(entity.getPoint_code())) { + throw new BadRequestException("存在相同的点位编码"); + } + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + entity.setCreate_id(currentUserId); + entity.setCreate_name(nickName); + entity.setCreate_time(now); + entity.setUpdate_id(currentUserId); + entity.setUpdate_name(nickName); + entity.setUpdate_time(now); + pointMapper.insert(entity); + } + + @Override + public void update(AcsPoint entity) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setUpdate_id(currentUserId); + entity.setUpdate_name(nickName); + entity.setUpdate_time(now); + pointMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + pointMapper.deleteBatchIds(ids); + } + + @Override + public void changeUsed(JSONObject jsonObject) { + // 不可能为空 + JSONArray data = jsonObject.getJSONArray("data"); + Boolean used = jsonObject.getBoolean("used"); + Assert.notNull(data, "数据为空!"); + Assert.notNull(used, "数据为空!"); + List schBasePoints = JSONArray.parseArray(JSONArray.toJSONString(data), AcsPoint.class); + // 获取所有pointCode + List pointCodes = schBasePoints.stream() + .map(AcsPoint::getPoint_code) + .collect(Collectors.toList()); + pointMapper.batchChangeUsed(pointCodes, used); + } + + @Override + public List getPointList(AcsPoint region) { + if (ObjectUtil.isEmpty(region)) { + return this.list(); + } + return pointMapper.selectList(new LambdaQueryWrapper<>()); + } + + + @Override + public void changeLock(JSONObject points) { + } + + @Override + public AcsPoint findByCode(String code) { + return pointMapper.selectOne(new LambdaQueryWrapper().eq(AcsPoint::getPoint_code, code)); + } + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/controller/ProductController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/controller/ProductController.java new file mode 100644 index 0000000..e06a7ac --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/controller/ProductController.java @@ -0,0 +1,75 @@ +package org.nl.acs.product.controller; + + +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.point.domain.AcsPoint; +import org.nl.acs.point.domain.PointQuery; +import org.nl.acs.product.domain.Product; +import org.nl.acs.product.domain.ProductQuery; +import org.nl.acs.product.service.IProductService; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; + +/** + *

+ * 配方主表 前端控制器 + *

+ * + * @author tuqiang + * @since 2024-09-29 + */ +@RestController +@RequestMapping("/api/product") +public class ProductController { + + @Autowired + private IProductService productService; + + @GetMapping + @Log("查询配方管理") + //@SaCheckPermission("@el.check('schBasePoint:list')") + public ResponseEntity query(ProductQuery whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(productService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增配方管理") + //@SaCheckPermission("@el.check('schBasePoint:add')") + public ResponseEntity create(@Validated @RequestBody JSONObject whereJson) { + productService.create(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改配方管理") + //@SaCheckPermission("@el.check('schBasePoint:edit')") + public ResponseEntity update(@RequestBody JSONObject whereJson) { + productService.update(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除配方管理") + //@SaCheckPermission("@el.check('schBasePoint:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + productService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getOutBillDtl") + @Log("查询明细") + + public ResponseEntity getOutBillDtl(@RequestParam Map whereJson) { + return new ResponseEntity<>(productService.getOutBillDtl(whereJson), HttpStatus.OK); + } + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/controller/ProductdtlController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/controller/ProductdtlController.java new file mode 100644 index 0000000..651c1b9 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/controller/ProductdtlController.java @@ -0,0 +1,71 @@ +package org.nl.acs.product.controller; + + + +import org.nl.acs.product.domain.Productdtl; +import org.nl.acs.product.domain.ProductdtlQuery; +import org.nl.acs.product.service.IProductdtlService; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.logging.annotation.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; + +/** + *

+ * 配方明细表 前端控制器 + *

+ * + * @author tuqiang + * @since 2024-10-08 + */ +@RestController +@RequestMapping("/productdtl") +public class ProductdtlController { + + @Autowired + private IProductdtlService productdtlService; + + @GetMapping + @Log("查询物料") + + //@PreAuthorize("@el.check('Materialbase:list')") + public ResponseEntity query(ProductdtlQuery whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(productdtlService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增物料") + + //@PreAuthorize("@el.check('Materialbase:add')") + public ResponseEntity create(@Validated @RequestBody Productdtl dto) { + productdtlService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改物料") + + //@PreAuthorize("@el.check('Materialbase:edit')") + public ResponseEntity update(@Validated @RequestBody Productdtl dto) { + productdtlService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除物料") + + //@PreAuthorize("@el.check('Materialbase:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + productdtlService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/Product.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/Product.java new file mode 100644 index 0000000..cd6deed --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/Product.java @@ -0,0 +1,70 @@ +package org.nl.acs.product.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + *

+ * 配方主表 + *

+ * + * @author tuqiang + * @since 2024-09-29 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("product") +@ApiModel(value="Product对象", description="配方主表") +public class Product implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "产品标识") + @TableId + private String product_id; + + @ApiModelProperty(value = "产品编号") + private String product_code; + + @ApiModelProperty(value = "总重量") + private float total_qty; + + @ApiModelProperty(value = "明细数量") + private int detail_count; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建者") + private String create_by; + + @ApiModelProperty(value = "创建时间") + private String create_time; + + @ApiModelProperty(value = "修改者") + private String update_by; + + @ApiModelProperty(value = "修改时间") + private String update_time; + + @ApiModelProperty(value = "是否删除") + private String is_delete; + + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/ProductQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/ProductQuery.java new file mode 100644 index 0000000..344ce94 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/ProductQuery.java @@ -0,0 +1,10 @@ +package org.nl.acs.product.domain; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ProductQuery implements Serializable { + private String product_code; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/Productdtl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/Productdtl.java new file mode 100644 index 0000000..07ff2a8 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/Productdtl.java @@ -0,0 +1,69 @@ +package org.nl.acs.product.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 配方明细表 + *

+ * + * @author tuqiang + * @since 2024-09-29 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("productdtl") +@ApiModel(value="Productdtl对象", description="配方明细表") +public class Productdtl implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "产品明细标识") + @TableId + private String productdtl_id; + + @ApiModelProperty(value = "产品标识") + private String product_id; + + @ApiModelProperty(value = "明细序号") + private int seq_no; + + @ApiModelProperty(value = "物料标识") + private String material_id; + + @ApiModelProperty(value = "物料编码") + private String material_code; + + @ApiModelProperty(value = "物料占比") + private String material_proportion; + + @ApiModelProperty(value = "物料单桶重量") + private String productin_qty; + + @ApiModelProperty(value = "创建者") + private String create_by; + + @ApiModelProperty(value = "创建时间") + private String create_time; + + @ApiModelProperty(value = "修改者") + private String update_by; + + @ApiModelProperty(value = "修改时间") + private String update_time; + + @ApiModelProperty(value = "物料编码") + private String material_name; + + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/ProductdtlQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/ProductdtlQuery.java new file mode 100644 index 0000000..04695d4 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/domain/ProductdtlQuery.java @@ -0,0 +1,9 @@ +package org.nl.acs.product.domain; + +import lombok.Data; + +@Data +public class ProductdtlQuery { + private String blurry; + private String productdtl_id; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductMapper.java new file mode 100644 index 0000000..df23660 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductMapper.java @@ -0,0 +1,16 @@ +package org.nl.acs.product.mapper; + +import org.nl.acs.product.domain.Product; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 配方主表 Mapper 接口 + *

+ * + * @author tuqiang + * @since 2024-09-29 + */ +public interface ProductMapper extends BaseMapper { + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductMapper.xml b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductMapper.xml new file mode 100644 index 0000000..469f0b0 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductdtlMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductdtlMapper.java new file mode 100644 index 0000000..5b9163c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/mapper/ProductdtlMapper.java @@ -0,0 +1,16 @@ +package org.nl.acs.product.mapper; + +import org.nl.acs.product.domain.Productdtl; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 配方明细表 Mapper 接口 + *

+ * + * @author tuqiang + * @since 2024-10-08 + */ +public interface ProductdtlMapper extends BaseMapper { + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/IProductService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/IProductService.java new file mode 100644 index 0000000..01be8d7 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/IProductService.java @@ -0,0 +1,55 @@ +package org.nl.acs.product.service; + +import cn.hutool.json.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.acs.product.domain.Product; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.product.domain.ProductQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.Map; +import java.util.Set; + +/** + *

+ * 配方主表 服务类 + *

+ * + * @author tuqiang + * @since 2024-09-29 + */ +public interface IProductService extends IService { + + IPage queryAll(ProductQuery whereJson, PageQuery page); + + /** + * 创建 + * + * @param whereJson / + */ + void create(JSONObject whereJson); + + /** + * 编辑 + * + * @param whereJson / + */ + void update(JSONObject whereJson); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + + /** + * 查询配方明细 + * + * @param whereJson / + * @return + */ + JSONArray getOutBillDtl(Map whereJson); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/IProductdtlService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/IProductdtlService.java new file mode 100644 index 0000000..8a69be1 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/IProductdtlService.java @@ -0,0 +1,45 @@ +package org.nl.acs.product.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.acs.product.domain.Product; +import org.nl.acs.product.domain.ProductQuery; +import org.nl.acs.product.domain.Productdtl; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.product.domain.ProductdtlQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.Set; + +/** + *

+ * 配方明细表 服务类 + *

+ * + * @author tuqiang + * @since 2024-10-08 + */ +public interface IProductdtlService extends IService { + + IPage queryAll(ProductdtlQuery whereJson, PageQuery page); + + /** + * 创建 + * + * @param entity / + */ + void create(Productdtl entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(Productdtl entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/impl/ProductServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/impl/ProductServiceImpl.java new file mode 100644 index 0000000..01aff05 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/impl/ProductServiceImpl.java @@ -0,0 +1,156 @@ +package org.nl.acs.product.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.nl.acs.product.domain.Product; +import org.nl.acs.product.domain.ProductQuery; +import org.nl.acs.product.domain.Productdtl; +import org.nl.acs.product.mapper.ProductMapper; +import org.nl.acs.product.mapper.ProductdtlMapper; +import org.nl.acs.product.service.IProductService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + *

+ * 配方主表 服务实现类 + *

+ * + * @author tuqiang + * @since 2024-09-29 + */ +@Service +public class ProductServiceImpl extends ServiceImpl implements IProductService { + + @Autowired + private ProductMapper productMapper; + @Autowired + private ProductdtlMapper productdtlMapper; + + @Override + public IPage queryAll(ProductQuery whereJson, PageQuery page) { + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(Product.class); + wrapper.eq(StrUtil.isNotEmpty(whereJson.getProduct_code()), Product::getProduct_code, whereJson.getProduct_code()); + pages = productMapper.selectPage(pages, wrapper); + return pages; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(JSONObject map) { + JSONArray rows = map.getJSONArray("tableData"); + map.remove("tableData"); + Product product = productMapper.selectById(MapUtil.getStr(map, "product_code")); + if (ObjectUtil.isNotEmpty(product) && !product.getProduct_code().equals(MapUtil.getStr(map, "product_code"))) { + throw new BadRequestException("存在相同的产品编码"); + } + + Product entity = new Product(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setProduct_id(IdUtil.getSnowflake(1, 1).nextId() + ""); + entity.setProduct_code(CodeUtil.getNewCode("PRODUCT_CODE")); + entity.setCreate_by(nickName); + entity.setCreate_time(now); + entity.setUpdate_by(nickName); + entity.setUpdate_time(now); + entity.setDetail_count(rows.size()); + //调用明细处理方法 + float qtySum = this.insertDtlByRows(entity, rows); + entity.setTotal_qty(qtySum); + + productMapper.insert(entity); + } + + private float insertDtlByRows(Product entity, JSONArray rows) { + + + float sum = 0; + for (int i = 0; i < rows.size(); i++) { + JSONObject json = rows.getJSONObject(i); + String jsonString = json.getString("qty"); + float qty = Float.parseFloat(jsonString); + sum += qty; + } + + //定义返回数据 + for (int i = 0; i < rows.size(); i++) { + JSONObject json = rows.getJSONObject(i); + Productdtl productdtl = new Productdtl(); + String jsonString = json.getString("qty"); + float qty = Float.parseFloat(jsonString); + float percentage = qty / sum; + productdtl.setMaterial_proportion(String.valueOf(percentage)); + productdtl.setProductdtl_id(IdUtil.getSnowflake(1, 1).nextId() + "") + .setSeq_no(i) + .setMaterial_id(json.getString("material_id")) + .setMaterial_code(json.getString("material_code")) + .setProduct_id(entity.getProduct_id()) + .setCreate_by(SecurityUtils.getCurrentNickName()) + .setProductin_qty(json.getString("qty")) + .setCreate_time(DateUtil.now()) + .setMaterial_name(json.getString("material_name")) + .setUpdate_by(SecurityUtils.getCurrentNickName()) + .setUpdate_time(DateUtil.now()); + productdtlMapper.insert(productdtl); + } + return sum; + } + + @Override + public void update(JSONObject whereJson) { + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String product_id = (String) whereJson.get("product_id"); + Product product = productMapper.selectById(product_id); + if (product == null) { + throw new BadRequestException("不存在此产品配方"); + } + productdtlMapper.deleteBatchIds(productdtlMapper.selectList(Wrappers.lambdaQuery(Productdtl.class).eq(Productdtl::getProduct_id, product_id))); + //获取明细 + JSONArray rows = whereJson.getJSONArray("tableData"); + this.insertDtlByRows(product, rows); + product.setUpdate_by(nickName); + product.setUpdate_time(now); + productMapper.update(product, Wrappers.lambdaQuery(Product.class).eq(Product::getProduct_id, product_id)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Set ids) { + productMapper.deleteBatchIds(ids); + + } + + @Override + public cn.hutool.json.JSONArray getOutBillDtl(Map whereJson) { + List list = productdtlMapper.selectList(Wrappers.lambdaQuery(Productdtl.class).eq(Productdtl::getProduct_id, whereJson.get("product_id"))); + if (list != null) { + return JSONUtil.parseArray(list); + } + return null; + } + + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/impl/ProductdtlServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/impl/ProductdtlServiceImpl.java new file mode 100644 index 0000000..4d5db0b --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/product/service/impl/ProductdtlServiceImpl.java @@ -0,0 +1,83 @@ +package org.nl.acs.product.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.nl.acs.product.domain.Productdtl; +import org.nl.acs.product.domain.ProductdtlQuery; +import org.nl.acs.product.mapper.ProductMapper; +import org.nl.acs.product.mapper.ProductdtlMapper; +import org.nl.acs.product.service.IProductdtlService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Set; + +/** + *

+ * 配方明细表 服务实现类 + *

+ * + * @author tuqiang + * @since 2024-10-08 + */ +@Service +public class ProductdtlServiceImpl extends ServiceImpl implements IProductdtlService { + + @Autowired + private ProductdtlMapper productdtlMapper; + + @Override + public IPage queryAll(ProductdtlQuery whereJson, PageQuery page) { + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + LambdaQueryWrapper productdtlLambdaQueryWrapper = Wrappers.lambdaQuery(Productdtl.class); + productdtlLambdaQueryWrapper.eq(StrUtil.isNotEmpty(whereJson.getProductdtl_id()), Productdtl::getProductdtl_id, whereJson.getProductdtl_id()); + if (StrUtil.isNotEmpty(whereJson.getBlurry())) { + productdtlLambdaQueryWrapper.and(wrapper -> { + wrapper.like(StrUtil.isNotEmpty(whereJson.getBlurry()), Productdtl::getProduct_id, whereJson.getBlurry()) + .or() + .like(StrUtil.isNotEmpty(whereJson.getBlurry()), Productdtl::getMaterial_code, whereJson.getBlurry()); + }); + } + pages = productdtlMapper.selectPage(pages, productdtlLambdaQueryWrapper); + return pages; + } + + @Override + public void create(Productdtl entity) { + String productdtl_id = entity.getProductdtl_id(); + Productdtl productdtlObj = productdtlMapper.selectById(productdtl_id); + if (ObjectUtil.isNotEmpty(productdtlObj) && !productdtlObj.getProductdtl_id().equals(entity.getProductdtl_id())) { + throw new BadRequestException("存在相同的配方明细id"); + } + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setCreate_time(now); + entity.setUpdate_time(now); + entity.setCreate_by(nickName); + entity.setUpdate_by(nickName); + productdtlMapper.insert(entity); + } + + @Override + public void update(Productdtl entity) { + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setUpdate_time(now); + entity.setUpdate_by(nickName); + productdtlMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + productdtlMapper.deleteBatchIds(ids); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/controller/SchBaseRegionController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/controller/SchBaseRegionController.java new file mode 100644 index 0000000..ff19ace --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/controller/SchBaseRegionController.java @@ -0,0 +1,78 @@ +package org.nl.acs.sch.region.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.sch.region.service.ISchBaseRegionService; +import org.nl.acs.sch.region.service.dao.SchBaseRegion; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; + +@Slf4j +@RestController + +@RequestMapping("/api/schBaseRegion") +public class SchBaseRegionController { + @Autowired + private ISchBaseRegionService regionService; + + @GetMapping + @Log("查询区域管理") + //@SaCheckPermission("@el.check('schBaseRegion:list')") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(regionService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增区域管理") + //@SaCheckPermission("@el.check('schBaseRegion:add')") + public ResponseEntity create(@Validated @RequestBody SchBaseRegion entity) { + regionService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改区域管理") + //@SaCheckPermission("@el.check('schBaseRegion:edit')") + public ResponseEntity update(@Validated @RequestBody SchBaseRegion entity) { + regionService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除区域管理") + //@SaCheckPermission("@el.check('schBaseRegion:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + regionService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/getRegionList") + @Log("获取区域下拉框") + //@SaCheckPermission("@el.check('schBaseRegion:list')") + public ResponseEntity getRegionList(@RequestBody(required = false) SchBaseRegion region) { + return new ResponseEntity<>(regionService.getRegionList(region), HttpStatus.OK); + } + + @PostMapping("/getPointStatusSelectById") + @Log("获取点位状态下拉框") + //@SaCheckPermission("region:add") + public ResponseEntity getPointStatusSelectById(@RequestBody String region_id) { + return new ResponseEntity<>(regionService.getPointStatusSelectById(region_id), HttpStatus.OK); + } + + @PostMapping("/getPointTypeSelectById") + @Log("获取点位类型下拉框") + + //@SaCheckPermission("region:add") + public ResponseEntity getPointTypeSelectById(@RequestBody String region_id) { + return new ResponseEntity<>(regionService.getPointTypeSelectById(region_id), HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/ISchBaseRegionService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/ISchBaseRegionService.java new file mode 100644 index 0000000..f52bad9 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/ISchBaseRegionService.java @@ -0,0 +1,67 @@ +package org.nl.acs.sch.region.service; + +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.sch.region.service.dao.SchBaseRegion; +import org.nl.common.domain.query.PageQuery; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface ISchBaseRegionService extends IService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(Map whereJson, PageQuery pageable); + + /** + * 创建 + * + * @param entity / + */ + void create(SchBaseRegion entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(SchBaseRegion entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + /** + * 区域下拉框 + * + * @param region 区域 + * @return / + */ + List getRegionList(SchBaseRegion region); + + /** + * 获取点位状态下拉框 + * + * @param regionId / + * @return / + */ + JSONArray getPointStatusSelectById(String regionId); + + /** + * 获取点位类型下拉框 + * + * @param regionId / + * @return / + */ + JSONArray getPointTypeSelectById(String regionId); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dao/SchBaseRegion.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dao/SchBaseRegion.java new file mode 100644 index 0000000..bfd1875 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dao/SchBaseRegion.java @@ -0,0 +1,59 @@ +package org.nl.acs.sch.region.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sch_base_region") +public class SchBaseRegion implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "region_code", type = IdType.NONE) + + private String region_code; + + + private String region_name; + + + private String point_type_explain; + + + private String point_status_explain; + + + private Boolean is_has_workder; + + + private String workshop_code; + + + private String remark; + + + private String create_id; + + + private String create_name; + + + private String create_time; + + + private String update_id; + + + private String update_name; + + + private String update_time; + + + private Integer order_seq; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dao/mapper/SchBaseRegionMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dao/mapper/SchBaseRegionMapper.java new file mode 100644 index 0000000..de9e4da --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dao/mapper/SchBaseRegionMapper.java @@ -0,0 +1,7 @@ +package org.nl.acs.sch.region.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.acs.sch.region.service.dao.SchBaseRegion; + +public interface SchBaseRegionMapper extends BaseMapper { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dto/SchBaseRegionDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dto/SchBaseRegionDto.java new file mode 100644 index 0000000..f9d404e --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/dto/SchBaseRegionDto.java @@ -0,0 +1,79 @@ +package org.nl.acs.sch.region.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data + +public class SchBaseRegionDto implements Serializable { + /** + * 区域编码 + */ + private String region_code; + + /** + * 区域名称 + */ + private String region_name; + + /** + * 点位类型说明 + */ + private String point_type_explain; + + /** + * 点位状态说明 + */ + private String point_status_explain; + + /** + * 是否创建工单 + */ + private Boolean is_has_workder; + + /** + * 车间编码 + */ + private String workshop_code; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String create_id; + + /** + * 创建人 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_id; + + /** + * 修改人 + */ + private String update_name; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 顺和号 + */ + private Integer order_seq; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/impl/SchBaseRegionServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/impl/SchBaseRegionServiceImpl.java new file mode 100644 index 0000000..318d9f0 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/region/service/impl/SchBaseRegionServiceImpl.java @@ -0,0 +1,130 @@ +package org.nl.acs.sch.region.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.sch.region.service.ISchBaseRegionService; +import org.nl.acs.sch.region.service.dao.SchBaseRegion; +import org.nl.acs.sch.region.service.dao.mapper.SchBaseRegionMapper; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +@Slf4j +@Service +public class SchBaseRegionServiceImpl extends ServiceImpl implements ISchBaseRegionService { + + @Autowired + private SchBaseRegionMapper schBaseRegionMapper; + + @Override + public IPage queryAll(Map whereJson, PageQuery page) { + String workshop_code = ObjectUtil.isNotEmpty(whereJson.get("workshop_code")) ? whereJson.get("workshop_code").toString() : null; + String blurry = ObjectUtil.isNotEmpty(whereJson.get("blurry")) ? whereJson.get("blurry").toString() : null; + Boolean is_has_workder = ObjectUtil.isNotEmpty(whereJson.get("is_has_workder")) ? Boolean.valueOf(whereJson.get("is_has_workder").toString()) : null; + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.eq(ObjectUtil.isNotEmpty(workshop_code), SchBaseRegion::getWorkshop_code, workshop_code) + .eq(ObjectUtil.isNotEmpty(is_has_workder), SchBaseRegion::getIs_has_workder, is_has_workder) + .like(ObjectUtil.isNotEmpty(blurry), SchBaseRegion::getRegion_code, blurry) + .or(ObjectUtil.isNotEmpty(blurry), la -> la.like(SchBaseRegion::getRegion_name, blurry)) + .orderByAsc(SchBaseRegion::getOrder_seq); + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + schBaseRegionMapper.selectPage(pages, lam); + return pages; + } + + @Override + public void create(SchBaseRegion entity) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + entity.setCreate_id(currentUserId); + entity.setCreate_name(nickName); + entity.setCreate_time(now); + entity.setUpdate_id(currentUserId); + entity.setUpdate_name(nickName); + entity.setUpdate_time(now); + schBaseRegionMapper.insert(entity); + } + + @Override + public void update(SchBaseRegion entity) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setUpdate_id(currentUserId); + entity.setUpdate_name(nickName); + entity.setUpdate_time(now); + + schBaseRegionMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + schBaseRegionMapper.deleteBatchIds(ids); + } + + @Override + public List getRegionList(SchBaseRegion region) { + return schBaseRegionMapper.selectList(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(region), SchBaseRegion::getIs_has_workder, true) + .orderByAsc(SchBaseRegion::getOrder_seq)); + } + + @Override + public JSONArray getPointStatusSelectById(String regionId) { + /** + * label,value + */ + SchBaseRegion schBaseRegion = schBaseRegionMapper.selectById(regionId); + JSONArray res = new JSONArray(); + String pointStatusExplain = schBaseRegion.getPoint_status_explain(); + if (ObjectUtil.isEmpty(pointStatusExplain)) { + return res; + } + String[] explain = pointStatusExplain.split(","); + for (int i = 0; i < explain.length; i++) { + String[] status = explain[i].split("-"); + JSONObject point_status = new JSONObject(); + point_status.put("label", status[1]); + point_status.put("value", status[0]); + res.add(point_status); + } + return res; + } + + @Override + public JSONArray getPointTypeSelectById(String regionId) { + /** + * label,value + */ + SchBaseRegion schBaseRegion = schBaseRegionMapper.selectById(regionId); + JSONArray res = new JSONArray(); + String pointTypeExplain = schBaseRegion.getPoint_type_explain(); + if (ObjectUtil.isEmpty(pointTypeExplain)) { + return res; + } + String[] explain = pointTypeExplain.split(","); + for (int i = 0; i < explain.length; i++) { + String[] types = explain[i].split("-"); + JSONObject point_type = new JSONObject(); + point_type.put("label", types[1]); + point_type.put("value", types[0]); + res.add(point_type); + } + return res; + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/SchBaseTaskController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/SchBaseTaskController.java new file mode 100644 index 0000000..c4b4453 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/SchBaseTaskController.java @@ -0,0 +1,75 @@ +package org.nl.acs.sch.task.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.sch.task.service.ISchBaseTaskService; +import org.nl.acs.sch.task.service.dao.SchBaseTask; +import org.nl.acs.sch.task.service.dto.SchBaseTaskQuery; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; + +@Slf4j +@RestController + +@RequestMapping("/api/schBaseTask") +public class SchBaseTaskController { + @Autowired + private ISchBaseTaskService schBaseTaskService; + + @GetMapping + @Log("查询任务管理") + //@SaCheckPermission("@el.check('schBaseTask:list')") + public ResponseEntity query(SchBaseTaskQuery whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(schBaseTaskService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增任务管理") + //@SaCheckPermission("@el.check('schBaseTask:add')") + public ResponseEntity create(@Validated @RequestBody SchBaseTask entity) { + schBaseTaskService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改任务管理") + //@SaCheckPermission("@el.check('schBaseTask:edit')") + public ResponseEntity update(@Validated @RequestBody SchBaseTask entity) { + schBaseTaskService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除任务管理") + //@SaCheckPermission("@el.check('schBaseTask:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + schBaseTaskService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/taskStatusList") + @Log("任务状态下拉框") + @SaIgnore + //@SaCheckPermission("@el.check('schBaseTask:list')") + public ResponseEntity getTaskStatusList() { + return new ResponseEntity<>(TableDataInfo.build(schBaseTaskService.getTaskStatusList()), HttpStatus.OK); + } + + @PutMapping("/operation") + @Log("任务操作") + //@SaCheckPermission("task:edit") + public ResponseEntity update(@RequestBody Map map) { + schBaseTaskService.operation(map); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/SchBaseTaskconfigController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/SchBaseTaskconfigController.java new file mode 100644 index 0000000..9241dbc --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/SchBaseTaskconfigController.java @@ -0,0 +1,62 @@ +package org.nl.acs.sch.task.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.sch.task.service.ISchBaseTaskconfigService; +import org.nl.acs.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Set; + +@Slf4j +@RestController + +@RequestMapping("/api/schBaseTaskconfig") +public class SchBaseTaskconfigController { + @Autowired + private ISchBaseTaskconfigService schBaseTaskconfigService; + + @GetMapping + @Log("查询任务配置") + //@SaCheckPermission("@el.check('schBaseTaskconfig:list')") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(schBaseTaskconfigService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增任务配置") + //@SaCheckPermission("@el.check('schBaseTaskconfig:add')") + public ResponseEntity create(@Validated @RequestBody SchBaseTaskconfig entity) { + schBaseTaskconfigService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改任务配置") + //@SaCheckPermission("@el.check('schBaseTaskconfig:edit')") + public ResponseEntity update(@Validated @RequestBody SchBaseTaskconfig entity) { + schBaseTaskconfigService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除任务配置") + //@SaCheckPermission("@el.check('schBaseTaskconfig:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + schBaseTaskconfigService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/getTaskConfigList") + @Log("获取下拉框") + public ResponseEntity getTaskConfigList() { + return new ResponseEntity<>(schBaseTaskconfigService.getTaskConfigList(), HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/WorkController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/WorkController.java new file mode 100644 index 0000000..4db875c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/controller/WorkController.java @@ -0,0 +1,86 @@ +package org.nl.acs.sch.task.controller; + +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.sch.task.service.WorkService; +import org.nl.acs.sch.task.service.dao.SchBaseTask; +import org.nl.acs.sch.task.service.dao.Work; +import org.nl.acs.sch.task.service.dto.SchBaseTaskQuery; +import org.nl.acs.sch.task.service.dto.WorkQuery; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; + +@Slf4j +@RestController + +@RequestMapping("/api/work") +public class WorkController { + @Autowired + private WorkService workService; + + @GetMapping + @Log("查询配料作业管理") + //@SaCheckPermission("@el.check('schBaseTask:list')") + public ResponseEntity query(WorkQuery whereJson, PageQuery page) { + return new ResponseEntity<>(TableDataInfo.build(workService.queryAll(whereJson, page)), HttpStatus.OK); + } + + @PostMapping + @Log("新增配料作业管理") + //@SaCheckPermission("@el.check('schBaseTask:add')") + public ResponseEntity create(@Validated @RequestBody Work entity) { + workService.create(entity); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改配料作业管理") + //@SaCheckPermission("@el.check('schBaseTask:edit')") + public ResponseEntity update(@Validated @RequestBody Work entity) { + workService.update(entity); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除配料作业管理") + //@SaCheckPermission("@el.check('schBaseTask:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Set ids) { + workService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("下发配料作业") + @PostMapping(value = "/send/{id}") + public ResponseEntity send(@RequestBody String id) throws Exception { + workService.send(id); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("补发配料作业") + @PostMapping(value = "/reSend") + public ResponseEntity reSend(@RequestBody Work dto) throws Exception { + workService.reSend(dto); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("完成配料作业") + @PostMapping(value = "/finish/{id}") + public ResponseEntity finish(@RequestBody String id) throws Exception { + workService.finish(id); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("确认配料作业") + @PostMapping(value = "/confirm/{id}") + public ResponseEntity confirm(@RequestBody String id) throws Exception { + workService.confirm(id); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/ISchBaseTaskService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/ISchBaseTaskService.java new file mode 100644 index 0000000..61570c9 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/ISchBaseTaskService.java @@ -0,0 +1,73 @@ +package org.nl.acs.sch.task.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.sch.task.service.dao.SchBaseTask; +import org.nl.acs.sch.task.service.dto.SchBaseTaskQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.Map; +import java.util.Set; + +public interface ISchBaseTaskService extends IService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(SchBaseTaskQuery whereJson, PageQuery pageable); + + /** + * 创建 + * + * @param entity / + */ + void create(SchBaseTask entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(SchBaseTask entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + /** + * 任务申请 + * + * @param param / + */ + void apply(JSONObject param); + + /** + * 获取任务状态下拉框 + * + * @return / + */ + JSONArray getTaskStatusList(); + + /** + * 任务操作 + * + * @param param 参数 + */ + void operation(Map param); + + /** + * 获取任务数据 + * + * @param taskCode 任务编码 + * @return / + */ + SchBaseTask getByCode(String taskCode); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/ISchBaseTaskconfigService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/ISchBaseTaskconfigService.java new file mode 100644 index 0000000..f3e1e4e --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/ISchBaseTaskconfigService.java @@ -0,0 +1,44 @@ +package org.nl.acs.sch.task.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.common.domain.query.PageQuery; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface ISchBaseTaskconfigService extends IService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(Map whereJson, PageQuery pageable); + + /** + * 创建 + * + * @param entity / + */ + void create(SchBaseTaskconfig entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(SchBaseTaskconfig entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + List getTaskConfigList(); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/WorkService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/WorkService.java new file mode 100644 index 0000000..602debe --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/WorkService.java @@ -0,0 +1,52 @@ +package org.nl.acs.sch.task.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.acs.sch.task.service.dao.SchBaseTask; +import org.nl.acs.sch.task.service.dao.Work; +import org.nl.acs.sch.task.service.dto.WorkQuery; +import org.nl.common.domain.query.PageQuery; + +import java.util.Set; + +public interface WorkService extends IService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param pageable 分页参数 + * @return IPage + */ + IPage queryAll(WorkQuery whereJson, PageQuery pageable); + + /** + * 创建 + * + * @param entity / + */ + void create(Work entity); + + /** + * 编辑 + * + * @param entity / + */ + void update(Work entity); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Set ids); + + void send(String id); + + void reSend(Work dto); + + void finish(String id); + + void confirm(String id); + + Work findByCode(String work_code); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/SchBaseTask.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/SchBaseTask.java new file mode 100644 index 0000000..9ff01c6 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/SchBaseTask.java @@ -0,0 +1,124 @@ +package org.nl.acs.sch.task.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sch_base_task") +public class SchBaseTask implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "task_id", type = IdType.NONE) + + private String task_id; + + + private String task_code; + + + private String task_status; + + + private String config_code; + + + private String point_code1; + + + private String point_code2; + + + private String point_code3; + + + private String point_code4; + + + private String group_id; + + + private String vehicle_type; + + + private Integer vehicle_qty; + + + private String vehicle_code; + + + private String vehicle_code2; + + + private String handle_status; + + + private String car_no; + + + private Long task_group_id; + + + private BigDecimal task_group_seq; + + + private String finished_type; + + + private String create_mode; + + + private String acs_trace_id; + + + private String request_param; + + + private String response_param; + + + private String workshop_code; + + + private String ext_group_data; + + + private String remark; + + + private Boolean is_delete; + + + private String create_id; + + + private String create_name; + + + private String create_time; + + + private String update_id; + + + private String update_name; + + /** + * 工单号 + */ + private String mfg_order_name; + + + private String update_time; + @TableField(exist = false) + private String config_name; + @TableField(exist = false) + private String task_name; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/SchBaseTaskconfig.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/SchBaseTaskconfig.java new file mode 100644 index 0000000..3958e90 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/SchBaseTaskconfig.java @@ -0,0 +1,146 @@ +package org.nl.acs.sch.task.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sch_base_taskconfig") +public class SchBaseTaskconfig implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "config_id", type = IdType.NONE) + + private String config_id; + + + private String config_code; + + + private String config_name; + + + private String route_plan_code; + + + private String task_qf_type; + + + private String acs_task_type; + + + private String task_name; + + + private String task_type; + + + private String task_direction; + + + private String priority; + + + private Integer task_create_max_num; + + + private Integer task_issue_max_num; + + + private Boolean is_auto_issue; + + + private String start_region_str; + + + private String next_region_str; + + + private String start_point_pre; + + + private String next_region_pre; + + + private Boolean is_check_workorder; + + + private Boolean is_check_start_lock; + + + private Boolean is_immediate_create; + + + private Boolean is_check_next_lock; + + + private Boolean is_start_auto; + + + private Boolean is_next_auto; + + + private Boolean is_lock_start; + + + private Boolean is_lock_next; + + + private String request_param; + + + private String response_param; + + + private Boolean is_group_congrol_issue_seq; + + + private BigDecimal unfinish_notify_time; + + + private String sql_param; + + + private String workshop_code; + + + private String remark; + + + private Boolean is_used; + + + private Boolean is_delete; + + + private String create_id; + + + private String create_name; + + + private String create_time; + + + private String update_id; + + + private String update_name; + + + private String update_time; + + @TableField(exist = false) + private List start_region_strs; + + @TableField(exist = false) + private List next_region_strs; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/Work.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/Work.java new file mode 100644 index 0000000..c976c0c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/Work.java @@ -0,0 +1,83 @@ +package org.nl.acs.sch.task.service.dao; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("work") +public class Work implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId + private String work_id; + + private String work_code; + + + /* + * 物料编码 + */ + private String material_code; + + /* + * 工单编码 + */ + private String mfg_order_name; + + + /* + * 物料名称 + */ + private String material_name; + + /* + * 任务配置编码 + */ + private String resource_name; + + private int seq_no; + + private float qty; + + /* + * 剩余桶数 + */ + private int remain_num; + + /* + * 需求桶数 + */ + private int require_num; + + private String status; + + /** + * 创建人 + */ + private String create_by; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_by; + + /** + * 修改时间 + */ + private String update_time; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskMapper.java new file mode 100644 index 0000000..e126b91 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskMapper.java @@ -0,0 +1,13 @@ +package org.nl.acs.sch.task.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.acs.sch.task.service.dao.SchBaseTask; +import org.nl.acs.sch.task.service.dto.SchBaseTaskQuery; + +import java.util.List; + +public interface SchBaseTaskMapper extends BaseMapper { + + IPage selectPageLeftJoin(IPage pages, SchBaseTaskQuery whereJson, List collect); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskMapper.xml b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskMapper.xml new file mode 100644 index 0000000..a71222c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskMapper.xml @@ -0,0 +1,44 @@ + + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskconfigMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskconfigMapper.java new file mode 100644 index 0000000..7ed0eca --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/SchBaseTaskconfigMapper.java @@ -0,0 +1,7 @@ +package org.nl.acs.sch.task.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.nl.acs.sch.task.service.dao.SchBaseTaskconfig; + +public interface SchBaseTaskconfigMapper extends BaseMapper { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/WorkMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/WorkMapper.java new file mode 100644 index 0000000..8acaa2e --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/WorkMapper.java @@ -0,0 +1,13 @@ +package org.nl.acs.sch.task.service.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.acs.sch.task.service.dao.Work; +import org.nl.acs.sch.task.service.dto.WorkQuery; +import org.springframework.stereotype.Repository; + +@Repository +public interface WorkMapper extends BaseMapper { + + IPage selectPageLeftJoin(IPage pages, WorkQuery whereJson); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/WorkMapper.xml b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/WorkMapper.xml new file mode 100644 index 0000000..733f57d --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dao/mapper/WorkMapper.xml @@ -0,0 +1,33 @@ + + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskDto.java new file mode 100644 index 0000000..96a2705 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskDto.java @@ -0,0 +1,171 @@ +package org.nl.acs.sch.task.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class SchBaseTaskDto implements Serializable { + /** + * 任务标识 + */ + private String task_id; + + /** + * 任务编码 + */ + private String task_code; + + + /** + * 任务状态 + */ + private String task_status; + + /** + * 配置编码 + */ + private String config_code; + + /** + * 点位1 + */ + private String point_code1; + + /** + * 点位2 + */ + private String point_code2; + + /** + * 点位3 + */ + private String point_code3; + + /** + * 点位4 + */ + private String point_code4; + + + private String group_id; + + /** + * 载具类型 + */ + private String vehicle_type; + + /** + * 载具数量 + */ + private BigDecimal vehicle_qty; + + /** + * 载具编码 + */ + private String vehicle_code; + + /** + * 处理状态 + */ + private String handle_status; + + /** + * 车号 + */ + private String car_no; + + + /** + * 任务组标识 + */ + private Long task_group_id; + + /** + * 任务组顺序号 + */ + private BigDecimal task_group_seq; + + /** + * 任务完成类型 + */ + private String finished_type; + + /** + * 生成方式 + */ + private String create_mode; + + /** + * 链路标识 + */ + private String acs_trace_id; + + /** + * 生成任务的请求参数 + */ + private String request_param; + + /** + * 下发任务的请求参数 + */ + private String response_param; + + /** + * 车间编码 + */ + private String workshop_code; + + /** + * 额外组盘信息 + */ + private String ext_group_data; + + /** + * 备注 + */ + private String remark; + + /** + * 是否删除 + */ + private Boolean is_delete; + + /** + * 创建人 + */ + private String create_id; + + /** + * 创建人 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_id; + + /** + * 修改人 + */ + private String update_name; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 工单号 + */ + private String mfg_order_name; + + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskQuery.java new file mode 100644 index 0000000..798c95a --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskQuery.java @@ -0,0 +1,18 @@ +package org.nl.acs.sch.task.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SchBaseTaskQuery implements Serializable { + private String task_code; + private String vehicle_code; + private String point_code; + private String begin_time; + private String end_time; + private String more_task_status; + private String unFinished; + + private String config_code; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskconfigDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskconfigDto.java new file mode 100644 index 0000000..8d54812 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskconfigDto.java @@ -0,0 +1,209 @@ +package org.nl.acs.sch.task.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class SchBaseTaskconfigDto implements Serializable { + /** + * 配置标识 + */ + private String config_id; + + /** + * 配置编码 + */ + private String config_code; + + /** + * 配置名称 + */ + private String config_name; + + /** + * 路由编码 + */ + private String route_plan_code; + + /** + * 任务取放类型 + */ + private String task_qf_type; + + /** + * acs任务类型 + */ + private String acs_task_type; + + /** + * 任务名字 + */ + private String task_name; + + /** + * 任务类型 + */ + private String task_type; + + /** + * 优先级 + */ + private String priority; + + /** + * 任务方向 + **/ + private String task_direction; + + /** + * 允许最大任务生成数 + */ + private Integer task_create_max_num; + + /** + * 允许最大任务下发数 + */ + private Integer task_issue_max_num; + + /** + * 是否自动下发 + */ + private Boolean is_auto_issue; + + /** + * 起点区域配置 + */ + private String start_region_str; + + /** + * 终点区域配置 + */ + private String next_region_str; + + /** + * 起点点位前缀 + */ + private String start_point_pre; + + /** + * 终点点位前缀 + */ + private String next_region_pre; + + /** + * 是否校验工单 + */ + private Boolean is_check_workorder; + + /** + * 是否判断起点锁定 + */ + private Boolean is_check_start_lock; + + /** + * 是否立即创建 + */ + private Boolean is_immediate_create; + + /** + * 是否判断终点锁定 + */ + private Boolean is_check_next_lock; + + /** + * 是否起点自动 + */ + private Boolean is_start_auto; + + /** + * 是否终点自动 + */ + private Boolean is_next_auto; + + /** + * 是否锁定起点 + */ + private Boolean is_lock_start; + + /** + * 是否锁定终点 + */ + private Boolean is_lock_next; + + /** + * 生成任务的请求参数 + */ + private String request_param; + + /** + * 下发任务的请求参数 + */ + private String response_param; + + /** + * 是否按组控制下发顺序 + */ + private Boolean is_group_congrol_issue_seq; + + /** + * 任务未完成通知时间数 + */ + private BigDecimal unfinish_notify_time; + + /** + * sql配置 + */ + private String sql_param; + + /** + * 车间编码 + */ + private String workshop_code; + + /** + * 备注 + */ + private String remark; + + /** + * 是否启用 + */ + private Boolean is_used; + + /** + * 是否删除 + */ + private Boolean is_delete; + + /** + * 创建人 + */ + private String create_id; + + /** + * 创建人 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_id; + + /** + * 修改人 + */ + private String update_name; + + /** + * 修改时间 + */ + private String update_time; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskconfigQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskconfigQuery.java new file mode 100644 index 0000000..f946261 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/SchBaseTaskconfigQuery.java @@ -0,0 +1,8 @@ +package org.nl.acs.sch.task.service.dto; + + +import org.nl.acs.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.common.domain.query.BaseQuery; + +public class SchBaseTaskconfigQuery extends BaseQuery { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/WorkDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/WorkDto.java new file mode 100644 index 0000000..b5eadc3 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/WorkDto.java @@ -0,0 +1,69 @@ +package org.nl.acs.sch.task.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class WorkDto implements Serializable { + private String work_id; + + private String work_code; + + /* + * 物料编码 + */ + private String material_code; + + /* + * 工单编码 + */ + private String mfg_order_name; + + + /* + * 物料名称 + */ + private String material_name; + + /* + * 任务配置编码 + */ + private String resource_name; + + private int seq_no; + + private float qty; + + /* + * 剩余桶数 + */ + private String remain_num; + + /* + * 需求桶数 + */ + private String require_num; + + private String status; + + /** + * 创建人 + */ + private String create_by; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private String update_by; + + /** + * 修改时间 + */ + private String update_time; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/WorkQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/WorkQuery.java new file mode 100644 index 0000000..3678565 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/dto/WorkQuery.java @@ -0,0 +1,13 @@ +package org.nl.acs.sch.task.service.dto; + +import lombok.Data; +import org.nl.acs.sch.task.service.dao.Work; +import org.nl.common.domain.query.BaseQuery; + +import java.io.Serializable; + +@Data +public class WorkQuery implements Serializable { + private String blurry; + private String status; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/SchBaseTaskServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/SchBaseTaskServiceImpl.java new file mode 100644 index 0000000..542daeb --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/SchBaseTaskServiceImpl.java @@ -0,0 +1,170 @@ +package org.nl.acs.sch.task.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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 lombok.extern.slf4j.Slf4j; +import org.nl.acs.sch.task.service.ISchBaseTaskService; +import org.nl.acs.sch.task.service.dao.SchBaseTask; +import org.nl.acs.sch.task.service.dao.mapper.SchBaseTaskMapper; +import org.nl.acs.sch.task.service.dao.mapper.SchBaseTaskconfigMapper; +import org.nl.acs.sch.task.service.dto.SchBaseTaskQuery; +import org.nl.acs.sch.task_manage.AbstractTask; +import org.nl.acs.sch.task_manage.task.core.TaskStatus; +import org.nl.acs.sch.task_manage.task.tasks.TaskFactory; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class SchBaseTaskServiceImpl extends ServiceImpl implements ISchBaseTaskService { + @Autowired + private SchBaseTaskMapper schBaseTaskMapper; + @Autowired + private SchBaseTaskconfigMapper schBaseTaskconfigMapper; + + @Autowired + private TaskFactory taskFactory; + + @Override + public IPage queryAll(SchBaseTaskQuery whereJson, PageQuery page) { + List collect = ObjectUtil.isNotEmpty(whereJson.getMore_task_status()) + ? Arrays.stream(whereJson.getMore_task_status().split(",")).collect(Collectors.toList()) : null; + if (collect != null) { + if (collect.contains(TaskStatus.UNFINISHED.getCode())) { + collect = null; + whereJson.setUnFinished(TaskStatus.EXECUTING.getCode()); + } + } + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + pages = schBaseTaskMapper.selectPageLeftJoin(pages, whereJson, collect); + return pages; + } + + @Override + public void create(SchBaseTask entity) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + Assert.notNull(entity.getTask_status(), "任务状态不能为空!"); + + entity.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + entity.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr()); + entity.setCreate_id(currentUserId); + entity.setCreate_name(nickName); + entity.setCreate_time(now); + entity.setUpdate_id(currentUserId); + entity.setUpdate_name(nickName); + entity.setUpdate_time(now); + schBaseTaskMapper.insert(entity); + } + + @Override + public void update(SchBaseTask entity) { + SchBaseTask dto = schBaseTaskMapper.selectById(entity.getTask_code()); + if (dto == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setUpdate_id(currentUserId); + entity.setUpdate_name(nickName); + entity.setUpdate_time(now); + + schBaseTaskMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + schBaseTaskMapper.deleteBatchIds(ids); + } + + @Override + public void apply(JSONObject param) { + /** + * 参数:设备编号(确定的点), 任务类型, 载具编码 + * hint: 根据任务类型来判断校验 + */ + String configCode = param.getString("config_code"); + // 校验设备编码 + AbstractTask task = taskFactory.getTask(configCode); + // 执行创建任务 + task.apply(param); + } + + @Override + public JSONArray getTaskStatusList() { + TaskStatus[] values = TaskStatus.values(); + JSONArray arr = new JSONArray(); + for (TaskStatus value : values) { + JSONObject json = new JSONObject(); + json.put("code", value.getCode()); + json.put("name", value.getName()); + arr.add(json); + } + return arr; + } + + @Override + public void operation(Map param) { + String task_code = ObjectUtil.isNotEmpty(param.get("task_code")) ? param.get("task_code").toString() : null; + String method_name = ObjectUtil.isNotEmpty(param.get("method_name")) ? param.get("method_name").toString() : null; + String config_code = ObjectUtil.isNotEmpty(param.get("config_code")) ? param.get("config_code").toString() : null; + if (ObjectUtil.isEmpty(task_code) || ObjectUtil.isEmpty(method_name) || ObjectUtil.isEmpty(config_code)) { + throw new BadRequestException("操作失败"); + } + // 根据标识找到任务 + SchBaseTask taskOne = this.getByCode(task_code); + if (Integer.parseInt(taskOne.getTask_status()) >= Integer.parseInt(TaskStatus.FINISHED.getCode())) { + throw new BadRequestException("任务已完成或已取消!"); + } + // 根据配置去工厂类获得类对象 + String processing_class = config_code; + String message = ""; + // 根据任务类型获取对应的任务操作类 + AbstractTask abstractTask = taskFactory.getTask(processing_class); + // 调用每个任务类的method_name()强制结束方法 + JSONObject result; + switch (method_name) { + case "immediateNotifyAcs": + // + break; + // 强制完成 + case "forceFinish": + abstractTask.forceFinish(task_code); + break; + case "cancel": + abstractTask.cancel(task_code); + break; + default: + break; + } + } + + @Override + public SchBaseTask getByCode(String taskCode) { + LambdaQueryWrapper lam = new QueryWrapper().lambda(); + lam.eq(SchBaseTask::getTask_code, taskCode); + return this.getOne(lam); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/SchBaseTaskconfigServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/SchBaseTaskconfigServiceImpl.java new file mode 100644 index 0000000..4b2184a --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/SchBaseTaskconfigServiceImpl.java @@ -0,0 +1,131 @@ +package org.nl.acs.sch.task.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.sch.task.service.ISchBaseTaskconfigService; +import org.nl.acs.sch.task.service.dao.SchBaseTaskconfig; +import org.nl.acs.sch.task.service.dao.mapper.SchBaseTaskconfigMapper; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; + +@Slf4j +@Service +public class SchBaseTaskconfigServiceImpl extends ServiceImpl implements ISchBaseTaskconfigService { + + @Autowired + private SchBaseTaskconfigMapper schBaseTaskconfigMapper; + + @Override + public IPage queryAll(Map whereJson, PageQuery page) { + String blurry = ObjectUtil.isNotEmpty(whereJson.get("blurry")) ? whereJson.get("blurry").toString() : null; + String workshop_code = ObjectUtil.isNotEmpty(whereJson.get("workshop_code")) ? whereJson.get("workshop_code").toString() : null; + LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); + lam.like(ObjectUtil.isNotEmpty(blurry), SchBaseTaskconfig::getConfig_name, blurry) + .or(ObjectUtil.isNotEmpty(blurry), la -> la.like( SchBaseTaskconfig::getConfig_code, blurry)) + .eq(ObjectUtil.isNotEmpty(workshop_code), SchBaseTaskconfig::getWorkshop_code, workshop_code); + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + schBaseTaskconfigMapper.selectPage(pages, lam); + pages.getRecords().forEach(config -> { + if (ObjectUtil.isNotEmpty(config.getStart_region_str())) { + config.setStart_region_strs(Arrays.asList(config.getStart_region_str().split(","))); + } + if (ObjectUtil.isNotEmpty(config.getNext_region_str())) { + config.setNext_region_strs(Arrays.asList(config.getNext_region_str().split(","))); + } + }); + return pages; + } + + @Override + public void create(SchBaseTaskconfig entity) { + SchBaseTaskconfig schBaseTaskconfig = schBaseTaskconfigMapper.selectOne(new LambdaQueryWrapper().eq(SchBaseTaskconfig::getConfig_code, entity.getConfig_code())); + if (ObjectUtil.isNotEmpty(schBaseTaskconfig)) { + throw new BadRequestException("任务配置【" + entity.getConfig_code() + "】已存在!"); + } + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + if (ObjectUtil.isAllEmpty(entity.getStart_region_strs(), entity.getNext_region_strs())) { + throw new BadRequestException("起点区域和终点区域不能同时为空!"); + } + + if (ObjectUtil.isNotEmpty(entity.getStart_region_strs())) { + // 起点区域配置 + String startRegion = String.join(",", entity.getStart_region_strs()); + entity.setStart_region_str(startRegion); + } + + if (ObjectUtil.isNotEmpty(entity.getNext_region_strs())) { + // 终点区域配置 + String nextRegion = String.join(",", entity.getNext_region_strs()); + entity.setNext_region_str(nextRegion); + } + + entity.setConfig_id(IdUtil.getSnowflake(1, 1).nextIdStr()); + entity.setCreate_id(currentUserId); + entity.setCreate_name(nickName); + entity.setCreate_time(now); + entity.setUpdate_id(currentUserId); + entity.setUpdate_name(nickName); + entity.setUpdate_time(now); + schBaseTaskconfigMapper.insert(entity); + } + + @Override + public void update(SchBaseTaskconfig entity) { + SchBaseTaskconfig dto = schBaseTaskconfigMapper.selectById(entity.getConfig_id()); + if (dto == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + if (ObjectUtil.isAllEmpty(entity.getStart_region_strs(), entity.getNext_region_strs())) { + throw new BadRequestException("起点区域和终点区域不能同时为空!"); + } + + if (ObjectUtil.isNotEmpty(entity.getStart_region_strs())) { + // 起点区域配置 + String startRegion = String.join(",", entity.getStart_region_strs()); + entity.setStart_region_str(startRegion); + } + + if (ObjectUtil.isNotEmpty(entity.getNext_region_strs())) { + // 终点区域配置 + String nextRegion = String.join(",", entity.getNext_region_strs()); + entity.setNext_region_str(nextRegion); + } + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setUpdate_id(currentUserId); + entity.setUpdate_name(nickName); + entity.setUpdate_time(now); + + schBaseTaskconfigMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + schBaseTaskconfigMapper.deleteBatchIds(ids); + } + + @Override + public List getTaskConfigList() { + return this.list(); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/WorkServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/WorkServiceImpl.java new file mode 100644 index 0000000..c06a5d7 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task/service/impl/WorkServiceImpl.java @@ -0,0 +1,199 @@ +package org.nl.acs.sch.task.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.common.base.CommonFinalParam; +import org.nl.acs.order.service.OrderService; +import org.nl.acs.order.service.dto.OrderDto; +import org.nl.acs.point.domain.AcsPoint; +import org.nl.acs.point.service.IAcsPointService; +import org.nl.acs.sch.task.service.WorkService; +import org.nl.acs.sch.task.service.dao.SchBaseTask; +import org.nl.acs.sch.task.service.dao.Work; +import org.nl.acs.sch.task.service.dao.mapper.WorkMapper; +import org.nl.acs.sch.task.service.dto.WorkQuery; +import org.nl.acs.sch.task_manage.task.core.TaskStatus; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.CodeUtil; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class WorkServiceImpl extends ServiceImpl implements WorkService { + @Autowired + private WorkMapper workMapper; + @Autowired + private TaskService taskService; + @Autowired + private OrderService orderService; + @Autowired + private IAcsPointService acsPointService; + + @Override + public IPage queryAll(WorkQuery whereJson, PageQuery page) { +// IPage pages = new Page<>(page.getPage() + 1, page.getSize()); +// LambdaQueryWrapper workLambdaQueryWrapper = Wrappers.lambdaQuery(Work.class); +// workLambdaQueryWrapper.eq(StrUtil.isNotEmpty(whereJson.getStatus()), Work::getStatus, whereJson.getStatus()) +// .lt(Work::getStatus, CommonFinalParam.TWO); +// if (StrUtil.isNotEmpty(whereJson.getBlurry())) { +// workLambdaQueryWrapper.and(wrapper -> { +// wrapper.like(StrUtil.isNotEmpty(whereJson.getBlurry()), Work::getResource_name, whereJson.getBlurry()) +// .or() +// .like(StrUtil.isNotEmpty(whereJson.getBlurry()), Work::getMfg_order_name, whereJson.getBlurry()); +// }); +// } +// pages = workMapper.selectPage(pages, workLambdaQueryWrapper); +// return pages; + IPage pages = new Page<>(page.getPage() + 1, page.getSize()); + pages = workMapper.selectPageLeftJoin(pages, whereJson); + return pages; + } + + @Override + public void create(Work entity) { + String work_id = entity.getWork_id(); + Work workObj = workMapper.selectById(work_id); + if (ObjectUtil.isNotEmpty(workObj) && !workObj.getWork_id().equals(entity.getWork_id())) { + throw new BadRequestException("存在相同的任务id"); + } + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setWork_id(IdUtil.getSnowflake(1, 1).nextId() + ""); + entity.setWork_code(CodeUtil.getNewCode("WORK_CODE")); + entity.setStatus("0"); + entity.setCreate_by(nickName); + entity.setCreate_time(now); + entity.setUpdate_by(nickName); + entity.setUpdate_time(now); + workMapper.insert(entity); + } + + @Override + public void update(Work entity) { + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + entity.setUpdate_by(nickName); + entity.setUpdate_time(now); + workMapper.updateById(entity); + } + + @Override + public void deleteAll(Set ids) { + // 真删除 + workMapper.deleteBatchIds(ids); + } + + @Override + public void send(String id) { + Work work = workMapper.selectById(id); + if (ObjectUtil.isEmpty(work)) { + throw new BadRequestException("不存在该配料任务"); + } + String mfg_order_name = work.getMfg_order_name(); + List works = workMapper.selectList(Wrappers.lambdaQuery(Work.class).eq(Work::getMfg_order_name, mfg_order_name).eq(Work::getStatus, TaskStatus.EXECUTING.getCode())); + if (works.size() != 0) { + throw new BadRequestException("该工单已有配料任务正在执行中,请勿重复下发"); + } + work.setStatus(TaskStatus.EXECUTING.getCode()); + workMapper.updateById(work); + } + + @Override + public void reSend(Work dto) { + Work work = workMapper.selectById(dto.getWork_id()); + if (ObjectUtil.isEmpty(work)) { + throw new BadRequestException("不存在该配料任务"); + } + work.setRemain_num(work.getRemain_num() + dto.getRequire_num()); + work.setRequire_num(work.getRequire_num() + dto.getRequire_num()); + workMapper.updateById(work); + + } + + @Override + public void finish(String id) { + Work work = workMapper.selectById(id); + if (ObjectUtil.isEmpty(work)) { + throw new BadRequestException("不存在该配料任务"); + } + work.setStatus(TaskStatus.FINISHED.getCode()); + workMapper.updateById(work); + OrderDto dto = orderService.findByCode(work.getMfg_order_name()); + List works = workMapper.selectList(Wrappers.lambdaQuery(Work.class).eq(Work::getMfg_order_name, work.getMfg_order_name()).eq(Work::getStatus, TaskStatus.FINISHED.getCode())); + // 工单所有配料任务都完成,则工单状态改为已完成 + if (works.size() == dto.getDetail_count()) { + dto.setStatus(CommonFinalParam.FINISHED); + orderService.update(dto); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void confirm(String id) { + Work work = workMapper.selectOne(Wrappers.lambdaQuery(Work.class).eq(Work::getWork_id, id)); + if (ObjectUtil.isEmpty(work)) { + throw new BadRequestException("该配料任务不存在!"); + } + if (StrUtil.equals(CommonFinalParam.FINISHED, work.getStatus())) { + throw new BadRequestException("该配料任务已完成!"); + } + String resource_name = work.getResource_name(); + TaskDto taskDto = new TaskDto(); + taskDto.setStart_device_code("T1"); + taskDto.setNext_device_code(resource_name); + taskDto.setTask_type(CommonFinalParam.TYPE_THREE); + taskDto.setAgv_system_type(CommonFinalParam.TWO); + AcsPoint point = acsPointService.findByCode("T1"); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("不存在T1点位"); + } + if (!point.getIs_used().booleanValue() || point.getPoint_status().equals(CommonFinalParam.ONE)) { + throw new BadRequestException("T1点位被占用"); + } + try { + taskService.create(taskDto); + } catch (Exception e) { + e.printStackTrace(); + } + work.setRemain_num(work.getRemain_num() - 1); + //当前数量为0,则修改状态为已完成 + if (work.getRemain_num() == 0) { + work.setStatus(TaskStatus.FINISHED.getCode()); + } + workMapper.updateById(work); + String mfg_order_name = work.getMfg_order_name(); + OrderDto dto = orderService.findByCode(mfg_order_name); + List works = workMapper.selectList(Wrappers.lambdaQuery(Work.class).eq(Work::getMfg_order_name, mfg_order_name).eq(Work::getStatus, TaskStatus.FINISHED.getCode())); + // 工单所有配料任务都完成,则工单状态改为已完成 + if (works.size() == dto.getDetail_count()) { + dto.setStatus(CommonFinalParam.FINISHED); + orderService.update(dto); + } + } + + @Override + public Work findByCode(String work_code) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(Work::getWork_code, work_code); + return workMapper.selectOne(wrapper); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AbstractTask.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AbstractTask.java new file mode 100644 index 0000000..82aca25 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AbstractTask.java @@ -0,0 +1,45 @@ +package org.nl.acs.sch.task_manage; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.point.service.IAcsPointService; +import org.nl.acs.sch.task.service.ISchBaseTaskService; +import org.nl.acs.sch.task.service.ISchBaseTaskconfigService; +import org.nl.common.exception.BadRequestException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author ldjun + * @version 1.0 + * @date 2023年05月16日 16:42 + * @desc 任务抽象父类,申请任务的相关率先判断以及生成,接着到子类执行任务的创建,最后统一通过定时任务去下发到ACS + */ +@Slf4j +@Component +public abstract class AbstractTask { + @Autowired + private ISchBaseTaskService taskService; + @Autowired + private ISchBaseTaskconfigService taskConfigService; + @Autowired + private IAcsPointService pointService; + + public void apply(JSONObject param) throws BadRequestException { + + } + + /** + * 强制结束完成任务 + * + * @param task_code + */ + public abstract void forceFinish(String task_code); + + /** + * 取消任务,货物搬回原点 + * + * @param task_code + */ + public abstract void cancel(String task_code); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AcsTaskDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AcsTaskDto.java new file mode 100644 index 0000000..1b322f5 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AcsTaskDto.java @@ -0,0 +1,4 @@ +package org.nl.acs.sch.task_manage; + +public class AcsTaskDto { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AutoCreateTask.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AutoCreateTask.java new file mode 100644 index 0000000..3af1905 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/AutoCreateTask.java @@ -0,0 +1,4 @@ +package org.nl.acs.sch.task_manage; + +public class AutoCreateTask { +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/GeneralDefinition.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/GeneralDefinition.java new file mode 100644 index 0000000..8287750 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/GeneralDefinition.java @@ -0,0 +1,168 @@ +package org.nl.acs.sch.task_manage; + +public class GeneralDefinition { + /** + * 默认密码 + */ + public static final String DEFAULT_PASSWORD = "123456"; + /** + * 盐值加密 + */ + public static final String SALT = "salt"; + /** + * 转义点 + */ + public static final String ESCAPE_DOT = "\\."; + /** + * 点 + */ + public static final String DOT = "."; + /** + * 日期变量 + */ + public static final String DATE_FORMAT = "yyyy-MM-dd"; + /** + * 时间变量 + */ + public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + /** + * 未知 + */ + public static final String UNKNOWN = "-"; + // 统一编码定义 + /** + * 窑自动任务开启 + */ + public static final String AUTO_KILN_CALL = "auto_kiln_call"; + // 是否 + /** + * 是/正确/可用... + */ + public static final String YES = "1"; + /** + * 否/错误/不可用... + */ + public static final String NO = "0"; + // 载具类型 + /** + * 料盅 + */ + public static final String MATERIAL_CUP = "LZ"; + /** + * 钢托盘 + */ + public static final String STEEL_TRAY = "GTP"; + // 账号定义 + /** + * acs系统 + */ + public static final String ACS_ID = "2"; + /** + * acs系统 + */ + public static final String ACS_NAME = "ACS系统"; + /** + * mes系统 + */ + public static final String MES_ID = "3"; + /** + * mes系统 + */ + public static final String MES_NAME = "MES系统"; + // 点位类型 + /** + * 设备位 + */ + public static final String DEVICE_POINT = "1"; + /** + * 对接位 + */ + public static final String DOCKING_POINT = "2"; + /** + * 检测位 + */ + public static final String CHECK_POINT = "4"; + // 出入口 + /** + * 入口 + **/ + public static final String ENTRANCE = "1"; + /** + * 出口 + **/ + public static final String EXIT = "2"; + // 任务生产方式 + /** + * 自动创建 + **/ + public static final String AUTO_CREATION = "1"; + /** + * ACS创建 + **/ + public static final String ACS_CREATION = "2"; + // 请求方向 + /** + * ACS->LMS + **/ + public static final String ACS_LMS = "1"; + /** + * LMS->ACS + **/ + public static final String LMS_ACS = "2"; + /** + * MES->LMS + **/ + public static final String MES_LMS = "3"; + /** + * LMS->MES + **/ + public static final String LMS_MES = "4"; + // 区域定义 + /** + * 料盅睏料线区域 + */ + public static final String LZKLX = "LZKLX"; + /** + * 干燥窑区域 + */ + public static final String GZY = "GZY"; + // 特殊: 1-缓存输送线入口,2-缓存输送线出口,3-上输送线,4-下输送线 + /** + * 上输送线 + */ + public static final String UPPER_CONVEYOR_LINE = "3"; + /** + * 下输送线 + */ + public static final String LOWER_CONVEYOR_LINE = "4"; + // 参数名称 + /** + * 是否连接 + */ + public static final String IS_CONNECT_ACS = "is_connect_acs"; + /** + * ACS路径 + */ + public static final String ACS_URL = "acs_url"; + /** + * 是否连接 + */ + public static final String IS_CONNECT_MES = "is_connect_mes"; + /** + * MES路径 + */ + public static final String MES_URL = "mes_url"; + // 完成/取消 + /** + * 任务完成 + */ + public static final String TASK_FINISH = "任务完成"; + /** + * 任务取消 + */ + public static final String TASK_CANCEL = "任务取消"; + /** + * 区域 - 分拣 + */ + public static final String AREA_FJ = "FJ"; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/task/core/TaskStatus.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/task/core/TaskStatus.java new file mode 100644 index 0000000..bec495a --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/task/core/TaskStatus.java @@ -0,0 +1,67 @@ +package org.nl.acs.sch.task_manage.task.core; + +public enum TaskStatus { + /** + * 申请 + */ + APPLY("1", "申请", "申请"), + /** + * 创建完成 + */ + CREATED("2", "创建完成", "创建完成"), + /** + * 下发 + */ + ISSUED("3", "下发", "下发"), + /** + * 执行中 + */ + EXECUTING("1", "执行中", "执行中"), + /** + * 完成 + */ + FINISHED("2", "完成", "完成"), + /** + * 已取消 + */ + CANCELED("6", "已取消", "已取消"), + /** + * 未完成 + */ + UNFINISHED("7", "未完成", "未完成"); + + + TaskStatus(String code, String name, String desc) { + this.code = code; + this.name = name; + this.desc = desc; + } + + private String code; + private String name; + private String desc; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/task/tasks/TaskFactory.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/task/tasks/TaskFactory.java new file mode 100644 index 0000000..f243f7c --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/sch/task_manage/task/tasks/TaskFactory.java @@ -0,0 +1,42 @@ +package org.nl.acs.sch.task_manage.task.tasks; + +import org.nl.acs.sch.task_manage.AbstractTask; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author ldjun + * @version 3.0 + * @date 2023年05月16日 16:42 + * @desc 2.0 采用获取注解来标识任务类型,并通过扫描和反射的方式来获取任务实例 + * 3.0 采用获取所有bean对象判断是否为AbstractTask + */ +@Component +public class TaskFactory implements BeanPostProcessor { + private final Map taskMap; + + @Autowired + public TaskFactory() { + taskMap = new HashMap<>(); + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof AbstractTask) { + taskMap.put(beanName, (AbstractTask) bean); + } + return bean; + } + + public AbstractTask getTask(String taskType) { + if (taskType == null) { + return null; + } + return taskMap.get(taskType); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java index 4a4ae49..74730f0 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java @@ -130,8 +130,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme private static final String BQHJ_TYPE = "6"; - - @Override public PageInfo queryAll(TaskQueryParam query, Pageable pageable) { IPage queryPage = PageUtil.toMybatisPage(pageable); @@ -477,10 +475,10 @@ public class TaskServiceImpl extends CommonServiceImpl impleme && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) .filter(task -> instructionService.findByTaskcodeAndStatus(task.getTask_code()) != null) .collect(Collectors.toList()); - if(CollUtil.isEmpty(collect)){ + if (CollUtil.isEmpty(collect)) { tasks.forEach( - task ->{ - if(TASK_TYPE.equals(task.getTask_type()) && StrUtil.isNotEmpty(task.getPut_device_code())){ + task -> { + if (TASK_TYPE.equals(task.getTask_type()) && StrUtil.isNotEmpty(task.getPut_device_code())) { Instruction instruction = instructionService.findByDeviceCodeFromCache(task.getNext_device_code()); if (ObjectUtil.isNotEmpty(instruction)) { if (StrUtil.equals(instruction.getStart_device_code(), device_code)) { @@ -507,10 +505,10 @@ public class TaskServiceImpl extends CommonServiceImpl impleme && StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) .filter(task -> instructionService.findByTaskcodeAndStatus(task.getTask_code()) != null) .collect(Collectors.toList()); - if(CollUtil.isEmpty(collect)){ + if (CollUtil.isEmpty(collect)) { tasks.forEach( - task ->{ - if(BQHJ_TYPE.equals(task.getTask_type()) && StrUtil.isNotEmpty(task.getPut_device_code())){ + task -> { + if (BQHJ_TYPE.equals(task.getTask_type()) && StrUtil.isNotEmpty(task.getPut_device_code())) { Instruction instruction = instructionService.findByDeviceCodeFromCache(task.getNext_device_code()); if (ObjectUtil.isNotEmpty(instruction)) { if (StrUtil.equals(instruction.getStart_device_code(), device_code)) { @@ -578,14 +576,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme @Override public void create(TaskDto dto) throws Exception { - dto = foramte(dto); - dto.setInteraction_json(ObjectUtil.isNotEmpty(dto.getInteractionJson()) ? dto.getInteractionJson().toJSONString() : ""); - if (!StrUtil.isEmpty(dto.getVehicle_code())) { - TaskDto vehicle_dto = this.findByContainer(dto.getVehicle_code()); - if (vehicle_dto != null) { - throw new BadRequestException(LangProcess.msg("task_checkExist", dto.getVehicle_code())); - } - } String currentUsername = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); String task_uuid = dto.getTask_id(); @@ -597,8 +587,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme task_code = CodeUtil.getNewCode("TASK_NO"); task_code = CommonFinalParam.HYPHEN_ + task_code; } - String start_point_code; - String next_point_code = dto.getNext_point_code(); String start_device_code = dto.getStart_device_code(); String next_device_code = dto.getNext_device_code(); String route_plan_code = dto.getRoute_plan_code(); @@ -609,28 +597,22 @@ public class TaskServiceImpl extends CommonServiceImpl impleme dto.setTask_code(task_code); dto.setRoute_plan_code(route_plan_code); dto.setTask_status(TaskStatusEnum.READY.getIndex()); - dto.setStart_device_code2(dto.getStart_point_code2()); - dto.setNext_device_code2(dto.getNext_point_code2()); + dto.setStart_point_code(start_device_code); + dto.setNext_point_code(next_device_code); if (StrUtil.isEmpty(dto.getPriority())) { dto.setPriority(CommonFinalParam.ONE); } String plan_code = dto.getRoute_plan_code(); - // 判断起点终点设备类型 - String startDeviceType = deviceAppService.findDeviceTypeByCode(dto.getStart_device_code()); - String nextDeviceType = deviceAppService.findDeviceTypeByCode(dto.getNext_device_code()); - // 同一排转库任务不做路由校验 - if (!(StrUtil.equals(DeviceType.storage.toString(), startDeviceType) && StrUtil.equals(DeviceType.storage.toString(), nextDeviceType) && StrUtil.equals(start_device_code, next_device_code))) { - if (routeLineService - .getShortPathLines(dto.getStart_device_code(), dto.getNext_device_code(), plan_code) - .size() - == 0) { - throw new BadRequestException(dto.getStart_point_code() + "->" + dto.getNext_point_code() + " " + LangProcess.msg("route_isNull")); - } + // 路由校验 + if (routeLineService + .getShortPathLines(dto.getStart_device_code(), dto.getNext_device_code(), plan_code) + .size() + == 0) { + throw new BadRequestException(dto.getStart_point_code() + "->" + dto.getNext_point_code() + " " + LangProcess.msg("route_isNull")); } - String createTaskCheck = paramService.findByCode(AcsConfig.CREATETASKCHECK).getValue(); - DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); Device nextdevice = appService.findDeviceByCode(next_device_code); if (nextdevice == null) { @@ -643,69 +625,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme throw new BadRequestException("起点设备未配置"); } dto.setMaterial(startdevice.getMaterial_type()); - if (StrUtil.equals(DeviceType.storage.toString(), startDeviceType)) { - start_point_code = start_device_code + CommonFinalParam.HYPHEN_ + dto.getFrom_y() + CommonFinalParam.HYPHEN_ + dto.getFrom_z(); - dto.setStart_point_code(start_point_code); - } - if (StrUtil.equals(DeviceType.storage.toString(), nextDeviceType)) { - next_point_code = next_device_code + CommonFinalParam.HYPHEN_ + dto.getTo_y() + CommonFinalParam.HYPHEN_ + dto.getTo_z(); - dto.setNext_point_code(next_point_code); - } - if (StrUtil.equals(createTaskCheck, CommonFinalParam.ONE)) { - // 判断起点为输送设备 - if (StrUtil.equals(DeviceType.conveyor.toString(), startDeviceType)) { - - } - - if (StrUtil.equals(DeviceType.conveyor.toString(), nextDeviceType)) { - } - } else { - // 判断起点为输送设备 - if (StrUtil.equals(DeviceType.conveyor.toString(), startDeviceType)) { - } - - if (StrUtil.equals(DeviceType.conveyor.toString(), nextDeviceType)) { - // if (nextdevice.getDeviceDriver() instanceof - // XgAgvCarDeviceDriver) { - // standardOrdinarySiteDeviceDriver = (XgAgvCarDeviceDriver) - // nextdevice.getDeviceDriver(); - // if (nextdevice.getHas_goods() != 0) { - // throw new Exception("任务终点需满足无货!"); - // } - // } - - JSONObject jo = new JSONObject(); - JSONObject jo2 = new JSONObject(); - if (!StrUtil.isEmpty(dto.getMaterial())) { - if (!StrUtil.equals(dto.getMaterial(), CommonFinalParam.ONE)) { - jo.put("hasGoodStatus", "2"); - jo.put("material_type", dto.getMaterial()); - } else { - jo.put("hasGoodStatus", CommonFinalParam.ONE); - jo.put("material_type", CommonFinalParam.ONE); - } - - } else { - jo.put("hasGoodStatus", CommonFinalParam.ONE); - jo.put("material_type", CommonFinalParam.ONE); - } - jo.put("device_code", dto.getStart_device_code()); - jo.put("quantity", dto.getQuantity()); - jo.put("remark", dto.getRemark()); - jo.put("batch", startdevice.getBatch()); - jo.put("islock", "true"); - deviceService.changeDeviceStatus(jo); - Device deviceByCode = deviceAppService.findDeviceByCode(dto.getNext_device_code()); - jo2.put("device_code", dto.getNext_device_code()); - jo2.put("hasGoodStatus", deviceByCode.getHas_goods()); - jo2.put("quantity", deviceByCode.getQuantity()); - jo2.put("remark", deviceByCode.getRemark()); - jo2.put("material_type", deviceByCode.getMaterial_type()); - jo2.put("batch", deviceByCode.getBatch()); - jo2.put("islock", "true"); - deviceService.changeDeviceStatus(jo2); - } - } Task entity = ConvertUtil.convert(dto, Task.class); taskMapper.insert(entity); tasks.add(dto); @@ -887,7 +806,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme //反馈上位系统任务状态 this.feedWmsTaskStatus(entity); //关闭仙工运单序列 - if (StrUtil.equals(task.getTask_type(), TaskTypeEnum.Standard_AGV_Task.getCode()) && (StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.One_NDC_System_Type.getCode()) || StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.XG_System_Type.getCode()))) { + if (StrUtil.equals(task.getTask_type(), TaskTypeEnum.Standard_AGV_Task.getCode())) { this.markComplete(entity); } } @@ -919,7 +838,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme //反馈上位系统任务状态 this.feedWmsTaskStatus(entity); //关闭仙工运单序列 - if(StrUtil.equals(task.getTask_type(),TaskTypeEnum.Standard_AGV_Task.getCode()) && (StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.One_NDC_System_Type.getCode())||StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.XG_System_Type.getCode()))) { + if (StrUtil.equals(task.getTask_type(), TaskTypeEnum.Standard_AGV_Task.getCode()) && (StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.One_NDC_System_Type.getCode()) || StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.XG_System_Type.getCode()))) { this.markComplete(entity); } } @@ -951,7 +870,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme //反馈上位系统任务状态 this.feedWmsTaskStatus(entity); //关闭仙工运单序列 - if(StrUtil.equals(task.getTask_type(),TaskTypeEnum.Standard_AGV_Task.getCode()) && (StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.One_NDC_System_Type.getCode())||StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.XG_System_Type.getCode()))) { + if (StrUtil.equals(task.getTask_type(), TaskTypeEnum.Standard_AGV_Task.getCode()) && (StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.One_NDC_System_Type.getCode()) || StrUtil.equals(task.getAgv_system_type(), AgvSystemTypeEnum.XG_System_Type.getCode()))) { this.markComplete(entity); } } @@ -995,7 +914,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme List shortPathsList = routeLineService.getShortPathLines( start_device_code, acsTask.getNext_device_code(), route_plan_code); - Device startDevice = deviceAppService.findDeviceByCode(start_device_code); RouteLineDto routeLineDto = shortPathsList.get(0); String path = routeLineDto.getPath(); String type = routeLineDto.getType(); @@ -1004,12 +922,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme int index = 0; for (int m = 0; m < pathlist.size(); m++) { if (pathlist.get(m).equals(start_device_code)) { - //起点为货架跳过堆垛机 - if (startDevice.getDeviceDriver() instanceof StandardStorageDeviceDriver) { - index = m + 2; - }else { - index = m + 1; - } + index = m + 1; break; } } @@ -1052,7 +965,6 @@ public class TaskServiceImpl extends CommonServiceImpl impleme instdto.setStart_height(start_height); instdto.setNext_height(next_height); instdto.setAgv_action_type(acsTask.getAgv_action_type()); - if (StrUtil.equals(agv_system_type, CommonFinalParam.TWO)) { // task_type //1、生箔; Itype=1:取空,取满,放空,放满; //2、分切 Itype=3取满、取空、放满、放空; @@ -1072,12 +984,9 @@ public class TaskServiceImpl extends CommonServiceImpl impleme } else { log.info("未找到对应的AGV指令类型,任务号:" + acsTask.getTask_code() + ",task_type:" + acsTask.getTask_type()); } - } else { - instdto.setAgv_inst_type("4"); - } instructionservice.create2(instdto); - acsTask.setTask_status(CommonFinalParam.ONE); - this.update(acsTask); +// acsTask.setTask_status(CommonFinalParam.ONE); +// this.update(acsTask); return instdto; } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/common/domain/query/PageQuery.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/common/domain/query/PageQuery.java index e268c0b..8e601c3 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/common/domain/query/PageQuery.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/common/domain/query/PageQuery.java @@ -4,7 +4,11 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; import org.apache.commons.lang3.StringUtils; import java.io.Serializable; diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/HandController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/HandController.java new file mode 100644 index 0000000..fd307b9 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/HandController.java @@ -0,0 +1,42 @@ +package org.nl.hand.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.sch.task.service.dto.WorkQuery; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.logging.annotation.Log; +import org.nl.hand.service.HandService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +/** + * @Author: tq + * @Description: 手持接口 + * @Date: 2024/10/15 + */ + +@Slf4j +@RestController + +@RequestMapping("/api/hand") +@SaIgnore +public class HandController { + @Autowired + private HandService handService; + + @PostMapping + @Log("配料作业查询") + public ResponseEntity query() { + return new ResponseEntity<>(handService.query(), HttpStatus.OK); + } + + @Log("确认配料作业") + @PostMapping(value = "/confirm") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(handService.confirm(whereJson),HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/MobileAuthorizationController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/MobileAuthorizationController.java similarity index 99% rename from acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/MobileAuthorizationController.java rename to acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/MobileAuthorizationController.java index 678b728..a6eee7f 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/MobileAuthorizationController.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/MobileAuthorizationController.java @@ -1,4 +1,4 @@ -package org.nl.hand.rest; +package org.nl.hand.controller; import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.secure.SaSecureUtil; diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/PdaController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/PdaController.java new file mode 100644 index 0000000..11704b8 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/controller/PdaController.java @@ -0,0 +1,94 @@ +package org.nl.hand.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.logging.annotation.Log; +import org.nl.hand.service.PdaService; +import org.nl.hand.service.dao.dto.PdaDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: tq + * @Description: 一体机接口 + * @Date: 2024/10/15 + */ +@Slf4j +@RestController + +@RequestMapping("/api/pda") +@SaIgnore +public class PdaController { + @Autowired + private PdaService pdaService; + + @PostMapping("/queryOrders") + @Log("工单查询") + public ResponseEntity queryOrders() { + return new ResponseEntity<>(pdaService.queryOrders(), HttpStatus.OK); + } + + @PostMapping("/queryWorks") + @Log("配料作业查询") + public ResponseEntity queryWorks() { + return new ResponseEntity<>(pdaService.queryWorks(), HttpStatus.OK); + } + + @PostMapping("/queryAllPoints") + @Log("查询所有点位") + @ApiOperation("查询所有点位") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity queryAllPoints() { + return new ResponseEntity<>(pdaService.queryAllPoints(), HttpStatus.OK); + } + + @Log("开始工单") + + @PostMapping("/startOrder") + public ResponseEntity startOrder(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaService.startOrder(whereJson),HttpStatus.OK); + } + + @Log("强制完成工单") + + @PostMapping("/forceFinish") + public ResponseEntity forceFinish(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaService.forceFinish(whereJson),HttpStatus.OK); + } + + @Log("下发配料作业") + @PostMapping(value = "/sendWork") + public ResponseEntity sendWork(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaService.sendWork(whereJson),HttpStatus.OK); + } + + @Log("补发配料作业") + @PostMapping(value = "/reSendWork") + public ResponseEntity reSendWork(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaService.reSendWork(whereJson),HttpStatus.OK); + } + + @Log("完成配料作业") + @PostMapping(value = "/finishWork") + public ResponseEntity finishWork(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaService.finishWork(whereJson),HttpStatus.OK); + } + + @PostMapping("/callTask") + @Log("生成退桶任务") + @ApiOperation("生成退桶任务") + @SaIgnore + //@PreAuthorize("@el.check('sect:list')") + public ResponseEntity callTask(@RequestBody PdaDto dto) { + return new ResponseEntity<>(pdaService.callTask(dto), HttpStatus.OK); + } + +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/B2HeadDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/B2HeadDto.java deleted file mode 100644 index 2988dec..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/B2HeadDto.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.nl.hand.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author : TuQiang - * @create 2024/4/15 13:59 - */ -@Data -public class B2HeadDto implements Serializable { - /** - * 起始设备编码1 - */ - private String start_device_code1; - - /** - * 目标设备编码1 - */ - private String next_device_code1; - - /** - * 起始设备编码2 - */ - private String start_device_code2; - - /** - * 目标设备编码2 - */ - private String next_device_code2; - - /** - * 任务类型 - */ - private String task_type; -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadDeviceDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadDeviceDto.java deleted file mode 100644 index 7fe53c2..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadDeviceDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.nl.hand.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author : TuQiang - * @create 2024/4/15 15:04 - */ -@Data -public class HeadDeviceDto implements Serializable { - /** - * 设备号 - */ - private String device_code; - - /** - * 操作类型 - * 0-禁止进出; - * 1-允许取放 - * 2-允许离开 - * - */ - private String option; -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadInstDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadInstDto.java deleted file mode 100644 index a061a14..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadInstDto.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.nl.hand.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author : TuQiang - * @create 2024/4/4 14:07 - */ -@Data -public class HeadInstDto implements Serializable { - /** - * 关键字 可为载具号、指令号、agv车号 - */ - private String keyword; - - /** - * 起始设备编码 - */ - private String start_devicecode; - - /** - * 目标设备编码 - */ - private String next_devicecode; - - /** - * 指令uuid - */ - private String inst_uuid; - - /** - * 操作类型 - * 1 指令撤销 - * 2 重新下发 - * 3 强制完成 - */ - private String type; -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadTaskDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadTaskDto.java deleted file mode 100644 index 89ff13c..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadTaskDto.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.nl.hand.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author : TuQiang - * @create 2024/4/4 16:06 - */ -@Data -public class HeadTaskDto implements Serializable { - /** - * 关键字 可为载具号、指令号、agv车号 - */ - private String keyword; - - /** - * 起始设备编码 - */ - private String start_devicecode; - - /** - * 目标设备编码 - */ - private String next_devicecode; - - /** - * 任务uuid - */ - private String task_uuid; - - /** - * 操作类型 - * 1 重新生成 - * 2 强制完成 - */ - private String type; -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/RegionDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/RegionDto.java deleted file mode 100644 index 9d3ea03..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/RegionDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.nl.hand.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author : TuQiang - * @create 2024/4/2 16:50 - */ -@Data -public class RegionDto implements Serializable { - /** - * 区域编号 - */ - private String region_code; -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/B2HandController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/B2HandController.java deleted file mode 100644 index 8d1c518..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/B2HandController.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.nl.hand.rest; - -import cn.dev33.satoken.annotation.SaIgnore; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.logging.annotation.Log; -import org.nl.hand.dto.B2HeadDto; -import org.nl.hand.dto.HeadDeviceDto; -import org.nl.hand.dto.RegionDto; -import org.nl.hand.service.B2HandService; -import org.nl.hand.service.HandService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @Author : TuQiang - * @create 2024/4/15 13:50 - */ -@RestController -@RequiredArgsConstructor -@Api(tags = "手持接口") -@RequestMapping("api/hands") -@Slf4j -public class B2HandController { - @Autowired - private B2HandService b2HandService; - - @Autowired - private HandService handService; - - @PostMapping("/queryArea") - @Log("查询区域") - @ApiOperation("查询区域") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity queryArea() { - return new ResponseEntity<>(handService.queryArea(), HttpStatus.OK); - } - - @PostMapping("/queryPointByArea") - @Log("根据区域编码查点位") - @ApiOperation("根据区域编码查点位") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity queryPointByArea(@RequestBody RegionDto dto) { - String region_code = dto.getRegion_code(); - return new ResponseEntity<>(handService.queryPointByArea(region_code), HttpStatus.OK); - } - - @PostMapping("/callTask") - @Log("手持创建任务") - @ApiOperation("手持创建任务") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity callTask(@RequestBody B2HeadDto dto) { - return new ResponseEntity<>(b2HandService.callTask(dto), HttpStatus.OK); - } - - @PostMapping("/queryDevices") - @Log("查询所有设备") - @ApiOperation("查询所有设备") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity queryDevices() { - return new ResponseEntity<>(b2HandService.queryDevices(), HttpStatus.OK); - } - - @PostMapping("/updateDeviceStatus") - @Log("更新设备状态") - @ApiOperation("更新设备状态") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity updateDeviceStatus(@RequestBody HeadDeviceDto dto) { - return new ResponseEntity<>(b2HandService.updateDeviceStatus(dto), HttpStatus.OK); - } -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/HandController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/HandController.java deleted file mode 100644 index 1a063cf..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/rest/HandController.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.nl.hand.rest; - -import cn.dev33.satoken.annotation.SaIgnore; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.common.logging.annotation.Log; -import org.nl.hand.dto.HeadDto; -import org.nl.hand.dto.HeadInstDto; -import org.nl.hand.dto.HeadTaskDto; -import org.nl.hand.dto.RegionDto; -import org.nl.hand.service.HandService; -import org.nl.system.service.dict.dao.Dict; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - * @Author : TuQiang - * @create 2024/4/2 10:18 - */ - -@RestController -@RequiredArgsConstructor -@Api(tags = "手持接口") -@RequestMapping("api/hand") -@Slf4j -public class HandController { - @Autowired - private HandService handService; - - @PostMapping("/queryArea") - @Log("查询区域") - @ApiOperation("查询区域") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity queryArea() { - return new ResponseEntity<>(handService.queryArea(), HttpStatus.OK); - } - - @PostMapping("/queryPointByArea") - @Log("根据区域编码查点位") - @ApiOperation("根据区域编码查点位") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity queryPointByArea(@RequestBody RegionDto dto) { - String region_code = dto.getRegion_code(); - return new ResponseEntity<>(handService.queryPointByArea(region_code), HttpStatus.OK); - } - - @PostMapping("/callTask") - @Log("手持创建任务") - @ApiOperation("手持创建任务") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity callTask(@RequestBody HeadDto dto) { - return new ResponseEntity<>(handService.callTask(dto), HttpStatus.OK); - } - - @PostMapping("/insts") - @Log("查询未完成指令") - @ApiOperation("查询未完成指令") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity queryInst(@RequestBody HeadInstDto dto) { - return new ResponseEntity<>(handService.queryInst(dto), HttpStatus.OK); - } - - @PostMapping("/inst") - @Log("指令操作") - @ApiOperation("指令操作") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity instOpt(@RequestBody HeadInstDto dto) throws Exception { - return new ResponseEntity<>(handService.instOpt(dto), HttpStatus.OK); - } - - @PostMapping("/tasks") - @Log("查询未完成指令") - @ApiOperation("查询未完成指令") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity querytasks(@RequestBody HeadTaskDto dto) { - return new ResponseEntity<>(handService.querytasks(dto), HttpStatus.OK); - } - - @PostMapping("/taskoperation") - @Log("指令操作") - @ApiOperation("指令操作") - @SaIgnore - //@PreAuthorize("@el.check('sect:list')") - public ResponseEntity taskOperation(@RequestBody HeadTaskDto dto) throws Exception { - return new ResponseEntity<>(handService.taskOperation(dto), HttpStatus.OK); - } -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/B2HandService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/B2HandService.java deleted file mode 100644 index f28bfaa..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/B2HandService.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.nl.hand.service; - -import org.nl.hand.dto.B2HeadDto; -import org.nl.hand.dto.HeadDeviceDto; - -import java.util.Map; - -/** - * @Author : TuQiang - * @create 2024/4/15 13:52 - */ -public interface B2HandService { - - /** - * 手持创建任务 - * - * @param dto - * @return - */ - Map callTask(B2HeadDto dto); - - Map queryDevices(); - - Map updateDeviceStatus(HeadDeviceDto dto); -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/HandService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/HandService.java index 2502e26..241339a 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/HandService.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/HandService.java @@ -1,38 +1,13 @@ package org.nl.hand.service; +import com.alibaba.fastjson.JSONObject; +import org.nl.hand.service.dao.vo.PdaResponseVo; +import org.nl.hand.service.vo.WorkVo; -import com.alibaba.fastjson.JSONArray; -import org.nl.acs.ext.wms.data.CreateHandTaskResponse; -import org.nl.hand.dto.HeadDto; -import org.nl.hand.dto.HeadInstDto; -import org.nl.hand.dto.HeadTaskDto; +import java.util.List; -import java.util.Map; - -/** - * @Author : TuQiang - * @create 2024/4/2 10:19 - */ public interface HandService { + List query(); - - Map queryPointByArea(String region_code); - - /** - * 手持创建任务 - * - * @param dto - * @return - */ - Map callTask(HeadDto dto); - - Map queryArea(); - - Map queryInst(HeadInstDto dto); - - Map instOpt(HeadInstDto dto) throws Exception; - - Map querytasks(HeadTaskDto dto); - - Map taskOperation(HeadTaskDto dto); + PdaResponseVo confirm(JSONObject whereJson); } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/PdaService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/PdaService.java new file mode 100644 index 0000000..15da096 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/PdaService.java @@ -0,0 +1,37 @@ +package org.nl.hand.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.sch.task.service.dao.Work; +import org.nl.hand.service.dao.dto.PdaDto; +import org.nl.hand.service.dao.vo.PdaResponseVo; +import org.nl.hand.service.vo.OrderVo; +import org.nl.hand.service.vo.WorkVo; + +import java.util.List; +import java.util.Map; + +public interface PdaService { + /** + * 工单查询 + * + * @return + */ + List queryOrders(); + + PdaResponseVo startOrder(JSONObject whereJson); + + PdaResponseVo forceFinish(JSONObject whereJson); + + List queryWorks(); + + PdaResponseVo sendWork(JSONObject whereJson); + + PdaResponseVo reSendWork(JSONObject whereJson); + + PdaResponseVo finishWork(JSONObject whereJson); + + JSONArray queryAllPoints(); + + Map callTask(PdaDto dto); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadDto.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/dto/PdaDto.java similarity index 68% rename from acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadDto.java rename to acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/dto/PdaDto.java index 35bc4b7..93d64b6 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/dto/HeadDto.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/dto/PdaDto.java @@ -1,16 +1,11 @@ -package org.nl.hand.dto; +package org.nl.hand.service.dao.dto; import lombok.Data; import java.io.Serializable; -/** - * @Author : TuQiang - * @create 2024/4/2 16:54 - */ @Data -public class HeadDto implements Serializable { - +public class PdaDto implements Serializable { /** * 起始设备编码 */ @@ -25,5 +20,4 @@ public class HeadDto implements Serializable { * 任务类型 */ private String task_type; - } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/mapper/PdaMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/mapper/PdaMapper.java new file mode 100644 index 0000000..2f2cfc1 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/mapper/PdaMapper.java @@ -0,0 +1,13 @@ +package org.nl.hand.service.dao.mapper; + +import org.nl.hand.service.vo.OrderVo; +import org.nl.hand.service.vo.WorkVo; + +import java.util.List; + +public interface PdaMapper { + + List getOrders(); + + List getWorks(); +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/mapper/PdaMapper.xml b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/mapper/PdaMapper.xml new file mode 100644 index 0000000..0e0b42e --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/mapper/PdaMapper.xml @@ -0,0 +1,35 @@ + + + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/vo/PdaResponseVo.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/vo/PdaResponseVo.java new file mode 100644 index 0000000..437dc8e --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/dao/vo/PdaResponseVo.java @@ -0,0 +1,23 @@ +package org.nl.hand.service.dao.vo; + + +import lombok.Data; + +/** + * @Author: tq + * @Description: 一体机返回 + * @Date: 2024/10/15 + */ +@Data +public class PdaResponseVo { + /** + * 先提供一个message + */ + private String message; + + public static PdaResponseVo pdaResultOk(String message) { + PdaResponseVo vo = new PdaResponseVo(); + vo.setMessage(message); + return vo; + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/B2HandServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/B2HandServiceImpl.java deleted file mode 100644 index 9f8f92a..0000000 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/B2HandServiceImpl.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.nl.hand.service.impl; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.common.base.CommonFinalParam; -import org.nl.acs.device.domain.Device; -import org.nl.acs.device.service.DeviceService; -import org.nl.acs.device_driver.conveyor.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; -import org.nl.acs.instruction.domain.Instruction; -import org.nl.acs.instruction.service.InstructionService; -import org.nl.acs.opc.DeviceAppService; -import org.nl.acs.task.service.TaskService; -import org.nl.acs.task.service.dto.TaskDto; -import org.nl.common.exception.BadRequestException; -import org.nl.hand.dto.B2HeadDto; -import org.nl.hand.dto.HeadDeviceDto; -import org.nl.hand.service.B2HandService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.util.List; -import java.util.Map; - -/** - * @Author : TuQiang - * @create 2024/4/15 13:52 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class B2HandServiceImpl implements B2HandService { - @Autowired - private TaskService taskserver; - @Autowired - private DeviceService deviceService; - @Autowired - private DeviceAppService deviceAppService; - @Autowired - private InstructionService instructionService; - - @Override - public Map callTask(B2HeadDto dto) { - JSONArray errArr = new JSONArray(); - String start_device_code = dto.getStart_device_code1(); - String next_device_code = dto.getNext_device_code1(); - String start_device_code2 = dto.getStart_device_code2(); - String next_device_code2 = dto.getNext_device_code2(); - String task_type = dto.getTask_type(); - - if (StrUtil.isEmpty(start_device_code)) { - throw new BadRequestException("起点1不能为空"); - } - if (StrUtil.isEmpty(next_device_code)) { - throw new BadRequestException("终点1不能为空"); - } - if (StrUtil.isEmpty(task_type)) { - throw new BadRequestException("任务类型不能为空"); - } - - JSONObject jo = new JSONObject(); - if (StrUtil.equals(task_type, CommonFinalParam.TYPE_ONE)) { - jo.put("start_device_code2", start_device_code2); - jo.put("next_device_code2", next_device_code2); - jo.put("start_point_code2", start_device_code2); - jo.put("next_point_code2", next_device_code2); - } else if (StrUtil.equals(task_type, CommonFinalParam.TYPE_TWO)) { - jo.put("start_device_code2", start_device_code2); - jo.put("next_device_code2", next_device_code2); - jo.put("start_point_code2", start_device_code2); - jo.put("next_point_code2", next_device_code2); - } - jo.put("start_device_code", start_device_code); - jo.put("next_device_code", next_device_code); - jo.put("start_point_code", start_device_code); - jo.put("next_point_code", next_device_code); - jo.put("task_type", task_type); - jo.put("route_plan_code","normal"); - jo.put("agv_system_type", "2"); - jo.put("priority", "1"); - - TaskDto task_dto = jo.toJavaObject(TaskDto.class); - try { - taskserver.create(task_dto); - } catch (Exception e) { -// e.printStackTrace(); - JSONObject json = new JSONObject(); - json.put("message", e.getMessage()); - errArr.add(json); - throw new RuntimeException(e.getMessage()); - } - JSONArray data = new JSONArray(); - JSONObject resultJson = new JSONObject(); - if (ObjectUtil.isEmpty(errArr)) { - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - } else { - resultJson.put("message", "操作失败"); - resultJson.put("data", data); - } - return resultJson; - } - - @Override - public Map queryDevices() { - JSONArray data = new JSONArray(); - //查询所有生箔区的设备 - List list = deviceService.lambdaQuery() - .eq(Device::getRegion, "1") - .list(); - if (CollectionUtil.isEmpty(list)) { - throw new BadRequestException("未查到该区域的设备!"); - } - - StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; - for (int i = 0; i < list.size(); i++) { - JSONObject jo = new JSONObject(); - Device device = list.get(i); - String device_id = device.getDevice_id(); - String device_code = device.getDevice_code(); - Device deviceCode = deviceAppService.findDeviceByCode(device_code); - int option = 0; - if (deviceCode.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) deviceCode.getDeviceDriver(); - option = standardOrdinarySiteDeviceDriver.getOption(); - } - String device_name = device.getDevice_name(); - BigDecimal seq_num = device.getSeq_num(); - jo.put("device_id", device_id); - jo.put("device_code", device_code); - jo.put("device_name", device_name); - jo.put("seq_num", seq_num); - jo.put("option", option); - data.add(jo); - } - JSONObject resultJson = new JSONObject(); - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - return resultJson; - } - - @Override - public Map updateDeviceStatus(HeadDeviceDto dto) { - JSONArray errArr = new JSONArray(); - String device_code = dto.getDevice_code(); - String option = dto.getOption(); - if (StrUtil.isEmpty(device_code)) { - throw new BadRequestException("设备号不能为空"); - } - if (StrUtil.isEmpty(option)) { - throw new BadRequestException("操作不能为空"); - } - //满轴位允许进入,空轴位允许离开 - if (device_code.contains("M")&&(!"1".equals(option))){ - throw new BadRequestException("该设备为满轴位,不能进行该操作"); - } - if (device_code.contains("K")&&(!"2".equals(option))){ - throw new BadRequestException("该设备为空轴位,不能进行该操作"); - } - StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; - Device device = deviceAppService.findDeviceByCode(device_code); - if (ObjectUtil.isEmpty(device)){ - JSONObject json = new JSONObject(); - json.put("message", "设备不存在!"); - errArr.add(json); - } - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - standardOrdinarySiteDeviceDriver.setOption(Integer.parseInt(option)); - JSONArray data = new JSONArray(); - JSONObject resultJson = new JSONObject(); - if (ObjectUtil.isEmpty(errArr)) { - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - } else { - resultJson.put("message", "操作失败"); - resultJson.put("data", data); - } - return resultJson; - } -} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/HandServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/HandServiceImpl.java index 2ab1831..b82e0f2 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/HandServiceImpl.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/HandServiceImpl.java @@ -1,459 +1,39 @@ package org.nl.hand.service.impl; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.agv.server.AgvService; -import org.nl.acs.agv.server.NDCAgvService; -import org.nl.acs.common.base.CommonFinalParam; -import org.nl.acs.device.domain.Device; -import org.nl.acs.device.service.DeviceService; -import org.nl.acs.ext.wms.data.CreateHandTaskRequest; -import org.nl.acs.ext.wms.data.CreateHandTaskResponse; -import org.nl.acs.ext.wms.data.JsonUtl; -import org.nl.acs.instruction.domain.Instruction; -import org.nl.acs.instruction.domain.InstructionMybatis; -import org.nl.acs.instruction.service.InstructionService; -import org.nl.acs.instruction.service.dto.InstructionDto; -import org.nl.acs.opc.DeviceAppService; -import org.nl.acs.opc.DeviceAppServiceImpl; -import org.nl.acs.task.domain.Task; -import org.nl.acs.task.enums.TaskStatusEnum; -import org.nl.acs.task.service.TaskService; -import org.nl.acs.task.service.dto.TaskDto; -import org.nl.acs.task.service.dto.TaskIdAndStatusDTO; -import org.nl.common.exception.BadRequestException; -import org.nl.common.utils.CodeUtil; -import org.nl.config.SpringContextHolder; -import org.nl.hand.dto.HeadDto; -import org.nl.hand.dto.HeadInstDto; -import org.nl.hand.dto.HeadTaskDto; +import org.nl.acs.sch.task.service.WorkService; +import org.nl.acs.sch.task.service.dao.Work; import org.nl.hand.service.HandService; -import org.nl.system.service.dict.ISysDictService; -import org.nl.system.service.dict.dao.Dict; +import org.nl.hand.service.PdaService; +import org.nl.hand.service.dao.vo.PdaResponseVo; +import org.nl.hand.service.vo.WorkVo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -/** - * @Author : TuQiang - * @create 2024/4/2 10:20 - */ -@Service -@RequiredArgsConstructor @Slf4j -public class HandServiceImpl implements HandService { - - @Autowired - private DeviceService deviceService; - @Autowired - private TaskService taskserver; - @Autowired - private ISysDictService dictService; - @Autowired - private InstructionService instructionService; +@Service +public class HandServiceImpl implements HandService { @Autowired - NDCAgvService ndcAgvService; + private PdaService pdaService; @Autowired - DeviceAppService deviceAppService; - + private WorkService workService; @Override - public Map queryPointByArea(String region_code) { - JSONArray data = new JSONArray(); - if (StrUtil.isEmpty(region_code)) { - throw new BadRequestException("区域编码不能为空!"); - } - - //根据区域编码查询所有设备 - List list = deviceService.lambdaQuery() - .eq(Device::getRegion, region_code) - .list(); - if (CollectionUtil.isEmpty(list)) { - throw new BadRequestException("未查到该区域的设备!"); - } - for (int i = 0; i < list.size(); i++) { - JSONObject jo = new JSONObject(); - Device device = list.get(i); - String device_id = device.getDevice_id(); - String device_code = device.getDevice_code(); - String device_name = device.getDevice_name(); - BigDecimal seq_num = device.getSeq_num(); - jo.put("device_id", device_id); - jo.put("device_code", device_code); - jo.put("device_name", device_name); - jo.put("seq_num", seq_num); - data.add(jo); - } - JSONObject resultJson = new JSONObject(); - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - return resultJson; + public List query() { + return pdaService.queryWorks(); } @Override - public Map callTask(HeadDto dto) { - JSONArray errArr = new JSONArray(); - String start_device_code = dto.getStart_device_code(); - String next_device_code = dto.getNext_device_code(); - String task_type = dto.getTask_type(); - - if (StrUtil.isEmpty(start_device_code)) { - throw new BadRequestException("起点不能为空"); - } - if (StrUtil.isEmpty(next_device_code)) { - throw new BadRequestException("终点不能为空"); - } - if (StrUtil.isEmpty(task_type)) { - throw new BadRequestException("任务类型不能为空"); - } - - String start_device_code2 = ""; - String next_device_code2 = ""; - JSONObject jo = new JSONObject(); - if (StrUtil.equals(task_type, CommonFinalParam.TYPE_ONE)) { - String s = start_device_code.substring(start_device_code.length() - 1); - if (StrUtil.equals("K", s)) { - start_device_code2 = next_device_code.substring(0, next_device_code.length() - 1) + "M"; - next_device_code2 = start_device_code.substring(0, start_device_code.length() - 1) + "M"; - jo.put("start_device_code2", start_device_code2); - jo.put("next_device_code2", next_device_code2); - jo.put("start_point_code2", start_device_code2); - jo.put("next_point_code2", next_device_code2); - }else{ - throw new BadRequestException("起点设备名称不符"); - } - } else if (StrUtil.equals(task_type, CommonFinalParam.TYPE_TWO)) { - String s = start_device_code.substring(start_device_code.length() - 1); - String n = next_device_code.substring(next_device_code.length() - 1); - if (StrUtil.equals("M", s) && StrUtil.equals("M", n)) { - start_device_code2 = next_device_code.substring(0, next_device_code.length() - 1) + "K"; - next_device_code2 = start_device_code.substring(0, start_device_code.length() - 1) + "K"; - jo.put("start_device_code2", start_device_code2); - jo.put("next_device_code2", next_device_code2); - jo.put("start_point_code2", start_device_code2); - jo.put("next_point_code2", next_device_code2); - }else if(StrUtil.equals("S", n) && StrUtil.equals("M", s)){ - start_device_code2 = next_device_code.substring(0, next_device_code.length() - 1) + "X"; - next_device_code2 = start_device_code.substring(0, start_device_code.length() - 1) + "K"; - jo.put("start_device_code2", start_device_code2); - jo.put("next_device_code2", next_device_code2); - jo.put("start_point_code2", start_device_code2); - jo.put("next_point_code2", next_device_code2); - }else{ - throw new BadRequestException("起点设备名称不符"); - } - } - Device startDevice = deviceAppService.findDeviceByCode(start_device_code2); - Device nextDevice = deviceAppService.findDeviceByCode(next_device_code2); - if(StrUtil.isAllNotEmpty(start_device_code2,next_device_code2) && ObjectUtil.isAllEmpty(startDevice,nextDevice)){ - throw new BadRequestException("起点终点设备不存在"); - } - jo.put("start_device_code", start_device_code); - jo.put("next_device_code", next_device_code); - jo.put("start_point_code", start_device_code); - jo.put("next_point_code", next_device_code); - jo.put("task_type", task_type); - jo.put("agv_system_type", "2"); - jo.put("priority", "1"); - - TaskDto task_dto = jo.toJavaObject(TaskDto.class); - try { - taskserver.create(task_dto); - } catch (Exception e) { -// e.printStackTrace(); - JSONObject json = new JSONObject(); - json.put("message", e.getMessage()); - errArr.add(json); - throw new RuntimeException(e.getMessage()); - } - JSONArray data = new JSONArray(); - JSONObject resultJson = new JSONObject(); - if (ObjectUtil.isEmpty(errArr)) { - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - } else { - resultJson.put("message", "操作失败"); - resultJson.put("data", data); - } - return resultJson; - } - - @Override - public Map queryArea() { - JSONArray data = new JSONArray(); - List list = dictService.lambdaQuery() - .eq(Dict::getCode, "region_type") - .list(); - if (CollectionUtil.isEmpty(list)) { - throw new BadRequestException("未查到该区域的设备!"); - } - for (int i = 0; i < list.size(); i++) { - JSONObject jo = new JSONObject(); - Dict dict = list.get(i); - String region_id = dict.getDict_id(); - String region_code = dict.getValue(); - String region_name = dict.getLabel(); - jo.put("region_id", region_id); - jo.put("region_code", region_code); - jo.put("region_name", region_name); - data.add(jo); - } - JSONObject resultJson = new JSONObject(); - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - return resultJson; - } - - @Override - public Map queryInst(HeadInstDto dto) { - //查询未完成的指令 - String key = dto.getKeyword(); - String start_point = dto.getStart_devicecode(); - String next_point = dto.getNext_devicecode(); - - List list; - if (StrUtil.isEmpty(key)&&StrUtil.isEmpty(start_point)&&StrUtil.isEmpty(next_point)){ - list = instructionService.lambdaQuery() - .orderByDesc(InstructionMybatis::getCreate_time) - .list(); - }else { - list = instructionService.lambdaQuery() - .like(InstructionMybatis::getStart_device_code, start_point) - .like(InstructionMybatis::getNext_device_code, next_point) - .ne(InstructionMybatis::getInstruction_status, "2") - .eq(InstructionMybatis::getInstruction_code, key) - .or() - .eq(InstructionMybatis::getCarno, key) - .or() - .eq(InstructionMybatis::getVehicle_code, key) - .orderByDesc(InstructionMybatis::getCreate_time) - .list(); - } - if (CollectionUtil.isEmpty(list)){ - throw new BadRequestException("没有指令存在!"); - } - JSONArray data = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - JSONObject inst = new JSONObject(); - inst.put("inst_uuid",list.get(i).getInstruction_id()); - inst.put("task_no",list.get(i).getTask_code()); - inst.put("instruction_code",list.get(i).getInstruction_code()); - inst.put("start_devicecode",list.get(i).getStart_device_code()); - inst.put("next_devicecode",list.get(i).getNext_device_code()); - inst.put("inst_status",list.get(i).getInstruction_status()); - inst.put("carrier",list.get(i).getVehicle_code()); - inst.put("inst_step",list.get(i).getExecute_message()); - inst.put("priority",list.get(i).getPriority()); - inst.put("create_time",list.get(i).getCreate_time()); - inst.put("carno",list.get(i).getCarno()); - data.add(inst); - } - JSONObject resultJson = new JSONObject(); - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - return resultJson; - } - - @Override - public Map instOpt(HeadInstDto dto) throws Exception { - JSONObject resultJson = new JSONObject(); - JSONArray data = new JSONArray(); - String type = dto.getType(); - String inst_uuid = dto.getInst_uuid(); - InstructionMybatis instruction= instructionService.lambdaQuery() - .eq(InstructionMybatis::getInstruction_id, inst_uuid) - .one(); - if(instruction==null){ - resultJson.put("message", "未找到该指令!"); - resultJson.put("data", data); - return resultJson; - } - if (StrUtil.equals(instruction.getInstruction_status(),"2")|| - StrUtil.equals(instruction.getInstruction_status(),"3")){ - resultJson.put("message", "指令已完成或已取消,无法操作!"); - resultJson.put("data", data); - return resultJson; - } - - /* 1 指令撤销 - 2 重新下发 - 3 强制完成*/ - if ("1".equals(type)){ - try { - if (StrUtil.isEmpty(instruction.getAgv_jobno())){ - instructionService.cancelNOSendAgv(inst_uuid); - }else { - ndcAgvService.deleteAgvInstToNDC(BeanUtil.copyProperties(instruction, Instruction.class)); - } - } catch (Exception e) { - resultJson.put("message", "下发agv失败!"); - resultJson.put("data", data); - return resultJson; - } - }else if ("2".equals(type)){ - try { - ndcAgvService.sendAgvInstToNDC(instruction.getAgv_system_type(),BeanUtil.copyProperties(instruction, Instruction.class)); - } catch (Exception e) { - resultJson.put("message", "下发agv失败!"); - resultJson.put("data", data); - return resultJson; - } - }else if ("3".equals(type)){ - try { - instructionService.finish(inst_uuid); - } catch (Exception e) { - resultJson.put("message", e.getMessage()); - resultJson.put("data", data); - return resultJson; - } - } - - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - return resultJson; - } - - @Override - public Map querytasks(HeadTaskDto dto) { - String key = dto.getKeyword(); - String start_point = dto.getStart_devicecode(); - String next_point = dto.getNext_devicecode(); - - List list; - if (StrUtil.isEmpty(key)&&StrUtil.isEmpty(start_point)&&StrUtil.isEmpty(next_point)){ - list = taskserver.lambdaQuery() - .orderByDesc(Task::getCreate_time) - .list(); - }else { - list = taskserver.lambdaQuery() - .like(Task::getStart_device_code, start_point) - .like(Task::getNext_device_code, next_point) - .lt(Task::getTask_status, "2") - .eq(Task::getTask_code, key) - .or() - .eq(Task::getVehicle_code, key) - .or() - .eq(Task::getTask_id, key) - .orderByDesc(Task::getCreate_time) - .list(); - } - if (CollectionUtil.isEmpty(list)){ - throw new BadRequestException("没有指令存在!"); - } - JSONArray data = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - JSONObject task = new JSONObject(); - task.put("task_uuid",list.get(i).getTask_id()); - task.put("task_no",list.get(i).getTask_code()); - task.put("start_devicecode",list.get(i).getStart_device_code()); - task.put("next_devicecode",list.get(i).getNext_device_code()); - task.put("task_status",list.get(i).getTask_status()); - task.put("priority",list.get(i).getPriority()); - task.put("create_time",list.get(i).getCreate_time()); - task.put("carrier",list.get(i).getVehicle_code()); - data.add(task); - } - JSONObject resultJson = new JSONObject(); - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - return resultJson; - } - - @Override - public Map taskOperation(HeadTaskDto dto) { - JSONObject resultJson = new JSONObject(); - JSONArray data = new JSONArray(); - String type = dto.getType(); - String task_uuid = dto.getTask_uuid(); - if (StrUtil.isEmpty(type)){ - throw new BadRequestException("操作类型不能为空!"); - } - if (StrUtil.isEmpty(task_uuid)){ - throw new BadRequestException("id不能为空!"); - } - TaskDto taskDto = taskserver.findById(task_uuid); - if (BeanUtil.isEmpty(taskDto)){ - throw new BadRequestException("任务为空!"); - } - String task_code = taskDto.getTask_code(); - String start_device_code = taskDto.getStart_device_code(); - String next_device_code = taskDto.getNext_device_code(); - String task_id = taskDto.getTask_id(); - - if(StrUtil.equals(taskDto.getTask_status(),"2")||StrUtil.equals(taskDto.getTask_status(),"3")){ - resultJson.put("message", "任务已完成或已取消,无法操作"); - resultJson.put("data", data); - return resultJson; - } - if ("1".equals(type)){ - //重新生成指令 - Instruction instdto = new Instruction(); - instdto.setInstruction_id(IdUtil.simpleUUID()); - instdto.setInstruction_code(CodeUtil.getNewCode("INSTRUCT_NO")); - instdto.setRemark(taskDto.getRemark()); - instdto.setMaterial(taskDto.getMaterial()); - instdto.setTask_id(task_id); - instdto.setTask_code(task_code); - instdto.setVehicle_code(taskDto.getVehicle_code()); - String now = DateUtil.now(); - instdto.setCreate_time(now); - instdto.setCreate_by("auto"); - instdto.setStart_point_code(taskDto.getStart_point_code()); - instdto.setNext_point_code(taskDto.getNext_point_code()); - instdto.setStart_device_code(start_device_code); - instdto.setNext_device_code(next_device_code); - instdto.setInstruction_status("0"); - InstructionMybatis instructionMybatis = instructionService.lambdaQuery() - .eq(InstructionMybatis::getStart_device_code, start_device_code) - .eq(InstructionMybatis::getNext_device_code, next_device_code) - .lt(InstructionMybatis::getInstruction_status, "2") - .eq(InstructionMybatis::getTask_id,task_uuid) - .one(); - if (BeanUtil.isNotEmpty(instructionMybatis)){ - resultJson.put("message", task_code + ":该任务已存在待完成指令!"); - resultJson.put("data", data); - return resultJson; - } - try{ - instructionService.create(instdto); - } catch (Exception e){ - resultJson.put("message", e.getMessage()); - resultJson.put("data", data); - return resultJson; - } - instdto.setExecute_code(start_device_code); - }else if ("2".equals(type)){ - //强制完成 - Instruction instruction = instructionService.findByTaskid(task_uuid, "instruction_status <2 "); - if (instruction!=null){ - resultJson.put("message", "有指令未完成!"); - resultJson.put("data", data); - return resultJson; - } - TaskIdAndStatusDTO taskIdAndStatusDTO = new TaskIdAndStatusDTO(); - taskIdAndStatusDTO.setTask_id(task_uuid); - taskIdAndStatusDTO.setTask_status(TaskStatusEnum.FINISHED.getIndex()); - taskserver.finish(taskIdAndStatusDTO); + public PdaResponseVo confirm(JSONObject whereJson) { + Work work = workService.findByCode(whereJson.getString("work_code")); + if (work != null){ + return PdaResponseVo.pdaResultOk("配料作业不存在"); } - resultJson.put("message", "操作成功"); - resultJson.put("data", data); - return resultJson; + workService.confirm(work.getWork_id()); + return PdaResponseVo.pdaResultOk("配料作业确认成功"); } } diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/PdaServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/PdaServiceImpl.java new file mode 100644 index 0000000..95d5af6 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/impl/PdaServiceImpl.java @@ -0,0 +1,190 @@ +package org.nl.hand.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.domain.Device; +import org.nl.acs.device.service.DeviceService; +import org.nl.acs.order.service.OrderService; +import org.nl.acs.order.service.dto.OrderDto; +import org.nl.acs.sch.task.service.WorkService; +import org.nl.acs.sch.task.service.dao.Work; +import org.nl.acs.sch.task_manage.task.core.TaskStatus; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.common.exception.BadRequestException; +import org.nl.common.utils.SecurityUtils; +import org.nl.config.language.LangProcess; +import org.nl.hand.service.PdaService; +import org.nl.hand.service.dao.dto.PdaDto; +import org.nl.hand.service.dao.mapper.PdaMapper; +import org.nl.hand.service.dao.vo.PdaResponseVo; +import org.nl.hand.service.vo.OrderVo; +import org.nl.hand.service.vo.WorkVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Slf4j +@Service +public class PdaServiceImpl implements PdaService { + @Autowired + private PdaMapper pdaMapper; + @Autowired + private OrderService orderService; + @Autowired + private WorkService workService; + @Autowired + private DeviceService deviceService; + @Autowired + private TaskService taskserver; + + @Override + public List queryOrders() { + return pdaMapper.getOrders(); + } + + @Override + public PdaResponseVo startOrder(JSONObject whereJson) { + String mfg_order_name = whereJson.getString("mfg_order_name"); + OrderDto dto = orderService.findByCode(mfg_order_name); + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + dto.setStatus("1"); + dto.setRealstart_time(DateUtil.now()); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(currentUsername); + dto.setUpdate_time(DateUtil.now()); + orderService.updateById(dto); + return PdaResponseVo.pdaResultOk("工单:[" + dto.getMfg_order_name() + "]已开始"); + } + + @Override + public PdaResponseVo forceFinish(JSONObject whereJson) { + String mfg_order_name = whereJson.getString("mfg_order_name"); + OrderDto dto = orderService.findByCode(mfg_order_name); + String currentUserId = SecurityUtils.getCurrentUserId(); + String currentUsername = SecurityUtils.getCurrentUsername(); + dto.setStatus("2"); + dto.setRealstart_time(DateUtil.now()); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(currentUsername); + dto.setUpdate_time(DateUtil.now()); + orderService.updateById(dto); + return PdaResponseVo.pdaResultOk("工单:[" + dto.getMfg_order_name() + "]已强制完成"); + } + + @Override + public List queryWorks() { + return pdaMapper.getWorks(); + } + + @Override + public PdaResponseVo sendWork(JSONObject whereJson) { + String work_code = whereJson.getString("work_code"); + Work work = workService.findByCode(work_code); + if (work == null) { + return PdaResponseVo.pdaResultOk("配料作业不存在"); + } + workService.send(work.getWork_id()); + return PdaResponseVo.pdaResultOk("下发成功"); + } + + @Override + public PdaResponseVo reSendWork(JSONObject whereJson) { + String work_code = whereJson.getString("work_code"); + Work work = workService.findByCode(work_code); + if (work == null) { + return PdaResponseVo.pdaResultOk("配料作业不存在"); + } + work.setRemain_num(work.getRemain_num() + whereJson.getIntValue("count")); + work.setRequire_num(work.getRequire_num() + whereJson.getIntValue("count")); + workService.updateById(work); + return PdaResponseVo.pdaResultOk("补发成功"); + } + + @Override + public PdaResponseVo finishWork(JSONObject whereJson) { + String work_code = whereJson.getString("work_code"); + Work work = workService.findByCode(work_code); + if (work == null) { + return PdaResponseVo.pdaResultOk("配料作业不存在"); + } + work.setStatus(TaskStatus.FINISHED.getCode()); + workService.updateById(work); + return PdaResponseVo.pdaResultOk("完成配料作业成功"); + } + + @Override + public JSONArray queryAllPoints() { + //查询所有设备 + List list = deviceService.lambdaQuery() + .list(); + if (CollectionUtil.isEmpty(list)) { + throw new BadRequestException(LangProcess.msg("error_no_regional")); + } + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(list)); + JSONArray result = new JSONArray(); + for (int i = 0; i < arr.size(); i++) { + JSONObject obj = arr.getJSONObject(i); + JSONObject json = new JSONObject(); + json.put("device_code", obj.getString("device_code")); + json.put("device_name", obj.getString("device_name")); + result.add(json); + } + return result; + } + + @Override + public Map callTask(PdaDto dto) { + JSONArray errArr = new JSONArray(); + String start_device_code = dto.getStart_device_code(); + String next_device_code = dto.getNext_device_code(); + String task_type = dto.getTask_type(); + + if (StrUtil.isEmpty(start_device_code)) { + throw new BadRequestException("起点不能为空"); + } + if (StrUtil.isEmpty(next_device_code)) { + throw new BadRequestException("终点不能为空"); + } + if (StrUtil.isEmpty(task_type)) { + throw new BadRequestException("任务类型不能为空"); + } + JSONObject jo = new JSONObject(); + jo.put("start_device_code", start_device_code); + jo.put("next_device_code", next_device_code); + jo.put("start_point_code", start_device_code); + jo.put("next_point_code", next_device_code); + jo.put("task_type", task_type); + jo.put("priority", "1"); + + TaskDto task_dto = jo.toJavaObject(TaskDto.class); + try { + taskserver.create(task_dto); + } catch (Exception e) { +// e.printStackTrace(); + JSONObject json = new JSONObject(); + json.put("message", e.getMessage()); + errArr.add(json); + throw new RuntimeException(e.getMessage()); + } + JSONArray data = new JSONArray(); + JSONObject resultJson = new JSONObject(); + if (ObjectUtil.isEmpty(errArr)) { + resultJson.put("message", "操作成功"); + resultJson.put("data", data); + } else { + resultJson.put("message", "操作失败"); + resultJson.put("data", data); + } + return resultJson; + } +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/vo/OrderVo.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/vo/OrderVo.java new file mode 100644 index 0000000..3034ff1 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/vo/OrderVo.java @@ -0,0 +1,20 @@ +package org.nl.hand.service.vo; + +import lombok.Data; + +/** + * @Author: tq + * @Description: 工单查询 + * @Date: 2024/10/15 + */ +@Data +public class OrderVo { + //工单号 + private String mfg_order_name; + private String product_name; + private String description; + private String resource_name; + private float total_qty; + private String status; + private String create_name; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/vo/WorkVo.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/vo/WorkVo.java new file mode 100644 index 0000000..d522450 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/hand/service/vo/WorkVo.java @@ -0,0 +1,21 @@ +package org.nl.hand.service.vo; + +import lombok.Data; + +/** + * @Author: tq + * @Description: 配料作业查询 + * @Date: 2024/10/15 + */ +@Data +public class WorkVo { + private int seq_no; + private String work_code; + private String mfg_order_name; + private String material_name; + private float qty; + private String resource_name; + private int require_num; + private int remain_num; + private String status; +} diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/monitor/MonitorController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/monitor/MonitorController.java index f5d73e8..e5ed7de 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/monitor/MonitorController.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/monitor/MonitorController.java @@ -39,7 +39,6 @@ public class MonitorController { private final MonitorService serverService; @GetMapping - @SaCheckPermission("monitor:list") public ResponseEntity query() { return new ResponseEntity<>(serverService.getServers(),HttpStatus.OK); diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java index 7ad71a8..1c62bd5 100644 --- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java +++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java @@ -46,7 +46,7 @@ public class AutoCreateInst { * 创建指令前需要判断是否条件具备:起始位置是否有货、目标位置是否有货 */ public void run() throws Exception { - log.info("自动生成指令"+DateUtil.now()); + log.info("自动生成指令" + DateUtil.now()); TaskService taskserver = SpringContextHolder.getBean(TaskService.class); InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class); @@ -66,7 +66,6 @@ public class AutoCreateInst { String task_type = acsTask.getTask_type(); String vehiclecode = acsTask.getVehicle_code(); String vehiclecode2 = acsTask.getVehicle_code2(); - String storage_task_type = acsTask.getStorage_task_type(); String priority = acsTask.getPriority(); String is_send = acsTask.getIs_send(); @@ -153,10 +152,6 @@ public class AutoCreateInst { instdto.setNext_device_code(next_device_code); instdto.setNext_point_code(next_point_code); - instdto.setStart_point_code2(start_point_code2); - instdto.setStart_device_code2(start_device_code2); - instdto.setNext_point_code2(next_point_code2); - instdto.setNext_device_code2(next_device_code2); instdto.setPriority(priority); instdto.setInstruction_status(InstructionStatusEnum.READY.getIndex()); @@ -170,32 +165,28 @@ public class AutoCreateInst { //1、1楼叉车系统 //2、2楼1区域AGV系统 //3、2楼2区域AGV系统 -已废弃 - if (StrUtil.equals(agv_system_type, CommonFinalParam.TWO)) { - // task_type - //1、生箔; Itype=1:取空,取满,放空,放满; - //2、分切 Itype=3取满、取空、放满、放空; - //3、普通任务 Itype=2:取货、放货; - //4、叉车任务 - //5、输送任务 - //6、行架 - //7、立库 - if (StrUtil.equals(task_type, CommonFinalParam.ONE)) { - instdto.setAgv_inst_type(CommonFinalParam.ONE); - } else if (StrUtil.equals(task_type, "3")) { - instdto.setAgv_inst_type("2"); - } else if (StrUtil.equals(task_type, "2")) { - instdto.setAgv_inst_type("3"); - } else if (StrUtil.equals(task_type, "8")) { - instdto.setAgv_inst_type("2"); - } else { - log.info("未找到对应的AGV指令类型,任务号:" + acsTask.getTask_code() + ",task_type:" + acsTask.getTask_type()); - continue; - } + // task_type + //1、生箔; Itype=1:取空,取满,放空,放满; + //2、分切 Itype=3取满、取空、放满、放空; + //3、普通任务 Itype=2:取货、放货; + //4、叉车任务 + //5、输送任务 + //6、行架 + //7、立库 + if (StrUtil.equals(task_type, CommonFinalParam.ONE)) { + instdto.setAgv_inst_type(CommonFinalParam.ONE); + } else if (StrUtil.equals(task_type, "3")) { + instdto.setAgv_inst_type("2"); + } else if (StrUtil.equals(task_type, "2")) { + instdto.setAgv_inst_type("3"); + } else if (StrUtil.equals(task_type, "8")) { + instdto.setAgv_inst_type("2"); } else { - instdto.setAgv_inst_type("4"); + log.info("未找到对应的AGV指令类型,任务号:" + acsTask.getTask_code() + ",task_type:" + acsTask.getTask_type()); + continue; } try { - instructionService.create(instdto); + instructionService.create(instdto); } catch (Exception e) { acsTask.setRemark(e.getMessage()); taskserver.updateByCodeFromCache(acsTask); @@ -208,9 +199,9 @@ public class AutoCreateInst { continue; } //创建指令后修改任务状态 - acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); - acsTask.setUpdate_time(DateUtil.now()); - taskserver.update(acsTask); + acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); + acsTask.setUpdate_time(DateUtil.now()); + taskserver.update(acsTask); } } diff --git a/acs/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml b/acs/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml index 1f62735..3bd0328 100644 --- a/acs/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml +++ b/acs/nladmin-system/nlsso-server/src/main/resources/config/application-dev.yml @@ -10,7 +10,7 @@ spring: driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy # url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:stand_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:lzhl_two_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:lzhl_two_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:niudixiya_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: ${DB_USER:root} # password: ${DB_PWD:Root.123456} diff --git a/acs/nladmin-system/nlsso-server/src/main/resources/config/application.yml b/acs/nladmin-system/nlsso-server/src/main/resources/config/application.yml index 2b5b26b..c01f42d 100644 --- a/acs/nladmin-system/nlsso-server/src/main/resources/config/application.yml +++ b/acs/nladmin-system/nlsso-server/src/main/resources/config/application.yml @@ -154,6 +154,9 @@ mybatis-plus: db-config: id-type: INPUT banner: false +mybatis: + configuration: + map-underscore-to-camel-case: true lucene: index: diff --git a/acs/nladmin-system/nlsso-server/src/main/resources/mapper/MaterialbaseMapper.xml b/acs/nladmin-system/nlsso-server/src/main/resources/mapper/MaterialbaseMapper.xml new file mode 100644 index 0000000..615bb94 --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/resources/mapper/MaterialbaseMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/acs/nladmin-system/nlsso-server/src/main/resources/mapper/ProductdtlMapper.xml b/acs/nladmin-system/nlsso-server/src/main/resources/mapper/ProductdtlMapper.xml new file mode 100644 index 0000000..19e744b --- /dev/null +++ b/acs/nladmin-system/nlsso-server/src/main/resources/mapper/ProductdtlMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/acs/nladmin-ui/src/assets/images/1.png b/acs/nladmin-ui/src/assets/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..65d44085bcd624e1bb7b854fcaac8ca54fdd9a7e GIT binary patch literal 90229 zcmXt91yCDZxD8UQcyV`kQV8x^ptx&+Kp;59-JRkNE$$X5r4)BB?ry~k6t|cE&3ik$ zo0*-R&E4;wd%p9@MysnSU}2D90000iB}G|H005C5e$b#H!mli@z9_?HGlA6z^^_)=pP;jKr$dt;xGjIox0L7+-`3a>%ngj-H zYp|?J!*QkUIZIMCYX#hQ9~en3p+f1lal8U-ma18WQb<`#Iuk6_9OD$c#%4kk6j8pj zJdd~?>{%tl!yhG)gL0LpL&vI{5!7#3to7OKOiFnNc0JqJbky#9*fqCn)i<)aw}a$+h4rWA7-#)z|E;C}z}X^XAops6gzunrwQ3}hQdN8y ze_<`bmG0P^F^q*&)6{%UW?5j-hcd+}Ela0@Yw9Ipt(~bDV+G!W>KlXa~yE-=p3)-2gt+7!p zZbXk!ju=EjFH^#CWvk!w*|$|{+B-}pX?{xo0=>YVA$SH0^f;}7=f4I|L-s>KKGscm z#!h}H+F?-aD7F;Ux%z;%m;o%Bj>c`AyhkPTAnO#W&i%~A{d20310WzzZfRo6ioT};V~|>! zR_X8=DE&ZRx>AKV_3*Q2YRm?=L!3<$D{?Y=Qs7D1-s!s;V2?njNoU$^zqa95a^2Jz zQIwj7A(EXG4mP$zXpAW9b)G9_*2r=>nb7-PV3JcDUO}8!dm?`V3=S%_l1+`%@e`vf__d3X}@{HX`Lphxu}v zHAkk$j4`@P-}-%*ocq%~rNSBGu}FP`Bq^ zhU*pg`G3`{DSy#Sq(H^oo#pa^vES;+?N$eRE5DcZ_(DuueIpN8%wa8@?4p3W9P6{Tf{Juc0vRq(n{F z5f^T}$8??lA=<1GRZ2Pvpo!I6wg!F?9xwkRY-9nX{GDB)c)nn`|4n%bTc>tKp+3cf za`mlVhm*qwS99KZF*@~)*{SkGe&ZBIw3Vz?)JcHtTLD#~vaG<{u_I-tc(&hT;+wW$ z>T=gL3f-?w;t-f*2oCRW#~W1|LIxi=hq!J9NfNFl)Lr0pV&Lm0sEJQiO8lM z>r!gBW*ph4>fJ}zHsVjHNy>g1P|0E{%Iei~36wiGo^X^qRod)+YZxD+y#uOOv!P-u zge}yMn0{Dl9m7HSurEu=1BN|Z#;H3G_@?{w_G26x?F`K-`{!sSW$P7_VGqWz;nZVH z>5mLt|F8a6xfKj zyJv*#KRxYc7T12`I-o2+U86QBR?6e(u@FsQrbUO}``=4nNsQJ`FWsNfW*&mtUmI*Zv@dd)FJhOC>!=zTQtyuR9>V zH@mi_@W+8Dc+>lNc~NyBa^Sy zq*jIVBL&=${AhaLnK)Y)Q=D>I8Bg8$6ly|yl?sakd)a@}QQWR27(7t|L#C#X?Eb!w zebJ^!v3%A&XS4QrJBC$^Z`#(HsQ-b`HNoP0JawuYOKrCILFqW!ouU}U4e~-e_DXkr zE>5A{%TtU>so&^)f#glt36*u+LMjTWC&Xl@%c~C!yup zx$Ps>UVr*64&dB-duqeZ$?J2_{Vk>s>cMzGLtEgT1D=^a9;)?ChT*`e-DqelRN%0Jq3138Z5n6E_R6>^M}*dg@fr&bMJ|e~!B`VQE!i~VkuW3_rKqLglNP0Xx|(ZAJ(cSDVfEPlxA}_hi83~Y+}OTJ zs>2L4GUm@MeDMbL;As9

)rfC*E^ExA_rGIK}yRe3YEI&mWie@r|d-0UY; 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

-r?fQPN(Gm6XkXbGk7=1hecb6 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

)*k z8j%z|R}-@K>Xk)oe|9p}I%ef5n2(CQVF}Pa9WO*f9~-gZ0~y0W;Xm`4)0vTI?$t=F z56SeU|Mb19Pw`i;54Mw>UomZOjowIWi=~g{a_7ePY8K;0m%lG8-p1pT^y%2e!{Ei- z#XmIp5)jdS2<7u#IX<}FPvcA_Jp)_Qdb7?pKniUpUUr=x1;|G5F zfWMFPG^pJ#`Ds)a4<8}q$3*o8oVZ?%{byl+rhAnTFO7aA=}E>JlZBYilKn$y{2!XG zGOVdS(2s7UySt?sAthY`Qlq;@4-}+JX=$aAlx_)Wl$Y#fR3wm#(?U*rr zPm*3Lghdt9yHacO%ldKWDPY=e2c)3p_)fZVOu=<-eUG2}l0k2!Nhr+`)zj8J>v#9e z4c<2135IBI?HGFRFA7;No-e=WSjA1Zb=0PrqN;CW+m%t0g zOI#sem;wk0wtjlc-_1PU--JJ2|GKx5{kKm0kGQ0g1Wg2=H8Wi`Z6_9+&?@}qiWKx2 zI&$AD&6L}l*Ns!6gR4lGHfOdhJ_YEj(Z4p2XR)!dl+cJ^I_kC18@A&Fdxy5FG}Sf( zZj2Rx6{uaN9J4G5EEEW7LT$Uf-Tl44^Cd*t?S$5f_4jqg*V$vlIk^g&VT9pFC(#+> zLTFuin~?79D>%TxsX>zoQdl!EwTja-JM1hEB1;`T%+UEarB|XOM&tIw@{@_4>*PC= zLB2&ytCbi9WLLb5#Zu=|d`jtpwaaJn=3 zf;U({KK=lOxgBbFsFVY_)pr@phek)3cB2Te6;~;SGc9MA z&WjhNVp4qdn{+G}8Tfb4+TVb$L7u+ImoPn4c%Anfym+l9o@@hwEV6ttXfn(suUcTD zglAmziaFR+?dULWl*H^LsoJW)pvu|FWe)1l}fHLaP0^iUTdO5az|FuELDlH0{OfD!VlgAg%#*k z1ZAfs>$^>3l0=Bv67D#96z=F~sqB)}C3L{r+g~p$pAN7XXi1~WQdPauIjEulDHQS? zP4{Bx*1NsEeQ3@&ow!6C;G2~(r}y@GQ!<8axISMimrcto$Cj3FwPqh!QbE3R>Acyu z?7TS3z4oZlFc-ATD_+*KVQuvzSK#|B+C#ZSM}JY)j_<=t!2?3uRD3JD#G0dyuqW~Q zh8N##-G^Uhw64b}py9drTW1e*>RDoHZeX~e^I4?kR%or^(0A%B={E?r5>Mlt>e|!p z{G>|2>HegT85qs)A~R(&Ryy)GVA@-!tvCd_U13BlhmF*y|FTCu^#O)hwW6op86I z*biH4a!}fEgwHF)T1Nbm~k8g^w0bnC82k zKR0aRROMEICV)usO;0C!>zmF46-Ruw&-s=Hb1XfA_1a$E&Mb>pd*-8bOqM<8;rbOD?f7f2&MF8d>jzBe5Gn zgvC+S=nnmK%;D6}8j9N0F$H@O;V116RGfKluHq6MZWlwyT63sL1Yjp5gDR#KqZ2Fs z7pI~@K=4Lb2;gxKxw^mlcXfIyN8gvNT2%nGYEoulQ8%I2R(0}B+nK`RQd^g>6m#ip znUpTt$Yf`C1ldkB*Xqa@l8L_C3&JMz^+VTSIrX7Rlw3!Ghnoi>ymMVJF!pH3fbqlGI_(V5gIdv8 zu*k5Aq^L5$K#7Dgwpw_Unl1%~%7GuUgGR&E6_ZL0MHx9t=WM|`@1B#6SgL@~JFo{L zeeEOfBbNyl^5ufVu#U#Wq3>>c$p>yfnr?6nc*lbyEoWkL;o)_Goz~-3lsSbTu(>6m z$;1%zQxBP`;S8N|4cyQ8AN5W{OpI5hM?f6tHDW0pY|AZf(m9{eKx~tuA9ZWwT8wv+ z&|C)8g}ekizf<;*Y`MGnCn8qt*(Y^-lNE#nAMyI7E0cv1eh0`soTHX!`oiyT&X138 zw@$Y9&z;P-)l8FW6^(ufSTVQ1?N?Wuh0`3>?B%nAekO`%+v7+x_~x>J8brm0JS=!N*^NoTUq9c=D@ty#wi@K0 zrKpZmZ%R$@MFS0!(pZ=nn`HVzoQ$)esnKcTBae5jm=EaTvdiXA_g^8`J#B#C`DN93J@!=693#a_PgB)6ee)~!6SG# zqB=QqR7X$612)xCOLNls9LGLIH#RC{el+ixh?oy)%br{X$CY~pE#+d(v{sR3RIc}TrxFl;* z4Ut-`lz1VYCh)9<9UULfRv5SKoR||=9@uza8XFh7ER6lTz7D#A+VZihl<`Y3ximCD z(jYFy0S_6T!sHM z2`xz57LO*9(`Vg|Y%mn#v+);s;@BriR`1@hv#6V+rzwwQ5P`b%oqq11iUDv9$XqtY?rs8=3y9UH6 zG^nD*WXA=@6%Ib1U3LziQg0Xk@g9kIelyQdY{FOCd21g?g2sRjf1Mxcn@RfOr38%% zpMA=>05f&aCtZP<3{oO4KRL~kkFeUkTW9oBXzbl$h&0hmy2BQ#04vD%n};yMHd!lZ}#8gqN+{h@y%k zK3zpEjU) z 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 z zz9z0ya)=NhD^?J{mNcbYS&Wm~3TJDquXvA1HOq#MOuAk4(BkxE;1*%C2tgd_ea{xX zvY?Z8zhubSBz(yVLK`jDv^37zmhhFe}fY;H*sk#U?nNLv7pnR<0f61|_OPoi$6Fk+kmD7J?^ebqaomO`4O5 z4s_C$ZI{j!S9d3#b-z{$QcM($&FAdx;}XfIbO&K4}1 zddA9|&-|RS9I@ZHD)D9g&nncr#rM6uS)CItE{lDK4yKxrG1%SI+IG{XU@W{42|MX{BVwj)D9h(UX#z35+n7OUss(c>v+2m zh|7AVtk?QdV2V>39Rv#bW;vZBkuCPgsJ4u3P&W2OkOPecFn!7H(ny-Gm-!@5d z-2}1ZvW*KFrT9H%!fNpXIvlduj0Gu`CIc;f5kU^M3u9~MuC1@D7%a*iS%y~J2TqP) zv59VurfRdQ(1@Xn&l%DG3hT(B?1~>PGjhvCk23ND>r7PpPqUVg4Du(dn-1~B8&mw{ zLyOof&J38AJcq}G?uWF76{h&KcQ2V-DY8Dax_pfi+06gmBwFF*Tr|RmUVC(HZ!5X3 zEsx7T^~=a+yvQ}`8A+UF<4@4lae?&}WK$eKj=eA5u3!p%H_!mox#`y^ElWi?V|9|Xc2~N$U&G^0|A$E zdL4zt?CA5vpOTBTfkg0k{^)GKC9*gkaR@&_4@x;PaVTSoXJm!ko3Q0vTIGrH$yE4$ zCy`(4@`K6crR;=@z&_^}>cq+*^3e_wbYqU%c#i^#-0sJmJ{gqypHA(c=aY}`lU)Sb zT5Wz98g-cmD}h*IH1w(_6b4|w4;UX+EQ3p9DF9DfK58nWD4*jK z4qO^_A?4$>RoQ~w^V-eyAB6e&3xNz89d7GQHg*q5TlvwuI-|wq72c=#H?jLcAn|oh z@G{F4xs>-_?o4oovH2JIsHUoTLWdNG*YZbFNR0c;hi23QttQ#++YrCiT@t=K@g zO{2J=er@68gUZ5GACb|TUfj47nM9$>3vX6T?&VRwn1}wA4(40dFVD%Ae^s^QeKDIf zpDYmWfAP7kK3)L+BTQ6K_?Ye_j48`+eLm)PEj_|TfAwo zcZ=X>PlDt`u0>*M{X7x6gU~m&p>7?{11ftN84}Xargg@eCgx&^^lO@&7hzul9h&Qs z>+TKY-u18MIc|+rTmo*w-ut9qirW5;w?2T& ztMc_HwOY4DAG5QPS7Jr`hOX^iY1O~|X7N-F2QGtZm>?}k^6`2YZd8@ns2e_` zRPm0jeM%sxi@j}jK^Ko-mQ_%bXF(Tdfa zv2Wbz2s}DCBXE;_)7%}NNE|d=&*we;6C1Xb`vS&D+twHP>In$#*H2#b?0462!_rPW zer@mq1TT`Z_YYMX;QmdGhk5dN3pa`0p&K@a|yziLg!{1ZQ!Vw5H> zsyHPV|hsLiq>;X z^@kJ_B=B*ziE7I&YmrUT1G_0}voDU^U3w2K&w-KgS4y-yqfEMxalk?x_mm4oC@J3HL7pP)!b zNq&bD(N*QvjqCZ6#w-k^yGSyNoM362_fOf9a+%T#YRuVDyGBK~o*P-*A-PQYu0zM(rixpm4KQqnuCCK)i`CR+ zC^oiuN?t{O3J_gMU5WWgt2ppI5_ABb70e;bJAaPJTJ)st*8|%|UpTXm8cJr|q%ZW}$Y*}P>^uh5YErL##<#Fp z6rIvy7p$}Q9FQk&S#gvZgq|1LYv1SgT`c`FYRGO($)?J?q$&!gf0z1Tw`FjJO%kQ9 z`RuFUK!dX@tPXAI#bmJQ(c6m~te@XOAm(&U6(yst!)*QLgdU&XXrJ8VHj8(|>WrUl zdZ?NDnZ4atO~?nbLz}YQQRO?|b1qC1kssQuTvIO2*nY@7!6KVYpUsoF-2!buIs~up zr(D+e{vMpc9+_gyr7>VH`f_P&r-yT~tLm#crR?r2bKTJczgP!TDU$c$P~p95N%ZwK zd@cQ<&-nDr(*CS#S;BCG0BQn{;%hDptG@q2dSI-p7_o)gWm*3%0+opzb$@Z=+{FAw z)*DBq=Sq_CTa4TX50q^<}Ec>s|m9*c6IS@W2wvh)r5jywFHdBNBD ziz2!|DxE4`V^&~{iz7ezK*fmM1w>&--`+sb6``z?mp}s%tzbQB*Us|6*-pJR8})l1 zcW|nqyxvQ+>~&1uWvP)T+uxYyUSfWjEPk-@CHt;caQFF=gk1wQQ{jt%K=)4X8i!gO zdD9;OI2HlU24-lVb2M&WB)TufGMb{8O`W>h3szUN7+~mC=V#>o*D0Ug>lrk*(onx{ zqqd-OLUkoyKw8dE4)J2tHq;W28hhO6CbK{jRHd3`qBeC)xKIdAsNZ;pGzyAig^{c7NxY5K$Ac%J$glu;> zE0%aZs6nCpFai(7e9c_49r6S!+m5c&`Za4#*U5<7_pPUump-!+ z{|YOd44P|hqv{@icDY*y;%7@pYZKLt3)Q@@JG9_7nPY7fo&lR)zisznLae7W)Yff1 zcSbBb%d*d%R+YEqEFaV3mz$qz-oD^Z7=xFTzuBKbftSYRI>r3k!MfBPDLOQ0y25^7k^8SHf&PzJ{L;POU#tZSxP9ihgs1~TeO^QWirCByhI|4-q>PvzZ`kv z`9$C|$JdGU<#F8OG=}ysOy-xgRLh<{oTg2GC#0m-51Pv_9$WwID7$1&c#S>n8g`cd zGgHYv96+K@<|W_r56!l&&gH9`!qN@X%B02nI{DdGYhKi!c5tYB*8(?+uw^f{c{svk zoqrjG@Zk2IgX)DTEzgdTAAa5_^j;szdN_Noc&;z3G|?XCSICOu`+JiqL?>6C+~b&T zm$Wy<&U>h5P2*U3cLKlC|2jn9dyf!E&uGpe((c=74<5eKSLza|*z`*)7yOr&@a5r_ z+w7u?4XNFk5;61!)1%T;_7jddqhsyqG-@A+C( zkJGO_B)_?rj)Y>37+!}&I9wHa4oK@kN!;6R!>HHg|FYByA-Qr#bJ?KLUP7iFyDt)d zST4Pai!Xo~gy+E=Bo}N28CUAL8}s7-w2F21-n1{~o|ip+rgA=WP4^c&&+VAEZsQiN zb+_qFFD|OUy0!WaPYxBN4KlYnLZPJjWCor4p))DPjWR9;KMWe*8Fv(@y7am7i`bqF zxin4iyvk3|b32yo{|XC9P}vL~k);#1wDdR(KXj3VI+M?ZHeAWXoRG<(7i-rB2mfh} z``YhJC(x9$RPf}T!e)TGGI9Jl#reEC<1sN5a`Ui>{@qyw`(jRi8F$&4#FLj^hTA3_ zePnKqQNK>z`=Qy2vU0d&H>5`hx}W#ut>Y!Fm-(N?R*&S@Q>r#mBOXG&lb%9#M^8rm zQegAXUNRv_9dlt!gADJ&$aU`vLUsxc=BqC}$eVTmhmS=&O$oz`^dWWfm4!p|M4d2@r-zY~{hzgH&% zC<=MmgiEV|Hv)*_bod1m+S$L=B7wGmL>thDZ_aY-Ki2Nb)rFw z8bwm2)K;S^X6@Q^P@Ag62okYF7eyPAn)x6oLC{jf-n2%Gpi#3$MTLqPv#NgS_xip6 zz3+L?x$ftF?&q9yo$Gqe)9}Dq@cSVh9-34c5jv7J+iOZV>pZGYAEAmNJU*uoIGNRs zCNb`z@ZGR0M?{cS*ti!K<*1_gFo7*_C+)7CM@UAhG|b*6l-#;MrCbyr{ys|W}8^SY=J%L+%J^{;t< zUOh&6Ut1qw7U>}GP4MI-vB7IZPipczC{jidYD1nJ@v=b!alUeAioXdMt#oy7)jdLP zkzq+Xv!8GVQ1*K`pQ$^^DkKU$L7~50UL@^tPKNq!VPkJ*KIv8ID!i<1RY-iUr839W zPjhfOpu!tR)b<Bd_(hw()$`U(5KOQ`^Kw!KP;^Voj1`6X3SxnFLC6=~a1;^UIG0|7 zxt*oW^eXC%R^#w6BFe>ziukj$S(IUq1wo&Q=ZUt@ZO0*Q|`FQ3Sp zQ>A&wX^4bsonEcF#zZd+i&-3kM>$vK zzh_#@`8&FvKVI|A`@JCJ*gbS0t*{yGv;jp#9aCK#>ECmh__%&k792$!*+05x8uE0o z!XV8Vbqdu$^8Bir`umyPB}DPk0nqavKpel#mGc{1$ujZ&w`Q4>W zud4T}q5QjlD0Tajb{Vx$L%nxk40avy3h#nuEhm~_(S`yO1DoO@!18V&`W?>a4=+tQ zP9DxL530!pX)CbPn%mn>WL$6HYbK_dUY!tc>VS~-6~G6ZHL}Ws3hL;a(QLtm z!rGDe(=P5R+G-zJ@r%!AJK5tyJ4sW7Uc@lB8YMeaO>V1dm%bm+=`^>WRX?-SXo9_) z4}cZZl=5V1OLysaXg}#zs{b=(je0V4uqcHRW)?!WLMrf1F#%Hv;;`atLV4XD;K9&< zPFgoCa-0Uz#>8M?8I1Wmz$;z7uYH=XlMU*_^<8WCBAMzFW#SCgwFBi1!fY2VPrUS5WIaOu|k(PgJi@CbCX%G!Bh5yG2Rga1<7( zTZ!CO*K~er+zN1KIc&)#&5A+CA2!3r|NAIWJ_QnZ37Edo+kOm>8gCdxUq7DU*Vgi` zpOI-ZN*1qg=$+5`=hIeCEILZ@ehzSXDIDD&nuQU@4(TK6|GyQ)+BIq0Xj$n?1gpOV zH%HLfLe`k!Wo|S+w(Dh+$cezuoO?h!gJxs(k2VRMqcWKpr$vW&mgerhZxs&4ihHh) zt}2HQOy+dm>@CBooDj(v#7k>b$8l9DlULZrsNY5$)JWnQ`eIF!^CyW{G-R;g=FHW; z=W8R>sF9zRqd(hPv1_Oca@}kb)y=)5ayd5V>pVB3OGoTxH)mGpJ3iXGFObPyL;Vz3 z?|g4yl{{s5tQJ3Rk&|;gzqz6{`@sck^~2fj@PH?lBs$KtW7%{-a{nA@o3CerN{4&& zZ=owMO?ZwyeGdr+|G2W`9kRPr1t9B>>bPmZ`LEVXZ$ac}R41Fdj?HpI^X@&qfCyZG z+}Fn516{*wDCg^3W`|9Str5j?=eV(w?6v0QIG?6a_jO0Ki+7U=)+!&W(z|Yqt5WSb zUjuc68)KYXNIN3!Tg;g(DuJZ38XonU-CxuHlW7#r+Ud_qEX&eSKC0sq$Xg>QMN>0p zx^2-v5Om_Lx_EoScXZez;N@~M_1+92TfLd@Yw~J@>uFyT+PXxr6)LnX?XCFR1Md(J zkvX`+Dd5PLymOcPRhc3t?+qgom|~sKB(IHrdEpXqDcA?cuUkn`?Z&*r%zl5ie-ftF z986{7tFW6f4s34}6p6QTk-<(@?Vs5Y#4-xiiBw_frZ`Y(3B%o|UULXGmizM_{{{`%^T+LO`ADqhL) z8ebXHcwv=Xh`HB*%5gKJ?Rq3zqriDNkC4o(X_@Tre{Nuo%@*ZQjTAliq~lQ4AD<)G zpoljbLOD{X??!5WZhL+DuBpyLe5Tm5u=n5(8y~2ITv0pW$tSQe(_9B6ehO((8pX`qXj$ z->9)mv($Jd29h{tSarG}lfidB%+SPc!Ty%6k-$@uI(x{YA{VXu7xN+`OLvjMqB{OV z=kHm^#QdV{x*kKF+`0wqt3zVV)YJiEK?xe|@4mno^BhlqDKl4%b@f^CTf$He;Hq-l zRQUAL)C5Wm`DdQi1#$mmWpKJzOFUPxerZZFkV;pJ!paY~Cjb#AV2d^Tup#DlP>dx? z<8%ixcin0e=<-{m`VQ8PhLD*(nG>?|r*b(pP5T1Zc#%O10Rx*+G&7*c-d@i4+_ws+2k$bUb%=6PU)5ST-2E?Ov^kb*b_ki!l>I#w9|o6 zu&J^H%xo~uB?C)Xj)b!3I@i~M$+*)ZCrxsbkYJyX1^385#bI)7lExjFyNI^wT0iae zIUO*XA4SIi!u^2XblfrqJ7kEBPx(S+g5h3!OI2rnQ~RzAdod509ATf^mQiD8i0`QN z4FWeDW1>sjxe$!Y+}Pc$Db8BrQsPBFftR)G^L=%#5Fn`JZ|f)tb*)`8+s89H*3u1S zBDuFO@9L}Vx1v@2EUdKLz&U-X>dIIfn%ewYq>J8;)0o}~j^$yd*||h=U;Y@h#@>lh zM;nc`|9l_!H|a7bRPO|4_#v(OY}6$61I|eItJ^s!0@73&+0;>_gW-mU8snlbnQJ^e zbSNVxX}6`t*tHq0yj@Dt$bJ(8JCu9SKO;+L3tT#h-JG~ryljQVI$N7GjS%uWkRKze zGBI;vy&(@)9ZZVfiGQEa{O$jZkW|rHU9m$maGt2DzB}J}O$-)5Jo77|K3Jd$!KS@% z?h8vg>1YIncHQ^Tkq#PTwHxJF*a@V8e6;48OM zRcip`g4Fdnx!+Gtz#!PQ@62^dlZ$ri;@{hCP`78F12O&XYT8_{Na0xM$R|R6UQ!rb zOOb|YiBk~K;7S6hL)HMyhWmJ*`tz|Q^-Px@kKgdSt??G#*#tmON^3A7X|+tF#(q=5 z^UpomRkvmzf#uTOwqa=i85H=b~5~pnPl?-_ezW{0PCgeVS*UcSA;v_D! z)lYD{I3a4LiMPvJJ>!kYT-p`CJI{!*7LBz#3W8nW7r6g|zE*Shus9_?G} zt4!8B;~7jZ@el-L1!iYYXF#_twso!5faZC3w_hz51-)8gn7VUkf`L1)yjGj|)_LK= zUBjw(gA(?ir4TpTeBTv7jjT!up7+ifd}|xL9=m8D6#=>l9<<<4vQC1Wjy+*3rgDnI zEq65fk+3_PM0TgK0eesD1*)$rpAnu_-%u>_XBJ=qmR4eG?Jkko8VSbQZfnI|AqRYG z$gEo~eZ*%X4J;ldCf`lP`V@6|9Hm_~H!FG)us=0u-Kx5@DHwOXSKt;EQSm+JY<7hW z`C!p0FV0&@U|=Zl(8^Ke(%Bd*XIOxY(n|MFyrIL5jJ`|Eyfl?Q>#6UTmd)nv?b9i) z4JjZ_AfiebmS7sq5gh{&X6F^-DbE-c)lYO$ig|7Mz8sexJ0kPxrJz#oSiOmXieRm3 zYN??W=c|JM3iT`upwk3R<=t)&{}dZc(%BRnXVx$==&4GvNaD=UvYbllLgz0C-Rp+) zS~y|P8lar%I`5$+rmscz9%Wf_EL>%GNrYY8LKMR}LrT&?-W<&r9tzGX+!ektwOyii z(biX^M0rFy`Z^;`Vfx~I?kC@(GDy<0P;ruLil>3vD&uBgdu^eWfGTMn>^o|Ai-FAN z0q`+6x_O8u15!W{JRYgK{UQZr@luHOO)SVPUuLjx{r)xwPxXO5*!L6C8@!rt zh?MXZ6f!WlxTieKtBN{mxA|n4_FHxC2)pDU)7|A=if5ayJ17(i^w6sl@vbYQ-syi4 z6PPajYnk*K#$EY$E8@1cy!Cv5N?CM(ov`W(Wd9|?r}(VGEtSl9PXSp>ex>5z5R0Rd z(eE3I3N)e05kY~_)t=}+KWy0|F0&Q7-YW7U;qLERBpJ-w!7|s1oz^<0zqc28cW;Au zXWwr){dluL>Sei6At5q6H&_>Kt&TJ{d-r3yfIx1TFYP#_~O9sW!u@@-Fd@hubZn;wPeK+xsWG1ecd zF>zlq<|(2I$B%Y5WhKHGaKW%*>E%tXO4}QMK3-7eJ^z5_c0nyd$U{i_!p4kAeR0Cs z`^*^hv|(#*=tfkYAmbIxZ%-jeP9^8?}QdF9?nk!16?EQJ>G>U#3{>^sBo zh_$oAvIY`~Mk;5NGJsS*(V|5AVm+}Sg|;{(;`zf?$5Sp&!4$sw9JM%v$KHLNnh^ui zXpf}#q6oO&W?(x~l^aY0ozI0Ta%MUt#Is4XGFk%x1h3DDg17f8Do~{!>KvSj%G-qh zcp{}Ft`Q?jZZeX6+#_;SEGha*PI<;zmH>R(2LQ7Uk3vql@f=qdBj1qogMfE~vBA(8 z|FPmCZb+OU%PAJINUh>NRb~gf$?GH$ZkH=Rgi&(9ilzG zH5Fp(_VSQrd0IcB0+xzYdFI!FI=fNRa$X2&cbuyVFQOCFz^gB0JAq_`jZ}Un0x0ya zuN7q2f{Qoq0?x3c6Kpm<&~dGp8##yP&DGmhit9-JDq2d&EPhMVP~A|oCPnF8Ejq!>qe1ho z40p|(Xx0ypTo3WDtg7agVjGMpb*Nu&kQt<}zQDOaV}%3}(o)mvsvBd(m#@{T_@6qI z0TzI2xtWjlYNm*%n?ATvjbl~)DjaTpcp&(EC{3!-Jn4ceV*oU_JZM4DS6ROJw@39$ zP*(9R%am1*b!`^$YPmL3H?AXwNK;_FGvQ=Ig9D6z`HOQ}RQOuRc+1(e2L-3R-#7mB z{PogIZP=o}`(w5q?Hg6;#gU3VWkZ;9DL<0HxaUhzxl^(0aG zXk)`o7)u85wAi>&kP0gJzTl*wMwdud*=^@bY|;l3O1z;?#YOl7zhSwDHz|chLsiQ1 z4wC0OOC28@=&QZIQd_Mgo8!ddESI}mwCCz8Sf>Ay8sy|#di8ob|23G9EZXPz0ZUv0 z!VA5xv;~H?twV&^iiUV(d1t+Hp$?KlH76ifQ#|vaTcL#)7hz?eTYR-F^M&FV*RyQJ zNN+mqZC8#9(Z^IYi{R57aWPzza;EC3-v5k6MZ^O6pGriYT{+72JWF%BDxdOtQZlB~ zz2wzxnY`S?yY zU*&uK@A_U0CfErR{3tX~U$kLBXvpKQdVEd-w$|Y?Z4F(}(*YA+M@~8w&ms9hv(~DK z^_n+eU2lFwhR-I{E!`&Cq$Ic-t48p=uKE=7dgAMwsCzfbpQj{V zA zMt46g>1UB5o|{XRw7L3g$HM|+uAs0Hv!Slu9oxRLZe?Gqy_&xWXANfBC8; z|KE(C(*1fqE%d^(_y2qyxXER{N;ncS^X~-gDRY9It+KeTc#A zZzh+=MU<^x5TrzP!Oz*pa9ieK93>$O5Zy5kU&2OX$>X1G7hhtdd$(yrPq4iNS61l) ild)n=rh2Y>cN`;k3!)xTlOD4$A5$YM!wP-(=l=(sK9e>8 literal 0 HcmV?d00001 diff --git a/acs/nladmin-ui/src/assets/images/2.jpeg b/acs/nladmin-ui/src/assets/images/2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..6a6fb3e990b8a7562a8ccabe8c8d2ea84d6bc039 GIT binary patch literal 17269 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 P00000NkvXXu0mjf2u#MM literal 0 HcmV?d00001 diff --git a/acs/nladmin-ui/src/components/Crud/crud.js b/acs/nladmin-ui/src/components/Crud/crud.js index 5c36475..4ae96be 100644 --- a/acs/nladmin-ui/src/components/Crud/crud.js +++ b/acs/nladmin-ui/src/components/Crud/crud.js @@ -1,7 +1,6 @@ import { download, initData } from '@/api/data' import { downloadFile, parseTime } from '@/utils/index' import Vue from 'vue' -import i18n from '@/i18n' /** * CRUD配置 @@ -51,13 +50,13 @@ function CRUD(options) { // 主页操作栏显示哪些按钮 optShow: { add: true, - edit: false, + edit: true, del: true, download: false, reset: true }, // 自定义一些扩展属性 - props: {}, + props: { size: 10 }, // 在主页准备 queryOnPresenterCreated: true, // 调试开关 @@ -85,7 +84,7 @@ function CRUD(options) { }, // 标题 get title() { - return this.add > CRUD.STATUS.NORMAL ? i18n.t('auto.common.Create') + ' ' + i18n.t(`${crud.title}`) : this.edit > CRUD.STATUS.NORMAL ? i18n.t('auto.common.Editors') + ' ' + i18n.t(`${crud.title}`) : crud.title + return this.add > CRUD.STATUS.NORMAL ? `新增${crud.title}` : this.edit > CRUD.STATUS.NORMAL ? `编辑${crud.title}` : this.view > CRUD.STATUS.NORMAL ? `${crud.title}详情` : crud.title } }, msg: { @@ -98,7 +97,7 @@ function CRUD(options) { // 页码 page: 0, // 每页数据条数 - size: 10, + size: options.props.size, // 总数据条数 total: 0 }, @@ -161,16 +160,6 @@ function CRUD(options) { }) }) }, - /** - * 格式化是否1-是,0-否 - */ - formatIsOrNot(row, column) { - if (!row[column.property]) { - return '否' - } - return row[column.property] === '1' ? '是' : '否' - }, - /** * 格式化数据,保留0位小数 */ diff --git a/acs/nladmin-ui/src/components/Crud/crud1.js b/acs/nladmin-ui/src/components/Crud/crud1.js new file mode 100644 index 0000000..07672a5 --- /dev/null +++ b/acs/nladmin-ui/src/components/Crud/crud1.js @@ -0,0 +1,974 @@ +import { download, initData } from '@/api/data' +import { downloadFile, parseTime } from '@/utils/index' +import Vue from 'vue' +import i18n from '@/i18n' + +/** + * CRUD配置 + * @author moxun + * @param {*} options
+ * @return crud instance. + * @example + * 要使用多crud时,请在关联crud的组件处使用crud-tag进行标记,如: + */ +function Crud(options) { + const defaultOptions = { + tag: 'default', + // id字段名 + idField: 'id', + // 标题 + title: '', + // 请求数据的url + url: '', + // 表格数据 + data: [], + // 选择项 + selections: [], + // 待查询的对象 + query: {}, + // 查询数据的参数 + params: {}, + // Form 表单 + form: {}, + // 重置表单 + defaultForm: () => { + }, + // 排序规则,默认 id 降序, 支持多字段排序 ['id,desc', 'createTime,asc'] + sort: ['id,desc'], + // 等待时间 + time: 50, + // Crud Method + crudMethod: { + add: (form) => { + }, + del: (id) => { + }, + edit: (form) => { + }, + get: (id) => { + } + }, + // 主页操作栏显示哪些按钮 + optShow: { + add: true, + edit: false, + del: true, + download: false, + reset: true + }, + // 自定义一些扩展属性 + props: {}, + // 在主页准备 + queryOnPresenterCreated: true, + // 调试开关 + debug: false + } + options = mergeOptions(defaultOptions, options) + const data = { + ...options, + // 记录数据状态 + dataStatus: {}, + status: { + add: Crud.STATUS.NORMAL, + edit: Crud.STATUS.NORMAL, + view: Crud.STATUS.NORMAL, + // 添加或编辑状态 + get cu() { + if (this.add === Crud.STATUS.NORMAL && this.edit === Crud.STATUS.NORMAL) { + return Crud.STATUS.NORMAL + } else if (this.add === Crud.STATUS.PREPARED || this.edit === Crud.STATUS.PREPARED) { + return Crud.STATUS.PREPARED + } else if (this.add === Crud.STATUS.PROCESSING || this.edit === Crud.STATUS.PROCESSING) { + return Crud.STATUS.PROCESSING + } + throw new Error('wrong crud\'s cu status') + }, + // 标题 + get title() { + return this.add > Crud.STATUS.NORMAL ? i18n.t('auto.common.Create') + ' ' + i18n.t(`${crud.title}`) : this.edit > Crud.STATUS.NORMAL ? i18n.t('auto.common.Editors') + ' ' + i18n.t(`${crud.title}`) : crud.title + } + }, + msg: { + submit: '提交成功', + add: '新增成功', + edit: '编辑成功', + del: '删除成功' + }, + page: { + // 页码 + page: 0, + // 每页数据条数 + size: 10, + // 总数据条数 + total: 0 + }, + // 整体loading + loading: false, + // 导出的 Loading + downloadLoading: false, + // 导出csv的 Loading + downloadcsvLoading: false, + // 删除的 Loading + delAllLoading: false + } + const methods = { + /** + * 通用的提示 + */ + submitSuccessNotify() { + crud.notify(crud.msg.submit, Crud.NOTIFICATION_TYPE.SUCCESS) + }, + addSuccessNotify() { + crud.notify(crud.msg.add, Crud.NOTIFICATION_TYPE.SUCCESS) + }, + editSuccessNotify() { + crud.notify(crud.msg.edit, Crud.NOTIFICATION_TYPE.SUCCESS) + }, + delSuccessNotify() { + crud.notify(crud.msg.del, Crud.NOTIFICATION_TYPE.SUCCESS) + }, + // 搜索 + toQuery() { + crud.page.page = 1 + crud.refresh() + }, + // 刷新 + refresh() { + if (!callVmHook(crud, Crud.HOOK.beforeRefresh)) { + return + } + return new Promise((resolve, reject) => { + crud.loading = true + // 请求数据 + initData(crud.url, crud.getQueryParams()).then(data => { + const table = crud.getTable() + if (table && table.lazy) { // 懒加载子节点数据,清掉已加载的数据 + table.store.states.treeData = {} + table.store.states.lazyTreeNodeMap = {} + } + crud.page.total = data.totalElements + crud.data = data.content + crud.resetDataStatus() + // time 毫秒后显示表格 + setTimeout(() => { + crud.loading = false + callVmHook(crud, Crud.HOOK.afterRefresh) + }, crud.time) + resolve(data) + }).catch(err => { + crud.loading = false + reject(err) + }) + }) + }, + /** + * 格式化是否1-是,0-否 + */ + formatIsOrNot(row, column) { + if (!row[column.property]) { + return '否' + } + return row[column.property] === '1' ? '是' : '否' + }, + + /** + * 格式化数据,保留0位小数 + */ + formatNum0(row, column) { + if (!row[column.property]) { + return 0 + } + return parseFloat(row[column.property]).toFixed(0) + }, + /** + * 格式化数据,保留2位小数 + */ + formatNum2(row, column) { + if (!row[column.property]) { + return 0 + } + return parseFloat(row[column.property]).toFixed(2) + }, + + /** + * 格式化数据,保留3位小数 + */ + formatNum3(row, column) { + if (!row[column.property]) { + return 0 + } + return parseFloat(row[column.property]).toFixed(3) + }, + + /** + * 质检格式化数据,保留4位小数 + */ + formatQlNum4(row, column) { + if (!row[column.property]) { + return '' + } + return parseFloat(row[column.property]).toFixed(4) + }, + /** + * 启动添加 + */ + toAdd() { + crud.resetForm() + if (!(callVmHook(crud, Crud.HOOK.beforeToAdd, crud.form) && callVmHook(crud, Crud.HOOK.beforeToCU, crud.form))) { + return + } + crud.status.add = Crud.STATUS.PREPARED + callVmHook(crud, Crud.HOOK.afterToAdd, crud.form) + callVmHook(crud, Crud.HOOK.afterToCU, crud.form) + }, + /** + * 启动添加 可携带参数 + */ + toAddAndData(data) { + crud.resetForm(JSON.parse(JSON.stringify(data))) + if (!(callVmHook(crud, Crud.HOOK.beforeToAdd, crud.form) && callVmHook(crud, Crud.HOOK.beforeToCU, crud.form))) { + return + } + crud.status.add = Crud.STATUS.PREPARED + callVmHook(crud, Crud.HOOK.afterToAdd, crud.form) + callVmHook(crud, Crud.HOOK.afterToCU, crud.form) + }, + /** + * 启动编辑 + * @param {*} data 数据项 + */ + toEdit(data) { + crud.resetForm(JSON.parse(JSON.stringify(data))) + if (!(callVmHook(crud, Crud.HOOK.beforeToEdit, crud.form) && callVmHook(crud, Crud.HOOK.beforeToCU, crud.form))) { + return + } + crud.status.edit = Crud.STATUS.PREPARED + crud.getDataStatus(crud.getDataId(data)).edit = Crud.STATUS.PREPARED + callVmHook(crud, Crud.HOOK.afterToEdit, crud.form) + callVmHook(crud, Crud.HOOK.afterToCU, crud.form) + }, + /** + * 查询详情 + * @param {*} data 数据项 + */ + toView(data) { + crud.params.optRow = data + crud.resetForm(JSON.parse(JSON.stringify(data))) + crud.status.view = Crud.STATUS.PREPARED + crud.getDataStatus(crud.getDataId(data)).view = Crud.STATUS.PREPARED + callVmHook(crud, Crud.HOOK.afterToView, crud.form) + }, + /** + * 启动删除 + * @param {*} data 数据项 + */ + toDelete(data) { + crud.getDataStatus(crud.getDataId(data)).delete = Crud.STATUS.PREPARED + }, + /** + * 取消删除 + * @param {*} data 数据项 + */ + cancelDelete(data) { + if (!callVmHook(crud, Crud.HOOK.beforeDeleteCancel, data)) { + return + } + crud.getDataStatus(crud.getDataId(data)).delete = Crud.STATUS.NORMAL + callVmHook(crud, Crud.HOOK.afterDeleteCancel, data) + }, + /** + * 取消新增/编辑 + */ + cancelCU(formName) { + if (formName instanceof PointerEvent) { + formName = 'form' + } + + const addStatus = crud.status.add + const editStatus = crud.status.edit + const viewStatus = crud.status.view + if (addStatus === Crud.STATUS.PREPARED) { + if (!callVmHook(crud, Crud.HOOK.beforeAddCancel, crud.form)) { + return + } + crud.status.add = Crud.STATUS.NORMAL + } + if (viewStatus === Crud.STATUS.PREPARED) { + crud.status.view = Crud.STATUS.NORMAL + } + if (editStatus === Crud.STATUS.PREPARED) { + if (!callVmHook(crud, Crud.HOOK.beforeEditCancel, crud.form)) { + return + } + crud.status.edit = Crud.STATUS.NORMAL + crud.getDataStatus(crud.getDataId(crud.form)).edit = Crud.STATUS.NORMAL + } + crud.resetForm() + if (addStatus === Crud.STATUS.PREPARED) { + callVmHook(crud, Crud.HOOK.afterAddCancel, crud.form) + } + if (editStatus === Crud.STATUS.PREPARED) { + callVmHook(crud, Crud.HOOK.afterEditCancel, crud.form) + } + // 清除表单验证 + if (crud.findVM('form').$refs[formName]) { + crud.findVM('form').$refs[formName].clearValidate() + } + }, + /** + * 提交新增/编辑 + */ + submitCU(formName) { + if (formName instanceof PointerEvent) { + formName = 'form' + } + if (!callVmHook(crud, Crud.HOOK.beforeValidateCU)) { + return + } + crud.findVM('form').$refs[formName].validate(valid => { + if (!valid) { + return + } + if (!callVmHook(crud, Crud.HOOK.afterValidateCU)) { + return + } + if (crud.status.add === Crud.STATUS.PREPARED) { + crud.doAdd() + } else if (crud.status.edit === Crud.STATUS.PREPARED) { + crud.doEdit() + } + }) + }, + /** + * 执行添加 + */ + doAdd() { + if (!callVmHook(crud, Crud.HOOK.beforeSubmit)) { + return + } + crud.status.add = Crud.STATUS.PROCESSING + crud.crudMethod.add(crud.form).then(() => { + crud.status.add = Crud.STATUS.NORMAL + crud.resetForm() + crud.addSuccessNotify() + callVmHook(crud, Crud.HOOK.afterSubmit) + crud.toQuery() + }).catch(() => { + crud.status.add = Crud.STATUS.PREPARED + callVmHook(crud, Crud.HOOK.afterAddError) + }) + }, + /** + * 执行编辑 + */ + doEdit() { + if (!callVmHook(crud, Crud.HOOK.beforeSubmit)) { + return + } + crud.status.edit = Crud.STATUS.PROCESSING + crud.crudMethod.edit(crud.form).then(() => { + crud.status.edit = Crud.STATUS.NORMAL + crud.getDataStatus(crud.getDataId(crud.form)).edit = Crud.STATUS.NORMAL + crud.editSuccessNotify() + crud.resetForm() + callVmHook(crud, Crud.HOOK.afterSubmit) + crud.refresh() + }).catch(() => { + crud.status.edit = Crud.STATUS.PREPARED + callVmHook(crud, Crud.HOOK.afterEditError) + }) + }, + /** + * 执行删除 + * @param {*} data 数据项 + */ + doDelete(data) { + let delAll = false + let dataStatus + const ids = [] + if (data instanceof Array) { + delAll = true + data.forEach(val => { + ids.push(this.getDataId(val)) + }) + } else { + ids.push(this.getDataId(data)) + dataStatus = crud.getDataStatus(this.getDataId(data)) + } + if (!callVmHook(crud, Crud.HOOK.beforeDelete, data)) { + return + } + if (!delAll) { + dataStatus.delete = Crud.STATUS.PROCESSING + } + return crud.crudMethod.del(ids).then(() => { + if (delAll) { + crud.delAllLoading = false + } else { + dataStatus.delete = Crud.STATUS.PREPARED + } + crud.dleChangePage(1) + crud.delSuccessNotify() + callVmHook(crud, Crud.HOOK.afterDelete, data) + crud.refresh() + }).catch(() => { + if (delAll) { + crud.delAllLoading = false + } else { + dataStatus.delete = Crud.STATUS.PREPARED + } + }) + }, + /** + * 通用导出 + */ + doExport() { + crud.downloadLoading = true + download(crud.url + '/download', crud.getQueryParams()).then(result => { + downloadFile(result, crud.title + '数据', 'xlsx') + crud.downloadLoading = false + }).catch(() => { + crud.downloadLoading = false + }) + }, + doExportCSV() { + crud.downloadcsvLoading = true + download(crud.url + '/downloadCSV', crud.getQueryParams()).then(result => { + downloadFile(result, crud.title + '数据', 'csv') + crud.downloadcsvLoading = false + }).catch(() => { + crud.downloadcsvLoading = false + }) + }, + /** + * 获取查询参数 + */ + getQueryParams: function() { + // 清除参数无值的情况 + Object.keys(crud.query).length !== 0 && Object.keys(crud.query).forEach(item => { + if (crud.query[item] === null || crud.query[item] === '') crud.query[item] = undefined + }) + Object.keys(crud.params).length !== 0 && Object.keys(crud.params).forEach(item => { + if (crud.params[item] === null || crud.params[item] === '') crud.params[item] = undefined + }) + return { + page: crud.page.page - 1, + size: crud.page.size, + sort: crud.sort, + ...crud.query, + ...crud.params + } + }, + // 当前页改变 + pageChangeHandler(e) { + crud.page.page = e + crud.refresh() + }, + // 每页条数改变 + sizeChangeHandler(e) { + crud.page.size = e + crud.page.page = 1 + crud.refresh() + }, + // 预防删除第二页最后一条数据时,或者多选删除第二页的数据时,页码错误导致请求无数据 + dleChangePage(size) { + if (crud.data.length === size && crud.page.page !== 1) { + crud.page.page -= 1 + } + }, + // 选择改变 + selectionChangeHandler(val) { + crud.selections = val + }, + /** + * 重置查询参数 + * @param {Boolean} toQuery 重置后进行查询操作 + */ + resetQuery(toQuery = true) { + const defaultQuery = JSON.parse(JSON.stringify(crud.defaultQuery)) + const query = crud.query + Object.keys(query).forEach(key => { + query[key] = defaultQuery[key] + }) + // 重置参数 + this.params = {} + if (toQuery) { + crud.toQuery() + } + }, + /** + * 重置表单 + * @param {Array} data 数据 + */ + resetForm(data) { + const form = data || (typeof crud.defaultForm === 'object' ? JSON.parse(JSON.stringify(crud.defaultForm)) : crud.defaultForm.apply(crud.findVM('form'))) + const crudFrom = crud.form + for (const key in form) { + if (crudFrom.hasOwnProperty(key)) { + crudFrom[key] = form[key] + } else { + Vue.set(crudFrom, key, form[key]) + } + } + // add by ghl 2020-10-04 页面重复添加信息时,下拉框的校验会存在,需要找工取消 + let form_ref = 'form' + if (crudFrom.form_ref) form_ref = crudFrom.form_ref + if (crud.findVM('form').$refs[form_ref]) { + crud.findVM('form').$refs[form_ref].clearValidate() + } + }, + /** + * 重置数据状态 + */ + resetDataStatus() { + const dataStatus = {} + + function resetStatus(datas) { + datas.forEach(e => { + dataStatus[crud.getDataId(e)] = { + delete: 0, + edit: 0 + } + if (e.children) { + resetStatus(e.children) + } + }) + } + + resetStatus(crud.data) + crud.dataStatus = dataStatus + }, + /** + * 获取数据状态 + * @param {Number | String} id 数据项id + */ + getDataStatus(id) { + return crud.dataStatus[id] + }, + /** + * 用于树形表格多选, 选中所有 + * @param selection + */ + selectAllChange(selection) { + // 如果选中的数目与请求到的数目相同就选中子节点,否则就清空选中 + if (selection && selection.length === crud.data.length) { + selection.forEach(val => { + crud.selectChange(selection, val) + }) + } else { + crud.getTable().clearSelection() + } + }, + /** + * 用于树形表格多选,单选的封装 + * @param selection + * @param row + */ + selectChange(selection, row) { + // 如果selection中存在row代表是选中,否则是取消选中 + if (selection.find(val => { + return crud.getDataId(val) === crud.getDataId(row) + })) { + if (row.children) { + row.children.forEach(val => { + crud.getTable().toggleRowSelection(val, true) + selection.push(val) + if (val.children) { + crud.selectChange(selection, val) + } + }) + } + } else { + crud.toggleRowSelection(selection, row) + } + }, + /** + * 切换选中状态 + * @param selection + * @param data + */ + toggleRowSelection(selection, data) { + if (data.children) { + data.children.forEach(val => { + crud.getTable().toggleRowSelection(val, false) + if (val.children) { + crud.toggleRowSelection(selection, val) + } + }) + } + }, + findVM(type) { + return crud.vms.find(vm => vm && vm.type === type).vm + }, + notify(title, type = Crud.NOTIFICATION_TYPE.INFO) { + crud.vms[0].vm.$notify({ + title, + type, + duration: 2500 + }) + }, + updateProp(name, value) { + Vue.set(crud.props, name, value) + }, + getDataId(data) { + return data[this.idField] + }, + getTable() { + return this.findVM('presenter').$refs.table + }, + attchTable() { + const table = this.getTable() + this.updateProp('table', table) + const that = this + table.$on('expand-change', (row, expanded) => { + if (!expanded) { + return + } + const lazyTreeNodeMap = table.store.states.lazyTreeNodeMap + row.children = lazyTreeNodeMap[crud.getDataId(row)] + if (row.children) { + row.children.forEach(ele => { + const id = crud.getDataId(ele) + if (that.dataStatus[id] === undefined) { + that.dataStatus[id] = { + delete: 0, + edit: 0 + } + } + }) + } + }) + } + } + const crud = Object.assign({}, data) + // 可观测化 + Vue.observable(crud) + // 附加方法 + Object.assign(crud, methods) + // 记录初始默认的查询参数,后续重置查询时使用 + Object.assign(crud, { + defaultQuery: JSON.parse(JSON.stringify(data.query)), + // 预留4位存储:组件 主页、头部、分页、表单,调试查看也方便找 + vms: Array(4), + /** + * 注册组件实例 + * @param {String} type 类型 + * @param {*} vm 组件实例 + * @param {Number} index 该参数内部使用 + */ + registerVM(type, vm, index = -1) { + const vmObj = { + type, + vm: vm + } + if (index < 0) { + this.vms.push(vmObj) + return + } + if (index < 4) { // 内置预留vm数 + this.vms[index] = vmObj + return + } + this.vms.length = Math.max(this.vms.length, index) + this.vms.splice(index, 1, vmObj) + }, + /** + * 取消注册组件实例 + * @param {*} vm 组件实例 + */ + unregisterVM(type, vm) { + for (let i = this.vms.length - 1; i >= 0; i--) { + if (this.vms[i] === undefined) { + continue + } + if (this.vms[i].type === type && this.vms[i].vm === vm) { + if (i < 4) { // 内置预留vm数 + this.vms[i] = undefined + } else { + this.vms.splice(i, 1) + } + break + } + } + } + }) + // 冻结处理,需要扩展数据的话,使用crud.updateProp(name, value),以crud.props.name形式访问,这个是响应式的,可以做数据绑定 + Object.freeze(crud) + return crud +} + +// hook VM +function callVmHook(crud, hook) { + if (crud.debug) { + console.log('callVmHook: ' + hook) + } + const tagHook = crud.tag ? hook + '$' + crud.tag : null + let ret = true + const nargs = [crud] + for (let i = 2; i < arguments.length; ++i) { + nargs.push(arguments[i]) + } + // 有些组件扮演了多个角色,调用钩子时,需要去重 + const vmSet = new Set() + crud.vms.forEach(vm => vm && vmSet.add(vm.vm)) + vmSet.forEach(vm => { + if (vm[hook]) { + ret = vm[hook].apply(vm, nargs) !== false && ret + } + if (tagHook && vm[tagHook]) { + ret = vm[tagHook].apply(vm, nargs) !== false && ret + } + }) + return ret +} + +function mergeOptions(src, opts) { + const optsRet = { + ...src + } + for (const key in src) { + if (opts.hasOwnProperty(key)) { + optsRet[key] = opts[key] + } + } + return optsRet +} + +/** + * 查找crud + * @param {*} vm + * @param {string} tag + */ +function lookupCrud(vm, tag) { + tag = tag || vm.$attrs['crud-tag'] || 'default' + // function lookupCrud(vm, tag) { + if (vm.$crud) { + const ret = vm.$crud[tag] + if (ret) { + return ret + } + } + return vm.$parent ? lookupCrud(vm.$parent, tag) : undefined +} + +/** + * crud主页 + */ +function presenter(crud) { + if (crud) { + console.warn('[Crud warn]: ' + 'please use $options.cruds() { return Crud(...) or [Crud(...), ...] }') + } + return { + data() { + // 在data中返回crud,是为了将crud与当前实例关联,组件观测crud相关属性变化 + return { + crud: this.crud + } + }, + beforeCreate() { + this.$crud = this.$crud || {} + let cruds = this.$options.cruds instanceof Function ? this.$options.cruds() : crud + if (!(cruds instanceof Array)) { + cruds = [cruds] + } + cruds.forEach(ele => { + if (this.$crud[ele.tag]) { + console.error('[Crud error]: ' + 'crud with tag [' + ele.tag + ' is already exist') + } + this.$crud[ele.tag] = ele + ele.registerVM('presenter', this, 0) + }) + this.crud = this.$crud['defalut'] || cruds[0] + }, + methods: { + parseTime + }, + created() { + for (const k in this.$crud) { + if (this.$crud[k].queryOnPresenterCreated) { + this.$crud[k].toQuery() + } + } + }, + destroyed() { + for (const k in this.$crud) { + this.$crud[k].unregisterVM('presenter', this) + } + }, + mounted() { + // 如果table未实例化(例如使用了v-if),请稍后在适当时机crud.attchTable刷新table信息 + if (this.$refs.table !== undefined) { + this.crud.attchTable() + } + } + } +} + +/** + * 头部 + */ +function header() { + return { + data() { + return { + crud: this.crud, + query: this.crud.query + } + }, + beforeCreate() { + this.crud = lookupCrud(this) + this.crud.registerVM('header', this, 1) + }, + destroyed() { + this.crud.unregisterVM('header', this) + } + } +} + +/** + * 分页 + */ +function pagination() { + return { + data() { + return { + crud: this.crud, + page: this.crud.page + } + }, + beforeCreate() { + this.crud = lookupCrud(this) + this.crud.registerVM('pagination', this, 2) + }, + destroyed() { + this.crud.unregisterVM('pagination', this) + } + } +} + +/** + * 表单 + */ +function form(defaultForm) { + return { + data() { + return { + crud: this.crud, + form: this.crud.form + } + }, + beforeCreate() { + this.crud = lookupCrud(this) + this.crud.registerVM('form', this, 3) + }, + created() { + this.crud.defaultForm = defaultForm + this.crud.resetForm() + }, + destroyed() { + this.crud.unregisterVM('form', this) + } + } +} + +/** + * crud + */ +function crud(options = {}) { + const defaultOptions = { + type: undefined + } + options = mergeOptions(defaultOptions, options) + return { + data() { + return { + crud: this.crud + } + }, + beforeCreate() { + this.crud = lookupCrud(this) + this.crud.registerVM(options.type, this) + }, + destroyed() { + this.crud.unregisterVM(options.type, this) + } + } +} + +/** + * CRUD钩子 + */ +Crud.HOOK = { + /** 刷新 - 之前 */ + beforeRefresh: 'beforeCrudRefresh', + /** 刷新 - 之后 */ + afterRefresh: 'afterCrudRefresh', + /** 删除 - 之前 */ + beforeDelete: 'beforeCrudDelete', + /** 删除 - 之后 */ + afterDelete: 'afterCrudDelete', + /** 删除取消 - 之前 */ + beforeDeleteCancel: 'beforeCrudDeleteCancel', + /** 删除取消 - 之后 */ + afterDeleteCancel: 'afterCrudDeleteCancel', + /** 新建 - 之前 */ + beforeToAdd: 'beforeCrudToAdd', + /** 新建 - 之后 */ + afterToAdd: 'afterCrudToAdd', + /** 编辑 - 之前 */ + beforeToEdit: 'beforeCrudToEdit', + /** 编辑 - 之后 */ + afterToEdit: 'afterCrudToEdit', + /** 开始 "新建/编辑" - 之前 */ + beforeToCU: 'beforeCrudToCU', + /** 开始 "新建/编辑" - 之后 */ + afterToCU: 'afterCrudToCU', + /** "新建/编辑" 验证 - 之前 */ + beforeValidateCU: 'beforeCrudValidateCU', + /** "新建/编辑" 验证 - 之后 */ + afterValidateCU: 'afterCrudValidateCU', + /** 添加取消 - 之前 */ + beforeAddCancel: 'beforeCrudAddCancel', + /** 添加取消 - 之后 */ + afterAddCancel: 'afterCrudAddCancel', + /** 编辑取消 - 之前 */ + beforeEditCancel: 'beforeCrudEditCancel', + /** 编辑取消 - 之后 */ + afterEditCancel: 'afterCrudEditCancel', + /** 提交 - 之前 */ + beforeSubmit: 'beforeCrudSubmitCU', + /** 提交 - 之后 */ + afterSubmit: 'afterCrudSubmitCU', + afterAddError: 'afterCrudAddError', + afterEditError: 'afterCrudEditError', + afterToView: 'afterToView' +} + +/** + * CRUD状态 + */ +Crud.STATUS = { + NORMAL: 0, + PREPARED: 1, + PROCESSING: 2 +} + +/** + * CRUD通知类型 + */ +Crud.NOTIFICATION_TYPE = { + SUCCESS: 'success', + WARNING: 'warning', + INFO: 'info', + ERROR: 'error' +} + +export default Crud + +export { + presenter, + header, + form, + pagination, + crud +} diff --git a/acs/nladmin-ui/src/layout/components/Sidebar/Logo.vue b/acs/nladmin-ui/src/layout/components/Sidebar/Logo.vue index 34f9ee5..637a504 100644 --- a/acs/nladmin-ui/src/layout/components/Sidebar/Logo.vue +++ b/acs/nladmin-ui/src/layout/components/Sidebar/Logo.vue @@ -14,7 +14,7 @@ + + diff --git a/acs/nladmin-ui/src/views/acs/basetask/config/schBaseTaskconfig.js b/acs/nladmin-ui/src/views/acs/basetask/config/schBaseTaskconfig.js new file mode 100644 index 0000000..aa2c551 --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/basetask/config/schBaseTaskconfig.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/schBaseTaskconfig', + method: 'post', + data + }) +} +export function getTaskConfigList() { + return request({ + url: 'api/schBaseTaskconfig/getTaskConfigList', + method: 'post' + }) +} + +export function del(ids) { + return request({ + url: 'api/schBaseTaskconfig/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/schBaseTaskconfig', + method: 'put', + data + }) +} + +export default { add, edit, del, getTaskConfigList } diff --git a/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue index d434d39..86428d7 100644 --- a/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue +++ b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue @@ -32,17 +32,6 @@ @keyup.enter.native="crud.toQuery" /> - - - -