From 5fc1250f822e20e980c74c138f4912a70b459e83 Mon Sep 17 00:00:00 2001 From: "ZHOUZ\\Noble'lift" <1014987728@qq.com> Date: Sat, 8 Oct 2022 13:44:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B0=E5=B7=9E=E6=B5=B7=E4=BA=AE=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nladmin-system/pom.xml | 4 +- .../java/org/nl/config/DataBaseConfig.java | 6 - .../config/thread/AsyncTaskExecutePool.java | 1 + .../modules/common/utils/SecurityUtils.java | 16 +- .../nl/modules/mnt/util/ExecuteShellUtil.java | 4 +- .../nl/modules/quartz/domain/QuartzJob.java | 1 + .../nl/modules/quartz/domain/QuartzLog.java | 1 + .../repository/QuartzJobRepository.java | 1 + .../quartz/service/QuartzJobService.java | 1 + .../quartz/service/dto/JobQueryCriteria.java | 1 + .../rest/AuthorizationController.java | 4 +- .../security/service/dto/AuthUserDto.java | 1 + .../security/service/dto/OnlineUserDto.java | 1 + .../org/nl/modules/system/domain/Dept.java | 1 + .../org/nl/modules/system/domain/User.java | 1 - .../modules/system/domain/vo/MenuMetaVo.java | 1 + .../system/repository/DeptRepository.java | 1 + .../system/repository/UserRepository.java | 1 + .../system/rest/GenCodeController.java | 4 +- .../system/rest/MonitorController.java | 6 +- .../system/service/CodeDetailService.java | 1 - .../system/service/DictDetailService.java | 1 + .../modules/system/service/DictService.java | 1 + .../modules/system/service/UserService.java | 1 + .../system/service/convert/RedisConvert.java | 3 - .../system/service/dto/DeptSmallDto.java | 1 + .../system/service/dto/DictSmallDto.java | 1 + .../modules/system/service/dto/ParamDto.java | 1 + .../system/service/dto/RoleSmallDto.java | 1 + .../system/service/impl/ParamServiceImpl.java | 5 +- .../system/service/impl/RedisServiceImpl.java | 1 - .../modules/tools/config/MultipartConfig.java | 1 + .../master/constant/MaterOptTypeEnum.java | 92 +++ .../basedata/master/eum/BusinessCodeEnum.java | 27 + .../basedata/master/eum/RecordStatusEnum.java | 28 + .../master/manage/AbstructMaterialType.java | 8 + .../master/rest/ClassstandardController.java | 124 ++++ .../master/rest/CustomerbaseController.java | 67 +++ .../master/rest/MaterialbaseController.java | 104 ++++ .../rest/StoragevehicleinfoController.java | 85 +++ .../master/rest/SupplierbaseController.java | 64 ++ .../basedata/master/rest/UnitController.java | 74 +++ .../master/service/ClassstandardService.java | 127 ++++ .../master/service/CustomerbaseService.java | 64 ++ .../master/service/MaterialbaseService.java | 97 +++ .../service/StoragevehicleinfoService.java | 78 +++ .../master/service/SupplierbaseService.java | 64 ++ .../basedata/master/service/UnitService.java | 68 +++ .../service/dto/BusinesstypematerialDto.java | 69 +++ .../master/service/dto/ClassstandardDto.java | 61 ++ .../master/service/dto/CustomerbaseDto.java | 192 ++++++ .../service/dto/EndrealsemimaterialDto.java | 45 ++ .../service/dto/MaterialParametersDto.java | 86 +++ .../master/service/dto/MaterialbaseDto.java | 105 ++++ .../service/dto/SemirealrawmaterialDto.java | 45 ++ .../service/dto/StoragevehicleinfoDto.java | 61 ++ .../master/service/dto/SupplierbaseDto.java | 102 ++++ .../basedata/master/service/dto/UnitDto.java | 41 ++ .../impl/ClassstandardServiceImpl.java | 555 ++++++++++++++++++ .../service/impl/CustomerbaseServiceImpl.java | 156 +++++ .../service/impl/MaterialbaseServiceImpl.java | 239 ++++++++ .../impl/StoragevehicleinfoServiceImpl.java | 226 +++++++ .../service/impl/SupplierbaseServiceImpl.java | 162 +++++ .../master/service/impl/UnitServiceImpl.java | 158 +++++ .../basedata/master/wql/QMD_ME_MATERIAL.wql | 82 +++ .../master/wql/QMD_ME_material_param01.wql | 90 +++ .../wql/QMD_PB_BUSINESSTYPEMATERIAL.wql | 61 ++ .../basedata/master/wql/QMD_PB_CLASSBASE.wql | 66 +++ .../master/wql/QMD_PB_STORAGEVEHICLEEXT.wql | 114 ++++ .../master/wql/QMD_PB_STORAGEVEHICLEINFO.wql | 80 +++ .../master/wql/QMD_PB_STORAGEVEHICLEPOINT.wql | 103 ++++ .../master/wql/QMD_STORAGEVEHICLECLEANING.wql | 111 ++++ .../master/wql/QMT_MATERIALPARAMETERS_001.wql | 120 ++++ .../org/nl/wms/basedata/master/wql/mdcs.xls | Bin 0 -> 172544 bytes .../org/nl/wms/basedata/master/wql/mdme.xls | Bin 0 -> 159744 bytes .../org/nl/wms/basedata/master/wql/mdpb.xls | Bin 0 -> 160768 bytes .../nl/wms/basedata/st/IvtChangeTypeEnum.java | 31 + .../wms/basedata/st/StoreIvtServiceImpl.java | 297 ++++++++++ .../basedata/st/rest/SectattrController.java | 84 +++ .../basedata/st/rest/StorattrController.java | 84 +++ .../st/rest/StructattrController.java | 76 +++ .../basedata/st/rest/StructivtController.java | 93 +++ .../st/rest/StructrelamaterialController.java | 85 +++ .../basedata/st/service/SectattrService.java | 74 +++ .../basedata/st/service/StorattrService.java | 74 +++ .../st/service/StructattrService.java | 72 +++ .../basedata/st/service/StructivtService.java | 72 +++ .../st/service/StructrelamaterialService.java | 69 +++ .../st/service/dto/MaterialsafeivtDto.java | 39 ++ .../basedata/st/service/dto/SectattrDto.java | 115 ++++ .../basedata/st/service/dto/StorattrDto.java | 106 ++++ .../st/service/dto/StructattrDto.java | 145 +++++ .../basedata/st/service/dto/StructivtDto.java | 64 ++ .../st/service/dto/StructrelamaterialDto.java | 30 + .../st/service/impl/SectattrServiceImpl.java | 251 ++++++++ .../st/service/impl/StorattrServiceImpl.java | 219 +++++++ .../service/impl/StructattrServiceImpl.java | 247 ++++++++ .../st/service/impl/StructivtServiceImpl.java | 148 +++++ .../impl/StructrelamaterialServiceImpl.java | 176 ++++++ .../java/org/nl/wms/basedata/st/wql/QLK01.wql | 226 +++++++ .../basedata/st/wql/QST_IVT_MATERIALSET.wql | 78 +++ .../nl/wms/basedata/st/wql/QST_SECT_ATTR.wql | 90 +++ .../nl/wms/basedata/st/wql/QST_STOR_ATTR.wql | 104 ++++ .../wms/basedata/st/wql/QST_STRUCTIVT001.wql | 83 +++ .../wms/basedata/st/wql/QST_STRUCT_ATTR.wql | 79 +++ .../java/org/nl/wms/basedata/st/wql/stivt.xls | Bin 0 -> 238080 bytes .../org/nl/wms/common/StructFindUtil.java | 91 +++ .../src/main/java/org/nl/wms/ext/acs/2.txt | 0 .../wms/ext/acs/rest/AcsToWmsController.java | 51 ++ .../wms/ext/acs/rest/WmsToAcsController.java | 82 +++ .../wms/ext/acs/service/AcsToWmsService.java | 44 ++ .../wms/ext/acs/service/WmsToAcsService.java | 58 ++ .../acs/service/impl/AcsToWmsServiceImpl.java | 549 +++++++++++++++++ .../acs/service/impl/WmsToAcsServiceImpl.java | 57 ++ .../org/nl/wms/ext/auto/AutoQueryTask.java | 140 +++++ .../wms/ext/crm/rest/CrmToLmsController.java | 39 ++ .../wms/ext/crm/service/CrmToLmsService.java | 15 + .../crm/service/impl/CrmToLmsServiceImpl.java | 101 ++++ .../wms/ext/mes/rest/LmsToMesController.java | 87 +++ .../wms/ext/mes/rest/MesToLmsController.java | 98 ++++ .../wms/ext/mes/service/LmsToMesService.java | 90 +++ .../wms/ext/mes/service/MesToLmsService.java | 55 ++ .../mes/service/impl/LmsToMesServiceImpl.java | 428 ++++++++++++++ .../mes/service/impl/MesToLmsServiceImpl.java | 211 +++++++ .../wms/ext/sap/rest/LmsToSapController.java | 39 ++ .../wms/ext/sap/rest/SapToLmsController.java | 47 ++ .../wms/ext/sap/service/LmsToSapService.java | 43 ++ .../wms/ext/sap/service/SapToLmsService.java | 19 + .../sap/service/impl/LmsToSapServiceImpl.java | 139 +++++ .../sap/service/impl/SapToLmsServiceImpl.java | 99 ++++ .../org/nl/wms/ext/wql/AUTO_QUERYTASK.wql | 92 +++ .../mps/rest/PersoncorrdeviceController.java | 120 ++++ .../mps/rest/ProduceshiftorderController.java | 145 +++++ .../mps/rest/TeamcorrpersonController.java | 65 ++ .../nl/wms/mps/rest/WorkteamController.java | 85 +++ .../mps/service/PersoncorrdeviceService.java | 84 +++ .../mps/service/ProduceshiftorderService.java | 124 ++++ .../mps/service/TeamcorrpersonService.java | 34 ++ .../nl/wms/mps/service/WorkteamService.java | 74 +++ .../mps/service/dto/PersoncorrdeviceDto.java | 27 + .../mps/service/dto/ProduceshiftorderDto.java | 159 +++++ .../mps/service/dto/TeamcorrpersonDto.java | 27 + .../nl/wms/mps/service/dto/WorkteamDto.java | 63 ++ .../impl/PersoncorrdeviceServiceImpl.java | 250 ++++++++ .../impl/ProduceshiftorderServiceImpl.java | 438 ++++++++++++++ .../impl/TeamcorrpersonServiceImpl.java | 76 +++ .../mps/service/impl/WorkteamServiceImpl.java | 177 ++++++ .../org/nl/wms/mps/wql/MPS_PRODUCEDURE001.wql | 178 ++++++ .../wms/mps/wql/MPS_Personcorrdevice001.wql | 130 ++++ .../nl/wms/mps/wql/MPS_Teamcorrperson001.wql | 58 ++ .../rest/CallMaterialController.java | 39 ++ .../service/CallMaterialService.java | 19 + .../service/impl/CallMaterialServiceImpl.java | 60 ++ .../callmaterial/wql/PDA_CALLMATERIAL_01.wql | 77 +++ .../rest/CallVehicleController.java | 39 ++ .../service/CallVehicleService.java | 19 + .../service/impl/CallVehicleServiceImpl.java | 69 +++ .../callvehicle/wql/PDA_CALLVEHICLE_01.wql | 77 +++ .../rest/EmptyAndQtyController.java | 32 + .../service/EmptyAndQtyService.java | 13 + .../service/impl/EmptyAndQtyServiceImpl.java | 49 ++ .../rest/SendMaterialController.java | 39 ++ .../service/SendMaterialService.java | 19 + .../service/impl/SendMaterialServiceImpl.java | 69 +++ .../sendmaterial/wql/PDA_SENDMATERIAL_01.wql | 77 +++ .../rest/SendVehicleController.java | 39 ++ .../service/SendVehicleService.java | 19 + .../service/impl/SendVehicleServiceImpl.java | 76 +++ .../sendvehicle/wql/PDA_SENDVEHICLE_01.wql | 99 ++++ .../org/nl/wms/pdm/rest/DeviceController.java | 77 +++ .../nl/wms/pdm/rest/DeviceitemController.java | 68 +++ .../wms/pdm/rest/ProcessrouteController.java | 96 +++ .../wms/pdm/rest/WorkProcedureController.java | 79 +++ .../org/nl/wms/pdm/service/DeviceService.java | 68 +++ .../nl/wms/pdm/service/DeviceitemService.java | 65 ++ .../wms/pdm/service/ProcessrouteService.java | 100 ++++ .../wms/pdm/service/WorkProcedureService.java | 81 +++ .../org/nl/wms/pdm/service/dto/BomDto.java | 63 ++ .../org/nl/wms/pdm/service/dto/DeviceDto.java | 79 +++ .../nl/wms/pdm/service/dto/DeviceitemDto.java | 54 ++ .../wms/pdm/service/dto/ProcessrouteDto.java | 76 +++ .../service/dto/ProductprocessrouteDto.java | 78 +++ .../wms/pdm/service/dto/WorkProcedureDto.java | 110 ++++ .../pdm/service/impl/DeviceServiceImpl.java | 140 +++++ .../service/impl/DeviceitemServiceImpl.java | 123 ++++ .../service/impl/ProcessrouteServiceImpl.java | 250 ++++++++ .../impl/WorkProcedureServiceImpl.java | 157 +++++ .../org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql | 58 ++ .../nl/wms/pdm/wql/QPDM_FACTORYCALENDAR.wql | 64 ++ .../nl/wms/pdm/wql/QP_BI_PROCESSROUTE01.wql | 82 +++ .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 0 -> 214016 bytes .../src/main/java/org/nl/wms/sch/AcsUtil.java | 52 ++ .../nl/wms/sch/manage/AbstractAcsTask.java | 157 +++++ .../org/nl/wms/sch/manage/FinishTypeEnum.java | 25 + .../org/nl/wms/sch/manage/TaskStatusEnum.java | 31 + .../org/nl/wms/sch/rest/PointController.java | 106 ++++ .../org/nl/wms/sch/rest/RegionController.java | 79 +++ .../org/nl/wms/sch/rest/TaskController.java | 131 +++++ .../org/nl/wms/sch/service/PointService.java | 88 +++ .../org/nl/wms/sch/service/RegionService.java | 74 +++ .../org/nl/wms/sch/service/TaskService.java | 87 +++ .../org/nl/wms/sch/service/dto/PointDto.java | 136 +++++ .../org/nl/wms/sch/service/dto/RegionDto.java | 77 +++ .../org/nl/wms/sch/service/dto/TaskDto.java | 80 +++ .../nl/wms/sch/service/dto/TaskQueryDto.java | 95 +++ .../sch/service/impl/PointServiceImpl.java | 269 +++++++++ .../sch/service/impl/RegionServiceImpl.java | 150 +++++ .../wms/sch/service/impl/TaskServiceImpl.java | 220 +++++++ .../wms/sch/service/wql/QSCH_BASE_POINT.wql | 132 +++++ .../nl/wms/sch/service/wql/QSCH_REGION_01.wql | 57 ++ .../nl/wms/sch/service/wql/QSCH_TASK_01.wql | 112 ++++ .../nl/wms/sch/service/wql/SCH_Point_01.wql | 121 ++++ .../java/org/nl/wms/sch/service/wql/sch.xls | Bin 0 -> 170496 bytes .../java/org/nl/wms/sch/tasks/AcsTaskDto.java | 30 + .../nl/wms/sch/tasks/CallEmpVehicleTask.java | 292 +++++++++ .../nl/wms/sch/tasks/CallMaterialTask.java | 306 ++++++++++ .../nl/wms/sch/tasks/PointToPointTask.java | 120 ++++ .../org/nl/wms/sch/tasks/RegionTypeEnum.java | 44 ++ .../nl/wms/sch/tasks/SendEmpVehicleTask.java | 310 ++++++++++ .../nl/wms/sch/tasks/SendMaterialTask.java | 311 ++++++++++ .../org/nl/wms/sch/tasks/TaskTypeEnum.java | 33 ++ .../st/inbill/rest/RegionioInController.java | 77 +++ .../st/inbill/service/RegionioInService.java | 79 +++ .../st/inbill/service/dto/RegionioDto.java | 156 +++++ .../service/impl/RegionioInServiceImpl.java | 231 ++++++++ .../nl/wms/st/inbill/wql/ST_REGION_IN_01.wql | 139 +++++ .../outbill/rest/RegionioOutController.java | 84 +++ .../outbill/service/RegionioOutService.java | 87 +++ .../service/impl/RegionioOutServiceImpl.java | 226 +++++++ .../wms/st/outbill/wql/ST_REGION_OUT_01.wql | 180 ++++++ .../rest/InEmptyvehiclerecordController.java | 77 +++ .../rest/OutEmptyvehiclerecordController.java | 77 +++ .../service/InEmptyvehiclerecordService.java | 79 +++ .../service/OutEmptyvehiclerecordService.java | 79 +++ .../service/dto/EmptyvehiclerecordDto.java | 109 ++++ .../impl/InEmptyvehiclerecordServiceImpl.java | 202 +++++++ .../OutEmptyvehiclerecordServiceImpl.java | 202 +++++++ .../st/vehiclebill/wql/ST_VEHICLE_IN_01.wql | 61 ++ .../st/vehiclebill/wql/ST_VEHICLE_IN_02.wql | 108 ++++ .../st/vehiclebill/wql/ST_VEHICLE_OUT_01.wql | 61 ++ .../st/vehiclebill/wql/ST_VEHICLE_OUT_02.wql | 114 ++++ .../main/resources/config/application-dev.yml | 9 +- .../template/generator/admin/Controller.ftl | 2 +- .../template/generator/admin/ServiceImpl.ftl | 14 +- .../template/generator/front/index.ftl | 13 +- .../basedata/master/class/classstandard.js | 75 +++ .../views/wms/basedata/master/class/index.vue | 328 +++++++++++ .../basedata/master/customer/customerbase.js | 27 + .../wms/basedata/master/customer/index.vue | 345 +++++++++++ .../wms/basedata/master/material/index.vue | 437 ++++++++++++++ .../basedata/master/material/materialbase.js | 58 ++ .../wms/basedata/master/measure/index.vue | 178 ++++++ .../master/measure/mdPbMeasureunit.js | 35 ++ .../master/storagevehicleinfo/index.vue | 366 ++++++++++++ .../storagevehicleinfo/storagevehicleinfo.js | 42 ++ .../views/wms/basedata/master/supp/index.vue | 344 +++++++++++ .../wms/basedata/master/supp/supplierbase.js | 27 + .../src/views/wms/basedata/st/ivt/index.vue | 137 +++++ .../views/wms/basedata/st/ivt/structivt.js | 49 ++ .../src/views/wms/basedata/st/sect/index.vue | 324 ++++++++++ .../views/wms/basedata/st/sect/sectattr.js | 43 ++ .../src/views/wms/basedata/st/stor/index.vue | 400 +++++++++++++ .../views/wms/basedata/st/stor/storattr.js | 43 ++ .../views/wms/basedata/st/struct/index.vue | 457 ++++++++++++++ .../wms/basedata/st/struct/structattr.js | 35 ++ nladmin-ui/src/views/wms/mps/device/device.js | 74 +++ nladmin-ui/src/views/wms/mps/device/index.vue | 151 +++++ .../src/views/wms/mps/item/deviceitem.js | 27 + nladmin-ui/src/views/wms/mps/item/index.vue | 162 +++++ .../mps/personcorrdevice/DevicesDialog.vue | 144 +++++ .../personcorrdevice/SelectDeviceDialog.vue | 187 ++++++ .../personcorrdevice/SelectPeersonDialog.vue | 153 +++++ .../views/wms/mps/personcorrdevice/index.vue | 135 +++++ .../mps/personcorrdevice/personcorrdevice.js | 67 +++ .../views/wms/mps/produce/OutMaterDialog.vue | 158 +++++ .../src/views/wms/mps/produce/ViewDialog.vue | 383 ++++++++++++ .../src/views/wms/mps/produce/bigScreen.vue | 314 ++++++++++ .../src/views/wms/mps/produce/index.vue | 536 +++++++++++++++++ .../src/views/wms/mps/produce/outmaterial.js | 51 ++ .../wms/mps/produce/produceshiftorder.js | 99 ++++ .../wms/mps/teamcorrperson/PersonDialog.vue | 111 ++++ .../teamcorrperson/SelectPeersonDialog.vue | 151 +++++ .../views/wms/mps/teamcorrperson/index.vue | 208 +++++++ .../wms/mps/teamcorrperson/teamcorrperson.js | 43 ++ .../views/wms/mps/teamcorrperson/workteam.js | 42 ++ .../views/wms/pdm/base/routing/AddDialog.vue | 274 +++++++++ .../src/views/wms/pdm/base/routing/index.vue | 187 ++++++ .../wms/pdm/base/routing/processroute.js | 58 ++ .../wms/pdm/base/workProcedure/index.vue | 189 ++++++ .../pdm/base/workProcedure/workProcedure.js | 33 ++ nladmin-ui/src/views/wms/pub/DeviceDialog.vue | 175 ++++++ nladmin-ui/src/views/wms/pub/MaterDialog.vue | 212 +++++++ nladmin-ui/src/views/wms/pub/PointDialog.vue | 178 ++++++ nladmin-ui/src/views/wms/sch/point/index.vue | 462 +++++++++++++++ nladmin-ui/src/views/wms/sch/point/point.js | 63 ++ nladmin-ui/src/views/wms/sch/region/index.vue | 190 ++++++ nladmin-ui/src/views/wms/sch/region/region.js | 35 ++ nladmin-ui/src/views/wms/sch/task/index.vue | 381 ++++++++++++ nladmin-ui/src/views/wms/sch/task/task.js | 64 ++ nladmin-ui/src/views/wms/st/inbill/index.vue | 449 ++++++++++++++ .../src/views/wms/st/inbill/regionioIn.js | 35 ++ .../src/views/wms/st/outbill/MaterDialog.vue | 165 ++++++ nladmin-ui/src/views/wms/st/outbill/index.vue | 451 ++++++++++++++ .../src/views/wms/st/outbill/regionioOut.js | 35 ++ .../views/wms/st/vehiclebill/PointDialog.vue | 202 +++++++ .../src/views/wms/st/vehiclebill/in/index.vue | 217 +++++++ .../wms/st/vehiclebill/in/inemptyvehicl.js | 35 ++ .../views/wms/st/vehiclebill/out/index.vue | 217 +++++++ .../wms/st/vehiclebill/out/outemptyvehicl.js | 35 ++ 309 files changed, 33005 insertions(+), 47 deletions(-) create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/constant/MaterOptTypeEnum.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/eum/BusinessCodeEnum.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/eum/RecordStatusEnum.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/manage/AbstructMaterialType.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/ClassstandardController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/CustomerbaseController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/MaterialbaseController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/StoragevehicleinfoController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/SupplierbaseController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/UnitController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/ClassstandardService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/CustomerbaseService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/MaterialbaseService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/StoragevehicleinfoService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/SupplierbaseService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/UnitService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/BusinesstypematerialDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/ClassstandardDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/CustomerbaseDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/EndrealsemimaterialDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/MaterialParametersDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/MaterialbaseDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SemirealrawmaterialDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/StoragevehicleinfoDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SupplierbaseDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/UnitDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/ClassstandardServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/CustomerbaseServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/MaterialbaseServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/StoragevehicleinfoServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/SupplierbaseServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/UnitServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_MATERIAL.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_material_param01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_BUSINESSTYPEMATERIAL.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_CLASSBASE.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEEXT.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEINFO.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEPOINT.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_STORAGEVEHICLECLEANING.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMT_MATERIALPARAMETERS_001.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdme.xls create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdpb.xls create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/IvtChangeTypeEnum.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/StoreIvtServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/SectattrController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StorattrController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructattrController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructivtController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructrelamaterialController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/SectattrService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StorattrService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructattrService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructivtService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructrelamaterialService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/MaterialsafeivtDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/SectattrDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StorattrDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructattrDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructivtDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructrelamaterialDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/SectattrServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StorattrServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructattrServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructivtServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructrelamaterialServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QLK01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_IVT_MATERIALSET.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_SECT_ATTR.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STOR_ATTR.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STRUCTIVT001.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STRUCT_ATTR.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls create mode 100644 nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/acs/2.txt create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/crm/service/CrmToLmsService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/crm/service/impl/CrmToLmsServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/LmsToMesController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/mes/service/LmsToMesService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/LmsToSapController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/SapToLmsController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/sap/service/LmsToSapService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/sap/service/SapToLmsService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/ext/wql/AUTO_QUERYTASK.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/rest/PersoncorrdeviceController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceshiftorderController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/rest/TeamcorrpersonController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/rest/WorkteamController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/PersoncorrdeviceService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/ProduceshiftorderService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/TeamcorrpersonService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/WorkteamService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/dto/PersoncorrdeviceDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/dto/ProduceshiftorderDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/dto/TeamcorrpersonDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/dto/WorkteamDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/impl/PersoncorrdeviceServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceshiftorderServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/impl/TeamcorrpersonServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/service/impl/WorkteamServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_PRODUCEDURE001.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_Personcorrdevice001.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_Teamcorrperson001.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/rest/CallVehicleController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/CallVehicleService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/impl/CallVehicleServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/wql/PDA_CALLVEHICLE_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/rest/EmptyAndQtyController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/service/EmptyAndQtyService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/service/impl/EmptyAndQtyServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/rest/SendMaterialController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/SendMaterialService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/impl/SendMaterialServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/wql/PDA_SENDMATERIAL_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/rest/DeviceController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/rest/DeviceitemController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/rest/ProcessrouteController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/rest/WorkProcedureController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/DeviceService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/DeviceitemService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/ProcessrouteService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkProcedureService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/BomDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceitemDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/ProcessrouteDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/ProductprocessrouteDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkProcedureDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceitemServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProcessrouteServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkProcedureServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/wql/QPDM_FACTORYCALENDAR.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/wql/QP_BI_PROCESSROUTE01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/manage/FinishTypeEnum.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/rest/PointController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/PointService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/TaskService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/dto/RegionDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskQueryDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_BASE_POINT.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_REGION_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_TASK_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/wql/SCH_Point_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/service/wql/sch.xls create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallEmpVehicleTask.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallMaterialTask.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendEmpVehicleTask.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/sch/tasks/TaskTypeEnum.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RegionioInController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RegionioInService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/inbill/service/dto/RegionioDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RegionioInServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/ST_REGION_IN_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/RegionioOutController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/outbill/service/RegionioOutService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/RegionioOutServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/ST_REGION_OUT_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/rest/InEmptyvehiclerecordController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/rest/OutEmptyvehiclerecordController.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/InEmptyvehiclerecordService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/OutEmptyvehiclerecordService.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/dto/EmptyvehiclerecordDto.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/impl/InEmptyvehiclerecordServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/impl/OutEmptyvehiclerecordServiceImpl.java create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_IN_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_IN_02.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_OUT_01.wql create mode 100644 nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_OUT_02.wql create mode 100644 nladmin-ui/src/views/wms/basedata/master/class/classstandard.js create mode 100644 nladmin-ui/src/views/wms/basedata/master/class/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/master/customer/customerbase.js create mode 100644 nladmin-ui/src/views/wms/basedata/master/customer/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/master/material/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/master/material/materialbase.js create mode 100644 nladmin-ui/src/views/wms/basedata/master/measure/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/master/measure/mdPbMeasureunit.js create mode 100644 nladmin-ui/src/views/wms/basedata/master/storagevehicleinfo/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/master/storagevehicleinfo/storagevehicleinfo.js create mode 100644 nladmin-ui/src/views/wms/basedata/master/supp/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/master/supp/supplierbase.js create mode 100644 nladmin-ui/src/views/wms/basedata/st/ivt/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/st/ivt/structivt.js create mode 100644 nladmin-ui/src/views/wms/basedata/st/sect/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/st/sect/sectattr.js create mode 100644 nladmin-ui/src/views/wms/basedata/st/stor/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/st/stor/storattr.js create mode 100644 nladmin-ui/src/views/wms/basedata/st/struct/index.vue create mode 100644 nladmin-ui/src/views/wms/basedata/st/struct/structattr.js create mode 100644 nladmin-ui/src/views/wms/mps/device/device.js create mode 100644 nladmin-ui/src/views/wms/mps/device/index.vue create mode 100644 nladmin-ui/src/views/wms/mps/item/deviceitem.js create mode 100644 nladmin-ui/src/views/wms/mps/item/index.vue create mode 100644 nladmin-ui/src/views/wms/mps/personcorrdevice/DevicesDialog.vue create mode 100644 nladmin-ui/src/views/wms/mps/personcorrdevice/SelectDeviceDialog.vue create mode 100644 nladmin-ui/src/views/wms/mps/personcorrdevice/SelectPeersonDialog.vue create mode 100644 nladmin-ui/src/views/wms/mps/personcorrdevice/index.vue create mode 100644 nladmin-ui/src/views/wms/mps/personcorrdevice/personcorrdevice.js create mode 100644 nladmin-ui/src/views/wms/mps/produce/OutMaterDialog.vue create mode 100644 nladmin-ui/src/views/wms/mps/produce/ViewDialog.vue create mode 100644 nladmin-ui/src/views/wms/mps/produce/bigScreen.vue create mode 100644 nladmin-ui/src/views/wms/mps/produce/index.vue create mode 100644 nladmin-ui/src/views/wms/mps/produce/outmaterial.js create mode 100644 nladmin-ui/src/views/wms/mps/produce/produceshiftorder.js create mode 100644 nladmin-ui/src/views/wms/mps/teamcorrperson/PersonDialog.vue create mode 100644 nladmin-ui/src/views/wms/mps/teamcorrperson/SelectPeersonDialog.vue create mode 100644 nladmin-ui/src/views/wms/mps/teamcorrperson/index.vue create mode 100644 nladmin-ui/src/views/wms/mps/teamcorrperson/teamcorrperson.js create mode 100644 nladmin-ui/src/views/wms/mps/teamcorrperson/workteam.js create mode 100644 nladmin-ui/src/views/wms/pdm/base/routing/AddDialog.vue create mode 100644 nladmin-ui/src/views/wms/pdm/base/routing/index.vue create mode 100644 nladmin-ui/src/views/wms/pdm/base/routing/processroute.js create mode 100644 nladmin-ui/src/views/wms/pdm/base/workProcedure/index.vue create mode 100644 nladmin-ui/src/views/wms/pdm/base/workProcedure/workProcedure.js create mode 100644 nladmin-ui/src/views/wms/pub/DeviceDialog.vue create mode 100644 nladmin-ui/src/views/wms/pub/MaterDialog.vue create mode 100644 nladmin-ui/src/views/wms/pub/PointDialog.vue create mode 100644 nladmin-ui/src/views/wms/sch/point/index.vue create mode 100644 nladmin-ui/src/views/wms/sch/point/point.js create mode 100644 nladmin-ui/src/views/wms/sch/region/index.vue create mode 100644 nladmin-ui/src/views/wms/sch/region/region.js create mode 100644 nladmin-ui/src/views/wms/sch/task/index.vue create mode 100644 nladmin-ui/src/views/wms/sch/task/task.js create mode 100644 nladmin-ui/src/views/wms/st/inbill/index.vue create mode 100644 nladmin-ui/src/views/wms/st/inbill/regionioIn.js create mode 100644 nladmin-ui/src/views/wms/st/outbill/MaterDialog.vue create mode 100644 nladmin-ui/src/views/wms/st/outbill/index.vue create mode 100644 nladmin-ui/src/views/wms/st/outbill/regionioOut.js create mode 100644 nladmin-ui/src/views/wms/st/vehiclebill/PointDialog.vue create mode 100644 nladmin-ui/src/views/wms/st/vehiclebill/in/index.vue create mode 100644 nladmin-ui/src/views/wms/st/vehiclebill/in/inemptyvehicl.js create mode 100644 nladmin-ui/src/views/wms/st/vehiclebill/out/index.vue create mode 100644 nladmin-ui/src/views/wms/st/vehiclebill/out/outemptyvehicl.js diff --git a/nladmin-system/pom.xml b/nladmin-system/pom.xml index 3ef99f3fb..44f116622 100644 --- a/nladmin-system/pom.xml +++ b/nladmin-system/pom.xml @@ -15,13 +15,11 @@ 0.11.1 - 5.5.0 + 5.9.0 1.9 - - com.hynnet jxl diff --git a/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java b/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java index 4e40be1b4..f679d3b82 100644 --- a/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java +++ b/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java @@ -1,19 +1,13 @@ package org.nl.config; -import cn.hutool.core.util.StrUtil; import com.alibaba.druid.pool.DruidDataSource; import lombok.extern.slf4j.Slf4j; -import org.nl.modules.mnt.util.DataTypeEnum; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; -import java.sql.DriverManager; -import java.sql.SQLException; @Configuration @Slf4j diff --git a/nladmin-system/src/main/java/org/nl/config/thread/AsyncTaskExecutePool.java b/nladmin-system/src/main/java/org/nl/config/thread/AsyncTaskExecutePool.java index 62c7dd6ba..0f7083a76 100644 --- a/nladmin-system/src/main/java/org/nl/config/thread/AsyncTaskExecutePool.java +++ b/nladmin-system/src/main/java/org/nl/config/thread/AsyncTaskExecutePool.java @@ -20,6 +20,7 @@ import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; diff --git a/nladmin-system/src/main/java/org/nl/modules/common/utils/SecurityUtils.java b/nladmin-system/src/main/java/org/nl/modules/common/utils/SecurityUtils.java index 56e2a13ab..d68991b99 100644 --- a/nladmin-system/src/main/java/org/nl/modules/common/utils/SecurityUtils.java +++ b/nladmin-system/src/main/java/org/nl/modules/common/utils/SecurityUtils.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.utils.dto.CurrentUser; import org.nl.modules.system.service.dto.UserDto; import java.util.List; @@ -22,14 +23,14 @@ public class SecurityUtils { * * @return 系统用户 */ - public static UserDto getCurrentUser() { + public static CurrentUser getCurrentUser() { try { JSONObject json = (JSONObject) StpUtil.getExtra("loginInfo"); if (ObjectUtil.isNotEmpty(json)) { - return json.toBean(UserDto.class); + return json.toBean(CurrentUser.class); } } catch (Exception e) { - return new UserDto(); + return new CurrentUser(); } return null; } @@ -61,6 +62,15 @@ public class SecurityUtils { return getCurrentUser().getId(); } + /** + * 获取系统用户Id + * + * @return 系统用户Id + */ + public static Long getDeptId() { + return getCurrentUser().getUser().getDept().getId(); + } + /** * 获取当前用户权限 * diff --git a/nladmin-system/src/main/java/org/nl/modules/mnt/util/ExecuteShellUtil.java b/nladmin-system/src/main/java/org/nl/modules/mnt/util/ExecuteShellUtil.java index 58401437d..504171164 100644 --- a/nladmin-system/src/main/java/org/nl/modules/mnt/util/ExecuteShellUtil.java +++ b/nladmin-system/src/main/java/org/nl/modules/mnt/util/ExecuteShellUtil.java @@ -21,7 +21,9 @@ import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import lombok.extern.slf4j.Slf4j; -import java.io.*; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.PrintWriter; import java.util.Vector; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/quartz/domain/QuartzJob.java b/nladmin-system/src/main/java/org/nl/modules/quartz/domain/QuartzJob.java index ae1359d17..bce16045d 100644 --- a/nladmin-system/src/main/java/org/nl/modules/quartz/domain/QuartzJob.java +++ b/nladmin-system/src/main/java/org/nl/modules/quartz/domain/QuartzJob.java @@ -19,6 +19,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import org.nl.modules.common.base.BaseEntity; + import javax.persistence.*; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; diff --git a/nladmin-system/src/main/java/org/nl/modules/quartz/domain/QuartzLog.java b/nladmin-system/src/main/java/org/nl/modules/quartz/domain/QuartzLog.java index 047bb9212..fbdb2d1e4 100644 --- a/nladmin-system/src/main/java/org/nl/modules/quartz/domain/QuartzLog.java +++ b/nladmin-system/src/main/java/org/nl/modules/quartz/domain/QuartzLog.java @@ -18,6 +18,7 @@ package org.nl.modules.quartz.domain; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.annotations.CreationTimestamp; + import javax.persistence.*; import java.io.Serializable; import java.sql.Timestamp; diff --git a/nladmin-system/src/main/java/org/nl/modules/quartz/repository/QuartzJobRepository.java b/nladmin-system/src/main/java/org/nl/modules/quartz/repository/QuartzJobRepository.java index 4d3d542a7..a63fcf291 100644 --- a/nladmin-system/src/main/java/org/nl/modules/quartz/repository/QuartzJobRepository.java +++ b/nladmin-system/src/main/java/org/nl/modules/quartz/repository/QuartzJobRepository.java @@ -18,6 +18,7 @@ package org.nl.modules.quartz.repository; import org.nl.modules.quartz.domain.QuartzJob; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + import java.util.List; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/quartz/service/QuartzJobService.java b/nladmin-system/src/main/java/org/nl/modules/quartz/service/QuartzJobService.java index 171fe3d11..0f6658226 100644 --- a/nladmin-system/src/main/java/org/nl/modules/quartz/service/QuartzJobService.java +++ b/nladmin-system/src/main/java/org/nl/modules/quartz/service/QuartzJobService.java @@ -19,6 +19,7 @@ import org.nl.modules.quartz.domain.QuartzJob; import org.nl.modules.quartz.domain.QuartzLog; import org.nl.modules.quartz.service.dto.JobQueryCriteria; import org.springframework.data.domain.Pageable; + import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; diff --git a/nladmin-system/src/main/java/org/nl/modules/quartz/service/dto/JobQueryCriteria.java b/nladmin-system/src/main/java/org/nl/modules/quartz/service/dto/JobQueryCriteria.java index 6b2a8ed6c..2279effc9 100644 --- a/nladmin-system/src/main/java/org/nl/modules/quartz/service/dto/JobQueryCriteria.java +++ b/nladmin-system/src/main/java/org/nl/modules/quartz/service/dto/JobQueryCriteria.java @@ -17,6 +17,7 @@ package org.nl.modules.quartz.service.dto; import lombok.Data; import org.nl.modules.common.annotation.Query; + import java.sql.Timestamp; import java.util.List; diff --git a/nladmin-system/src/main/java/org/nl/modules/security/rest/AuthorizationController.java b/nladmin-system/src/main/java/org/nl/modules/security/rest/AuthorizationController.java index 9f24ffc2a..40c37cf63 100644 --- a/nladmin-system/src/main/java/org/nl/modules/security/rest/AuthorizationController.java +++ b/nladmin-system/src/main/java/org/nl/modules/security/rest/AuthorizationController.java @@ -126,10 +126,10 @@ public class AuthorizationController { @ApiOperation("获取用户信息") @GetMapping(value = "/info") public ResponseEntity getUserInfo() { - UserDto currentUser = (UserDto) SecurityUtils.getCurrentUser(); + CurrentUser currentUser = SecurityUtils.getCurrentUser(); JSONObject jsonObject = new JSONObject(); jsonObject.put("roles", SecurityUtils.getCurrentUserPermissions()); - jsonObject.put("user", currentUser); + jsonObject.put("user", currentUser.getUser()); return ResponseEntity.ok(jsonObject); } diff --git a/nladmin-system/src/main/java/org/nl/modules/security/service/dto/AuthUserDto.java b/nladmin-system/src/main/java/org/nl/modules/security/service/dto/AuthUserDto.java index f678dbbe9..61d9bed5b 100644 --- a/nladmin-system/src/main/java/org/nl/modules/security/service/dto/AuthUserDto.java +++ b/nladmin-system/src/main/java/org/nl/modules/security/service/dto/AuthUserDto.java @@ -17,6 +17,7 @@ package org.nl.modules.security.service.dto; import lombok.Getter; import lombok.Setter; + import javax.validation.constraints.NotBlank; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/security/service/dto/OnlineUserDto.java b/nladmin-system/src/main/java/org/nl/modules/security/service/dto/OnlineUserDto.java index 703703216..e5468d669 100644 --- a/nladmin-system/src/main/java/org/nl/modules/security/service/dto/OnlineUserDto.java +++ b/nladmin-system/src/main/java/org/nl/modules/security/service/dto/OnlineUserDto.java @@ -18,6 +18,7 @@ package org.nl.modules.security.service.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; + import java.util.Date; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/system/domain/Dept.java b/nladmin-system/src/main/java/org/nl/modules/system/domain/Dept.java index 5c5695721..9a68cb5a9 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/domain/Dept.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/domain/Dept.java @@ -20,6 +20,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import org.nl.modules.common.base.BaseEntity; + import javax.persistence.*; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; diff --git a/nladmin-system/src/main/java/org/nl/modules/system/domain/User.java b/nladmin-system/src/main/java/org/nl/modules/system/domain/User.java index 22179b1e3..b7d8d0770 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/domain/User.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/domain/User.java @@ -23,7 +23,6 @@ import org.hibernate.annotations.NotFoundAction; import org.nl.modules.common.base.BaseEntity; import javax.persistence.*; -import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.io.Serializable; diff --git a/nladmin-system/src/main/java/org/nl/modules/system/domain/vo/MenuMetaVo.java b/nladmin-system/src/main/java/org/nl/modules/system/domain/vo/MenuMetaVo.java index e7a803199..72b475c0f 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/domain/vo/MenuMetaVo.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/domain/vo/MenuMetaVo.java @@ -17,6 +17,7 @@ package org.nl.modules.system.domain.vo; import lombok.AllArgsConstructor; import lombok.Data; + import java.io.Serializable; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/system/repository/DeptRepository.java b/nladmin-system/src/main/java/org/nl/modules/system/repository/DeptRepository.java index a9d673191..65c58c8b5 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/repository/DeptRepository.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/repository/DeptRepository.java @@ -20,6 +20,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; + import java.util.List; import java.util.Set; diff --git a/nladmin-system/src/main/java/org/nl/modules/system/repository/UserRepository.java b/nladmin-system/src/main/java/org/nl/modules/system/repository/UserRepository.java index 76fac5cfb..cf873aafd 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/repository/UserRepository.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/repository/UserRepository.java @@ -20,6 +20,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; + import java.util.Date; import java.util.List; import java.util.Set; diff --git a/nladmin-system/src/main/java/org/nl/modules/system/rest/GenCodeController.java b/nladmin-system/src/main/java/org/nl/modules/system/rest/GenCodeController.java index 853fa30c8..39ea3e8b7 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/rest/GenCodeController.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/rest/GenCodeController.java @@ -1,15 +1,15 @@ package org.nl.modules.system.rest; +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import com.alibaba.fastjson.JSONObject; import org.nl.modules.logging.annotation.Log; import org.nl.modules.system.service.GenCodeService; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import cn.dev33.satoken.annotation.SaCheckPermission; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; diff --git a/nladmin-system/src/main/java/org/nl/modules/system/rest/MonitorController.java b/nladmin-system/src/main/java/org/nl/modules/system/rest/MonitorController.java index 13d726076..3852b66c2 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/rest/MonitorController.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/rest/MonitorController.java @@ -15,14 +15,16 @@ */ package org.nl.modules.system.rest; +import cn.dev33.satoken.annotation.SaCheckPermission; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.nl.modules.system.service.MonitorService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import cn.dev33.satoken.annotation.SaCheckPermission; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * @author Zheng Jie diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/CodeDetailService.java b/nladmin-system/src/main/java/org/nl/modules/system/service/CodeDetailService.java index cec92f896..8d70039fa 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/CodeDetailService.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/CodeDetailService.java @@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject; import org.springframework.data.domain.Pageable; import java.util.Map; -import java.util.Set; public interface CodeDetailService { /** diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/DictDetailService.java b/nladmin-system/src/main/java/org/nl/modules/system/service/DictDetailService.java index f15bd4236..1bc51e89b 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/DictDetailService.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/DictDetailService.java @@ -19,6 +19,7 @@ import org.nl.modules.system.domain.DictDetail; import org.nl.modules.system.service.dto.DictDetailDto; import org.nl.modules.system.service.dto.DictDetailQueryCriteria; import org.springframework.data.domain.Pageable; + import java.util.List; import java.util.Map; diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java b/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java index 9ba30f022..76a0011b4 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java @@ -19,6 +19,7 @@ import org.nl.modules.system.domain.Dict; import org.nl.modules.system.service.dto.DictDto; import org.nl.modules.system.service.dto.DictQueryCriteria; import org.springframework.data.domain.Pageable; + import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/UserService.java b/nladmin-system/src/main/java/org/nl/modules/system/service/UserService.java index f5e276215..40ba27eea 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/UserService.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/UserService.java @@ -20,6 +20,7 @@ import org.nl.modules.system.service.dto.UserDto; import org.nl.modules.system.service.dto.UserQueryCriteria; import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; + import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/convert/RedisConvert.java b/nladmin-system/src/main/java/org/nl/modules/system/service/convert/RedisConvert.java index 7ec348876..d03c81500 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/convert/RedisConvert.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/convert/RedisConvert.java @@ -3,12 +3,9 @@ package org.nl.modules.system.service.convert; import cn.hutool.core.util.StrUtil; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import org.nl.modules.system.service.entity.RedisKeyDefine; -import org.nl.modules.system.service.vo.RedisKeyDefineRespVO; import org.nl.modules.system.service.vo.RedisMonitorRespVO; import java.util.ArrayList; -import java.util.List; import java.util.Properties; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/dto/DeptSmallDto.java b/nladmin-system/src/main/java/org/nl/modules/system/service/dto/DeptSmallDto.java index c27bbc5df..4ff0a37c1 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/dto/DeptSmallDto.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/dto/DeptSmallDto.java @@ -16,6 +16,7 @@ package org.nl.modules.system.service.dto; import lombok.Data; + import java.io.Serializable; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/dto/DictSmallDto.java b/nladmin-system/src/main/java/org/nl/modules/system/service/dto/DictSmallDto.java index e737bf6d6..ea42f8a94 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/dto/DictSmallDto.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/dto/DictSmallDto.java @@ -17,6 +17,7 @@ package org.nl.modules.system.service.dto; import lombok.Getter; import lombok.Setter; + import java.io.Serializable; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/dto/ParamDto.java b/nladmin-system/src/main/java/org/nl/modules/system/service/dto/ParamDto.java index 4c4a961ad..86da40182 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/dto/ParamDto.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/dto/ParamDto.java @@ -1,6 +1,7 @@ package org.nl.modules.system.service.dto; import lombok.Data; + import java.io.Serializable; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/dto/RoleSmallDto.java b/nladmin-system/src/main/java/org/nl/modules/system/service/dto/RoleSmallDto.java index eac81ca38..150b19135 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/dto/RoleSmallDto.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/dto/RoleSmallDto.java @@ -16,6 +16,7 @@ package org.nl.modules.system.service.dto; import lombok.Data; + import java.io.Serializable; /** diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/impl/ParamServiceImpl.java b/nladmin-system/src/main/java/org/nl/modules/system/service/impl/ParamServiceImpl.java index e942c7b6d..766af3e7d 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/impl/ParamServiceImpl.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/impl/ParamServiceImpl.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.FileUtil; import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.common.utils.dto.CurrentUser; import org.nl.modules.system.service.ParamService; import org.nl.modules.system.service.dto.ParamDto; import org.nl.modules.system.service.dto.UserDto; @@ -74,7 +75,7 @@ public class ParamServiceImpl implements ParamService { @Override @Transactional(rollbackFor = Exception.class) public void create(ParamDto dto) { - UserDto currentUsername = SecurityUtils.getCurrentUser(); + CurrentUser currentUsername = SecurityUtils.getCurrentUser(); Long currentId = StpUtil.getLoginIdAsLong(); String now = DateUtil.now(); @@ -98,7 +99,7 @@ public class ParamServiceImpl implements ParamService { ParamDto entity = this.findById(dto.getId()); if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); - UserDto currentUsername = SecurityUtils.getCurrentUser(); + CurrentUser currentUsername = SecurityUtils.getCurrentUser(); String now = DateUtil.now(); dto.setUpdate_optid(StpUtil.getLoginIdAsLong()); diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/impl/RedisServiceImpl.java b/nladmin-system/src/main/java/org/nl/modules/system/service/impl/RedisServiceImpl.java index 18b06affa..1d5f9d63c 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/impl/RedisServiceImpl.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/impl/RedisServiceImpl.java @@ -8,7 +8,6 @@ import org.nl.modules.system.service.RedisService; import org.nl.modules.system.service.convert.RedisConvert; import org.nl.modules.system.service.entity.RedisKeyDefine; import org.nl.modules.system.service.entity.RedisKeyRegistry; -//import org.nl.modules.system.service.vo.IdempotentRedisDAO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.connection.RedisServerCommands; diff --git a/nladmin-system/src/main/java/org/nl/modules/tools/config/MultipartConfig.java b/nladmin-system/src/main/java/org/nl/modules/tools/config/MultipartConfig.java index ec352f61e..853d7f85a 100644 --- a/nladmin-system/src/main/java/org/nl/modules/tools/config/MultipartConfig.java +++ b/nladmin-system/src/main/java/org/nl/modules/tools/config/MultipartConfig.java @@ -18,6 +18,7 @@ package org.nl.modules.tools.config; import org.springframework.boot.web.servlet.MultipartConfigFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; + import javax.servlet.MultipartConfigElement; import java.io.File; diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/constant/MaterOptTypeEnum.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/constant/MaterOptTypeEnum.java new file mode 100644 index 000000000..cc20467ea --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/constant/MaterOptTypeEnum.java @@ -0,0 +1,92 @@ +package org.nl.wms.basedata.master.constant; + +import com.alibaba.fastjson.JSONObject; + +/** + * 获取物料操作类型 + */ +public enum MaterOptTypeEnum { + QBWL(1, "00", "全部物料", "('1')", ""), + BCP(2, "01", "管件半成品", "('1528555443906023424')", ""), + YCL(3, "02", "管件原材料", "('1503644349995552768')", ""), + CP(4, "03", "关键成品", "('1528555444031852544')", ""); + + + + //顺序号 + private int index; + //编码 + private String code; + //名字 + private String name; + //分类标识串 + private String class_idStr; + //描述 + private String desc; + + public static JSONObject getObj(String code) { + for (MaterOptTypeEnum item : values()) { + if (item.getCode().equals(code)) { + JSONObject json=new JSONObject(); + json.put("index",item.getIndex()); + json.put("code",item.getCode()); + json.put("name",item.getName()); + json.put("class_idStr",item.getClass_idStr()); + json.put("desc",item.getDesc()); + return json; + } + } + + return null; + + } + + + private MaterOptTypeEnum(int index, String code, String name, String class_idStr, String desc) { + this.index = index; + this.code = code; + this.name = name; + this.class_idStr = class_idStr; + this.desc = desc; + } + + public String getClass_idStr() { + return class_idStr; + } + + public void setClass_idStr(String class_idStr) { + this.class_idStr = class_idStr; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + 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; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/eum/BusinessCodeEnum.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/eum/BusinessCodeEnum.java new file mode 100644 index 000000000..02a13c814 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/eum/BusinessCodeEnum.java @@ -0,0 +1,27 @@ +package org.nl.wms.basedata.master.eum; + +public enum BusinessCodeEnum { + STOCK_IN(1,"10","入库"), + STOCK_OUT(2,"20","出库"), + QUALITY_INSPECTOR(3,"30","质检"), + CHEMISTRY(4,"40","理化"); + + + private int index; + private String name; + private String code; + + private BusinessCodeEnum(int index, String code, String name) { + this.index = index; + this.code = code; + this.name = name; + } + + public String getName() { + return name; + } + + public String getCode() { + return code; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/eum/RecordStatusEnum.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/eum/RecordStatusEnum.java new file mode 100644 index 000000000..bedc36a75 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/eum/RecordStatusEnum.java @@ -0,0 +1,28 @@ +package org.nl.wms.basedata.master.eum; + +public enum RecordStatusEnum { + CREATE(1,"01","生成"), + SET_TRAY(2,"02","组盘"), + STOCK_IN(3,"03","入库"), + STOCK_OUT(4,"04","出库"), + STOCK_STATE_IN(5,"05","入立库"); + + + private int index; + private String name; + private String code; + + private RecordStatusEnum(int index, String code, String name) { + this.index = index; + this.code = code; + this.name = name; + } + + public String getName() { + return name; + } + + public String getCode() { + return code; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/manage/AbstructMaterialType.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/manage/AbstructMaterialType.java new file mode 100644 index 000000000..83f07f1c8 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/manage/AbstructMaterialType.java @@ -0,0 +1,8 @@ +package org.nl.wms.basedata.master.manage; + +import java.util.HashSet; +import java.util.Set; + +public class AbstructMaterialType { + private Set materialTypeIds = new HashSet<>(); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/ClassstandardController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/ClassstandardController.java new file mode 100644 index 000000000..7ab7de4b6 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/ClassstandardController.java @@ -0,0 +1,124 @@ + +package org.nl.wms.basedata.master.rest; + + +import cn.hutool.core.map.MapUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.basedata.master.service.dto.ClassstandardDto; +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; + +/** + * @author zhouz + * @date 2021-12-07 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "基础类别管理") +@RequestMapping("/api/Classstandard") +@Slf4j +public class ClassstandardController { + + private final ClassstandardService ClassstandardService; + + @GetMapping + @Log("查询基础类别") + @ApiOperation("查询基础类别") + //@PreAuthorize("@el.check('Classstandard:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(ClassstandardService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增基础类别") + @ApiOperation("新增基础类别") + //@PreAuthorize("@el.check('Classstandard:add')") + public ResponseEntity create(@Validated @RequestBody ClassstandardDto dto) { + ClassstandardService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改基础类别") + @ApiOperation("修改基础类别") + //@PreAuthorize("@el.check('Classstandard:edit')") + public ResponseEntity update(@Validated @RequestBody ClassstandardDto dto) { + ClassstandardService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除基础类别") + @ApiOperation("删除基础类别") + //@PreAuthorize("@el.check('Classstandard:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + ClassstandardService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/loadClass") + @Log("查询基础类型") + @ApiOperation("查询基础类型") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity query(@RequestParam Map whereJson) { + return new ResponseEntity<>(ClassstandardService.loadClass(whereJson), HttpStatus.OK); + } + + @GetMapping("/getClass") + @Log("查询基础类型") + @ApiOperation("查询基础类型") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity queryClassBycode(@RequestParam Map whereJson) { + return new ResponseEntity<>(ClassstandardService.queryClassBycode(whereJson), HttpStatus.OK); + } + + + @GetMapping("/queryClassById") + @Log("查询分类基础列表") + @ApiOperation("查询分类基础列表") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity queryClassById(@RequestParam Map whereJson) { + return new ResponseEntity<>(ClassstandardService.queryClassById(whereJson), HttpStatus.OK); + } + + @GetMapping("/getClassTable") + @Log("查询物料基础类型") + @ApiOperation("查询物料基础类型") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity queryClassTable(@RequestParam Map whereJson,Pageable page) { + return new ResponseEntity<>(ClassstandardService.queryClassTable(whereJson,page), HttpStatus.OK); + } + + @ApiOperation("查询类别:根据ID获取同级与上级数据") + @PostMapping("/superior") + //@PreAuthorize("@el.check('user:list','dept:list')") + public ResponseEntity getSuperior(@RequestBody Long id) { + JSONObject jo = WQLObject.getWQLObject("MD_PB_ClassStandard").query("class_id = '" + id + "'").uniqueResult(0); + JSONArray maters = ClassstandardService.getSuperior(jo, new JSONArray()); + return new ResponseEntity<>(ClassstandardService.buildTree(maters), HttpStatus.OK); + } + + @GetMapping("/getType") + @Log("获取分类类型") + @ApiOperation("获取分类类型") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity getType(@RequestParam Map whereJson) { + String type_id = MapUtil.getStr(whereJson, "type_id"); + int level = MapUtil.getInt(whereJson, "level"); + return new ResponseEntity<>(ClassstandardService.getType(type_id,level), HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/CustomerbaseController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/CustomerbaseController.java new file mode 100644 index 000000000..dd5f04b87 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/CustomerbaseController.java @@ -0,0 +1,67 @@ + +package org.nl.wms.basedata.master.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.master.service.CustomerbaseService; +import org.nl.wms.basedata.master.service.dto.CustomerbaseDto; +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; + +/** + * @author ldjun + * @date 2021-12-06 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "客户基础表管理") +@RequestMapping("/api/customerbase") +@Slf4j +public class CustomerbaseController { + + private final CustomerbaseService customerbaseService; + + @GetMapping + @Log("查询客户基础表") + @ApiOperation("查询客户基础表") + //@PreAuthorize("@el.check('customerbase:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(customerbaseService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增客户基础表") + @ApiOperation("新增客户基础表") + //@PreAuthorize("@el.check('customerbase:add')") + public ResponseEntity create(@Validated @RequestBody CustomerbaseDto dto) { + customerbaseService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改客户基础表") + @ApiOperation("修改客户基础表") + //@PreAuthorize("@el.check('customerbase:edit')") + public ResponseEntity update(@Validated @RequestBody CustomerbaseDto dto) { + customerbaseService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除客户基础表") + @ApiOperation("删除客户基础表") + //@PreAuthorize("@el.check('customerbase:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + customerbaseService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/MaterialbaseController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/MaterialbaseController.java new file mode 100644 index 000000000..b25d5516b --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/MaterialbaseController.java @@ -0,0 +1,104 @@ + +package org.nl.wms.basedata.master.rest; + + +import cn.hutool.core.map.MapUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.master.constant.MaterOptTypeEnum; +import org.nl.wms.basedata.master.service.MaterialbaseService; +import org.nl.wms.basedata.master.service.dto.MaterialbaseDto; +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; + +/** + * @author zhouz + * @date 2021-12-07 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "物料管理") +@RequestMapping("/api/Materialbase") +@Slf4j +public class MaterialbaseController { + + private final MaterialbaseService materialBaseService; + + @GetMapping + @Log("查询物料") + @ApiOperation("查询物料") + //@PreAuthorize("@el.check('Materialbase:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(materialBaseService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增物料") + @ApiOperation("新增物料") + //@PreAuthorize("@el.check('Materialbase:add')") + public ResponseEntity create(@Validated @RequestBody MaterialbaseDto dto) { + materialBaseService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改物料") + @ApiOperation("修改物料") + //@PreAuthorize("@el.check('Materialbase:edit')") + public ResponseEntity update(@Validated @RequestBody MaterialbaseDto dto) { + materialBaseService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除物料") + @ApiOperation("删除物料") + //@PreAuthorize("@el.check('Materialbase:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + materialBaseService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + + @Log("判断物料操作类型") + @ApiOperation("判断物料操作类型") + @PostMapping("/isAlongMaterType") + public ResponseEntity isAlongMaterType(@RequestBody Map map) { + String materOpt_code = MapUtil.getStr(map, "materOpt_code"); + String material_id = MapUtil.getStr(map, "material_id"); + String material_type_id = MapUtil.getStr(map, "material_type_id"); + return new ResponseEntity<>(materialBaseService.isAlongMaterType(materOpt_code, material_id, material_type_id), HttpStatus.OK); + } + + @Log("查询物料操作类型") + @ApiOperation("查询物料操作类型") + @PostMapping("/getMaterOptType") + public ResponseEntity getMaterOptType(@RequestBody Map map) { + String materOpt_code = MapUtil.getStr(map, "materOpt_code"); + return new ResponseEntity<>(MaterOptTypeEnum.getObj(materOpt_code), HttpStatus.OK); + } + + @PostMapping("/synchronize") + @Log("物料同步") + @ApiOperation("物料同步") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity synchronize(@RequestBody Map whereJson) { + materialBaseService.synchronize(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("查询产品系列类型") + @ApiOperation("查询产品系列类型") + @GetMapping("/getProductSeries") + public ResponseEntity getProductSeries() { + return new ResponseEntity<>(materialBaseService.getProductSeries("1527572574832300032"), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/StoragevehicleinfoController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/StoragevehicleinfoController.java new file mode 100644 index 000000000..84bf5d9f3 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/StoragevehicleinfoController.java @@ -0,0 +1,85 @@ + +package org.nl.wms.basedata.master.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.master.service.StoragevehicleinfoService; +import org.nl.wms.basedata.master.service.dto.StoragevehicleinfoDto; +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; + +/** +* @author ldjun +* @date 2021-12-09 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "载具管理") +@RequestMapping("/api/storagevehicleinfo") +@Slf4j +public class StoragevehicleinfoController { + + private final StoragevehicleinfoService storagevehicleinfoService; + + @GetMapping + @Log("查询载具") + @ApiOperation("查询载具") + //@PreAuthorize("@el.check('mdPbStoragevehicleinfo:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(storagevehicleinfoService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增载具") + @ApiOperation("新增载具") + //@PreAuthorize("@el.check('mdPbStoragevehicleinfo:add')") + public ResponseEntity create(@RequestBody Map map){ + return new ResponseEntity<>(storagevehicleinfoService.create(map),HttpStatus.CREATED); + } + + @PutMapping + @Log("修改载具") + @ApiOperation("修改载具") + //@PreAuthorize("@el.check('mdPbStoragevehicleinfo:edit')") + public ResponseEntity update(@Validated @RequestBody StoragevehicleinfoDto dto){ + storagevehicleinfoService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除载具") + @ApiOperation("删除载具") + //@PreAuthorize("@el.check('mdPbStoragevehicleinfo:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + storagevehicleinfoService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping("/changeActive") + @Log("修改点位启用状态") + @ApiOperation("修改点位启用状态") + //@PreAuthorize("@el.check('store:edit')") + public ResponseEntity changeActive(@RequestBody JSONObject json) { + storagevehicleinfoService.changeActive(json); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @GetMapping("/getVehicle/{code}") + @Log("获取起始载具号") + @ApiOperation("获取起始载具号") + //@PreAuthorize("@el.check('store:edit')") + public ResponseEntity getVehicle(@PathVariable String code) { + JSONObject json = storagevehicleinfoService.getVehicle(code); + return new ResponseEntity<>(json,HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/SupplierbaseController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/SupplierbaseController.java new file mode 100644 index 000000000..59d7f48cf --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/SupplierbaseController.java @@ -0,0 +1,64 @@ + +package org.nl.wms.basedata.master.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.master.service.SupplierbaseService; +import org.nl.wms.basedata.master.service.dto.SupplierbaseDto; +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; + +/** + * @author zhouz + * @date 2021-12-06 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "供应商管理") +@RequestMapping("/api/supplierbase") +@Slf4j +public class SupplierbaseController { + + private final SupplierbaseService supplierbaseService; + + @GetMapping + @Log("查询供应商") + @ApiOperation("查询供应商") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(supplierbaseService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增供应商") + @ApiOperation("新增供应商") + public ResponseEntity create(@Validated @RequestBody SupplierbaseDto dto) { + supplierbaseService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改供应商") + @ApiOperation("修改供应商") + public ResponseEntity update(@Validated @RequestBody SupplierbaseDto dto) { + supplierbaseService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除供应商") + @ApiOperation("删除供应商") + //@PreAuthorize("@el.check('mdCsSupplierbase:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + supplierbaseService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/UnitController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/UnitController.java new file mode 100644 index 000000000..d53b421cc --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/UnitController.java @@ -0,0 +1,74 @@ + +package org.nl.wms.basedata.master.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.master.service.UnitService; +import org.nl.wms.basedata.master.service.dto.UnitDto; +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; + +/** +* @author loujf +* @date 2021-12-07 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "计量单位管理") +@RequestMapping("/api/mdPbMeasureunit") +@Slf4j +public class UnitController { + private final UnitService unitService; + + @GetMapping + @Log("查询计量单位") + @ApiOperation("查询计量单位") + //@PreAuthorize("@el.check('Unit:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(unitService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增计量单位") + @ApiOperation("新增计量单位") + //@PreAuthorize("@el.check('Unit:add')") + public ResponseEntity create(@Validated @RequestBody UnitDto dto){ + unitService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改计量单位") + @ApiOperation("修改计量单位") + //@PreAuthorize("@el.check('Unit:edit')") + public ResponseEntity update(@Validated @RequestBody UnitDto dto){ + unitService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除计量单位") + @ApiOperation("删除计量单位") + //@PreAuthorize("@el.check('Unit:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + unitService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getUnit") + @Log("查询单位下拉框") + @ApiOperation("查询仓库下拉框") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity queryUnit(@RequestParam Map whereJson) { + return new ResponseEntity<>(unitService.getUnit(whereJson), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/ClassstandardService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/ClassstandardService.java new file mode 100644 index 000000000..6960a8550 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/ClassstandardService.java @@ -0,0 +1,127 @@ + +package org.nl.wms.basedata.master.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.master.service.dto.ClassstandardDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author zhouz + * @description 服务接口 + * @date 2021-12-07 + **/ +public interface ClassstandardService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param class_id ID + * @return Classstandard + */ + ClassstandardDto findById(String class_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Classstandard + */ + ClassstandardDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(ClassstandardDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(ClassstandardDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + JSONObject loadClass(Map whereJson); + + JSONArray getSuperior(JSONObject jo, JSONArray ja); + + JSONObject buildTree(JSONArray ja); + + @SuppressWarnings("unchecked") + JSONObject queryClassBycode(Map whereJson); + + JSONObject queryClassById(Map whereJson); + + JSONObject queryClassTable(Map whereJson, Pageable page); + + /** + * @param type_id 类型标识 + * @param level 级别 + * @return + */ + JSONObject getType(String type_id, int level); + + /** + * 获取当前节点的所有子类节点集合数据 + * + * @param class_id + * @return + */ + Set getChildIdSet(String class_id); + + /** + * 获取查询条件的所有子节点集合 + * + * @param class_idStr + * @return + */ + Set getAllChildIdSet(String class_idStr); + + /** + * 获取当前节点的所有子类节点集合串,用于拼接SQL(in) + * + * @param class_id + * @return + */ + String getChildIdStr(String class_id); + + /** + * 获取所有节点的子节点的ID串 + * + * @param class_idStr + * @return + */ + String getAllChildIdStr(String class_idStr); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/CustomerbaseService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/CustomerbaseService.java new file mode 100644 index 000000000..67bf4c284 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/CustomerbaseService.java @@ -0,0 +1,64 @@ + +package org.nl.wms.basedata.master.service; + +import org.nl.wms.basedata.master.service.dto.CustomerbaseDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @description 服务接口 + * @author ldjun + * @date 2021-12-06 + **/ +public interface CustomerbaseService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param cust_id ID + * @return Customerbase + */ + CustomerbaseDto findById(Long cust_id); + + /** + * 根据编码查询 + * @param code code + * @return Customerbase + */ + CustomerbaseDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(CustomerbaseDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(CustomerbaseDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/MaterialbaseService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/MaterialbaseService.java new file mode 100644 index 000000000..2f01466b0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/MaterialbaseService.java @@ -0,0 +1,97 @@ + +package org.nl.wms.basedata.master.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.master.service.dto.MaterialbaseDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author zhouz + * @description 服务接口 + * @date 2021-12-07 + **/ +public interface MaterialbaseService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param material_id ID + * @return Materialbase + */ + MaterialbaseDto findById(Long material_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Materialbase + */ + MaterialbaseDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(MaterialbaseDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(MaterialbaseDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 根据物料标识或类型判断物料类型:对应MaterOptTypeEnum类定义的类型 + * + * @param material_id + * @param material_type_id + * @param materOpt_code + * @return + */ + boolean isAlongMaterType(String materOpt_code, String material_id, String material_type_id); + + /** + * 根据编码获取物料操作类型 + * + * @param materOpt_code MaterOptTypeEnum + * @return + */ + JSONObject getMaterOptType(String materOpt_code); + + void synchronize(Map whereJson); + + JSONArray getProductSeries(String parent_class_id); + + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/StoragevehicleinfoService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/StoragevehicleinfoService.java new file mode 100644 index 000000000..61ace9d97 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/StoragevehicleinfoService.java @@ -0,0 +1,78 @@ + +package org.nl.wms.basedata.master.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.master.service.dto.StoragevehicleinfoDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author ldjun +* @date 2021-12-09 +**/ +public interface StoragevehicleinfoService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param storagevehicle_id ID + * @return MdPbStoragevehicleinfo + */ + StoragevehicleinfoDto findById(Long storagevehicle_id); + + /** + * 根据编码查询 + * @param code code + * @return MdPbStoragevehicleinfo + */ + StoragevehicleinfoDto findByCode(String code); + + + /** + * 创建 + * @param map / + */ + JSONArray create(Map map); + + /** + * 编辑 + * @param dto / + */ + void update(StoragevehicleinfoDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 多修改启用状态 + * @param json / + */ + void changeActive(JSONObject json); + + /** + * 获取起始载具号 + * @param code / + */ + JSONObject getVehicle(String code); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/SupplierbaseService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/SupplierbaseService.java new file mode 100644 index 000000000..4160412bb --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/SupplierbaseService.java @@ -0,0 +1,64 @@ + +package org.nl.wms.basedata.master.service; + +import org.nl.wms.basedata.master.service.dto.SupplierbaseDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author zhouz +* @date 2021-12-06 +**/ +public interface SupplierbaseService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param supp_id ID + * @return MdCsSupplierbase + */ + SupplierbaseDto findById(Long supp_id); + + /** + * 根据编码查询 + * @param code code + * @return MdCsSupplierbase + */ + SupplierbaseDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(SupplierbaseDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(SupplierbaseDto dto); + + /**c + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/UnitService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/UnitService.java new file mode 100644 index 000000000..a326fc5fe --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/UnitService.java @@ -0,0 +1,68 @@ + +package org.nl.wms.basedata.master.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.master.service.dto.UnitDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author loujf +* @date 2021-12-07 +**/ +public interface UnitService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param measure_unit_id ID + * @return Unit + */ + UnitDto findById(Long measure_unit_id); + + /** + * 根据编码查询 + * @param code code + * @return Unit + */ + UnitDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(UnitDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(UnitDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(String[] ids); + + JSONObject getUnit(Map whereJson); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/BusinesstypematerialDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/BusinesstypematerialDto.java new file mode 100644 index 000000000..1d25b2e80 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/BusinesstypematerialDto.java @@ -0,0 +1,69 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author Liuxy +* @date 2022-01-19 +**/ +@Data +public class BusinesstypematerialDto implements Serializable { + + /** 业务明细标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long business_id; + + /** 业务类型编码 */ + private String business_type_code; + + /** 业务类型名称 */ + private String business_type_name; + + /** 单据类型编码 */ + private String inv_type_code; + + /** 单据类型名称 */ + private String inv_type_name; + + /** 物料分类标识 */ + private String material_type_id; + + /** 物料分类编码 */ + private String material_type_code; + + /** 说明 */ + private String remark; + + /** 是否启用 */ + private String is_used; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; + + /** 是否删除 */ + private String is_delete; + + /** 外部标识 */ + private String ext_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/ClassstandardDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/ClassstandardDto.java new file mode 100644 index 000000000..50141143b --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/ClassstandardDto.java @@ -0,0 +1,61 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @description / + * @author zhouz + * @date 2021-12-07 + **/ +@Data +public class ClassstandardDto implements Serializable { + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long class_id; + + private String base_data_type; + + private String path_code; + + private String class_code; + + private String long_class_code; + + private String class_name; + + private String class_desc; + + private Long parent_class_id; + + private String is_leaf; + + private BigDecimal sub_count; + + private String is_modify; + + private String is_delete; + + private String class_level; + + private String ext_id; + + private String ext_parent_id; + + private Long create_id; + + private String create_name; + + private String create_time; + + private Long update_optid; + + private String update_optname; + + private String update_time; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/CustomerbaseDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/CustomerbaseDto.java new file mode 100644 index 000000000..3c84156fa --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/CustomerbaseDto.java @@ -0,0 +1,192 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ldjun + * @description / + * @date 2021-12-06 + **/ +@Data +public class CustomerbaseDto implements Serializable { + /** 客户标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long cust_id; + + /** + * 客户编码 + */ + private String cust_code; + + /** + * 客户名称 + */ + private String cust_name; + + /** + * 客户简称 + */ + private String cust_simple_name; + + /** + * 国家 + */ + private String country; + + /** + * 省份 + */ + private String state; + + /** + * 城市 + */ + private String city; + + /** + * 传真 + */ + private String faxnumber; + + /** + * 邮箱 + */ + private String webSite; + + /** + * 法人代表 + */ + private String jurid_name; + + /** + * 税务登记号 + */ + private String tax_no; + + /** + * 工商注册号 + */ + private String register_no; + + /** + * 经营许可证号 + */ + private String manage_lice_no; + + /** + * 营业执照 + */ + private String busi_char_name; + + /** + * 行政区划 + */ + private Long area_id; + + /** + * 邮政编码 + */ + private String zip_code; + + /** + * 公司电话 + */ + private String corp_tele_no; + + /** + * 公司地址 + */ + private String corp_address; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 启用时间 + */ + private String is_used_time; + + /** + * 是否启用 + */ + private String is_used; + + /** + * 是否删除 + */ + private String is_delete; + + /** + * 外部标识 + */ + private String ext_id; + + /** + * 备注 + */ + private String remark; + + /** + * 分类标识 + */ + private Long class_id; + + /** + * 分类编码 + */ + private String class_code; + + /** + * 分类名称 + */ + private String class_name; + + /** + * 子卷打印模板号 + */ + private String zj_print_no; + + /** + * 包装打印模板号 + */ + private String bz_print_no; + + /** + * 送货单打印模板号 + */ + private String shd_print_no; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/EndrealsemimaterialDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/EndrealsemimaterialDto.java new file mode 100644 index 000000000..221b61122 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/EndrealsemimaterialDto.java @@ -0,0 +1,45 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author geng by +* @date 2022-05-31 +**/ +@Data +public class EndrealsemimaterialDto implements Serializable { + + /** 关系标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long relation_id; + + /** 成品标识 */ + private Long end_material_id; + + /** 半成品标识 */ + private Long semi_material_id; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/MaterialParametersDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/MaterialParametersDto.java new file mode 100644 index 000000000..6ebacb2b1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/MaterialParametersDto.java @@ -0,0 +1,86 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author zhouz +* @date 2021-12-07 +**/ +@Data + +public class MaterialParametersDto implements Serializable { + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long material_id; + + /** 物料编码 */ + private String material_code; + + /** 物料名称 */ + private String material_name; + + private String material_spec; + + private String material_model; + + private String english_name; + + private Long base_unit_id; + + private String approve_fileno; + + private String print_no; + + /** 物料分类 */ + private Long material_type_id; + + + private Long len_unit_id; + + private BigDecimal length; + + private BigDecimal width; + + private BigDecimal height; + + /** 计量单位 */ + private Long weight_unit_id; + + private BigDecimal gross_weight; + + private BigDecimal net_weight; + + private Long cubage_unit_id; + + private BigDecimal cubage; + + private Long create_id; + + private String create_name; + + private String create_time; + + private Long update_optid; + + private String update_optname; + + private String update_time; + + private String is_used_time; + + /** 是否启用 */ + private String is_used; + + private String is_delete; + + private String ext_id; + + private String material_height_type; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/MaterialbaseDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/MaterialbaseDto.java new file mode 100644 index 000000000..ce3519244 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/MaterialbaseDto.java @@ -0,0 +1,105 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author zhouz + * @description / + * @date 2021-12-07 + **/ +@Data +public class MaterialbaseDto implements Serializable { + + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long material_id; + + /** + * 物料编码 + */ + private String material_code; + + /** + * 物料名称 + */ + private String material_name; + + private String material_spec; + + private String material_model; + + private String english_name; + + private long base_unit_id; + + private long assist_unit_id; + private String base_unit_name; + + private String approve_fileno; + + private String print_no; + + /** + * 物料分类 + */ + private Long material_type_id; + + private Long len_unit_id; + + private BigDecimal length; + + private BigDecimal width; + + private BigDecimal height; + + /** + * 计量单位 + */ + private Long weight_unit_id; + + private BigDecimal gross_weight; + + private BigDecimal net_weight; + + private Long cubage_unit_id; + + private BigDecimal cubage; + + private Long create_id; + + private String create_name; + + private String create_time; + + private Long update_optid; + + private String update_optname; + + private String update_time; + + private String is_used_time; + + /** + * 是否启用 + */ + private String is_used; + + private String is_delete; + + private String ext_id; + + private String material_height_type; + + private Long ass_unit_id; + + private Long product_series; + + private Integer standing_time; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SemirealrawmaterialDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SemirealrawmaterialDto.java new file mode 100644 index 000000000..316588d90 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SemirealrawmaterialDto.java @@ -0,0 +1,45 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author geng by +* @date 2022-05-31 +**/ +@Data +public class SemirealrawmaterialDto implements Serializable { + + /** 关系标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long relation_id; + + /** 半成品标识 */ + private Long semi_material_id; + + /** 原材料标识 */ + private Long raw_material_id; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/StoragevehicleinfoDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/StoragevehicleinfoDto.java new file mode 100644 index 000000000..171d9149c --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/StoragevehicleinfoDto.java @@ -0,0 +1,61 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author ldjun +* @date 2021-12-09 +**/ +@Data +public class StoragevehicleinfoDto implements Serializable { + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long storagevehicle_id; + + private String storagevehicle_code; + + private String storagevehicle_name; + + private String one_code; + + private String two_code; + + private String rfid_code; + + private Long create_id; + + private String create_name; + + private String create_time; + + private Long update_optid; + + private String update_optname; + + private String update_time; + + private String is_delete; + + private String is_used; + + private String storagevehicle_type; + + private BigDecimal vehicle_width; + + private BigDecimal vehicle_long; + + private BigDecimal vehicle_height; + + private String overstruct_type; + + private BigDecimal occupystruct_qty; + + private String ext_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SupplierbaseDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SupplierbaseDto.java new file mode 100644 index 000000000..57fb0b233 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/SupplierbaseDto.java @@ -0,0 +1,102 @@ +package org.nl.wms.basedata.master.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author zhouz + * @description / + * @date 2021-12-06 + **/ +@Data +public class SupplierbaseDto implements Serializable { + /** 供应商标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long supp_id; + + /** 供应商编码 */ + private String supp_code; + + /** 供应商名称 */ + private String supp_name; + + /** 法人代表 */ + private String jurid_name; + + /** 税务登记号 */ + private String tax_no; + + /** 工商注册号 */ + private String register_no; + + /** 经营许可证号 */ + private String manage_lice_no; + + /** 营业执照 */ + private String busi_char_name; + + /** 行政区划 */ + private Long area_id; + + /** 邮政编码 */ + private String zip_code; + + /** 公司电话 */ + private String corp_tele_no; + + /** 公司地址 */ + private String corp_address; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; + + /** 启用时间 */ + private String is_used_time; + + /** 是否启用 */ + private String is_used; + + /** 是否删除 */ + private String is_delete; + + /** 外部标识 */ + private String ext_id; + + /** 条码打印起始值 */ + private String barcode_print; + + /** 备注 */ + private String remark; + + /** 分类标识 */ + private Long class_id; + + /** 分类编码 */ + private String class_code; + + /** 分类名称 */ + private String class_name; + + /** 资金计划履约天数 */ + private BigDecimal honour_days; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/UnitDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/UnitDto.java new file mode 100644 index 000000000..7168b6ec4 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/dto/UnitDto.java @@ -0,0 +1,41 @@ +package org.nl.wms.basedata.master.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author loujf +* @date 2021-12-07 +**/ +@Data +public class UnitDto implements Serializable { + + private Long measure_unit_id; + + private String unit_code; + + private String unit_name; + + private BigDecimal qty_precision; + + private String is_used; + + 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 ext_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/ClassstandardServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/ClassstandardServiceImpl.java new file mode 100644 index 000000000..6578e4e90 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/ClassstandardServiceImpl.java @@ -0,0 +1,555 @@ + +package org.nl.wms.basedata.master.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 cn.hutool.db.Db; +import cn.hutool.db.Entity; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.modules.wql.util.WqlUtil; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.basedata.master.service.dto.ClassstandardDto; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.sql.DataSource; +import java.math.BigDecimal; +import java.sql.SQLException; +import java.util.*; + +/** + * @author zhouz + * @description 服务实现 + * @date 2021-12-07 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class ClassstandardServiceImpl implements ClassstandardService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + String base_data_type = (String) whereJson.get("base_data_type"); + String where = ""; + if (!StrUtil.isEmpty(base_data_type)) { + where = "AND base_data_type = '" + base_data_type + "'"; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "(parent_class_id is null OR parent_class_id = '0') AND is_delete = '0'" + where + "", "update_time desc"); + final JSONObject json = rb.pageResult(); + JSONArray ja = json.getJSONArray("content"); + JSONArray new_ja = new JSONArray(); + for (int i = 0; i < ja.size(); i++) { + JSONObject mater_jo = ja.getJSONObject(i); + if (mater_jo.getInteger("sub_count") > 0) { + mater_jo.put("hasChildren", true); + mater_jo.put("leaf", false); + } else { + mater_jo.put("hasChildren", false); + mater_jo.put("leaf", true); + } + mater_jo.put("id", mater_jo.getString("class_id")); + mater_jo.put("label", mater_jo.getString("class_name")); + new_ja.add(mater_jo); + } + json.put("content", new_ja); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(ClassstandardDto.class); + return list; + } + + @Override + public ClassstandardDto findById(String class_id) { + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + JSONObject json = wo.query("class_id = '" + class_id + "'").uniqueResult(0); + final ClassstandardDto obj = json.toJavaObject(ClassstandardDto.class); + return obj; + } + + @Override + public ClassstandardDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + JSONObject json = wo.query("class_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final ClassstandardDto obj = json.toJavaObject(ClassstandardDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(ClassstandardDto dto) { + String class_code = dto.getClass_code(); + ClassstandardDto classstandardDto = this.findByCode(class_code); + if (classstandardDto != null && classstandardDto.getIs_delete().equals("0") && dto.getBase_data_type().equals(classstandardDto.getBase_data_type())) { + throw new BadRequestException("存在相同的基础类别编号"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setClass_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setIs_leaf("1"); + dto.setClass_level(Math.ceil(dto.getClass_code().length() / 2.0) + ""); + dto.setSub_count(new BigDecimal(0)); + dto.setPath_code(dto.getClass_code()); + dto.setLong_class_code(dto.getClass_code()); + + if (StrUtil.equals(dto.getBase_data_type(), "03")) { + dto.setIs_modify("0"); + } + + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + + ///更新节点 + if (dto.getParent_class_id() != null) { + updateSubCnt(dto.getParent_class_id()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ClassstandardDto dto) { + ClassstandardDto entity = this.findById(dto.getClass_id() + ""); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + String class_code = dto.getClass_code(); + ClassstandardDto classstandardDto = this.findByCode(class_code); + if (classstandardDto != null && !dto.getClass_id().equals(classstandardDto.getClass_id()) && classstandardDto.getIs_delete().equals("0") && dto.getBase_data_type().equals(classstandardDto.getBase_data_type())) { + throw new BadRequestException("存在相同的供应商编号"); + } + + Long oldPid = findById(dto.getClass_id() + "").getParent_class_id(); + Long newPid = dto.getParent_class_id(); + + if (dto.getParent_class_id() != null && dto.getClass_id().equals(dto.getParent_class_id())) { + throw new BadRequestException("上级不能为自己"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + + //更新父节点中子节点数目 + updateSubCnt(oldPid); + updateSubCnt(newPid); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + for (Long class_id : ids) { + JSONObject param = new JSONObject(); + param.put("class_id", String.valueOf(class_id)); + ClassstandardDto classstandardDto = findById(class_id + ""); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + + JSONArray child_rows = wo.query("parent_class_id = '" + String.valueOf(class_id) + "'").getResultJSONArray(0); + if (child_rows.size() > 0) { + Long[] child_ids = new Long[child_rows.size()]; + for (int i = 0; i < child_rows.size(); i++) { + JSONObject child_row = child_rows.getJSONObject(i); + Long id = child_row.getLong + ("class_id"); + child_ids[i] = id; + } + this.deleteAll(child_ids); + } + updateSubCnt(classstandardDto.getParent_class_id()); + } + } + + @Override + public JSONObject loadClass(Map whereJson) { + JSONObject jo = new JSONObject(); + JSONArray ja = new JSONArray(); + String pid = (String) whereJson.get("pid"); + String base_data_type = (String) whereJson.get("base_data_type"); + String where = ""; + if (!StrUtil.isEmpty(base_data_type)) { + where = "AND base_data_type = '" + base_data_type + "'"; + } + if (pid == null || pid.equals("0")) { + ja = WQLObject.getWQLObject("MD_PB_ClassStandard").query("(parent_class_id = '0' OR parent_class_id is null) and is_delete = '0' " + where + " order by class_id").getResultJSONArray(0); + } else { + ja = WQLObject.getWQLObject("MD_PB_ClassStandard").query("parent_class_id = '" + pid + "' AND is_delete = '0'" + where + " order by class_id").getResultJSONArray(0); + } + for (int i = 0; i < ja.size(); i++) { + JSONObject mater_jo = ja.getJSONObject(i); + if (mater_jo.getInteger("sub_count") > 0) { + mater_jo.put("hasChildren", true); + mater_jo.put("leaf", false); + } else { + mater_jo.put("hasChildren", false); + mater_jo.put("leaf", true); + } + mater_jo.put("id", mater_jo.get("class_id")); + mater_jo.put("label", mater_jo.getString("class_name")); + mater_jo.put("create_user_name", mater_jo.getString("create_name")); + mater_jo.put("update_user_name", mater_jo.getString("update_optname")); + } + jo.put("content", ja); + return jo; + } + + @Override + public JSONArray getSuperior(JSONObject jo, JSONArray ja) { + String base_data_type=jo.getString("base_data_type"); + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + if (StrUtil.isEmpty(jo.getString("parent_class_id")) || jo.getString("parent_class_id").equals("0")) { + JSONArray null_pids = new JSONArray(); + if (jo.getString("base_data_type").equals(base_data_type)) { + null_pids = wo.query("(parent_class_id = '0' OR parent_class_id is null) and is_delete = '0' and base_data_type = '"+base_data_type+"'").getResultJSONArray(0); + } else { + null_pids = wo.query("(parent_class_id = '0' OR parent_class_id is null) and is_delete = '0'").getResultJSONArray(0); + } + + for (int m = 0; m < null_pids.size(); m++) { + JSONObject null_pid = null_pids.getJSONObject(m); + ja.add(null_pid); + } + return ja; + } + JSONArray pid_rows = wo.query("parent_class_id = '" + jo.getString("parent_class_id") + "'").getResultJSONArray(0); + for (int n = 0; n < pid_rows.size(); n++) { + JSONObject pid_row = pid_rows.getJSONObject(n); + ja.add(pid_row); + } + JSONObject id_row = wo.query("class_id = '" + jo.getString("parent_class_id") + "'").uniqueResult(0); + return getSuperior(id_row, ja); + } + + @Override + public JSONObject buildTree(JSONArray ja) { + Set trees = new LinkedHashSet<>(); + Set maters = new LinkedHashSet<>(); + List mater_name = new LinkedList<>(); + for (int i = 0; i < ja.size(); i++) { + JSONObject jo = ja.getJSONObject(i); + mater_name.add(jo.getString("class_name")); + } + boolean isChild; + for (int m = 0; m < ja.size(); m++) { + JSONObject jo1 = ja.getJSONObject(m); + isChild = false; + if (jo1.getString("parent_class_id").equals("0") || StrUtil.isEmpty(jo1.getString("parent_class_id"))) { + jo1.put("id", jo1.getString("class_id")); + jo1.put("label", jo1.getString("class_name")); + if (jo1.getInteger("sub_count") > 0) { + jo1.put("hasChildren", true); + jo1.put("leaf", false); + } else { + jo1.put("hasChildren", false); + jo1.put("leaf", true); + } + trees.add(jo1); + } + for (int n = 0; n < ja.size(); n++) { + JSONObject jo2 = ja.getJSONObject(n); + if (!jo2.getString("class_id").equals("0") && jo1.getString("class_id").equals(jo2.getString("parent_class_id"))) { + isChild = true; + if (jo1.getJSONArray("children") == null) { + jo1.put("children", new JSONArray()); + } + JSONArray child_ja = jo1.getJSONArray("children"); + jo2.put("id", jo2.getString("class_id")); + jo2.put("label", jo2.getString("class_name")); + if (jo2.getInteger("sub_count") > 0) { + jo2.put("hasChildren", true); + jo2.put("leaf", false); + } else { + jo2.put("hasChildren", false); + jo2.put("leaf", true); + } + child_ja.add(jo2); + } + } + if (isChild) { + jo1.put("id", jo1.getString("class_id")); + jo1.put("label", jo1.getString("class_name")); + if (jo1.getInteger("sub_count") > 0) { + jo1.put("hasChildren", true); + jo1.put("leaf", false); + } else { + jo1.put("hasChildren", false); + jo1.put("leaf", true); + } + maters.add(jo1); + } else if (!jo1.getString("class_id").equals("0") && !mater_name.contains(jo1.getString("material_type_name"))) { + jo1.put("id", jo1.getString("class_id")); + jo1.put("label", jo1.getString("class_name")); + if (jo1.getInteger("sub_count") > 0) { + jo1.put("hasChildren", true); + jo1.put("leaf", false); + } else { + jo1.put("hasChildren", false); + jo1.put("leaf", true); + } + maters.add(jo1); + } + } + if (maters.size() == 0) { + maters = trees; + } + JSONObject jo = new JSONObject(); + jo.put("totalElements", ja.size()); + jo.put("content", maters.size() == 0 ? ja : trees); + return jo; + } + + @Override + public JSONObject queryClassBycode(Map whereJson) { + String parent_class_code = (String) whereJson.get("parent_class_code"); + String class_code = (String) whereJson.get("class_code"); + JSONObject jo = new JSONObject(); + JSONArray ja = new JSONArray(); + String where = ""; + ClassstandardDto classstandardDto = null; + if (!StrUtil.isEmpty(parent_class_code)) { + classstandardDto = this.findByCode(parent_class_code); + if (classstandardDto == null) { + throw new BadRequestException("请输入正确的父节点编号!"); + } + } + if (!StrUtil.isEmpty(class_code)) { + where = " AND class_code IN ('" + class_code + "')"; + } + //parent_class_code不为空,查出 id等于classstandardDto.getClass_id() + if (StrUtil.isNotEmpty(parent_class_code)) { + ja = WQLObject.getWQLObject("MD_PB_ClassStandard").query("class_id = '" + classstandardDto.getClass_id() + "' order by class_id").getResultJSONArray(0); + } else if (StrUtil.isNotEmpty(where)) { + ja = WQLObject.getWQLObject("MD_PB_ClassStandard").query("1=1 " + where + " order by class_id").getResultJSONArray(0); + } else if (StrUtil.isEmpty(parent_class_code) || parent_class_code.equals("0")) { + ja = WQLObject.getWQLObject("MD_PB_ClassStandard").query("(parent_class_id = '0' OR parent_class_id is null) and is_delete = '0' order by class_id").getResultJSONArray(0); + } + for (int i = 0; i < ja.size(); i++) { + JSONObject mater_jo = ja.getJSONObject(i); + if (mater_jo.getInteger("sub_count") > 0) { + mater_jo.put("hasChildren", true); + mater_jo.put("leaf", false); + } else { + mater_jo.put("hasChildren", false); + mater_jo.put("leaf", true); + } + mater_jo.put("id", mater_jo.getString("class_id")); + mater_jo.put("label", mater_jo.getString("class_name")); + mater_jo.put("create_user_name", mater_jo.getString("create_name")); + mater_jo.put("update_user_name", mater_jo.getString("update_optname")); + } + jo.put("content", ja); + return jo; + } + + @Override + public JSONObject queryClassById(Map whereJson) { + String parent_class_id = (String) whereJson.get("parent_class_id"); + + /*where条件*/ + String class_idStr = (String) whereJson.get("class_idStr"); + String whereStr = (String) whereJson.get("whereStr"); + + JSONObject jo = new JSONObject(); + JSONArray ja = new JSONArray(); + String where = "1=1"; + + if (!StrUtil.isEmpty(whereStr)) { + where += whereStr; + } + if (StrUtil.isNotEmpty(class_idStr)) { + where += " AND class_id IN " + class_idStr; + //"('1','2','3')" + } + if (!StrUtil.isEmpty(parent_class_id)) { + where = " AND parent_class_id = " + parent_class_id; + } + + ja = WQLObject.getWQLObject("MD_PB_ClassStandard").query(where + " order by class_id").getResultJSONArray(0); + for (int i = 0; i < ja.size(); i++) { + JSONObject mater_jo = ja.getJSONObject(i); + if (mater_jo.getInteger("sub_count") > 0) { + mater_jo.put("hasChildren", true); + mater_jo.put("leaf", false); + } else { + mater_jo.put("hasChildren", false); + mater_jo.put("leaf", true); + } + mater_jo.put("id", mater_jo.getString("class_id")); + mater_jo.put("label", mater_jo.getString("class_name")); + mater_jo.put("create_user_name", mater_jo.getString("create_name")); + mater_jo.put("update_user_name", mater_jo.getString("update_optname")); + } + jo.put("content", ja); + return jo; + } + + @Override + public JSONObject queryClassTable(Map whereJson, Pageable page) { + HashMap map = new HashMap<>(); + map.put("flag", "1"); + String material_type_id = (String) whereJson.get("material_type_id"); + String class_idStr = (String) whereJson.get("class_idStr"); + //处理物料当前节点的所有子节点 + if (!StrUtil.isEmpty(material_type_id)) { + map.put("material_type_id", material_type_id); + String classIds = this.getChildIdStr(material_type_id); + map.put("classIds", classIds); + } else if (ObjectUtil.isNotEmpty(class_idStr)) { + String classIds = this.getAllChildIdStr(class_idStr); + map.put("classIds", classIds); + } + JSONObject jo = WQL.getWO("QMD_PB_CLASSBASE").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "update_time desc"); + JSONArray content = jo.getJSONArray("content"); + JSONArray jsonArr = new JSONArray(); + for (int i = 0; i < content.size(); i++) { + JSONObject json = content.getJSONObject(i); + JSONObject jsonParent = WQLObject.getWQLObject("md_pb_classstandard").query("class_id = '" + json.getString("parent_class_id") + "'").uniqueResult(0); + json.put("address", jsonParent.getString("class_name")); + jsonArr.add(json); + } + jo.put("content", jsonArr); + return jo; + } + + @Override + public JSONObject getType(String type_id, int level) { + WQLObject classTab = WQLObject.getWQLObject("md_pb_classstandard"); + JSONObject json = classTab.query("class_id= " + type_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) { + return null; + } + String class_code = json.getString("class_code"); + if (class_code.length() / 2 == level) { + return json; + } else { + return getType(json.getString("parent_class_id"), level); + } + + } + + @Override + public Set getChildIdSet(String class_id) { + String sql = "select DISTINCT class_id from (\n" + + " select t1.class_id,\n" + + " if(find_in_set(parent_class_id, @pids) > 0, @pids := concat(@pids, ',', class_id), 0) as ischild\n" + + " from (\n" + + " select class_id,parent_class_id from md_pb_classstandard t where t.is_delete = '0' order by class_code\n" + + " ) t1,\n" + + " (select @pids := '" + class_id + "') t2\n" + + " ) t3 where ischild != 0"; + Set set = new HashSet<>(); + //添加本级 + set.add(class_id); + + //添加子节点 + try { + List list = Db.use((DataSource) SpringContextHolder.getBean("dataSource")).query(sql); + list.forEach(item -> { + set.add(item.getStr("class_id")); + }); + } catch (SQLException e) { + e.printStackTrace(); + } + return set; + } + + @Override + public Set getAllChildIdSet(String class_idStr) { + JSONArray arr = WQLObject.getWQLObject("md_pb_classstandard").query("class_id IN " + class_idStr).getResultJSONArray(0); + Set set = new HashSet<>(); + for (int i = 0; i < arr.size(); i++) { + set.addAll(this.getChildIdSet(arr.getJSONObject(i).getString("class_id"))); + } + return set; + } + + @Override + public String getChildIdStr(String class_id) { + Set set = this.getChildIdSet(class_id); + StringBuilder sb = new StringBuilder(); + set.forEach(item -> { + sb.append(",'" + item + "'"); + }); + String str = sb.toString(); + if (StrUtil.isNotEmpty(str)) { + str = "(" + str.substring(1) + ")"; + } + return str; + } + + @Override + public String getAllChildIdStr(String class_idStr) { + Set set = this.getAllChildIdSet(class_idStr); + StringBuilder sb = new StringBuilder(); + set.forEach(item -> { + sb.append(",'" + item + "'"); + }); + String str = sb.toString(); + if (StrUtil.isNotEmpty(str)) { + str = "(" + str.substring(1) + ")"; + } + return str; + } + + + public void updateSubCnt(Long Id) { + if (Id != null && Id != 0) { + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + int count = wo.query("parent_class_id = '" + Id + "' AND is_delete = '0'").getResultJSONArray(0).size(); + JSONObject pid = wo.query("class_id = '" + Id + "'").uniqueResult(0); + pid.put("sub_count", count); + if (count > 0) { + pid.put("is_leaf", "0"); + } else { + pid.put("is_leaf", "1"); + } + wo.update(pid); + } + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/CustomerbaseServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/CustomerbaseServiceImpl.java new file mode 100644 index 000000000..3336b46c0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/CustomerbaseServiceImpl.java @@ -0,0 +1,156 @@ + +package org.nl.wms.basedata.master.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.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.basedata.master.service.CustomerbaseService; +import org.nl.wms.basedata.master.service.dto.ClassstandardDto; +import org.nl.wms.basedata.master.service.dto.CustomerbaseDto; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author ldjun + * @description 服务实现 + * @date 2021-12-06 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class CustomerbaseServiceImpl implements CustomerbaseService { + @Autowired + private ClassstandardService classstandardService; + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String where = ""; + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + String search = (String) whereJson.get("search"); + if (!StrUtil.isEmpty(search)) { + where = "AND (cust_code like '%" + search + "%' OR cust_name like '%" + search + "%')"; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "is_delete = '0'" + where, "update_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(CustomerbaseDto.class); + return list; + } + + @Override + public CustomerbaseDto findById(Long cust_id) { + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONObject json = wo.query("cust_id =" + cust_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final CustomerbaseDto obj = json.toJavaObject(CustomerbaseDto.class); + return obj; + } + + @Override + public CustomerbaseDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONObject json = wo.query("cust_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final CustomerbaseDto obj = json.toJavaObject(CustomerbaseDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(CustomerbaseDto dto) { + String cust_code = dto.getCust_code(); + CustomerbaseDto customerbaseDto = this.findByCode(cust_code); + if (customerbaseDto != null && customerbaseDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的客户编号"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + ClassstandardDto classDto = classstandardService.findById(dto.getClass_id() + ""); + dto.setClass_code(classDto.getClass_code()); + dto.setClass_name(classDto.getClass_name()); + dto.setCust_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(CustomerbaseDto dto) { + CustomerbaseDto entity = this.findById(dto.getCust_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + String cust_code = dto.getCust_code(); + CustomerbaseDto customerbaseDto = this.findByCode(cust_code); + if (customerbaseDto != null && !customerbaseDto.getCust_id().equals(dto.getCust_id()) && customerbaseDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的客户编号"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + for (Long cust_id : ids) { + JSONObject param = new JSONObject(); + param.put("cust_id", String.valueOf(cust_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/MaterialbaseServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/MaterialbaseServiceImpl.java new file mode 100644 index 000000000..77310aef8 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/MaterialbaseServiceImpl.java @@ -0,0 +1,239 @@ + +package org.nl.wms.basedata.master.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.master.constant.MaterOptTypeEnum; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.basedata.master.service.MaterialbaseService; +import org.nl.wms.basedata.master.service.dto.MaterialbaseDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author zhouz + * @description 服务实现 + * @date 2021-12-07 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class MaterialbaseServiceImpl implements MaterialbaseService { + private final ClassstandardService classstandardService; + //private final WmsToErpService wmsToErpService; + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String search = MapUtil.getStr(whereJson, "search"); + //物料限制的时候使用,初始化页面 + String class_idStr = MapUtil.getStr(whereJson, "class_idStr"); + String material_type_id = MapUtil.getStr(whereJson, "material_type_id"); + String class_code = MapUtil.getStr(whereJson, "class_code"); + String ids = MapUtil.getStr(whereJson, "ids"); + + + HashMap map = new HashMap<>(); + map.put("flag", "1"); + + if (!StrUtil.isEmpty(search)) { + //处理转义字符 + if (search.contains("\\")) { + search = search.replace("\\", "\\\\\\"); + } + map.put("search", "%" + search + "%"); + } + + //处理物料当前节点的所有子节点 + if (!StrUtil.isEmpty(material_type_id)) { + map.put("material_type_id", material_type_id); + String classIds = classstandardService.getChildIdStr(material_type_id); + map.put("classIds", classIds); + } else if (ObjectUtil.isNotEmpty(class_idStr)) { + String classIds = classstandardService.getAllChildIdStr(class_idStr); + map.put("classIds", classIds); + } + + if (!StrUtil.isEmpty(class_code)) { + map.put("class_code", class_code + "%"); + } + + StringBuffer where = new StringBuffer(); + if (StrUtil.isNotEmpty(ids)) { + ids = ids.replaceAll("\'", ""); + String[] strs = ids.split(","); + where.append("("); + for (int i = 0; i < strs.length; ) { + where.append("class.class_code like '" + strs[i] + "%'"); + i++; + if (i < strs.length) { + where.append(" or "); + } + } + where.append(")"); + map.put("idssql", where.toString()); + } else { + map.put("idssql", "1=1"); + } + + JSONObject jo = WQL.getWO("QMD_ME_MATERIAL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "material_id"); + return jo; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(MaterialbaseDto.class); + return list; + } + + @Override + public MaterialbaseDto findById(Long material_id) { + WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); + JSONObject json = wo.query("material_id =" + material_id + "").uniqueResult(0); + String unit_name = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id= '" + json.getString("base_unit_id") + "'").uniqueResult(0).getString("unit_name"); + json.put("base_unit_name", unit_name); + final MaterialbaseDto obj = json.toJavaObject(MaterialbaseDto.class); + return obj; + } + + @Override + public MaterialbaseDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); + if (StrUtil.isNotEmpty(code) && code.contains("\\")) { + code = code.replace("\\", "\\\\"); + } + JSONObject json = wo.query("material_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + String unit_name = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id= '" + json.getString("base_unit_id") + "'").uniqueResult(0).getString("unit_name"); + json.put("base_unit_name", unit_name); + final MaterialbaseDto obj = json.toJavaObject(MaterialbaseDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(MaterialbaseDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setMaterial_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(MaterialbaseDto dto) { + MaterialbaseDto entity = this.findById(dto.getMaterial_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); + for (Long material_id : ids) { + JSONObject param = new JSONObject(); + param.put("material_id", String.valueOf(material_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + public boolean isAlongMaterType(String materOpt_code, String material_id, String material_type_id) { + if (ObjectUtil.isNotEmpty(material_id)) { + Long long_mater = Long.parseLong(material_id); + material_type_id = this.findById(long_mater).getMaterial_type_id() + ""; + } + if (ObjectUtil.isEmpty(material_type_id)) { + throw new BadRequestException("物料类型不能为空!"); + } + String class_idStr = MaterOptTypeEnum.getObj(materOpt_code).getString("class_idStr"); + + Set set = classstandardService.getAllChildIdSet(class_idStr); + if (ObjectUtil.isNotEmpty(set)) { + return set.contains(material_type_id); + } + + return false; + } + + @Override + public JSONObject getMaterOptType(String materOpt_code) { + return MaterOptTypeEnum.getObj(materOpt_code); + } + + @Override + public void synchronize(Map whereJson) { + /* wmsToErpService.getClassInfo(null); + wmsToErpService.getMaterialInfo(null);*/ + } + + @Override + public JSONArray getProductSeries(String parent_class_id) { + WQLObject wo = WQLObject.getWQLObject("MD_PB_ClassStandard"); + JSONArray parentArray = wo.query("is_delete = '0' and parent_class_id = '" + parent_class_id + "'").getResultJSONArray(0); + JSONArray newParentArray = new JSONArray(); + for (int i = 0; i < parentArray.size(); i++) { + JSONObject parentMap = parentArray.getJSONObject(i); + JSONObject newParentMap = new JSONObject(); + JSONArray children = this.getProductSeries(parentMap.getString("class_id")); + newParentMap.put("children", children); + newParentMap.put("label", parentMap.getString("class_name")); + newParentMap.put("id", parentMap.getString("class_id")); + newParentArray.add(newParentMap); + } + return newParentArray; + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/StoragevehicleinfoServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/StoragevehicleinfoServiceImpl.java new file mode 100644 index 000000000..1efb7731a --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/StoragevehicleinfoServiceImpl.java @@ -0,0 +1,226 @@ + +package org.nl.wms.basedata.master.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.service.impl.GenCodeServiceImpl; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.master.service.StoragevehicleinfoService; +import org.nl.wms.basedata.master.service.dto.StoragevehicleinfoDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author ldjun + * @description 服务实现 + * @date 2021-12-09 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class StoragevehicleinfoServiceImpl implements StoragevehicleinfoService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + + String storagevehicle_code_begin = (String) whereJson.get("storagevehicle_code_begin"); + String storagevehicle_code_end = (String) whereJson.get("storagevehicle_code_end"); + String storagevehicle_type = (String) whereJson.get("storagevehicle_type"); + + HashMap map = new HashMap(); + map.put("storagevehicle_code_begin", storagevehicle_code_begin); + map.put("storagevehicle_code_end", storagevehicle_code_end); + map.put("storagevehicle_type", storagevehicle_type); + map.put("flag", "1"); + JSONObject json = WQL.getWO("QMD_PB_STORAGEVEHICLEINFO").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "s.storagevehicle_code ASC"); + JSONArray content = json.getJSONArray("content"); + for (int i = 0; i < content.size(); i++) { + JSONObject jsonObject = content.getJSONObject(i); + JSONObject jsonTask = taskTab.query("vehicle_code = '" + jsonObject.getString("storagevehicle_code") + "' and task_status <> '99' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonTask)) { + jsonObject.put("start_point_code", jsonTask.getString("start_point_code")); + jsonObject.put("next_point_code", jsonTask.getString("next_point_code")); + jsonObject.put("is_task", "1"); + jsonObject.put("point_code", ""); + } else { + jsonObject.put("is_task", "0"); + } + } + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(StoragevehicleinfoDto.class); + return list; + } + + @Override + public StoragevehicleinfoDto findById(Long storagevehicle_id) { + WQLObject wo = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + JSONObject json = wo.query("storagevehicle_id =" + storagevehicle_id + "").uniqueResult(0); + final StoragevehicleinfoDto obj = json.toJavaObject(StoragevehicleinfoDto.class); + return obj; + } + + @Override + public StoragevehicleinfoDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + JSONObject json = wo.query("storagevehicle_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)){ + throw new BadRequestException("请输入正确的载具号!"); + } + final StoragevehicleinfoDto obj = json.toJavaObject(StoragevehicleinfoDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONArray create(Map map) { + WQLObject wo = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + JSONObject jsonObject = wo.query("storagevehicle_code = '" + map.get("storagevehicle_code") + "' and is_delete = '0'").uniqueResult(0); + if (!ObjectUtil.isEmpty(jsonObject)) { + throw new BadRequestException("此载具已存在"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String storagevehicle_type = (String) map.get("storagevehicle_type"); + String code = ""; + switch (storagevehicle_type) { + case "00": + code = "VEHICCLE_CODE_MTP"; + break; + case "01": + code = "VEHICCLE_CODE_TTP"; + break; + } + JSONArray resultCodeArr = new JSONArray(); + int num = MapUtil.getInt(map, "num"); + for (int i = 0; i < num; i++) { + StoragevehicleinfoDto dto = new StoragevehicleinfoDto(); + dto.setStoragevehicle_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setStoragevehicle_code(CodeUtil.getNewCode(code)); + dto.setCreate_id(currentUserId); + dto.setStoragevehicle_name(dto.getStoragevehicle_code()); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setStoragevehicle_type((String) map.get("storagevehicle_type")); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + resultCodeArr.add(dto.getStoragevehicle_code()); + } + return resultCodeArr; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(StoragevehicleinfoDto dto) { + WQLObject wo = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + JSONObject jsonObject = wo.query("storagevehicle_code = '" + dto.getStoragevehicle_code() + "' and is_delete = '0'").uniqueResult(0); + if (!ObjectUtil.isEmpty(jsonObject)) { + throw new BadRequestException("此载具已存在"); + } + StoragevehicleinfoDto entity = this.findById(dto.getStoragevehicle_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + for (Long storagevehicle_id : ids) { + JSONObject param = new JSONObject(); + param.put("storagevehicle_id", String.valueOf(storagevehicle_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeActive(JSONObject json) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String is_used = "1"; + if (StrUtil.equals("1", json.getString("is_used"))) { + is_used = "0"; + } + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("md_pb_storagevehicleinfo").update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject getVehicle(String code) { + String term = ""; + switch (code) { + case "00": + term = "VEHICCLE_CODE_MTP"; + break; + case "01": + term = "VEHICCLE_CODE_TTP"; + break; + } + + HashMap map = new HashMap<>(); + map.put("code", term); + map.put("flag", "0"); + GenCodeServiceImpl genCodeService = new GenCodeServiceImpl(); + String value = genCodeService.codeDemo(map); + + JSONObject json = new JSONObject(); + json.put("value", value); + return json; + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/SupplierbaseServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/SupplierbaseServiceImpl.java new file mode 100644 index 000000000..91676ab26 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/SupplierbaseServiceImpl.java @@ -0,0 +1,162 @@ + +package org.nl.wms.basedata.master.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.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.basedata.master.service.SupplierbaseService; +import org.nl.wms.basedata.master.service.dto.ClassstandardDto; +import org.nl.wms.basedata.master.service.dto.SupplierbaseDto; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author zhouz + * @description 服务实现 + * @date 2021-12-06 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class SupplierbaseServiceImpl implements SupplierbaseService { + @Autowired + private ClassstandardService classstandardService; + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String where = ""; + WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); + String search = (String) whereJson.get("search"); + if (!StrUtil.isEmpty(search)) { + where = "AND (supp_code like '%" + search + "%' OR supp_name like '%" + search + "%')"; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "is_delete = '0'" + where, "update_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(SupplierbaseDto.class); + return list; + } + + @Override + public SupplierbaseDto findById(Long supp_id) { + WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); + JSONObject json = wo.query("supp_id =" + supp_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final SupplierbaseDto obj = json.toJavaObject(SupplierbaseDto.class); + return obj; + } + + @Override + public SupplierbaseDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); + JSONObject json = wo.query("supp_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final SupplierbaseDto obj = json.toJavaObject(SupplierbaseDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(SupplierbaseDto dto) { + String supp_code = dto.getSupp_code(); + SupplierbaseDto supplierbaseDto = this.findByCode(supp_code); + if (supplierbaseDto != null && supplierbaseDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的供应商编号"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + ClassstandardDto classDto = classstandardService.findById(dto.getClass_id() + ""); + if (ObjectUtil.isNotEmpty(classDto)) { + dto.setClass_code(classDto.getClass_code()); + dto.setClass_name(classDto.getClass_name()); + } + + dto.setSupp_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SupplierbaseDto dto) { + SupplierbaseDto entity = this.findById(dto.getSupp_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + ClassstandardDto classDto = classstandardService.findById(dto.getClass_id() + ""); + if (ObjectUtil.isNotEmpty(classDto)) { + dto.setClass_code(classDto.getClass_code()); + dto.setClass_name(classDto.getClass_name()); + } + String supp_code = dto.getSupp_code(); + SupplierbaseDto supplierbaseDto = this.findByCode(supp_code); + if (supplierbaseDto != null && !dto.getSupp_id().equals(supplierbaseDto.getSupp_id()) && supplierbaseDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的供应商编号"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("md_cs_supplierbase"); + for (Long supp_id : ids) { + JSONObject param = new JSONObject(); + param.put("supp_id", String.valueOf(supp_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/UnitServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/UnitServiceImpl.java new file mode 100644 index 000000000..d06950b72 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/UnitServiceImpl.java @@ -0,0 +1,158 @@ + +package org.nl.wms.basedata.master.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.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.master.service.UnitService; +import org.nl.wms.basedata.master.service.dto.UnitDto; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author loujf + * @description 服务实现 + * @date 2021-12-07 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class UnitServiceImpl implements UnitService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String where = ""; + WQLObject wo = WQLObject.getWQLObject("md_pb_measureunit"); + String search = (String) whereJson.get("search"); + if (!StrUtil.isEmpty(search)) { + where = " AND (unit_code like '%" + search + "%' OR unit_name like '%" + search + "%' ) "; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "is_delete='0' " + where, "update_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("md_pb_measureunit"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(UnitDto.class); + return list; + } + + @Override + public UnitDto findById(Long measure_unit_id) { + WQLObject wo = WQLObject.getWQLObject("md_pb_measureunit"); + JSONObject json = wo.query("measure_unit_id =" + measure_unit_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final UnitDto obj = json.toJavaObject(UnitDto.class); + return obj; + } + + @Override + public UnitDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("md_pb_measureunit"); + JSONObject json = wo.query("unit_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final UnitDto obj = json.toJavaObject(UnitDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(UnitDto dto) { + String unit_code = dto.getUnit_code(); + UnitDto unitDto = this.findByCode(unit_code); + if (unitDto != null && unitDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的编码"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setMeasure_unit_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(String.valueOf(currentUserId)); + dto.setCreate_name(nickName); + dto.setUpdate_optid(String.valueOf(currentUserId)); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("md_pb_measureunit"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(UnitDto dto) { + UnitDto entity = this.findById(dto.getMeasure_unit_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + String unit_code = dto.getUnit_code(); + UnitDto unitDto = this.findByCode(unit_code); + if (unitDto != null && + !unitDto.getMeasure_unit_id().equals(dto.getMeasure_unit_id()) + && unitDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的编码"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(String.valueOf(currentUserId)); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("md_pb_measureunit"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + public JSONObject getUnit(Map whereJson) { + JSONArray units = WQLObject.getWQLObject("md_pb_measureunit").query("is_used = '1' AND is_delete = '0'").getResultJSONArray(0); + JSONObject jo = new JSONObject(); + jo.put("content", units); + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("md_pb_measureunit"); + for (String measure_unit_id : ids) { + JSONObject param = new JSONObject(); + param.put("measure_unit_id", String.valueOf(measure_unit_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_MATERIAL.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_MATERIAL.wql new file mode 100644 index 000000000..fb52826d0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_MATERIAL.wql @@ -0,0 +1,82 @@ +[交易说明] + 交易名: 物料分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.class_code TYPEAS s_string + 输入.idssql TYPEAS f_string + 输入.classIds TYPEAS f_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + mb.*, + class.class_code, + class.class_name, + unit_name, + '50' as standard_weight, + unit_name as base_unit_id_name, + class2.class_code as product_series_code, + class2.class_name as product_series_name + + FROM + md_me_materialbase mb + LEFT JOIN MD_PB_ClassStandard class ON class.class_id = mb.material_type_id + LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = mb.base_unit_id + left join MD_PB_ClassStandard class2 on class2.class_id =mb.product_series + WHERE + mb.is_delete = '0' + and 输入.idssql + OPTION 输入.search <> "" + ( + mb.material_code like 输入.search + OR + mb.material_name like 输入.search + ) + ENDOPTION + OPTION 输入.class_code <> "" + class.class_code like 输入.class_code + ENDOPTION + OPTION 输入.classIds <> "" + class.class_id in 输入.classIds + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_material_param01.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_material_param01.wql new file mode 100644 index 000000000..aac78514e --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_material_param01.wql @@ -0,0 +1,90 @@ +[交易说明] + 交易名: 物料参数弹窗数据查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.material_id TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + m.*, + e.*, + c.class_name, + c.class_code, + u.unit_name + FROM + MD_ME_MaterialBase m + LEFT JOIN MD_ME_StockMaterialExt e ON m.material_id = e.material_id + LEFT JOIN MD_PB_ClassStandard c ON c.class_id = m.material_type_id + LEFT JOIN md_pb_measureunit u ON u.measure_unit_id = m.base_unit_id + WHERE + m.is_used = '1' + AND m.is_delete = '0' + OPTION 输入.material_id <> "" + m.material_id = 输入.material_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + + IF 输入.flag = "2" + QUERY + SELECT + m2.*, + e2.*, + c2.class_name, + c2.class_code, + u2.unit_name + FROM + MD_ME_MaterialBase m2 + LEFT JOIN MD_ME_ProducMaterialExt e2 ON m2.material_id = e2.material_id + LEFT JOIN MD_PB_ClassStandard c2 ON c2.class_id = m2.material_type_id + LEFT JOIN md_pb_measureunit u2 ON u2.measure_unit_id = m2.base_unit_id + WHERE + m2.is_used = '1' + AND m2.is_delete = '0' + OPTION 输入.material_id <> "" + m2.material_id = 输入.material_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_BUSINESSTYPEMATERIAL.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_BUSINESSTYPEMATERIAL.wql new file mode 100644 index 000000000..e89ac0592 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_BUSINESSTYPEMATERIAL.wql @@ -0,0 +1,61 @@ +[交易说明] + 交易名: 业务单据类型物料对应分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.inv_type_code TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + b.* + FROM + md_pb_businesstypematerial b + WHERE + b.is_delete = '0' + + OPTION 输入.inv_type_code <> "" + (b.inv_type_code like 输入.inv_type_code or + b.inv_type_name like 输入.inv_type_code ) + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_CLASSBASE.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_CLASSBASE.wql new file mode 100644 index 000000000..d940485bf --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_CLASSBASE.wql @@ -0,0 +1,66 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.classIds TYPEAS f_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + * + FROM + md_pb_classstandard class + LEFT JOIN ST_IVT_StructRelaMaterial sr ON sr.material_type_id = class.class_id + WHERE + is_leaf = '1' + AND + base_data_type = '03' + AND + sr.sect_id IS NULL + AND + is_delete = '0' + OPTION 输入.classIds <> "" + class.class_id in 输入.classIds + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEEXT.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEEXT.wql new file mode 100644 index 000000000..24bcbf2b4 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEEXT.wql @@ -0,0 +1,114 @@ +[交易说明] + 交易名: 载具扩展属性设置分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.storagevehicle_code_begin TYPEAS s_string + 输入.storagevehicle_code_end TYPEAS s_string + 输入.storagevehicle_type TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + info.*, + ext.storagevehicleext_id, + ext.material_id, + ext.pcsn, + ext.qty_unit_id, + ext.qty_unit_name, + ext.storage_qty, + ext.workordercard_id, + ext.is_need_clean, + ext.remark, + d.label AS storagevehicle_type_name, + mdb.material_name, + mdb.material_spec, + mdb.gross_weight, + mdp.old_mark, + point.point_name, + device.device_id AS device_uuid, + device.device_code + FROM + md_pb_storagevehicleinfo info + LEFT JOIN md_pb_storagevehicleext ext ON info.storagevehicle_id = ext.storagevehicle_id + LEFT JOIN sys_dict_detail d ON info.storagevehicle_type = d.value and d.name = 'storagevehicle_type' + LEFT JOIN MD_ME_MaterialBase mdb ON ext.material_id = mdb.material_id + LEFT JOIN MD_ME_ProducMaterialExt mdp ON mdb.material_id = mdp.material_id + LEFT JOIN sch_base_point point ON info.storagevehicle_code = point.vehicle_code + LEFT JOIN EM_BI_DeviceInfo device ON device.device_id = ext.device_uuid + WHERE + info.is_delete = '0' + AND info.storagevehicle_type in (30,31,32,33) + + ENDOPTION + OPTION 输入.storagevehicle_code_begin <> "" + info.storagevehicle_code >= 输入.storagevehicle_code_begin + ENDOPTION + ENDOPTION + OPTION 输入.storagevehicle_code_end <> "" + info.storagevehicle_code <= 输入.storagevehicle_code_end + ENDOPTION + + ENDOPTION + OPTION 输入.storagevehicle_type <> "" + info.storagevehicle_type = 输入.storagevehicle_type + ENDOPTION + + ENDOPTION + OPTION 输入.storagevehicle_type <> "" + info.storagevehicle_type = 输入.storagevehicle_type + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + PAGEQUERY + SELECT + dict.label, + dict.value + FROM + sys_dict_detail dict + WHERE + dict.name = 'storagevehicle_type' + AND dict.value in (30,31,32,33) + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEINFO.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEINFO.wql new file mode 100644 index 000000000..4081d66bb --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEINFO.wql @@ -0,0 +1,80 @@ +[交易说明] + 交易名: 载具维护分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.storagevehicle_code_begin TYPEAS s_string + 输入.storagevehicle_code_end TYPEAS s_string + 输入.storagevehicle_type TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + s.*, + d.label AS storagevehicle_type_name, + mater.material_code, + mater.material_name, + point.point_code, + point.point_name + FROM + md_pb_storagevehicleinfo s + LEFT JOIN sys_dict_detail d ON s.storagevehicle_type = d.value and d.dict_id = '32' + LEFT JOIN sch_base_point point ON point.vehicle_code = s.storagevehicle_code + LEFT JOIN ST_IVT_StructIvt ivt ON point.source_id = ivt.struct_id + LEFT JOIN md_me_materialbase mater ON mater.material_id = ivt.material_id + WHERE + s.is_delete = '0' + ENDOPTION + OPTION 输入.storagevehicle_code_begin <> "" + s.storagevehicle_code >= 输入.storagevehicle_code_begin + ENDOPTION + + ENDOPTION + OPTION 输入.storagevehicle_code_end <> "" + s.storagevehicle_code <= 输入.storagevehicle_code_end + ENDOPTION + + ENDOPTION + OPTION 输入.storagevehicle_type <> "" + s.storagevehicle_type = 输入.storagevehicle_type + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEPOINT.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEPOINT.wql new file mode 100644 index 000000000..a6009e248 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_PB_STORAGEVEHICLEPOINT.wql @@ -0,0 +1,103 @@ +[交易说明] + 交易名: 点位载具关系设置分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.name TYPEAS s_string + 输入.area_type TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + point.*, + svp.storagevehiclepoint_id, + svp.storagevehicle_id, + svp.storagevehicle_code, + svp.set_type, + d.label AS set_type_name + FROM + sch_base_point point + LEFT JOIN md_pb_storagevehiclepoint svp ON point.point_id = svp.point_id and svp.set_type <>'02' + LEFT JOIN sys_dict_detail d ON svp.set_type = d.value and d.name = 'set_type' + WHERE + point.is_delete = '0' + AND point.is_used = '1' + AND point.area_type in (25,26,32,28) + ENDOPTION + OPTION 输入.name <> "" + (point.point_code like "%" 输入.name "%" or point.point_name like "%" 输入.name "%") + ENDOPTION + + ENDOPTION + OPTION 输入.area_type <> "" + point.area_type = 输入.area_type + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + PAGEQUERY + SELECT + dict.label, + dict.value + FROM + sys_dict_detail dict + WHERE + dict.name = 'storagevehicle_type' + AND dict.value in (30,31,32,33) + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + dict.label, + dict.value + FROM + sys_dict_detail dict + WHERE + dict.name = 'sch_area_type' + AND dict.value in (25,26,32,28) + ENDSELECT + ENDQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_STORAGEVEHICLECLEANING.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_STORAGEVEHICLECLEANING.wql new file mode 100644 index 000000000..15c96e759 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_STORAGEVEHICLECLEANING.wql @@ -0,0 +1,111 @@ +[交易说明] + 交易名: 载具清洗关系设置分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.point_code TYPEAS s_string + 输入.storagevehicle_type TYPEAS s_string + 输入.storagevehicle_code TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + info.*, + svp.storagevehiclepoint_id, + svp.set_type, + svp.point_id, + svp.point_code, + svp.point_name, + d.label AS storagevehicle_type_name + FROM + md_pb_storagevehicleinfo info + LEFT JOIN md_pb_storagevehiclepoint svp ON info.storagevehicle_id = svp.storagevehicle_id and svp.set_type <>'01' + LEFT JOIN sch_base_point point ON point.point_id = svp.point_id + LEFT JOIN sys_dict_detail d ON info.storagevehicle_type = d.value and d.name = 'storagevehicle_type' + WHERE + info.is_delete = '0' + AND info.is_used = '1' + AND info.storagevehicle_type in (30,31,32,33) + ENDOPTION + OPTION 输入.point_code <> "" + svp.point_code = 输入.point_code + ENDOPTION + + OPTION 输入.storagevehicle_type <> "" + info.storagevehicle_type = 输入.storagevehicle_type + ENDOPTION + + OPTION 输入.storagevehicle_code <> "" + info.storagevehicle_code like "%" 输入.storagevehicle_code "%" + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + PAGEQUERY + SELECT + point.point_id, + point.point_code, + point.point_name + FROM + SCH_BASE_Point point + WHERE + point.is_used = '1' + AND point.is_delete = '0' + AND point.area_type in ('29') + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "3" + PAGEQUERY + SELECT + dict.label, + dict.value + FROM + sys_dict_detail dict + WHERE + dict.name = 'storagevehicle_type' + AND dict.value in (30,31,32,33) + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMT_MATERIALPARAMETERS_001.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMT_MATERIALPARAMETERS_001.wql new file mode 100644 index 000000000..e8709183a --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMT_MATERIALPARAMETERS_001.wql @@ -0,0 +1,120 @@ +[交易说明] + 交易名: 产品参数分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.material_code TYPEAS s_string + 输入.material_type_id TYPEAS s_string + 输入.class_code TYPEAS s_string + 输入.classIds TYPEAS f_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + m.material_id, + m.material_code, + m.material_name, + m.base_unit_id, + m.material_type_id, + s.is_need_plan, + s.standard_weight AS stock_standard_weight, + s.is_report AS stock_is_report, + s.wc_seqno, + s.report_seqno, + s.is_pure, + s.is_need_move AS stock_is_need_move, + p.old_mark, + p.product_mode, + p.is_auto_open, + p.waste_limit_down, + p.waste_limit_up, + p.report_time, + p.is_report AS produc_is_report, + p.is_again_put, + p.standard_weight AS produc_standard_weight, + p.product_series, + p.c_balance, + p.ball_time, + p.ball_speed, + p.weight_lost_up, + p.weight_lost_down, + p.product_ball_time, + p.standard_weight_pft, + p.is_need_move AS product_is_need_move, + p.net_rate, + m.is_used, + m.update_optname, + m.update_time, + m.material_height_type, + b.class_name, + b.class_code, + d1.label AS product_mode_name, + d2.label AS is_need_plan_name, + d3.label AS stock_is_report_name, + d7.label AS produc_is_report_name, + d4.label AS is_auto_open_name, + d5.label AS is_again_put_name, + d6.label AS product_series_name, + u.unit_name + FROM + md_me_materialbase m + LEFT JOIN md_me_stockmaterialext s ON m.material_id = s.material_id + LEFT JOIN md_me_producmaterialext p ON m.material_id = p.material_id + LEFT JOIN md_pb_classstandard b ON m.material_type_id = b.class_id + LEFT JOIN sys_dict_detail d1 ON d1.value = p.product_mode and d1.name = 'product_mode' + LEFT JOIN sys_dict_detail d2 ON d2.value = s.is_need_plan and d2.name = 'IS_OR_NOT' + LEFT JOIN sys_dict_detail d3 ON d3.value = s.is_report and d3.name = 'IS_OR_NOT' + LEFT JOIN sys_dict_detail d7 ON d7.value = p.is_report and d7.name = 'IS_OR_NOT' + LEFT JOIN sys_dict_detail d4 ON d4.value = p.is_auto_open and d4.name = 'IS_OR_NOT' + LEFT JOIN sys_dict_detail d5 ON d5.value = p.is_again_put and d5.name = 'IS_OR_NOT' + LEFT JOIN sys_dict_detail d6 ON d6.value = p.product_series and d6.name = 'product_series' + LEFT JOIN md_pb_measureunit u ON u.measure_unit_id = m.base_unit_id + WHERE + m.is_delete = '0' + OPTION 输入.material_code <> "" + ( m.material_code like "%" 输入.material_code "%" or m.material_name like "%" 输入.material_code "%") + ENDOPTION + + OPTION 输入.classIds <> "" + b.class_id in 输入.classIds + ENDOPTION + + OPTION 输入.class_code <> "" + b.class_code like 输入.class_code + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls b/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdcs.xls new file mode 100644 index 0000000000000000000000000000000000000000..7db328db7da1fa76804de7ed6233ce292845aca3 GIT binary patch literal 172544 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 DU|Tj~;t2@V$e7#8dFK2|m>GlZ4<>6&G%j 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 literal 0 HcmV?d00001 diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/IvtChangeTypeEnum.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/IvtChangeTypeEnum.java new file mode 100644 index 000000000..402eb993d --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/IvtChangeTypeEnum.java @@ -0,0 +1,31 @@ +package org.nl.wms.basedata.st; + +/** + * // 11-扣减可用; 12-增加可用; + * // 21-减库存; 22-加库存; 23-同时加; 24-同时减 + */ +public enum IvtChangeTypeEnum { + SUB_CAN_USE("扣减可用数", 11), + ADD_CAN_USE("增加用数", 12), + + SUB_IVT("扣减库存", 21), + ADD_IVT("增加库存", 22), + ADD_IVT_AND_CAN_USE("同时加库存和可用", 23), + SUB_IVT_AND_CAN_USE("同时减库存和可用", 24); + + private final String name; + private final int index; + + IvtChangeTypeEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public String getName() { + return name; + } + + public int getIndex() { + return index; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/StoreIvtServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/StoreIvtServiceImpl.java new file mode 100644 index 000000000..45cf89de5 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/StoreIvtServiceImpl.java @@ -0,0 +1,297 @@ +package org.nl.wms.basedata.st; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.WQLObject; + +import java.math.BigDecimal; + +/** + * Title: Test.java Description: 一、入库 单据审核,可用数、库存数加上。 取消审核,可用数、库存数减掉 二、出库 + * 单据分配,可用数减掉 取消分配,可用数加回 单据审核,库存数减掉 取消审核,库存数加回 + * + * @author ldjun + * @created 2020年7月23日 下午2:23:04 + */ +public class StoreIvtServiceImpl { + /** + * @discription 添加仓储变动记录 + * @author ldjun + * @created 2020年5月12日 下午12:54:42 + */ + public void addIvtFlow(JSONObject disObj, IvtChangeTypeEnum changeType) { + String struct_id = disObj.getString("struct_id"); + JSONObject pointObj = WQLObject.getWQLObject("sch_base_point").query("point_id ='" + struct_id + "'").uniqueResult(0); + String vehicle_code = disObj.getString("vehicle_code"); + if (StrUtil.isEmpty(struct_id)) { + throw new BadRequestException("仓位标识不能为空!"); + } + String change_qty = disObj.getString("change_qty"); + if (StrUtil.isEmpty(change_qty)) { + change_qty = "0"; + } + if (StrUtil.equals("0", change_qty)) { + throw new BadRequestException("变动量不能都为0!"); + } + JSONObject param = new JSONObject(); + param.put("change_id", IdUtil.getSnowflake(1, 1).nextId()); + param.put("struct_id", struct_id); + param.put("struct_code",pointObj.getString("point_code")); + param.put("struct_name",pointObj.getString("point_name")); + param.put("material_id", disObj.getString("material_id")); + param.put("pcsn", disObj.getString("pcsn")); + //先默认写死,只有一个仓库 + param.put("stor_id", "1528627995269533696"); + param.put("change_type_scode",changeType.getIndex()); + + param.put("inv_id", disObj.getString("bill_id")); + param.put("bill_code", disObj.getString("bill_code")); + param.put("bill_type_scode", disObj.getString("bill_type_scode")); + param.put("qty_unit_id", disObj.getString("qty_unit_id")); + param.put("change_time", DateUtil.now()); + param.put("change_qty", change_qty); + param.put("change_person_id", SecurityUtils.getCurrentUserId()); + param.put("change_person_name", SecurityUtils.getCurrentNickName()); + + + param.put("change_type", changeType.getIndex()); + param.put("region_id", disObj.getString("region_id")); + param.put("is_full", disObj.getString("is_full")); + + + // 仓位库存变动记录表【ST_IVT_StructIvtFlow】 + WQLObject ivtFlowTab = WQLObject.getWQLObject("ST_IVT_StructIvtFlow"); + ivtFlowTab.insert(param); + // 根据变动记录改变仓位库存 + param.put("vehicle_code", vehicle_code); + param.put("stewing_time", disObj.getString("stewing_time")); + param.put("producetask_id", disObj.getString("producetask_id")); + this.changeInventory(param, changeType); + } + + /** + * @param param + * @discription 扣减可用数 + * @author ldjun + * @created 2020年5月12日 上午8:52:44 + */ + private void changeInventory(JSONObject param, IvtChangeTypeEnum changeType) { + WQLObject stackIvtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); + String struct_id = param.getString("struct_id"); + String vehicle_code = param.getString("vehicle_code"); + String stewing_time = param.getString("stewing_time"); + String producetask_id = param.getString("producetask_id"); + String struct_name = param.getString("struct_name"); + String struct_code = param.getString("struct_code"); + if (StrUtil.isEmpty(struct_id)) { + throw new BadRequestException("仓位标识不能为空!"); + } + + String material_id = param.getString("material_id"); + // 拼接查询条件参数 + String whereArgs = "struct_id = '" + struct_id + "' and material_id = '" + material_id + "'"; + JSONObject stackIvtObj = stackIvtTab.query(whereArgs).uniqueResult(0); + + // 需变动的数量 + String change_qty = param.getString("change_qty"); + + // 变动类型 + // 11-扣减可用; 12-增加可用; 13-刷新可用 + // 21-减库存; 22-加库存; 23-同时加; 24-同时减 + // 31-加待入; 32-减待入 33减库存可用数可以为0 34同时减(库存和数量) 考虑负数 35 加库存 考虑负数 + if (stackIvtObj == null) {// 说明该货位上还没有该物料,直接插入记录即可 + JSONObject json = new JSONObject(); + json.put("stockrecord_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("struct_id", param.getString("struct_id")); + json.put("struct_name", param.getString("struct_name")); + json.put("material_id", param.getString("material_id")); + + json.put("pcsn", param.getString("pcsn")); + json.put("qty_unit_id", param.getString("qty_unit_id")); + json.put("instorage_time", DateUtil.now()); + + json.put("canuse_qty", "0"); + json.put("frozen_qty", "0"); + json.put("ivt_qty", "0"); + json.put("warehousing_qty", "0"); + json.put("qc_qty", "0"); + + // 11-扣减可用; 12-增加可用; + // 21-减库存; 22-加库存; 23-同时加(可用和库存); 24-同时减(可用和库存) + // 31-加待入; 32-减待入 + switch (changeType.getIndex()) { + case 11: // 扣减可用重量和数量 + break; + + case 12: + break; + case 13: + break; + case 21: + break; + case 22: + json.put("ivt_qty", change_qty); + break; + case 23: + json.put("ivt_qty", change_qty); + json.put("canuse_qty", change_qty); + break; + case 24:// 同时减 + // 语句 + break; + case 31:// 加待入 + // 语句 + break; + case 32:// 减待入 + // 语句 + break; + default: // 可选 + throw new BadRequestException("变动类型不正确!"); + } + json.put("vehicle_code", vehicle_code); + json.put("stewing_time", stewing_time); + json.put("producetask_id", producetask_id); + json.put("struct_code", struct_code); + json.put("struct_name", struct_name); + json.put("barcode", param.getString("barcode")); + json.put("region_id", param.getString("region_id")); + String is_full = param.getString("is_full"); + if (StrUtil.isEmpty(is_full)) { + is_full = "1"; + } + json.put("is_full", is_full); + + stackIvtTab.insert(json); + } + // 对应的货位上有物料,需判断数量重量相关字段是否符合实际逻辑,符合时更新相应记录 + if (stackIvtObj != null) { + // 变动前可用数量 + String before_canuse_qty = stackIvtObj.getString("canuse_qty"); + // 变动前冻结数量 + String before_frozen_qty = stackIvtObj.getString("frozen_qty"); + // 变动前库存数量 + String before_ivt_qty = stackIvtObj.getString("ivt_qty"); + // 变动前待入数量 + String before_warehousing_qty = stackIvtObj.getString("warehousing_qty"); + // 变动前待检数量 + String before_qc_qty = stackIvtObj.getString("qc_qty"); + + // 变动后可用数量 + BigDecimal after_canuse_qty = new BigDecimal(0); + // 变动后冻结数量 + BigDecimal after_frozen_qty = new BigDecimal(0); + // 变动后库存数量 + BigDecimal after_ivt_qty = new BigDecimal(0); + // 变动后待入数量 + BigDecimal after_warehousing_qty = new BigDecimal(0); + // 变动后待检数量 + BigDecimal after_qc_qty = new BigDecimal(0); + + // 判断是否减为0 + boolean is_sub0 = false; + switch (changeType.getIndex()) { + case 11: // 扣减可用重量和数量 + // 变动后可用数量 + after_canuse_qty = NumberUtil.sub(before_canuse_qty, change_qty); + if (after_canuse_qty.doubleValue() < 0) { + throw new BadRequestException("可用数量不足,无法操作!"); + } + stackIvtObj.put("canuse_qty", after_canuse_qty); + break; + case 12:// 12-增加可用重量和数量; + // 变动后可用数量 + after_canuse_qty = NumberUtil.add(before_canuse_qty, change_qty); + stackIvtObj.put("canuse_qty", after_canuse_qty); + break; + case 13:// 刷新可用数量和重量 + // 语句 + break; + case 21:// 减库存 + // 变动后库存数量 + after_ivt_qty = NumberUtil.sub(before_ivt_qty, change_qty); + if (after_ivt_qty.doubleValue() < 0) { + throw new BadRequestException("可用数量不足,无法操作!"); + } + if (after_ivt_qty.doubleValue() <= 0) { + is_sub0 = true; + } + stackIvtObj.put("ivt_qty", after_ivt_qty); + break; + case 33:// 减库存 + after_ivt_qty = NumberUtil.sub(before_ivt_qty, change_qty); + if (after_ivt_qty.doubleValue() < 0) { + throw new BadRequestException("库存数量不足,无法操作!"); + } + if (after_ivt_qty.doubleValue() <= 0) { + is_sub0 = true; + } + stackIvtObj.put("ivt_qty", after_ivt_qty); + break; + case 22:// 加库存重量和数量 + // 变动后库存数量 + after_ivt_qty = NumberUtil.add(before_ivt_qty, change_qty); + stackIvtObj.put("ivt_qty", after_ivt_qty); + break; + case 23:// 同时加(可用和库存) + // 变动后可用数量 + after_canuse_qty = NumberUtil.add(before_canuse_qty, change_qty); + stackIvtObj.put("canuse_qty", after_canuse_qty); + + // 变动后库存数量 + after_ivt_qty = NumberUtil.add(before_ivt_qty, change_qty); + stackIvtObj.put("ivt_qty", after_ivt_qty); + // 语句 + break; + case 24:// 同时减(库存和数量) + // 变动后可用数量 + after_canuse_qty = NumberUtil.sub(before_canuse_qty, change_qty); + if (after_canuse_qty.doubleValue() < 0) { + throw new BadRequestException("可用数量不足,无法操作!"); + } + stackIvtObj.put("canuse_qty", after_canuse_qty); + + // 变动后库存数量 + after_ivt_qty = NumberUtil.sub(before_ivt_qty, change_qty); + if (after_ivt_qty.doubleValue() < 0) { + throw new BadRequestException("可用数量不足,无法操作!"); + } + if (after_ivt_qty.doubleValue() <= 0) { + is_sub0 = true; + } + stackIvtObj.put("ivt_qty", after_ivt_qty); + // 语句 + + break; + case 31:// 加待入 + // 语句 + break; + case 32:// 减待入 + // 语句 + break; + default: // 可选 + throw new BadRequestException("变动类型不正确!"); + } + + + // 库存减为0,删除该记录 + if (is_sub0) { + // 出完货以后更新载具号为空 + JSONObject structObj = new JSONObject(); + structObj.put("storagevehicle_code", ""); + structObj.put("struct_id", stackIvtObj.getString("struct_id")); + stackIvtTab.delete(whereArgs); + + } else {//更新 + stackIvtObj.put("vehicle_code", vehicle_code); + stackIvtTab.update(stackIvtObj, whereArgs); + } + + } + + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/SectattrController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/SectattrController.java new file mode 100644 index 000000000..943ec4b81 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/SectattrController.java @@ -0,0 +1,84 @@ + +package org.nl.wms.basedata.st.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.st.service.SectattrService; +import org.nl.wms.basedata.st.service.dto.SectattrDto; +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; + +/** +* @author zhouz +* @date 2021-12-09 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "库区管理") +@RequestMapping("/api/sectattr") +@Slf4j +public class SectattrController { + + private final SectattrService sectattrService; + + @GetMapping + @Log("查询库区") + @ApiOperation("查询库区") + //@PreAuthorize("@el.check('sectattr:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(sectattrService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增库区") + @ApiOperation("新增库区") + //@PreAuthorize("@el.check('sectattr:add')") + public ResponseEntity create(@Validated @RequestBody SectattrDto dto){ + sectattrService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改库区") + @ApiOperation("修改库区") + //@PreAuthorize("@el.check('sectattr:edit')") + public ResponseEntity update(@Validated @RequestBody SectattrDto dto){ + sectattrService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除库区") + @ApiOperation("删除库区") + //@PreAuthorize("@el.check('sectattr:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + sectattrService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getSect") + @Log("查询库区下拉框") + @ApiOperation("查询库区下拉框") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity querySect(@RequestParam Map whereJson) { + return new ResponseEntity<>(sectattrService.getSect(whereJson), HttpStatus.OK); + } + + @PutMapping("/changeActive") + @Log("修改库区状态") + @ApiOperation("修改库区状态") + public ResponseEntity update(@RequestBody JSONObject json) { + sectattrService.changeActive(json); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StorattrController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StorattrController.java new file mode 100644 index 000000000..5ac0ee267 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StorattrController.java @@ -0,0 +1,84 @@ + +package org.nl.wms.basedata.st.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.st.service.StorattrService; +import org.nl.wms.basedata.st.service.dto.StorattrDto; +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; + +/** +* @author zhouz +* @date 2021-12-08 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "仓库管理") +@RequestMapping("/api/Storattr") +@Slf4j +public class StorattrController { + + private final StorattrService storattrService; + + @GetMapping + @Log("查询仓库") + @ApiOperation("查询仓库") + //@PreAuthorize("@el.check('Storattr:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(storattrService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增仓库") + @ApiOperation("新增仓库") + //@PreAuthorize("@el.check('Storattr:addgetStor')") + public ResponseEntity create(@Validated @RequestBody StorattrDto dto){ + storattrService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改仓库") + @ApiOperation("修改仓库") + //@PreAuthorize("@el.check('Storattr:edit')") + public ResponseEntity update(@Validated @RequestBody StorattrDto dto){ + storattrService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除仓库") + @ApiOperation("删除仓库") + //@PreAuthorize("@el.check('Storattr:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + storattrService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getStor") + @Log("查询仓库下拉框") + @ApiOperation("查询仓库下拉框") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity queryStor(@RequestParam Map whereJson) { + return new ResponseEntity<>(storattrService.getStor(whereJson), HttpStatus.OK); + } + + @PutMapping("/changeActive") + @Log("修改仓库管理状态") + @ApiOperation("修改仓库管理状态") + public ResponseEntity update(@RequestBody JSONObject json) { + storattrService.changeActive(json); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructattrController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructattrController.java new file mode 100644 index 000000000..c83a71661 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructattrController.java @@ -0,0 +1,76 @@ + +package org.nl.wms.basedata.st.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.st.service.StructattrService; +import org.nl.wms.basedata.st.service.dto.StructattrDto; +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; + +/** +* @author zhouz +* @date 2021-12-09 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "仓位管理") +@RequestMapping("/api/structattr") +@Slf4j +public class StructattrController { + + private final StructattrService structattrService; + + @GetMapping + @Log("查询仓位") + @ApiOperation("查询仓位") + //@PreAuthorize("@el.check('structattr:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(structattrService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增仓位") + @ApiOperation("新增仓位") + //@PreAuthorize("@el.check('structattr:add')") + public ResponseEntity create(@Validated @RequestBody StructattrDto dto){ + structattrService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改仓位") + @ApiOperation("修改仓位") + //@PreAuthorize("@el.check('structattr:edit')") + public ResponseEntity update(@Validated @RequestBody StructattrDto dto){ + structattrService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除仓位") + @ApiOperation("删除仓位") + //@PreAuthorize("@el.check('structattr:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + structattrService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping("/changeActive") + @Log("修改仓位状态") + @ApiOperation("修改仓位状态") + public ResponseEntity update(@RequestBody JSONObject json) { + structattrService.changeActive(json); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructivtController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructivtController.java new file mode 100644 index 000000000..a9854df95 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructivtController.java @@ -0,0 +1,93 @@ + +package org.nl.wms.basedata.st.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.st.service.StructivtService; +import org.nl.wms.basedata.st.service.dto.StructivtDto; +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; + +/** +* @author geng by +* @date 2022-06-02 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "库存管理管理") +@RequestMapping("/api/structivt") +@Slf4j +public class StructivtController { + + private final StructivtService structivtService; + + @GetMapping + @Log("查询库存管理") + @ApiOperation("查询库存管理") + //@PreAuthorize("@el.check('structivt:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(structivtService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增库存管理") + @ApiOperation("新增库存管理") + //@PreAuthorize("@el.check('structivt:add')") + public ResponseEntity create(@Validated @RequestBody StructivtDto dto){ + structivtService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改库存管理") + @ApiOperation("修改库存管理") + //@PreAuthorize("@el.check('structivt:edit')") + public ResponseEntity update(@Validated @RequestBody StructivtDto dto){ + structivtService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除库存管理") + @ApiOperation("删除库存管理") + //@PreAuthorize("@el.check('structivt:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + structivtService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getStruct") + @Log("查询仓位下拉") + @ApiOperation("查询仓位下拉") + //@PreAuthorize("@el.check('structivt:list')") + public ResponseEntity getStruct(){ + return new ResponseEntity<>(structivtService.getStruct(),HttpStatus.OK); + } + + @PostMapping("/getStructById") + @Log("根据仓位id查询仓位信息") + @ApiOperation("根据仓位id查询仓位信息") + //@PreAuthorize("@el.check('structivt:list')") + public ResponseEntity getStructById(@RequestBody JSONObject param){ + return new ResponseEntity<>(structivtService.getStructById(param),HttpStatus.OK); + } + + @GetMapping("/getUnits") + @Log("查询计量单位下拉") + @ApiOperation("查询计量单位下拉") + //@PreAuthorize("@el.check('structivt:list')") + public ResponseEntity getUnits(){ + return new ResponseEntity<>(structivtService.getUnits(),HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructrelamaterialController.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructrelamaterialController.java new file mode 100644 index 000000000..6e8956d71 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/rest/StructrelamaterialController.java @@ -0,0 +1,85 @@ + +package org.nl.wms.basedata.st.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.basedata.st.service.StructrelamaterialService; +import org.nl.wms.basedata.st.service.dto.StructrelamaterialDto; +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; + +/** +* @author zhouz +* @date 2021-12-09 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "物料存放设置管理") +@RequestMapping("/api/structrelamaterial") +@Slf4j +public class StructrelamaterialController { + + private final StructrelamaterialService structrelamaterialService; + + @GetMapping + @Log("查询物料存放设置") + @ApiOperation("查询物料存放设置") + //@PreAuthorize("@el.check('structrelamaterial:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(structrelamaterialService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增物料存放设置") + @ApiOperation("新增物料存放设置") + //@PreAuthorize("@el.check('structrelamaterial:add')") + public ResponseEntity create(@Validated @RequestBody StructrelamaterialDto dto){ + structrelamaterialService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改物料存放设置") + @ApiOperation("修改物料存放设置") + //@PreAuthorize("@el.check('structrelamaterial:edit')") + public ResponseEntity update(@Validated @RequestBody StructrelamaterialDto dto){ + structrelamaterialService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除物料存放设置") + @ApiOperation("删除物料存放设置") + //@PreAuthorize("@el.check('structrelamaterial:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + structrelamaterialService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/insertSet") + @Log("插入物料存放设置") + @ApiOperation("插入物料存放设置") + //@PreAuthorize("@el.check('structrelamaterial:edit')") + public ResponseEntity insertSet(@RequestBody Map whereJson){ + structrelamaterialService.insertSet(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PostMapping("/delSet") + @Log("删除物料存放设置") + @ApiOperation("删除物料存放设置") + //@PreAuthorize("@el.check('structrelamaterial:edit')") + public ResponseEntity delSet(@RequestBody Map whereJson){ + structrelamaterialService.delSet(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/SectattrService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/SectattrService.java new file mode 100644 index 000000000..7e6bd9724 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/SectattrService.java @@ -0,0 +1,74 @@ + +package org.nl.wms.basedata.st.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.st.service.dto.SectattrDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author zhouz +* @date 2021-12-09 +**/ +public interface SectattrService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param sect_id ID + * @return Sectattr + */ + SectattrDto findById(Long sect_id); + + /** + * 根据编码查询 + * @param code code + * @return Sectattr + */ + SectattrDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(SectattrDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(SectattrDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + JSONObject getSect(Map whereJson); + + /** + * 改变启用状态 + * @param json + */ + void changeActive(JSONObject json); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StorattrService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StorattrService.java new file mode 100644 index 000000000..b095b5cd0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StorattrService.java @@ -0,0 +1,74 @@ + +package org.nl.wms.basedata.st.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.st.service.dto.StorattrDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author zhouz +* @date 2021-12-08 +**/ +public interface StorattrService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param stor_id ID + * @return Storattr + */ + StorattrDto findById(Long stor_id); + + /** + * 根据编码查询 + * @param code code + * @return Storattr + */ + StorattrDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(StorattrDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(StorattrDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + JSONObject getStor(Map whereJson); + + /** + * 改变启用状态 + * @param json + */ + void changeActive(JSONObject json); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructattrService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructattrService.java new file mode 100644 index 000000000..b316562f2 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructattrService.java @@ -0,0 +1,72 @@ + +package org.nl.wms.basedata.st.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.st.service.dto.StructattrDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author zhouz +* @date 2021-12-09 +**/ +public interface StructattrService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param struct_id ID + * @return Structattr + */ + StructattrDto findById(Long struct_id); + + /** + * 根据编码查询 + * @param code code + * @return Structattr + */ + StructattrDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(StructattrDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(StructattrDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 改变启用状态 + * @param json + */ + void changeActive(JSONObject json); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructivtService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructivtService.java new file mode 100644 index 000000000..70a5989dd --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructivtService.java @@ -0,0 +1,72 @@ + +package org.nl.wms.basedata.st.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.st.service.dto.StructivtDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author geng by +* @date 2022-06-02 +**/ +public interface StructivtService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param stockrecord_id ID + * @return Structivt + */ + StructivtDto findById(Long stockrecord_id); + + /** + * 根据编码查询 + * @param code code + * @return Structivt + */ + StructivtDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(StructivtDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(StructivtDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + JSONArray getStruct(); + + JSONObject getStructById(JSONObject param); + + JSONArray getUnits(); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructrelamaterialService.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructrelamaterialService.java new file mode 100644 index 000000000..ca3b70d91 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/StructrelamaterialService.java @@ -0,0 +1,69 @@ + +package org.nl.wms.basedata.st.service; + +import org.nl.wms.basedata.st.service.dto.StructrelamaterialDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author zhouz +* @date 2021-12-09 +**/ +public interface StructrelamaterialService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param material_type_id ID + * @return Structrelamaterial + */ + StructrelamaterialDto findById(Long material_type_id); + + /** + * 根据编码查询 + * @param code code + * @return Structrelamaterial + */ + StructrelamaterialDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(StructrelamaterialDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(StructrelamaterialDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + void insertSet(Map whereJson); + + void delSet(Map whereJson); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/MaterialsafeivtDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/MaterialsafeivtDto.java new file mode 100644 index 000000000..861caffc2 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/MaterialsafeivtDto.java @@ -0,0 +1,39 @@ +package org.nl.wms.basedata.st.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author zhouz +* @date 2021-12-10 +**/ +@Data +public class MaterialsafeivtDto implements Serializable { + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long stor_id; + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long material_id; + + private BigDecimal safe_ivt_down; + + private BigDecimal safe_ivt_up; + + private Long qty_unit_id; + + private String qty_unit_name; + + private Long set_id; + + private String set_name; + + private String set_time; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/SectattrDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/SectattrDto.java new file mode 100644 index 000000000..be570484f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/SectattrDto.java @@ -0,0 +1,115 @@ +package org.nl.wms.basedata.st.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author zhouz +* @date 2021-12-09 +**/ +@Data +public class SectattrDto implements Serializable { + + /** 库区标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long sect_id; + + /** 库区编码 */ + private String sect_code; + + /** 库区名称 */ + private String sect_name; + + /** 库区简称 */ + private String simple_name; + + /** 库区类型 */ + private String sect_type_attr; + + /** 仓库标识 */ + private Long stor_id; + + /** 仓库名称 */ + private String stor_name; + + /** 仓库类型 */ + private String stor_type; + + /** 容量 */ + private BigDecimal capacity; + + /** 宽度 */ + private BigDecimal width; + + /** 高度 */ + private BigDecimal height; + + /** 深度 */ + private BigDecimal zdepth; + + /** 起始X坐标 */ + private BigDecimal xqty; + + /** 起始Y坐标 */ + private BigDecimal yqty; + + /** 起始Z坐标 */ + private BigDecimal zqty; + + /** 负责人 */ + private String sect_manager_name; + + /** 负责人电话 */ + private String mobile_no; + + /** 备注 */ + private String remark; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; + + /** 是否删除 */ + private String is_delete; + + /** 背景色 */ + private String back_ground_color; + + /** 前景色 */ + private String front_ground_color; + + /** 背景图片 */ + private String back_ground_pic; + + /** 字体显示方向 */ + private String font_direction_scode; + + /** 所在楼层 */ + private BigDecimal floor_no; + + /** 是否启用 */ + private String is_used; + + /** 外部标识 */ + private String ext_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StorattrDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StorattrDto.java new file mode 100644 index 000000000..fb16efef1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StorattrDto.java @@ -0,0 +1,106 @@ +package org.nl.wms.basedata.st.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author zhouz +* @date 2021-12-08 +**/ +@Data +public class StorattrDto implements Serializable { + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long stor_id; + + /** 仓库编码 */ + private String stor_code; + + /** 仓库名称 */ + private String stor_name; + + /** 简称 */ + private String simple_name; + + /** 容量 */ + private BigDecimal stor_capacity; + + /** 总面积(㎡) */ + private BigDecimal total_area; + + /** 仓库性质 */ + private String stor_type_scode; + + private String is_virtualstore; + + private String is_semi_finished; + + private String is_materialstore; + + private String is_productstore; + + private String is_reversed; + + private String is_mvout_auto_cfm; + + private String is_mvin_auto_cfm; + + private String area; + + /** 地址 */ + private String storea_ddress; + + /** 负责人 */ + private String principal; + + /** 联系电话 */ + private String office_phone; + + private String mobile_no; + + /** 备注 */ + private String remark; + + private BigDecimal order_index; + + private String whstate_scode; + + /** 是否启用 */ + private String is_used; + + private String base_class_id; + + private Long create_id; + + private String create_name; + + private String create_time; + + private Long update_optid; + + private String update_optname; + + private String update_time; + + private Long sysownerid; + + private Long sysdeptid; + + private Long syscompanyid; + + private String is_delete; + + private String ext_id; + + private String depart_name; + + private String company_name; + + private String is_attachment; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructattrDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructattrDto.java new file mode 100644 index 000000000..6b4fb958c --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructattrDto.java @@ -0,0 +1,145 @@ +package org.nl.wms.basedata.st.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author zhouz +* @date 2021-12-09 +**/ +@Data +public class StructattrDto implements Serializable { + + /** 仓位标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long struct_id; + + /** 仓位编码 */ + private String struct_code; + + /** 仓位名称 */ + private String struct_name; + + /** 仓位简称 */ + private String simple_name; + + /** 库区标识 */ + private Long sect_id; + + /** 库区编码 */ + private String sect_code; + + /** 库区名称 */ + private String sect_name; + + /** 仓库标识 */ + private Long stor_id; + + /** 仓库编码 */ + private String stor_code; + + /** 仓库名称 */ + private String stor_name; + + /** 仓库类型 */ + private String stor_type; + + /** 容量 */ + private BigDecimal capacity; + + /** 宽度 */ + private BigDecimal width; + + /** 高度 */ + private BigDecimal height; + + /** 深度 */ + private BigDecimal zdepth; + + /** 承受重量 */ + private BigDecimal weight; + + /** 起始X坐标 */ + private BigDecimal xqty; + + /** 起始Y坐标 */ + private BigDecimal yqty; + + /** 起始Z坐标 */ + private BigDecimal zqty; + + /** 是否临时仓位 */ + private String is_tempstruct; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; + + /** 是否删除 */ + private String is_delete; + + /** 背景色 */ + private String back_ground_color; + + /** 前景色 */ + private String front_ground_color; + + /** 背景图片 */ + private String back_ground_pic; + + /** 字体显示方向 */ + private String font_direction_scode; + + /** 是否启用 */ + private String is_used; + + /** 是否判断高度 */ + private String is_zdepth; + + /** 存储载具标识 */ + private Long storagevehicle_id; + + /** 存储载具号 */ + private String storagevehicle_code; + + /** 存储载具类型 */ + private String storagevehicle_type; + + /** 是否空载具 */ + private String is_emptyvehicle; + + /** 载具数量 */ + private BigDecimal storagevehicle_qty; + + /** 锁定类型 */ + private String lock_type; + + /** 物料高度类型 */ + private String material_height_type; + + /** 外部标识 */ + private String ext_id; + + /** 备注 */ + private String remark; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructivtDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructivtDto.java new file mode 100644 index 000000000..cc9fdef5a --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructivtDto.java @@ -0,0 +1,64 @@ +package org.nl.wms.basedata.st.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author geng by +* @date 2022-06-02 +**/ +@Data +public class StructivtDto implements Serializable { + + /** 库存记录标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long stockrecord_id; + + /** 仓位标识 */ + private Long struct_id; + + /** 仓位编码 */ + private String struct_code; + + /** 仓位名称 */ + private String struct_name; + + /** 工序标识 */ + private Long workprocedure_id; + + /** 物料标识 */ + private Long material_id; + + /** 品质类型 */ + private String quality_scode; + + /** 批次 */ + private String pcsn; + + /** 可用数 */ + private BigDecimal canuse_qty; + + /** 冻结数 */ + private BigDecimal frozen_qty; + + /** 库存数 */ + private BigDecimal ivt_qty; + + /** 待入数 */ + private BigDecimal warehousing_qty; + + /** 计量单位标识 */ + private Long qty_unit_id; + + /** 入库时间 */ + private String instorage_time; + + /** 销售单标识 */ + private Long sale_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructrelamaterialDto.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructrelamaterialDto.java new file mode 100644 index 000000000..42e102782 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/dto/StructrelamaterialDto.java @@ -0,0 +1,30 @@ +package org.nl.wms.basedata.st.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author zhouz +* @date 2021-12-09 +**/ +@Data +public class StructrelamaterialDto implements Serializable { + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long sect_id; + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long material_type_id; + + private Long set_id; + + private String set_name; + + private String set_time; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/SectattrServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/SectattrServiceImpl.java new file mode 100644 index 000000000..37d554e3a --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/SectattrServiceImpl.java @@ -0,0 +1,251 @@ + +package org.nl.wms.basedata.st.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.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.st.service.SectattrService; +import org.nl.wms.basedata.st.service.StorattrService; +import org.nl.wms.basedata.st.service.dto.SectattrDto; +import org.nl.wms.basedata.st.service.dto.StorattrDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author zhouz + * @description 服务实现 + * @date 2021-12-09 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class SectattrServiceImpl implements SectattrService { + + @Autowired + private StorattrService storattrService; + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String search = (String) whereJson.get("search"); + HashMap map = new HashMap<>(); + if (!StrUtil.isEmpty(search)) { + map.put("search", "%" + search + "%"); + } + map.put("flag", "1"); + map.put("stor_id", (String) whereJson.get("stor_id")); + JSONObject jo = WQL.getWO("QST_SECT_ATTR").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "update_time desc"); + return jo; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_sectattr"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(SectattrDto.class); + return list; + } + + @Override + public SectattrDto findById(Long sect_id) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_sectattr"); + JSONObject json = wo.query("sect_id =" + sect_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final SectattrDto obj = json.toJavaObject(SectattrDto.class); + return obj; + } + + @Override + public SectattrDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_sectattr"); + JSONObject json = wo.query("sect_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final SectattrDto obj = json.toJavaObject(SectattrDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(SectattrDto dto) { + String sect_code = dto.getSect_code(); + SectattrDto sectattrDto = this.findByCode(sect_code); + if (sectattrDto != null && sectattrDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的库区编号"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setSect_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + StorattrDto storattrDto = storattrService.findById(dto.getStor_id()); + dto.setStor_name(storattrDto.getStor_name()); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_sectattr"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(SectattrDto dto) { + SectattrDto entity = this.findById(dto.getSect_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + String sect_code = dto.getSect_code(); + SectattrDto sectattrDto = this.findByCode(sect_code); + if (sectattrDto != null && !dto.getSect_id().equals(sectattrDto.getSect_id()) && sectattrDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的库区编号"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + StorattrDto storattrDto = storattrService.findById(dto.getStor_id()); + dto.setStor_name(storattrDto.getStor_name()); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_sectattr"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_sectattr"); + for (Long sect_id : ids) { + JSONObject param = new JSONObject(); + param.put("sect_id", String.valueOf(sect_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + public JSONObject getSect(Map whereJson) { + JSONArray new_ja = new JSONArray(); + HashMap stor_map = new HashMap<>(); + stor_map.put("flag", "2"); + String is_materialstore = (String) whereJson.get("is_materialstore"); + String is_virtualstore = (String) whereJson.get("is_virtualstore"); + String is_semi_finished = (String) whereJson.get("is_semi_finished"); + String is_productstore = (String) whereJson.get("is_productstore"); + String is_attachment = (String) whereJson.get("is_attachment"); + String is_reversed = (String) whereJson.get("is_reversed"); + if (!StrUtil.isEmpty(is_materialstore)) { + stor_map.put("is_materialstore", is_materialstore); + } + if (!StrUtil.isEmpty(is_virtualstore)) { + stor_map.put("is_virtualstore", is_virtualstore); + } + if (!StrUtil.isEmpty(is_semi_finished)) { + stor_map.put("is_semi_finished", is_semi_finished); + } + if (!StrUtil.isEmpty(is_productstore)) { + stor_map.put("is_productstore", is_productstore); + } + if (!StrUtil.isEmpty(is_attachment)) { + stor_map.put("is_attachment", is_attachment); + } + if (!StrUtil.isEmpty(is_reversed)) { + stor_map.put("is_reversed", is_reversed); + } + JSONArray stor_ja = WQL.getWO("QST_STOR_ATTR").addParamMap(stor_map).process().getResultJSONArray(0); + for (int i = 0; i < stor_ja.size(); i++) { + JSONObject stor_jo = stor_ja.getJSONObject(i); + JSONObject stor_cas = new JSONObject(); + stor_cas.put("value", stor_jo.getString("stor_id")); + stor_cas.put("label", stor_jo.getString("stor_name")); + HashMap map = new HashMap<>(); + map.put("flag", "2"); + map.put("stor_id", stor_jo.getString("stor_id")); + map.put("sect_type_attr", (String) whereJson.get("sect_type_attr")); + JSONArray ja = WQL.getWO("QST_SECT_ATTR").addParamMap(map).process().getResultJSONArray(0); + if (ja.size() > 0) { + JSONArray sect_ja = new JSONArray(); + for (int j = 0; j < ja.size(); j++) { + JSONObject sect_jo = ja.getJSONObject(j); + JSONObject sect_cas = new JSONObject(); + sect_cas.put("value", sect_jo.getString("sect_id")); + sect_cas.put("label", sect_jo.getString("sect_name")); + sect_ja.add(sect_cas); + } + stor_cas.put("children", sect_ja); + } + new_ja.add(stor_cas); + } + JSONObject jo = new JSONObject(); + jo.put("content", new_ja); + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeActive(JSONObject json) { + + String stor_id = json.getString("stor_id"); + JSONObject st_ivt_bsRealStorAttr = WQLObject.getWQLObject("ST_IVT_BSRealStorAttr").query(" stor_id = '" + stor_id + "' and is_used = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(st_ivt_bsRealStorAttr)){ + throw new BadRequestException("该库区所属的仓库已禁用,请先启用该仓库!"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String is_used = "1"; + if (StrUtil.equals("1", json.getString("is_used"))) { + is_used = "0"; + } + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("st_ivt_sectattr").update(json); + + String sect_id = json.getString("sect_id"); + json = new JSONObject(); + json.put("sect_id",sect_id); + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("st_ivt_structattr").update(json," sect_id = '" + sect_id + "'"); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StorattrServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StorattrServiceImpl.java new file mode 100644 index 000000000..6fccddd7f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StorattrServiceImpl.java @@ -0,0 +1,219 @@ + +package org.nl.wms.basedata.st.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.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.st.service.StorattrService; +import org.nl.wms.basedata.st.service.dto.StorattrDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author zhouz + * @description 服务实现 + * @date 2021-12-08 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class StorattrServiceImpl implements StorattrService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String search = (String) whereJson.get("search"); + HashMap map = new HashMap<>(); + if (!StrUtil.isEmpty(search)) { + map.put("search", "%" + search + "%"); + } + map.put("flag", "1"); + JSONObject jo = WQL.getWO("QST_STOR_ATTR").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "update_time desc"); + return jo; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(StorattrDto.class); + return list; + } + + @Override + public StorattrDto findById(Long stor_id) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); + JSONObject json = wo.query("stor_id =" + stor_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final StorattrDto obj = json.toJavaObject(StorattrDto.class); + return obj; + } + + @Override + public StorattrDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); + JSONObject json = wo.query("stor_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final StorattrDto obj = json.toJavaObject(StorattrDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(StorattrDto dto) { + String stor_code = dto.getStor_code(); + StorattrDto storattrDto = this.findByCode(stor_code); + if (storattrDto != null && storattrDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的仓库编号"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setStor_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + //TODO + dto.setSyscompanyid(18L); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(StorattrDto dto) { + StorattrDto entity = this.findById(dto.getStor_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + String stor_code = dto.getStor_code(); + StorattrDto storattrDto = this.findByCode(stor_code); + if (storattrDto != null && !dto.getStor_id().equals(storattrDto.getStor_id()) && storattrDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的供应商编号"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setSyscompanyid(dto.getSysdeptid()); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_bsrealstorattr"); + for (Long stor_id : ids) { + JSONObject param = new JSONObject(); + param.put("stor_id", String.valueOf(stor_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + public JSONObject getStor(Map whereJson) { + String is_materialstore = (String) whereJson.get("is_materialstore"); + String is_virtualstore = (String) whereJson.get("is_virtualstore"); + String is_semi_finished = (String) whereJson.get("is_semi_finished"); + String is_productstore = (String) whereJson.get("is_productstore"); + String is_attachment = (String) whereJson.get("is_attachment"); + String is_reversed = (String) whereJson.get("is_reversed"); + HashMap map = new HashMap<>(); + map.put("flag", "2"); + if (!StrUtil.isEmpty(is_materialstore)) { + map.put("is_materialstore", is_materialstore); + } + if (!StrUtil.isEmpty(is_virtualstore)) { + map.put("is_virtualstore", is_virtualstore); + } + if (!StrUtil.isEmpty(is_semi_finished)) { + map.put("is_semi_finished", is_semi_finished); + } + if (!StrUtil.isEmpty(is_productstore)) { + map.put("is_productstore", is_productstore); + } + if (!StrUtil.isEmpty(is_attachment)) { + map.put("is_attachment", is_attachment); + } + if (!StrUtil.isEmpty(is_reversed)) { + map.put("is_reversed", is_reversed); + } + JSONArray ja = WQL.getWO("QST_STOR_ATTR").addParamMap(map).process().getResultJSONArray(0); + JSONObject jo = new JSONObject(); + jo.put("content", ja); + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeActive(JSONObject json) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String is_used = "1"; + if (StrUtil.equals("1", json.getString("is_used"))) { + is_used = "0"; + } + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("ST_IVT_BSRealStorAttr").update(json); + + //同时修改该stor_id仓库下仓位和库区的启用状态 + String stor_id = json.getString("stor_id"); + json = new JSONObject(); + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("st_ivt_structattr").update(json, "stor_id = '" + stor_id + "'"); + + json = new JSONObject(); + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("st_ivt_sectattr").update(json, "stor_id = '" + stor_id + "'"); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructattrServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructattrServiceImpl.java new file mode 100644 index 000000000..428669501 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructattrServiceImpl.java @@ -0,0 +1,247 @@ + +package org.nl.wms.basedata.st.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.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.st.service.SectattrService; +import org.nl.wms.basedata.st.service.StorattrService; +import org.nl.wms.basedata.st.service.StructattrService; +import org.nl.wms.basedata.st.service.dto.SectattrDto; +import org.nl.wms.basedata.st.service.dto.StorattrDto; +import org.nl.wms.basedata.st.service.dto.StructattrDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author zhouz + * @description 服务实现 + * @date 2021-12-09 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class StructattrServiceImpl implements StructattrService { + + @Autowired + private SectattrService sectattrService; + @Autowired + private StorattrService storattrService; + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String search = (String) whereJson.get("search"); + HashMap map = new HashMap<>(); + if (StrUtil.isNotEmpty(search)) { + map.put("search", "%" + search + "%"); + } + map.put("flag", "1"); + map.put("stor_id", (String) whereJson.get("stor_id")); + map.put("sect_id", (String) whereJson.get("sect_id")); + map.put("lock_type", (String) whereJson.get("lock_type")); + JSONObject jo = WQL.getWO("QST_STRUCT_ATTR").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "struct_code asc"); + return jo; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structattr"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(StructattrDto.class); + return list; + } + + @Override + public StructattrDto findById(Long struct_id) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structattr"); + JSONObject json = wo.query("struct_id =" + struct_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final StructattrDto obj = json.toJavaObject(StructattrDto.class); + return obj; + } + + @Override + public StructattrDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structattr"); + JSONObject json = wo.query("struct_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final StructattrDto obj = json.toJavaObject(StructattrDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(StructattrDto dto) { + String struct_code = dto.getStruct_code(); + StructattrDto structattrDto = this.findByCode(struct_code); + if (structattrDto != null && structattrDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的库区编号"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setStruct_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + SectattrDto sectattrDto = sectattrService.findById(dto.getSect_id()); + StorattrDto storattrDto = storattrService.findById(sectattrDto.getStor_id()); + dto.setSect_code(sectattrDto.getSect_code()); + dto.setSect_name(sectattrDto.getSect_name()); + dto.setStor_id(storattrDto.getStor_id()); + dto.setStor_code(storattrDto.getStor_code()); + dto.setStor_name(storattrDto.getStor_name()); + + String storagevehicle_code = dto.getStoragevehicle_code(); + if (ObjectUtil.isNotEmpty(storagevehicle_code)) { + WQLObject vehicleTab = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + JSONObject obj = vehicleTab.query("storagevehicle_code = '" + storagevehicle_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(obj)) throw new BadRequestException("未发现载具号为【" + storagevehicle_code + "】的载具信息"); + + dto.setStoragevehicle_id(obj.getLong + ("storagevehicle_id")); + dto.setStoragevehicle_type(obj.getString("storagevehicle_type")); + } + + + WQLObject wo = WQLObject.getWQLObject("st_ivt_structattr"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + + //根据仓位更新点位载具和锁定信息 + // 点位基础表【SCH_BASE_Point】 +/* JSONObject param = new JSONObject(); + param.put("is_used", dto.getIs_used()); + param.put("vehicle_code", dto.getStoragevehicle_code()); + param.put("lock_type", dto.getLock_type()); + WQLObject.getWQLObject("SCH_BASE_Point").update(param, "point_code = '" + dto.getStruct_code() + "'");*/ + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(StructattrDto dto) { + StructattrDto entity = this.findById(dto.getStruct_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + String struct_code = dto.getStruct_code(); + StructattrDto structattrDto = this.findByCode(struct_code); + if (structattrDto != null && !dto.getStruct_id().equals(structattrDto.getStruct_id()) && structattrDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的库区编号"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + SectattrDto sectattrDto = sectattrService.findById(dto.getSect_id()); + StorattrDto storattrDto = storattrService.findById(sectattrDto.getStor_id()); + dto.setSect_code(sectattrDto.getSect_code()); + dto.setSect_name(sectattrDto.getSect_name()); + dto.setStor_id(storattrDto.getStor_id()); + dto.setStor_code(storattrDto.getStor_code()); + dto.setStor_name(storattrDto.getStor_name()); + + String storagevehicle_code = dto.getStoragevehicle_code(); + if (ObjectUtil.isNotEmpty(storagevehicle_code)) { + WQLObject vehicleTab = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); + JSONObject obj = vehicleTab.query("storagevehicle_code = '" + storagevehicle_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(obj)) throw new BadRequestException("未发现载具号为【" + storagevehicle_code + "】的载具信息"); + + dto.setStoragevehicle_id(obj.getLong + ("storagevehicle_id")); + dto.setStoragevehicle_type(obj.getString("storagevehicle_type")); + } + + + WQLObject wo = WQLObject.getWQLObject("st_ivt_structattr"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + +/* //根据仓位更新点位载具和锁定信息 + // 点位基础表【SCH_BASE_Point】 + JSONObject param = new JSONObject(); + param.put("is_used", dto.getIs_used()); + param.put("vehicle_code", dto.getStoragevehicle_code()); + param.put("lock_type", dto.getLock_type()); + WQLObject.getWQLObject("SCH_BASE_Point").update(param, "point_code = '" + dto.getStruct_code() + "'");*/ + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_structattr"); + for (Long struct_id : ids) { + JSONObject param = new JSONObject(); + param.put("struct_id", String.valueOf(struct_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeActive(JSONObject json) { + + String sect_id = json.getString("sect_id"); + JSONObject st_ivt_bsRealStorAttr = WQLObject.getWQLObject("ST_IVT_SectAttr").query(" sect_id = '" + sect_id + "' and is_used = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(st_ivt_bsRealStorAttr)){ + throw new BadRequestException("该仓位所属的库区已禁用,请先启用该库区!"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String struct_id = json.getString("struct_id"); + String now = DateUtil.now(); + + String is_used = "1"; + if (StrUtil.equals("1", json.getString("is_used"))) { + is_used = "0"; + } + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("st_ivt_structattr").update(json); + + json = new JSONObject(); + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("sch_base_point").update(json, " point_id = '" + struct_id + "'"); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructivtServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructivtServiceImpl.java new file mode 100644 index 000000000..1e11b60c2 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructivtServiceImpl.java @@ -0,0 +1,148 @@ + +package org.nl.wms.basedata.st.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.basedata.st.service.StructivtService; +import org.nl.wms.basedata.st.service.dto.StructivtDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务实现 +* @author geng by +* @date 2022-06-02 +**/ +@Service +@RequiredArgsConstructor +@Slf4j +public class StructivtServiceImpl implements StructivtService { + private final ClassstandardService classstandardService; + + @Override + public Map queryAll(Map whereJson, Pageable page){ + String material = MapUtil.getStr(whereJson, "material"); + String struct = MapUtil.getStr(whereJson, "struct"); + String region_id = MapUtil.getStr(whereJson, "region_id"); + JSONObject map = new JSONObject(); + map.put("flag", "1"); + map.put("region_id", region_id); + if (StrUtil.isNotEmpty(material)) { + map.put("material", "%" + material + "%"); + } + if (StrUtil.isNotEmpty(struct)) { + map.put("struct", "%" + struct + "%"); + } + JSONObject jsonObject = WQL.getWO("QST_STRUCTIVT001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "ivt.instorage_time desc"); + return jsonObject; + } + + @Override + public List queryAll(Map whereJson){ + WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(StructivtDto.class); + return null; + } + + @Override + public StructivtDto findById(Long stockrecord_id) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); + JSONObject json = wo.query("stockrecord_id = '" + stockrecord_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( StructivtDto.class); + } + return null; + } + + @Override + public StructivtDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( StructivtDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(StructivtDto dto) { + String now = DateUtil.now(); + dto.setStockrecord_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setInstorage_time(now); + WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(StructivtDto dto) { + StructivtDto entity = this.findById(dto.getStockrecord_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_structivt"); + for (Long stockrecord_id: ids) { + JSONObject param = new JSONObject(); + param.put("stockrecord_id", String.valueOf(stockrecord_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + public JSONArray getStruct() { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structattr"); + final JSONArray resultJSONArray = wo.query("is_delete = '0'").getResultJSONArray(0); + return resultJSONArray; + } + + @Override + public JSONObject getStructById(JSONObject param) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structattr"); + final JSONObject jsonObject = wo.query("is_delete = '0' and struct_id = '" + param.getString("struct_id") + "'").uniqueResult(0); + return jsonObject; + } + + @Override + public JSONArray getUnits() { + WQLObject wo = WQLObject.getWQLObject("md_pb_measureunit"); + final JSONArray resultJSONArray = wo.query("is_delete = '0'").getResultJSONArray(0); + return resultJSONArray; + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructrelamaterialServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructrelamaterialServiceImpl.java new file mode 100644 index 000000000..3ffd99ea7 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructrelamaterialServiceImpl.java @@ -0,0 +1,176 @@ + +package org.nl.wms.basedata.st.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.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.basedata.st.service.StructrelamaterialService; +import org.nl.wms.basedata.st.service.dto.StructrelamaterialDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author zhouz + * @description 服务实现 + * @date 2021-12-09 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class StructrelamaterialServiceImpl implements StructrelamaterialService { + private final ClassstandardService classstandardService; + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String search = (String) whereJson.get("search"); + HashMap map = new HashMap<>(); + if (!StrUtil.isEmpty(search)) { + map.put("search", "%" + search + "%"); + } + map.put("flag", "1"); + map.put("stor_id", (String) whereJson.get("stor_id")); + map.put("sect_id", (String) whereJson.get("sect_id")); + String material_type_id = (String) whereJson.get("material_type_id"); + String class_idStr = (String) whereJson.get("class_idStr"); + //处理物料当前节点的所有子节点 + if (!StrUtil.isEmpty(material_type_id)) { + map.put("material_type_id", material_type_id); + String classIds = classstandardService.getChildIdStr(material_type_id); + map.put("classIds", classIds); + } else if (ObjectUtil.isNotEmpty(class_idStr)) { + String classIds = classstandardService.getAllChildIdStr(class_idStr); + map.put("classIds", classIds); + } + JSONObject jo = WQL.getWO("QST_IVT_MATERIALSET").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "set_time desc"); + return jo; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structrelamaterial"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(StructrelamaterialDto.class); + return list; + } + + @Override + public StructrelamaterialDto findById(Long material_type_id) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structrelamaterial"); + JSONObject json = wo.query("material_type_id =" + material_type_id + "").uniqueResult(0); + final StructrelamaterialDto obj = json.toJavaObject(StructrelamaterialDto.class); + return obj; + } + + @Override + public StructrelamaterialDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_structrelamaterial"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + final StructrelamaterialDto obj = json.toJavaObject(StructrelamaterialDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(StructrelamaterialDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setMaterial_type_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setSet_name(nickName); + dto.setSet_time(now); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_structrelamaterial"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(StructrelamaterialDto dto) { + StructrelamaterialDto entity = this.findById(dto.getMaterial_type_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + WQLObject wo = WQLObject.getWQLObject("st_ivt_structrelamaterial"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_structrelamaterial"); + for (Long material_type_id : ids) { + JSONObject param = new JSONObject(); + param.put("material_type_id", String.valueOf(material_type_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + public void insertSet(Map whereJson) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + WQLObject mater = WQLObject.getWQLObject("ST_IVT_StructRelaMaterial"); + String sect_id = (String) whereJson.get("sect_id"); + ArrayList class_rows = (ArrayList) whereJson.get("class_rows"); + for (int i = 0; i < class_rows.size(); i++) { + HashMap class_row = class_rows.get(i); + JSONObject material_set = mater.query("sect_id = '" + sect_id + "' AND material_type_id = '" + class_row.get("class_id") + "'") + .uniqueResult(0); + if (material_set != null) { + HashMap update_map = new HashMap<>(); + update_map.put("set_id", currentUserId + ""); + update_map.put("set_name", nickName); + update_map.put("set_time", now); + mater.update(update_map, "sect_id = '" + sect_id + "' AND material_type_id = '" + class_row.get("class_id") + "'"); + } else { + JSONObject jo = new JSONObject(); + jo.put("sect_id", sect_id); + jo.put("material_type_id", class_row.get("class_id")); + jo.put("set_id", currentUserId + ""); + jo.put("set_name", nickName); + jo.put("set_time", now); + mater.insert(jo); + } + } + } + + @Override + public void delSet(Map whereJson) { + String sect_id = (String) whereJson.get("sect_id"); + String material_type_id = (String) whereJson.get("material_type_id"); + WQLObject.getWQLObject("ST_IVT_StructRelaMaterial").delete("sect_id = '" + sect_id + "' AND material_type_id = '" + material_type_id + "'"); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QLK01.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QLK01.wql new file mode 100644 index 000000000..2ba88dab4 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QLK01.wql @@ -0,0 +1,226 @@ +[交易说明] + 交易名: 将海亮的物料导入mysql + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.material_code TYPEAS s_string + 输入.processroute_uuid TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + * + FROM + MD_PB_BaseData_ClassInfo classinfot + LEFT JOIN MD_PB_BaseData_ClassStandard standard ON classinfot.class_uuid = standard.class_uuid + LEFT JOIN MD_ME_MaterialBase material ON material.material_uuid = classinfot.base_data_uuid + left join MD_ME_MaterialExt ext on ext.material_uuid = material.material_uuid + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + * + FROM + MD_PB_BaseData_ClassStandard class + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + * + FROM + ST_IVT_BSREALSTORATTR + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + * + FROM + ST_IVT_SECTATTR + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + * + FROM + ST_IVT_STRUCTATTR + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "6" + QUERY + SELECT + * + FROM + ST_IVT_StorageVehicleInfo + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "7" + QUERY + SELECT + * + FROM + wdk_sysparam + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "8" + QUERY + SELECT + * + FROM + IF_CacheLine_Position + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "9" + QUERY + SELECT + * + FROM + st_cacheline_position + ENDSELECT + ENDQUERY + ENDIF + +IF 输入.flag = "10" + QUERY + SELECT + mb.*, + class.class_code, + class.class_name + FROM + md_me_materialbase mb + LEFT JOIN MD_PB_ClassStandard class ON class.class_id = mb.material_type_id + WHERE + mb.is_delete = '0' + AND 1 = 1 + AND class.class_id IN ( '1528555445302726656', '1528555443906023424', '1528555445080428544' ) + ENDSELECT + ENDQUERY +ENDIF + +IF 输入.flag = "11" + QUERY + SELECT + mb.*, + class.class_code, + class.class_name + FROM + md_me_materialbase mb + LEFT JOIN MD_PB_ClassStandard class ON class.class_id = mb.material_type_id + WHERE + mb.is_delete = '0' + AND 1 = 1 + AND class.class_id IN ( '1528555444031852544', '1528555444778438656', '1528555444291899392' ) + ENDSELECT + ENDQUERY +ENDIF + + +IF 输入.flag = "12" + QUERY + SELECT + * + FROM + PDM_BI_WorkshopMaterialCorr + ENDSELECT + ENDQUERY +ENDIF + +IF 输入.flag = "13" + QUERY + SELECT + * + FROM + PDM_BI_SemiMaterialCorr + ENDSELECT + ENDQUERY +ENDIF + +IF 输入.flag = "14" + QUERY + SELECT + * + FROM + PDM_BI_WorkshopMaterialCorr corr + LEFT JOIN PF_PB_SysDicInfo sys ON sys.sysdic_code = corr.materialprocess_series + AND sys.sysdic_type = 'IF_WCS_DEVICESERIES' + ENDSELECT + ENDQUERY +ENDIF + + + +IF 输入.flag = "15" + QUERY + SELECT + * + FROM + PDM_BI_ProduceProcessRoute route + ENDSELECT + ENDQUERY +ENDIF + +IF 输入.flag = "16" + QUERY + SELECT + * + FROM + PDM_BI_ProduceProcessRoute route + LEFT JOIN PDM_BI_ProduceProcessRouteDtl dtl ON route.processroute_uuid = dtl.processroute_uuid + route.processroute_uuid = 输入.processroute_uuid + order by workprocedure_number + ENDSELECT + ENDQUERY +ENDIF \ No newline at end of file diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_IVT_MATERIALSET.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_IVT_MATERIALSET.wql new file mode 100644 index 000000000..3eff3c770 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_IVT_MATERIALSET.wql @@ -0,0 +1,78 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.sect_id TYPEAS s_string + 输入.classIds TYPEAS f_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + se.sect_code, + se.sect_name, + class.class_code, + class.class_name, + sm.* + FROM + st_ivt_structrelamaterial sm + INNER JOIN st_ivt_sectattr se ON se.sect_id = sm.sect_id + INNER JOIN md_pb_classstandard class ON class.class_id = sm.material_type_id + OPTION 输入.search <> "" + ( + class.class_code like 输入.search + OR + class.class_name like 输入.search + ) + ENDOPTION + OPTION 输入.stor_id <> "" + se.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.sect_id <> "" + se.sect_id = 输入.sect_id + ENDOPTION + OPTION 输入.classIds <> "" + class.class_id in 输入.classIds + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_SECT_ATTR.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_SECT_ATTR.wql new file mode 100644 index 000000000..cae0762ff --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_SECT_ATTR.wql @@ -0,0 +1,90 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.sect_type_attr TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + sect.*, + stor.stor_name + FROM + ST_IVT_SectAttr sect + left join ST_IVT_BSRealStorAttr stor on sect.stor_id = stor.stor_id + WHERE + sect.is_delete = '0' + OPTION 输入.search <> "" + ( + sect.sect_code like 输入.search + OR + sect.sect_name like 输入.search + ) + ENDOPTION + OPTION 输入.stor_id <> "" + sect.stor_id = 输入.stor_id + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + sect.sect_id, + sect.sect_name + FROM + st_ivt_sectattr sect + WHERE + sect.is_delete = '0' + AND + sect.is_used = '1' + OPTION 输入.stor_id <> "" + sect.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.sect_type_attr <> "" + sect.sect_type_attr = 输入.sect_type_attr + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STOR_ATTR.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STOR_ATTR.wql new file mode 100644 index 000000000..088b2ef56 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STOR_ATTR.wql @@ -0,0 +1,104 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.is_materialstore TYPEAS s_string + 输入.is_virtualstore TYPEAS s_string + 输入.is_semi_finished TYPEAS s_string + 输入.is_productstore TYPEAS s_string + 输入.is_attachment TYPEAS s_string + 输入.is_reversed TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + stor.*, + detail.label + FROM + st_ivt_bsrealstorattr stor + LEFT JOIN sys_dict_detail detail ON detail.value = stor.stor_type_scode AND detail.dict_id = '30' + WHERE + stor.is_delete = '0' + OPTION 输入.search <> "" + ( + stor.stor_code like 输入.search + OR + stor.stor_name like 输入.search + ) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + stor.stor_id, + stor.stor_code, + stor.stor_name + FROM + st_ivt_bsrealstorattr stor + WHERE + stor.is_delete = '0' + AND + stor.is_used = '1' + OPTION 输入.is_virtualstore <> "" + stor.is_virtualstore = 输入.is_virtualstore + ENDOPTION + OPTION 输入.is_semi_finished <> "" + stor.is_semi_finished = 输入.is_semi_finished + ENDOPTION + OPTION 输入.is_materialstore <> "" + stor.is_materialstore = 输入.is_materialstore + ENDOPTION + OPTION 输入.is_productstore <> "" + stor.is_productstore = 输入.is_productstore + ENDOPTION + OPTION 输入.is_attachment <> "" + stor.is_attachment = 输入.is_attachment + ENDOPTION + OPTION 输入.is_reversed <> "" + stor.is_reversed = 输入.is_reversed + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STRUCTIVT001.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STRUCTIVT001.wql new file mode 100644 index 000000000..e23ba0529 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STRUCTIVT001.wql @@ -0,0 +1,83 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.struct TYPEAS s_string + 输入.material TYPEAS s_string + 输入.region_id TYPEAS f_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + ivt.*, + point.point_code, + point.point_name, + mater.material_code, + mater.material_name, + unit.unit_name, + region.region_name + FROM + ST_IVT_StructIvt ivt + LEFT JOIN sch_base_point point ON ivt.struct_id = point.point_id + LEFT JOIN md_me_materialbase mater ON mater.material_id = ivt.material_id + LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = ivt.qty_unit_id + LEFT JOIN SCH_BASE_Region region ON region.region_id = ivt.region_id + WHERE + 1 = 1 + + OPTION 输入.struct <> "" + ( + ivt.struct_code like 输入.struct or + ivt.struct_name like 输入.struct + ) + ENDOPTION + OPTION 输入.material <> "" + ( + mater.material_code like 输入.material or + mater.material_name like 输入.material + ) + ENDOPTION + + OPTION 输入.region_id <> "" + ivt.region_id = 输入.region_id + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STRUCT_ATTR.wql b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STRUCT_ATTR.wql new file mode 100644 index 000000000..2f75599d2 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/QST_STRUCT_ATTR.wql @@ -0,0 +1,79 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.sect_id TYPEAS s_string + 输入.lock_type TYPEAS s_string + 输入.storagevehicle_type TYPEAS s_string + 输入.is_used TYPEAS s_string + 输入.is_delete TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + struct.* + FROM + st_ivt_structattr struct + WHERE + struct.is_delete = '0' + OPTION 输入.search <> "" + ( + struct.struct_code like 输入.search + OR + struct.struct_name like 输入.search + ) + ENDOPTION + OPTION 输入.stor_id <> "" + struct.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.sect_id <> "" + struct.sect_id = 输入.sect_id + ENDOPTION + OPTION 输入.lock_type <> "" + struct.lock_type = 输入.lock_type + ENDOPTION + OPTION 输入.lock_type = "00" + (struct.storagevehicle_code is null or struct.storagevehicle_code = '') + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls b/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls new file mode 100644 index 0000000000000000000000000000000000000000..ffdc4110b7aaac60a1078d6be43d9f91fa21028c GIT binary patch literal 238080 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%0D@MYL(mOxpF%+b&1GnV|&1M;DYoq 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πzQj+$*N6WnD0kn*y@EicO{VV|a6#{6uSG%i zKv%SwCb=kWy87NnA~T{4lFj#@JMytuz~e_>dg-;7j$9NU$O0=Fq7xtXeRuftqucR7 zDuvx&yms;JA4LB>FoXQcxBFVfhlA(#eSF}LZD068_H7d%sAu=QbNrS4@4Wiqfsar9 zO$`0*Hz)tL_v>Syvj~)f>O=iZX&-p9{o?K~#A=9yI|hONvO5t@bd~38gSog| zrrt9^c2rzimKRB-zz5gn*3?vbXz!yszq-UN)`RF{MnOLIXG-f!>a6t@m8B5k#HvxD z{D+Xo-m>_|7x|EzXmF9M+HEGHN-cr43(23_@3qcX z-rxVW)W&%1IH_CGFFv)SPGi(TR7=&SYErehXk|cYCre>kouN#p#-bdee2K1Dol#;a zR_oGnD7mD>R9akC3^Wmc4DOb6o5rZILi)?F8LYN+99A}^X&ern$(m*~>ix?!iZb98 zsQ(Z`si&c$5`URv1n%*D7>EF&S1 receiveTaskStatusAcs(@RequestBody String string) { + return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK); + } + + @PostMapping("/orderFinish") + @Log("ACS给WMS下发工单完成状态") + @ApiOperation("ACS给WMS下发工单完成状态") + public ResponseEntity orderFinish(@RequestBody String string) { + return new ResponseEntity<>(acsToWmsService.orderFinish(string), HttpStatus.OK); + } + + @PostMapping("/apply") + @Log("申请任务") + @ApiOperation("申请任务") + public ResponseEntity apply(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(acsToWmsService.apply(whereJson), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java b/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java new file mode 100644 index 000000000..4b72d308b --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java @@ -0,0 +1,82 @@ + +package org.nl.wms.ext.acs.rest; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author ludj + * @date 2021-07-21 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "wms发送acs") +@RequestMapping("/api/wms/task") +@Slf4j +public class WmsToAcsController { + private final WmsToAcsService wmsToAcsService; + + @PostMapping + @Log("WMS给ACS发送任务") + @ApiOperation("WMS给ACS发送任务") + public ResponseEntity issueTaskToAcs(@RequestBody Map whereJson) { + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(whereJson.get("data"))); + return new ResponseEntity<>(wmsToAcsService.issueTaskToAcs(arr), HttpStatus.OK); + } + + @PostMapping("/cancel") + @Log("WMS主动取消ACS任务") + @ApiOperation("WMS主动取消ACS任务") + public ResponseEntity cancelToAcs(@RequestBody Map whereJson) { + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(whereJson.get("data"))); + return new ResponseEntity<>(wmsToAcsService.cancelToAcs(arr), HttpStatus.OK); + } + + @PostMapping("/updatePointStatus") + @Log("WMS更新ACS点位状态") + @ApiOperation("WMS更新ACS点位状态") + public ResponseEntity updatePointStatus(@RequestBody Map whereJson) { + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(whereJson.get("data"))); + return new ResponseEntity<>(wmsToAcsService.updatePointStatus(arr), HttpStatus.OK); + } + + @PostMapping("/order") + @Log("WMS开工向acs下发工单") + @ApiOperation("WMS开工向acs下发工单") + public ResponseEntity startWork(@RequestBody Map whereJson) { + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(whereJson.get("data"))); + return new ResponseEntity<>(wmsToAcsService.order(arr), HttpStatus.OK); + } + + @PostMapping("/orderStatusUpdate") + @Log("WMS向acs发送强制完成") + @ApiOperation("WMS强制完成向acs发送强制完成") + public ResponseEntity orderStatusUpdate(@RequestBody Map whereJson) { + JSONArray arr = JSONArray.parseArray(JSON.toJSONString(whereJson.get("data"))); + return new ResponseEntity<>(wmsToAcsService.orderStatusUpdate(arr), HttpStatus.OK); + } + + @PostMapping("/querydevice") + @Log("WMS向acs发送获取点位状态") + @ApiOperation("WMS向acs发送获取点位状态") + public ResponseEntity getPointStatus(@RequestBody JSONArray whereJson) { + return new ResponseEntity<>(wmsToAcsService.getPointStatus(whereJson), HttpStatus.OK); + } + + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java new file mode 100644 index 000000000..a82f446d2 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -0,0 +1,44 @@ +package org.nl.wms.ext.acs.service; + +import com.alibaba.fastjson.JSONObject; + +import java.util.Map; + +public interface AcsToWmsService { + + + /** + * ACS客户端--->WMS服务端 + * ACS向WMS反馈任务状态 + * + * @param string 条件 + * @return Map + */ + + Map receiveTaskStatusAcs(String string); + + /** + * ACS客户端--->WMS服务端 + * ACS向WMS反馈点位状态 + * @param jsonObject 条件 + * @return Map + */ + + Map receivePointStatusFromAcs(Map jsonObject); + + /** + * ACS给WMS下发工单强制完成状态 + * @param string + * @return + */ + Map orderFinish(String string); + + /** + * ACS客户端--->LMS服务端 + * 任务申请 + * + * @param whereJson 条件 + * @return JSONObject + */ + JSONObject apply(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java new file mode 100644 index 000000000..3735345de --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -0,0 +1,58 @@ +package org.nl.wms.ext.acs.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import java.util.Map; + +/** + * + */ +public interface WmsToAcsService { + /** + * WMS客户端--->ACS服务端 + * 下发任务 + * + * @param arr 条件 + * @return Map + */ + + Map issueTaskToAcs(JSONArray arr); + + /** + * WMS客户端--->ACS服务端 + * 取消任务 + * + * @param arr 条件 + * @return Map + */ + + Map cancelToAcs(JSONArray arr); + + /** + * 更新ACS点位 + * @param arr + * @return + */ + Map updatePointStatus(JSONArray arr); + + /** + * wms 开工向acs发送任务 + * @param arr + * @return + */ + Map order(JSONArray arr); + + /** + * wms工单强制完成向acs发送强制完成 + * @param arr + * @return + */ + Map orderStatusUpdate(JSONArray arr); + + /** + * 获取点位状态 + * @return + */ + JSONObject getPointStatus(JSONArray whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java new file mode 100644 index 000000000..ee67e4834 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -0,0 +1,549 @@ +package org.nl.wms.ext.acs.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.TaskService; +import org.nl.wms.sch.service.dto.TaskDto; +import org.nl.wms.sch.tasks.*; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +public class AcsToWmsServiceImpl implements AcsToWmsService { + private final TaskService taskService; + + /** + * task_uuid:任务标识 + * task_code:任务编码 + * task_status:1:执行中,2:完成 ,3:acs取消 + * + * @param string 条件 + * @returnzss + */ + @Override + public Map receiveTaskStatusAcs(String string) { + JSONArray array = JSONArray.parseArray(string); + //返回处理失败的任务 + JSONArray errArr = new JSONArray(); + for (int i = 0; i < array.size(); i++) { + JSONObject row = array.getJSONObject(i); + String task_uuid = row.getString("task_id"); + TaskDto taskDto = taskService.findById(task_uuid); + String processing_class = taskDto.getHandle_class(); + //1:执行中,2:完成 ,3:acs取消 + String acs_task_status = row.getString("task_status"); + String message = ""; + String status = ""; + if ("1".equals(acs_task_status)) { + status = TaskStatusEnum.EXECUTING.getCode(); + } + if ("2".equals(acs_task_status)) { + status = TaskStatusEnum.FINISHED.getCode(); + } + if ("3".equals(acs_task_status)) { + status = "0"; + } + // 任务处理类 + try { + Class clz = Class.forName(processing_class); + Object obj = clz.newInstance(); + // 调用每个任务类的forceFinishInst()强制结束方法 + Method m = obj.getClass().getDeclaredMethod("updateTaskStatus", JSONObject.class, String.class); + m.invoke(obj, row, status); + } catch (InvocationTargetException e) { + e.printStackTrace(); + //空指针 + if (ObjectUtil.isNull(e.getTargetException().getMessage())) { + message = e.getTargetException().toString(); + } else { + message = e.getTargetException().getMessage(); + } + log.info("任务状态更新失败:{}", message); + + JSONObject json = new JSONObject(); + json.put("task_uuid", task_uuid); + json.put("message", message); + errArr.add(json); + + } catch (Exception e) { + e.printStackTrace(); + message = e.getMessage(); + log.info("任务状态更新失败:{}", message); + + JSONObject json = new JSONObject(); + json.put("task_uuid", task_uuid); + json.put("message", message); + errArr.add(json); + + } + } + + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "任务状态反馈成功!"); + result.put("data", new JSONObject()); + result.put("errArr", errArr); + return result; + } + + @Override + public Map receivePointStatusFromAcs(Map jsonObject) { + return null; + } + + @Override + public Map orderFinish(String string) { + JSONObject orderJson = JSONObject.parseObject(string); + String ext_order_id = orderJson.getString("ext_order_id"); + // JSONArray array = JSONArray.parseArray(string); + String now = DateUtil.now(); + WQLObject wo = WQLObject.getWQLObject("MPS_BD_ProduceShiftOrder"); + JSONObject map = new JSONObject(); + map.put("produceorder_id", ext_order_id); + map.put("order_status", "04"); + map.put("update_optid", 1111111111); + map.put("device_id", ""); + map.put("update_optname", "acs"); + map.put("update_time", now); + map.put("realproduceend_date", now); + wo.update(map, "produceorder_id = '" + ext_order_id + "'"); + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "任务状态反馈成功!"); + return result; + } + + @Override + @Transactional + public JSONObject apply(JSONObject whereJson) { + String type = whereJson.getString("type"); + String point_code = whereJson.getString("point_code"); + String vehicle_num = whereJson.getString("vehicle_num"); + String vehicle_type = whereJson.getString("vehicle_type"); + String vehicle_code = whereJson.getString("vehicle_code"); + String qty = whereJson.getString("qty"); + + if (ObjectUtil.isEmpty(type)) throw new BadRequestException("类型不能为空"); + if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); + + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord");// 空载具作业记录表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");// 空载具作业记录表 + WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); // 区域出入库表 + WQLObject veQtyTab = WQLObject.getWQLObject("PDM_BI_vehicleQty"); // 托盘对应数量表 + + + /* + * 根据type判断是什么业务类型: + * 1.共挤线申请空盘 + * 2.共挤线满托入库 + * 3.油漆线申请空盘 + * 4.油漆线申请物料 + * 5.油漆线空盘入库 + * 6.一楼空盘入库 (有载具号) + * 7.油漆线->输送线 + * 8.豪凯自动线下料入库 + */ + JSONObject resuft = new JSONObject(); + try { + if (StrUtil.equals(type, "1")) { + // 1.共挤线申请空盘: 调用空托盘出库处理类创建任务 + if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); + + JSONObject param = new JSONObject(); + param.put("next_point_code", point_code); + param.put("qty", vehicle_num); + // 创建任务 + CallEmpVehicleTask taskBean = SpringContextHolder.getBean(CallEmpVehicleTask.class); + String task_id = taskBean.createTask(param); + + // 插入空载具作业记录表 + JSONObject jsonEmpParam = new JSONObject(); + jsonEmpParam.put("vehicle_qty", vehicle_num); + jsonEmpParam.put("task_id", task_id); + jsonEmpParam.put("io_type", "1"); + this.createEmp(jsonEmpParam); + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + + } else if (StrUtil.equals(type, "2")) { + // 2.共挤线满托入库: 调用物料入库处理类创建任务 + if (ObjectUtil.isEmpty(qty) || (StrUtil.equals(qty, "0"))) + throw new BadRequestException("物料数量不能为空或者为0"); + + JSONObject param = new JSONObject(); + param.put("start_point_code", point_code); + SendMaterialTask taskBean = SpringContextHolder.getBean(SendMaterialTask.class); + String task_id = taskBean.createTask(param); + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + // 插入区域出入库表 + param.put("next_point_code", jsonTask.getString("next_point_code")); + param.put("qty", qty); + param.put("task_id", task_id); + param.put("io_type", "0"); + JSONObject json = this.inCreateRegion(param); + // 回显任务载具类型 + jsonTask.put("vehicle_type", json.getString("vehicle_type")); + taskTab.update(jsonTask); + + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } else if (StrUtil.equals(type, "3")) { + // 3.油漆线申请空盘: 调用空托盘出库处理类创建任务 + if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); + + JSONObject param = new JSONObject(); + param.put("next_point_code", point_code); + param.put("qty", vehicle_num); + // 创建任务 + CallEmpVehicleTask taskBean = SpringContextHolder.getBean(CallEmpVehicleTask.class); + String task_id = taskBean.createTask(param); + + // 插入空载具作业记录表 + JSONObject jsonEmpParam = new JSONObject(); + jsonEmpParam.put("vehicle_qty", vehicle_num); + jsonEmpParam.put("task_id", task_id); + jsonEmpParam.put("io_type", "1"); + this.createEmp(jsonEmpParam); + + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } else if (StrUtil.equals(type, "4")) { + // 4.油漆线申请物料: 调用物料出库库处理类创建任务 + JSONObject param = new JSONObject(); + param.put("next_point_code", point_code); + param.put("io_type", "1"); + // 插入区域出库单 + JSONObject json = this.outCreateRegion(param); + + param.put("vehicle_type", json.getString("vehicle_type")); + param.put("material_id", json.getString("material_id")); + param.put("create_mode", json.getString("create_mode")); + param.put("iostorinv_id", json.getString("iostorinv_id")); + // 创建任务 + CallMaterialTask taskBean = SpringContextHolder.getBean(CallMaterialTask.class); + String task_id = taskBean.createTask(param); + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + // 回显出库单:起始点位、起始区域、任务id + JSONObject jsonRegion = regionTab.query("iostorinv_id = '" + json.getString("iostorinv_id") + "'").uniqueResult(0); + jsonRegion.put("start_point_code", jsonTask.getString("start_point_code")); + Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("start_point_code")).getRegion_id(); + jsonRegion.put("start_region_id", String.valueOf(start_region_id)); + jsonRegion.put("task_id", Long.valueOf(task_id)); + regionTab.update(jsonRegion); + + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } else if (StrUtil.equals(type, "5")) { + // 5.油漆线空盘入库: 调用空托盘入库处理类创建任务 + if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); + + JSONObject param = new JSONObject(); + param.put("start_point_code", point_code); + param.put("qty", vehicle_num); + // 创建任务 + SendEmpVehicleTask taskBean = SpringContextHolder.getBean(SendEmpVehicleTask.class); + String task_id = taskBean.createTask(param); + + // 插入空载具作业记录表 + JSONObject jsonEmpParam = new JSONObject(); + jsonEmpParam.put("vehicle_qty", vehicle_num); + jsonEmpParam.put("task_id", task_id); + jsonEmpParam.put("io_type", "0"); + this.createEmp(jsonEmpParam); + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + + } else if (StrUtil.equals(type, "6")) { + // 6.一楼空盘入库 (有载具号): 调用空托盘入库处理类创建任务 + if (ObjectUtil.isEmpty(vehicle_code)) throw new BadRequestException("载具号不能为空"); + JSONObject param = new JSONObject(); + + // 查询载具号对应的数量 + JSONObject jsonVeQty = new JSONObject(); + if (ObjectUtil.isEmpty(qty)) { + jsonVeQty = veQtyTab.query("vehicle_code = '" + vehicle_code + "' and is_task = '0' order by create_time DESC").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonVeQty)) throw new BadRequestException("请先手持扫码"); + } else { + jsonVeQty.put("qty", qty); + } + + param.put("qty", jsonVeQty.getString("qty")); + param.put("start_point_code", point_code); + param.put("vehicle_code", vehicle_code); + // 创建任务 + SendEmpVehicleTask taskBean = SpringContextHolder.getBean(SendEmpVehicleTask.class); + String task_id = taskBean.createTask(param); + + // 插入空载具作业记录表 + JSONObject jsonEmpParam = new JSONObject(); + jsonEmpParam.put("vehicle_qty", jsonVeQty.getString("qty")); + jsonEmpParam.put("task_id", task_id); + jsonEmpParam.put("io_type", "0"); + this.createEmp(jsonEmpParam); + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + // 更新载具对应数量表 + jsonVeQty.put("is_task", "1"); + veQtyTab.update(jsonVeQty); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } else if (StrUtil.equals(type, "7")) { + JSONObject param = new JSONObject(); + param.put("start_point_code", point_code); + // 1.生成起点确定的任务 + SpringContextHolder.getBean(PointToPointTask.class).createTask(param); + + resuft.put("status", "200"); + resuft.put("message", ""); + } else if (StrUtil.equals(type, "8")) { + // 8.豪凯自动线下料入库 + JSONObject param = new JSONObject(); + param.put("start_point_code", point_code); + SendMaterialTask taskBean = SpringContextHolder.getBean(SendMaterialTask.class); + String task_id = taskBean.createTask(param); + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + // 插入区域出入库表 + param.put("next_point_code", jsonTask.getString("next_point_code")); + if (ObjectUtil.isEmpty(qty)) { + param.put("qty", "1"); // 为空先写死1 + } else { + param.put("qty", qty); + } + param.put("task_id", task_id); + param.put("io_type", "0"); + JSONObject json = this.inCreateRegion(param); + // 回显任务载具类型 + jsonTask.put("vehicle_type", json.getString("vehicle_type")); + taskTab.update(jsonTask); + + // 下发 + JSONObject jsonObject = taskBean.renotifyAcs(task_id); + if (StrUtil.equals(jsonObject.getString("status"), "200")) { + // 成功返回 更新任务状态 + resuft.put("status", "200"); + resuft.put("message", ""); + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } else { + throw new BadRequestException(jsonObject.getString("message")); + } + } + } catch (Exception e) { + resuft.put("status", ((BadRequestException) e).getStatus()); + resuft.put("message", e.getMessage()); + } + return resuft; + } + + @Transactional + public void createEmp(JSONObject json) { + String vehicle_qty = json.getString("vehicle_qty"); + String task_id = json.getString("task_id"); + String io_type = json.getString("io_type"); + + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord");// 空载具作业记录表 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");// 空载具作业记录表 + + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + JSONObject jsonEmp = new JSONObject(); + jsonEmp.put("record_uuid", IdUtil.getSnowflake(1, 1).nextId()); + jsonEmp.put("bill_code", CodeUtil.getNewCode("KZJ_BILL_CODE")); + jsonEmp.put("io_type", io_type); + jsonEmp.put("bill_status", "20"); + jsonEmp.put("vehicle_qty", vehicle_qty); + jsonEmp.put("start_point_code", jsonTask.getString("start_point_code")); + Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("start_point_code")).getRegion_id(); + jsonEmp.put("start_region_id", start_region_id); + jsonEmp.put("next_point_code", jsonTask.getString("next_point_code")); + Long next_region_id = SpringContextHolder.getBean(PointService.class).findByCode(jsonTask.getString("next_point_code")).getRegion_id(); + jsonEmp.put("end_region_id", next_region_id); + jsonEmp.put("task_uuid", task_id); + jsonEmp.put("create_id", SecurityUtils.getCurrentUserId()); + jsonEmp.put("create_name", SecurityUtils.getCurrentNickName()); + jsonEmp.put("create_time", DateUtil.now()); + empTab.insert(jsonEmp); + } + + @Transactional + public JSONObject inCreateRegion(JSONObject json) { + String start_point_code = json.getString("start_point_code"); + String next_point_code = json.getString("next_point_code"); + String qty = json.getString("qty"); + Long task_id = json.getLongValue("task_id"); + String io_type = json.getString("io_type"); + + WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); + WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + + + JSONObject jsonRegion = new JSONObject(); + jsonRegion.put("iostorinv_id", IdUtil.getSnowflake(1, 1).nextId()); + jsonRegion.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + jsonRegion.put("io_type", io_type); + jsonRegion.put("bill_status", "20"); + // 根据起点点位找到起点设备,根据设备找到对应工单, 根据工单找到对应物料及托盘类型 + String device_code = start_point_code.substring(0, start_point_code.indexOf("_")); + + DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); + DeviceDto deviceDto = deviceBean.findByCode(device_code); + if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); + JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); + + jsonRegion.put("material_id", jsonOrder.getString("material_id")); + jsonRegion.put("qty", qty); + JSONObject jsonMater = materTab.query("material_id ='" + jsonOrder.getString("material_id") + "'").uniqueResult(0); + jsonRegion.put("qty_unit_id", jsonMater.getString("base_unit_id")); + + jsonRegion.put("start_point_code", start_point_code); + Long start_region_id = SpringContextHolder.getBean(PointService.class).findByCode(start_point_code).getRegion_id(); + jsonRegion.put("start_region_id", String.valueOf(start_region_id)); + jsonRegion.put("end_point_code", next_point_code); + Long end_region_id = SpringContextHolder.getBean(PointService.class).findByCode(next_point_code).getRegion_id(); + jsonRegion.put("end_region_id", String.valueOf(end_region_id)); + + jsonRegion.put("create_mode", "02"); + jsonRegion.put("task_id", task_id); + jsonRegion.put("create_id", SecurityUtils.getCurrentUserId()); + jsonRegion.put("create_name", SecurityUtils.getCurrentNickName()); + jsonRegion.put("create_time", DateUtil.now()); + regionTab.insert(jsonRegion); + + JSONObject resuft = new JSONObject(); + resuft.put("vehicle_type", jsonOrder.getString("vehicle_type")); + resuft.put("material_id", jsonRegion.getString("material_id")); + resuft.put("create_mode", jsonRegion.getString("create_mode")); + return resuft; + } + + @Transactional + public JSONObject outCreateRegion(JSONObject json) { + String next_point_code = json.getString("next_point_code"); + String io_type = json.getString("io_type"); + + WQLObject regionTab = WQLObject.getWQLObject("ST_IVT_regionIO"); + WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + + JSONObject jsonRegion = new JSONObject(); + jsonRegion.put("iostorinv_id", IdUtil.getSnowflake(1, 1).nextId()); + jsonRegion.put("bill_code", CodeUtil.getNewCode("OUT_STORE_CODE")); + jsonRegion.put("io_type", io_type); + jsonRegion.put("bill_status", "20"); + // 根据起点点位找到起点设备,根据设备找到对应工单, 根据工单找到对应物料及托盘类型 + String device_code = next_point_code.substring(0, next_point_code.indexOf("_")); + + DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); + DeviceDto deviceDto = deviceBean.findByCode(device_code); + if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); + JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); + + jsonRegion.put("material_id", jsonOrder.getString("material_id")); + jsonRegion.put("qty", "100"); // 暂时先按照100 + JSONObject jsonMater = materTab.query("material_id ='" + jsonOrder.getString("material_id") + "'").uniqueResult(0); + jsonRegion.put("qty_unit_id", jsonMater.getString("base_unit_id")); + + jsonRegion.put("end_point_code", next_point_code); + Long end_region_id = SpringContextHolder.getBean(PointService.class).findByCode(next_point_code).getRegion_id(); + jsonRegion.put("end_region_id", String.valueOf(end_region_id)); + + jsonRegion.put("create_mode", "02"); + jsonRegion.put("create_id", SecurityUtils.getCurrentUserId()); + jsonRegion.put("create_name", SecurityUtils.getCurrentNickName()); + jsonRegion.put("create_time", DateUtil.now()); + regionTab.insert(jsonRegion); + + // 需回显起始点位、起始区域、任务id + JSONObject resuft = new JSONObject(); + resuft.put("iostorinv_id", jsonRegion.getString("iostorinv_id")); + resuft.put("vehicle_type", jsonOrder.getString("vehicle_type")); + resuft.put("create_mode", jsonRegion.getString("create_mode")); + resuft.put("material_id", jsonOrder.getString("material_id")); + return resuft; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java new file mode 100644 index 000000000..9c28278bb --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -0,0 +1,57 @@ +package org.nl.wms.ext.acs.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.sch.AcsUtil; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +@RequiredArgsConstructor +@Slf4j +public class WmsToAcsServiceImpl implements WmsToAcsService { + @Override + public Map issueTaskToAcs(JSONArray arr) { + String api = "api/wms/task"; + return AcsUtil.notifyAcs(api, arr); + } + + @Override + public Map cancelToAcs(JSONArray arr) { + String api = "api/wms/cancelTask"; + return AcsUtil.notifyAcs(api, arr); + } + + @Override + public Map updatePointStatus(JSONArray arr) { + JSONObject param = new JSONObject(); + param.put("point_code", ""); + //0,1,2 + param.put("has_goods", ""); + String api = "api/wms/updateDeviceGoods"; + return AcsUtil.notifyAcs(api, arr); + } + + @Override + public Map order(JSONArray arr) { + String api = "api/wms/order"; + return AcsUtil.notifyAcs(api, arr); + } + + @Override + public Map orderStatusUpdate(JSONArray arr) { + String api = "api/wms/orderStatusUpdate"; + return AcsUtil.notifyAcs(api, arr); + } + + @Override + public JSONObject getPointStatus(JSONArray whereJson) { + String api = "api/wms/querydevice"; + return AcsUtil.notifyAcs(api, whereJson); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java b/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java new file mode 100644 index 000000000..e250bc8f1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java @@ -0,0 +1,140 @@ +package org.nl.wms.ext.auto; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.sch.tasks.PointToPointTask; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class AutoQueryTask { + + private final WmsToAcsService wmsToAcsService; + + @Transactional + public void run() { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + + PointToPointTask pointTaskBean = SpringContextHolder.getBean(PointToPointTask.class); + + // 1.查找起点为油漆线 物料下料位的任务 + JSONArray taskArr = WQL.getWO("AUTO_QUERYTASK").addParam("flag", "1").process().getResultJSONArray(0); + + for (int i = 0; i < taskArr.size(); i++) { + JSONObject jsonTask = taskArr.getJSONObject(i); + /* + * 1.查找输送线有没有空位 输送线1对1关系 调用获取点位状态接口 + * 2.判断有空位的输送线是否有任务:起点和终点都要判断 + * 输送线点位:SSX01A1 - SSX01A2 ,SSX02A1 - SSX02A2 + */ + // 2.查找输送线空位,调用获取点位状态接口 + JSONArray paramArr = new JSONArray(); + + JSONObject pointA1 = new JSONObject(); + pointA1.put("device_code", "SSX01A1"); + paramArr.add(pointA1); + + JSONObject pointA2 = new JSONObject(); + pointA2.put("device_code", "SSX01A2"); + paramArr.add(pointA2); + + JSONObject pointB1 = new JSONObject(); + pointB1.put("device_code", "SSX02A1"); + paramArr.add(pointB1); + + JSONObject pointB2 = new JSONObject(); + pointB2.put("device_code", "SSX02A2"); + paramArr.add(pointB2); + + JSONObject result = wmsToAcsService.getPointStatus(paramArr); + + if (StrUtil.equals(result.getString("status"), "200")) { + JSONObject jsonPointAfter = new JSONObject(); // 处理后的json + + JSONArray dataArr = result.getJSONArray("data"); + // 3.处理返回的数据,处理后为json,key为点位编码,value为状态 + for (int j = 0; j < dataArr.size(); j++) { + JSONObject jsonObject = dataArr.getJSONObject(j); + + String device_code = jsonObject.getString("device_code"); + switch (device_code) { + case "SSX01A1" : + jsonPointAfter.put("SSX01A1",jsonObject.getString("move")); + break; + case "SSX01A2" : + jsonPointAfter.put("SSX01A2",jsonObject.getString("move")); + break; + case "SSX02A1" : + jsonPointAfter.put("SSX02A1",jsonObject.getString("move")); + break; + case "SSX02A2" : + jsonPointAfter.put("SSX02A2",jsonObject.getString("move")); + break; + } + } + JSONObject map = new JSONObject(); + // 4.1判断SSX01A1 、 SSX01A2是否是空位 无任务 + if (StrUtil.equals(jsonPointAfter.getString("SSX01A1"), "0") && StrUtil.equals(jsonPointAfter.getString("SSX01A2"), "0")) { + // 4.2如果都是空位 则判断是否有正在进行的任务 + map.put("flag", "2"); + map.put("start_point_code", "('SSX01A1','SSX01A2')"); + // 查找起点是否有任务 + JSONArray is_stara = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); + // 查询终点是否有任务 + map.put("flag", "3"); + map.put("end_point_code", "('SSX01A1','SSX01A2')"); + JSONArray is_end = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); + + if (ObjectUtil.isEmpty(is_stara) && ObjectUtil.isEmpty(is_end)) { + // 4.3.更新任务终点点位 + jsonTask.put("next_point_code", "SSX01A1"); + taskTab.update(jsonTask); + // 4.4.下发ACS + JSONObject jsonResultAcs = pointTaskBean.renotifyAcs(jsonTask.getString("task_id")); + + if (StrUtil.equals(jsonResultAcs.getString("status"), "200")) { + // 4.5.下发成功、更新任务状态 + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } + // 5.1判断SSX02A1 、 SSX02A2是否是空位 无任务 + } else if (StrUtil.equals(jsonPointAfter.getString("SSX02A1"), "0") && StrUtil.equals(jsonPointAfter.getString("SSX02A2"), "0")) { + // 5.2如果都是空位 则判断是否有正在进行的任务 + map.put("flag", "2"); + map.put("start_point_code", "('SSX02A1','SSX02A2')"); + // 查找起点是否有任务 + JSONArray is_stara2 = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); + // 查询终点是否有任务 + map.put("flag", "3"); + map.put("end_point_code", "('SSX02A1','SSX02A2')"); + JSONArray is_end2 = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); + + if (ObjectUtil.isEmpty(is_stara2) && ObjectUtil.isEmpty(is_end2)) { + // 5.3.更新任务终点点位 + jsonTask.put("next_point_code", "SSX02A1"); + taskTab.update(jsonTask); + // 5.4.下发ACS + JSONObject jsonResultAcs = pointTaskBean.renotifyAcs(jsonTask.getString("task_id")); + + if (StrUtil.equals(jsonResultAcs.getString("status"), "200")) { + // 4.5.下发成功、更新任务状态 + jsonTask.put("task_status", "05"); + taskTab.update(jsonTask); + } + } + } + } + } + } + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java b/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java new file mode 100644 index 000000000..86d1cefbc --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java @@ -0,0 +1,39 @@ +package org.nl.wms.ext.crm.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.ext.crm.service.CrmToLmsService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "crm发送lms") +@RequestMapping("/api/crm") +@Slf4j +public class CrmToLmsController { + private final CrmToLmsService crmToLmsService; + + @PostMapping("/getCustomerInfo") + @Log("CRM给LMS推送客户信息") + @ApiOperation("CRM给LMS推送客户信息") + public ResponseEntity momRollFoilWeighing(@RequestBody JSONObject jo) { + return new ResponseEntity<>(crmToLmsService.getCustomerInfo(jo), HttpStatus.OK); + } + + @PostMapping("/getCPIvtInfo") + @Log("CRM获取LMS成品库存信息") + @ApiOperation("CRM获取LMS成品库存信息") + public ResponseEntity getCPIvtInfo(@RequestBody JSONObject jo) { + return new ResponseEntity<>(crmToLmsService.getCPIvtInfo(jo), HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/CrmToLmsService.java b/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/CrmToLmsService.java new file mode 100644 index 000000000..12d3d69b0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/CrmToLmsService.java @@ -0,0 +1,15 @@ +package org.nl.wms.ext.crm.service; + +import com.alibaba.fastjson.JSONObject; + +public interface CrmToLmsService { + /* + * 获取客户信息 + * */ + JSONObject getCustomerInfo(JSONObject jo); + + /* + * CRM获取LMS成品库存信息 + * */ + JSONObject getCPIvtInfo(JSONObject jo); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/impl/CrmToLmsServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/impl/CrmToLmsServiceImpl.java new file mode 100644 index 000000000..640db5f33 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/impl/CrmToLmsServiceImpl.java @@ -0,0 +1,101 @@ +package org.nl.wms.ext.crm.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.crm.service.CrmToLmsService; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class CrmToLmsServiceImpl implements CrmToLmsService { + + @Override + public JSONObject getCustomerInfo(JSONObject row) { + + String customer_name = row.getString("CustomerName"); + String description = row.getString("Description"); + String company = row.getString("Company"); + String country = row.getString("Country"); + String state = row.getString("State"); + String city = row.getString("City"); + String address_line1 = row.getString("AddressLine1"); + String zip_code = row.getString("ZipCode"); + String phone_number = row.getString("PhoneNumber"); + String fax_number = row.getString("FaxNumber"); + String web_site = row.getString("WebSite"); + String notes = row.getString("Notes"); + + JSONObject jo = new JSONObject(); + jo.put("id", IdUtil.getSnowflake(1, 1).nextId()); + jo.put("customer_name", customer_name); + jo.put("description", description); + jo.put("company", company); + jo.put("country", country); + jo.put("state", state); + jo.put("city", city); + jo.put("address_line1", address_line1); + jo.put("zip_code", zip_code); + jo.put("phone_number", phone_number); + jo.put("fax_number", fax_number); + jo.put("web_site", web_site); + jo.put("notes", notes); + WQLObject.getWQLObject("MD_CS_CustomerBaseProc").insert(jo); + log.info(jo.toString()); + + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + return result; + } + + @Override + public JSONObject getCPIvtInfo(JSONObject jo) { + log.info("getCPIvtInfo输入参数为:----------------------" + jo.toString()); + /*String material_code = jo.getString("material_code"); + String material_name = jo.getString("material_name"); + String mfgordername = jo.getString("mfgordername"); + String customername = jo.getString("customername"); + String customerdescription = jo.getString("customerdescription"); + + HashMap map = new HashMap<>(); + map.put("")*/ + //将查询条件带入,查询LMS成品库库存信息 + //JSONArray rows = WQL.getWO("").addParamMap(jo).addParam("flag","1").process().getResultJSONArray(0); + + JSONArray rows = new JSONArray(); + + JSONObject row = new JSONObject(); + row.put("material_code", "物料编码"); + row.put("material_name", "物料名称"); + row.put("pcsn", "子卷批次"); + row.put("mfgordername", "销售订单及行号"); + row.put("customername", "客户编号"); + row.put("customerdescription", "客户名称"); + row.put("dateoffginbound", "入库日期"); + row.put("packageboxsn", "木箱唯一码"); + row.put("width", "产品规格(幅宽)"); + row.put("thickness", "产品厚度"); + row.put("netweight", "净重"); + row.put("length", "长度"); + row.put("warehouse_code", "仓库编码"); + row.put("dateofproduction", "生产日期"); + row.put("unplanproductproperty", "物性"); + + rows.add(row); + rows.add(row); + + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", rows.size()); + result.put("RTDAT", rows); + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/LmsToMesController.java b/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/LmsToMesController.java new file mode 100644 index 000000000..fac709719 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/LmsToMesController.java @@ -0,0 +1,87 @@ +package org.nl.wms.ext.mes.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.ext.mes.service.LmsToMesService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "lms发送mes") +@RequestMapping("/api/lms") +@Slf4j +public class LmsToMesController { + private final LmsToMesService lmsToMesService; + + @PostMapping("/momRollFoilWeighing") + @Log("LMS的PDA操作AGV下卷,AGV称重完成后AGV称重信息发送MES") + @ApiOperation("LMS的PDA操作AGV下卷,AGV称重完成后AGV称重信息发送MES") + public ResponseEntity momRollFoilWeighing(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.momRollFoilWeighing(jo), HttpStatus.OK); + } + + @PostMapping("/momRollBakeInBound") + @Log("智能桁架将母卷调进烘箱完成,智能物流发送MES") + @ApiOperation("智能桁架将母卷调进烘箱完成,智能物流发送MES") + public ResponseEntity momRollBakeInBound(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.momRollBakeInBound(jo), HttpStatus.OK); + } + + @PostMapping("/momRollBakeOutBound") + @Log("母卷出烘箱信息智能物流传MES") + @ApiOperation("母卷出烘箱信息智能物流传MES") + public ResponseEntity momRollBakeOutBound(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.momRollBakeOutBound(jo), HttpStatus.OK); + } + + @PostMapping("/momRollSemiFGInboundComplete") + @Log("AGV将母卷从烘箱暂存位转移至暂存区,传MES") + @ApiOperation("AGV将母卷从烘箱暂存位转移至暂存区,传MES") + public ResponseEntity momRollSemiFGInboundComplete(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.momRollSemiFGInboundComplete(jo), HttpStatus.OK); + } + + @PostMapping("/airSwellWithPaperTubeAssComplete") + @Log("套轴任务完成,上架暂存区,智能物流PDA选任务、扫轴、扫料架货位,传MES套轴任务完成信息") + @ApiOperation("套轴任务完成,上架暂存区,智能物流PDA选任务、扫轴、扫料架货位,传MES套轴任务完成信息") + public ResponseEntity airSwellWithPaperTubeAssComplete(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.airSwellWithPaperTubeAssComplete(jo), HttpStatus.OK); + } + + @PostMapping("/cutPlanMomRollDeliveryComplete") + @Log("LMS提前做/MES呼叫后做,立库子卷出库完成/母卷配送至分切机暂存位,AGV传MES 母卷配送完成信息/立库子卷出库完成信息") + @ApiOperation("LMS提前做/MES呼叫后做,立库子卷出库完成/母卷配送至分切机暂存位,AGV传MES 母卷配送完成信息/立库子卷出库完成信息") + public ResponseEntity cutPlanMomRollDeliveryComplete(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.cutPlanMomRollDeliveryComplete(jo), HttpStatus.OK); + } + + @PostMapping("/airSwellWithPaperTubeAssArrival") + @Log("提前将/按呼叫指令配送(扫码校验配送先后顺序)气涨轴套装运输到分切机,智能物流传MES 到位信息") + @ApiOperation("提前将/按呼叫指令配送(扫码校验配送先后顺序)气涨轴套装运输到分切机,智能物流传MES 到位信息") + public ResponseEntity airSwellWithPaperTubeAssArrival(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.airSwellWithPaperTubeAssArrival(jo), HttpStatus.OK); + } + + @PostMapping("/childRollFGInboundComplete") + @Log("入库完成,LMS回传MES,MES成品入库Move Out") + @ApiOperation("入库完成,LMS回传MES,MES成品入库Move Out") + public ResponseEntity childRollFGInboundComplete(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.childRollFGInboundComplete(jo), HttpStatus.OK); + } + + @PostMapping("/childRollFGOutboundComplete") + @Log("发货完成,LMS同步MES子卷及包装箱状态,MES更新信息") + @ApiOperation("发货完成,LMS同步MES子卷及包装箱状态,MES更新信息") + public ResponseEntity childRollFGOutboundComplete(@RequestBody JSONObject jo) { + return new ResponseEntity<>(lmsToMesService.childRollFGOutboundComplete(jo), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java b/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java new file mode 100644 index 000000000..a9103e241 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java @@ -0,0 +1,98 @@ +package org.nl.wms.ext.mes.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.ext.mes.service.MesToLmsService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "mes发送lms") +@RequestMapping("/api/mes") +@Slf4j +public class MesToLmsController { + private final MesToLmsService mesToLmsService; + + @PostMapping("/momRollFoilStart") + @Log("母卷批次创建信息发送智能物流(MES生箔工序Move In)") + @ApiOperation("母卷批次创建信息发送智能物流(MES生箔工序Move In)") + public ResponseEntity momRollFoilStart(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.momRollFoilStart(jo), HttpStatus.OK); + } + + @PostMapping("momRollFoilWeighing") + @Log("MES获取AGV称重信息") + @ApiOperation("MES获取AGV称重信息") + public ResponseEntity momRollFoilWeighing(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.momRollFoilWeighing(jo), HttpStatus.OK); + } + + @PostMapping("/momRollFoilComplete") + @Log("MES执行下卷动作告诉LMS") + @ApiOperation("MES执行下卷动作告诉LMS") + public ResponseEntity momRollFoilComplete(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.momRollFoilComplete(jo), HttpStatus.OK); + } + + @PostMapping("/momRollBakeNextSpecTransfer") + @Log("MES下达烘箱温度和时间配方给智能物流(MES 包装防护工序Move Out)") + @ApiOperation("MES下达烘箱温度和时间配方给智能物流(MES 包装防护工序Move Out)") + public ResponseEntity momRollBakeNextSpecTransfer(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.momRollBakeNextSpecTransfer(jo), HttpStatus.OK); + } + + @PostMapping("/cutPlanTransfer") + @Log("分切包装段:分切计划(单表,包含母卷/改制子卷-包装箱号、空包装箱物料、纸筒/FRP管)MES下发智能物流") + @ApiOperation("分切包装段:分切计划(单表,包含母卷/改制子卷-包装箱号、空包装箱物料、纸筒/FRP管)MES下发智能物流") + public ResponseEntity cutPlanTransfer(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.cutPlanTransfer(jo), HttpStatus.OK); + } + + @PostMapping("/callNextAssAndMomRoll") + @Log("分切即将完成,呼叫配送下一个母卷/改制子卷,MES传智能物流") + @ApiOperation("分切即将完成,呼叫配送下一个母卷/改制子卷,MES传智能物流") + public ResponseEntity callNextAssAndMomRoll(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.callNextAssAndMomRoll(jo), HttpStatus.OK); + } + + @PostMapping("/childRollCutStartComp") + @Log("当母卷开始分切时,MES系统会将对应的子卷进站信息发送给只能物流系统,一方面物流系统可以预估下个母卷的送达时间,也可以闭环期分切计划指令") + @ApiOperation("当母卷开始分切时,MES系统会将对应的子卷进站信息发送给只能物流系统,一方面物流系统可以预估下个母卷的送达时间,也可以闭环期分切计划指令") + public ResponseEntity childRollCutStartComp(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.childRollCutStartComp(jo), HttpStatus.OK); + } + + @PostMapping("/childRollPackComplete") + @Log("包装完成,传智能物流包装箱与子卷关系及子卷属性值,LMS执行入库") + @ApiOperation("包装完成,传智能物流包装箱与子卷关系及子卷属性值,LMS执行入库") + public ResponseEntity childRollPackComplete(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.childRollPackComplete(jo), HttpStatus.OK); + } + + @PostMapping("/inventoryTransferInfoSync") + @Log("转单指令在MES平台查看后,更新信息,发送LMS(是否拆包、更新后的入库日期、是否更换外包装箱标签),LMS重打子卷标签、包装箱外标签") + @ApiOperation("转单指令在MES平台查看后,更新信息,发送LMS(是否拆包、更新后的入库日期、是否更换外包装箱标签),LMS重打子卷标签、包装箱外标签") + public ResponseEntity inventoryTransferInfoSync(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.inventoryTransferInfoSync(jo), HttpStatus.OK); + } + + @PostMapping("/childRollInfoUpdate") + @Log("子卷信息更新:计划外需求有可能入库完成后,ERP才回传计划外需求SalesOrder") + @ApiOperation("子卷信息更新:计划外需求有可能入库完成后,ERP才回传计划外需求SalesOrder") + public ResponseEntity childRollInfoUpdate(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.childRollInfoUpdate(jo), HttpStatus.OK); + } + + + + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/LmsToMesService.java b/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/LmsToMesService.java new file mode 100644 index 000000000..6dd002cb2 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/LmsToMesService.java @@ -0,0 +1,90 @@ +package org.nl.wms.ext.mes.service; + +import com.alibaba.fastjson.JSONObject; + +public interface LmsToMesService { + /** + * LMS的PDA操作AGV下卷,AGV称重完成后AGV称重信息发送MES + * 参数:iContainerName 母卷号 + * iResourceName 机台编码 + * iWeigh 重量(KG) + * iWeighDate 称重时间 + */ + JSONObject momRollFoilWeighing(JSONObject param); + + /** + * 智能桁架将母卷调进烘箱完成,智能物流发送MES + * 参数:iContainerName 母卷号 + * iResourceName 烘箱机台编码 + * iMoveInDate 入烘箱时间(yyyy-MM-dd HH:mm:ss) + */ + JSONObject momRollBakeInBound(JSONObject param); + + /** + * AGV将母卷从烘箱暂存位转移至暂存区,传MES + * 参数:iContainerName 母卷号 + * iResourceName 烘箱机台编码 + * iMoveOutDate 出烘箱时间(yyyy-MM-dd HH:mm:ss) + * iActualBakingTemperature 实际烘烤温度 + * iActualBakingTimer 实际烘烤时间(yyyy-MM-dd HH:mm:ss) + */ + JSONObject momRollBakeOutBound(JSONObject param); + + /** + * AGV将母卷从烘箱暂存位转移至暂存区,传MES + * 参数:iContainerName 母卷号 + * iArrivalTime 半成品入库时间(yyyy-MM-dd HH:mm:ss) + * iWarehouse 半成品仓库 + */ + JSONObject momRollSemiFGInboundComplete(JSONObject param); + + /** + * 套轴任务完成,上架暂存区,智能物流PDA选任务、扫轴、扫料架货位,传MES套轴任务完成信息 + * 参数:ContainerName 子卷号 + * isSourceRollDeliveryComplete 母卷/立库是否配送完成 + * isAirSwellAssComplete 气涨轴是否套轴完成 + * isAirSwellDeliveryComplete 气涨轴是否配送到位 + */ + JSONObject airSwellWithPaperTubeAssComplete(JSONObject param); + + /** + * LMS提前做/MES呼叫后做,立库子卷出库完成/母卷配送至分切机暂存位,AGV传MES 母卷配送完成信息/立库子卷出库完成信息 + * 参数:ContainerName 子卷号 + * isSourceRollDeliveryComplete 母卷/立库是否配送完成 + * PackageBoxSN 木箱号 + * isAirSwellAssComplete 气涨轴是否套轴完成 + * isAirSwellDeliveryComplete 气涨轴是否配送到位 + */ + JSONObject cutPlanMomRollDeliveryComplete(JSONObject param); + + /** + * 提前将/按呼叫指令配送(扫码校验配送先后顺序)气涨轴套装运输到分切机,智能物流传MES 到位信息 + * 参数: + * ContainerName 子卷号 + * isSourceRollDeliveryComplete 母卷/立库是否配送完成 + * isAirSwellAssComplete 气涨轴是否套轴完成 + * isAirSwellDeliveryComplete 气涨轴是否配送到位 + */ + JSONObject airSwellWithPaperTubeAssArrival(JSONObject param); + + /** + * 入库完成,LMS回传MES,MES成品入库Move Out + * 参数: + * PackageBoxSN 包装箱号 + * Spec 入库工序 + * Warehouse 仓库 + * ArrivalDate 入库时间 + * User 入库人 + */ + JSONObject childRollFGInboundComplete(JSONObject param); + + /** + * 发货完成,LMS同步MES子卷及包装箱状态,MES更新信息 + * 参数: + * OutboundOrderNum 出库单号 + * OutboundUser 出库人 + * OutboundTime 出库时间 + */ + JSONObject childRollFGOutboundComplete(JSONObject param); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java b/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java new file mode 100644 index 000000000..ebdadf3d8 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java @@ -0,0 +1,55 @@ +package org.nl.wms.ext.mes.service; + +import com.alibaba.fastjson.JSONObject; + +public interface MesToLmsService { + /** + * 母卷批次创建信息发送智能物流(MES生箔工序Move In) + */ + JSONObject momRollFoilStart(JSONObject param); + + /** + * MES获取AGV称重信息 + */ + JSONObject momRollFoilWeighing(JSONObject param); + + /** + * MES执行下卷动作告诉LMS + */ + JSONObject momRollFoilComplete(JSONObject param); + + /** + * MES下达烘箱温度和时间配方给智能物流(MES 包装防护工序Move Out) + */ + JSONObject momRollBakeNextSpecTransfer(JSONObject param); + + /** + * 分切包装段:分切计划(单表,包含母卷/改制子卷-包装箱号、空包装箱物料、纸筒/FRP管)MES下发智能物流 + */ + JSONObject cutPlanTransfer(JSONObject param); + + /** + * 分切即将完成,呼叫配送下一个母卷/改制子卷,MES传智能物流 + */ + JSONObject callNextAssAndMomRoll(JSONObject param); + + /** + * 当母卷开始分切时,MES系统会将对应的子卷进站信息发送给只能物流系统,一方面物流系统可以预估下个母卷的送达时间,也可以闭环期分切计划指令 + */ + JSONObject childRollCutStartComp(JSONObject param); + + /** + * 包装完成,传智能物流包装箱与子卷关系及子卷属性值,LMS执行入库 + */ + JSONObject childRollPackComplete(JSONObject param); + + /** + * 转单指令在MES平台查看后,更新信息,发送LMS(是否拆包、更新后的入库日期、是否更换外包装箱标签),LMS重打子卷标签、包装箱外标签 + */ + JSONObject inventoryTransferInfoSync(JSONObject param); + + /** + * 子卷信息更新:计划外需求有可能入库完成后,ERP才回传计划外需求SalesOrder + */ + JSONObject childRollInfoUpdate(JSONObject param); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java new file mode 100644 index 000000000..deda86c29 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java @@ -0,0 +1,428 @@ +package org.nl.wms.ext.mes.service.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.system.service.impl.ParamServiceImpl; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.mes.service.LmsToMesService; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +/** + * LMS系统为客户端,MES为服务端 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class LmsToMesServiceImpl implements LmsToMesService { + /** + * LMS的PDA操作AGV下卷,AGV称重完成后AGV称重信息发送MES + * + * @return + */ + @Override + public JSONObject momRollFoilWeighing(JSONObject param) { + log.info("momRollFoilWeighing接口输入参数为:-------------------"+param); + System.out.println("momRollFoilWeighing接口输入参数为:-------------------"+param); + + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = ""; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(list)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("momRollFoilWeighing接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + + /** + * 智能桁架将母卷调进烘箱完成,智能物流发送MES + * + * @return + */ + @Override + public JSONObject momRollBakeInBound(JSONObject param) { + log.info("momRollBakeInBound接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = "CamstarApi/MomRollBakeInBound"; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("momRollBakeInBound接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + + /** + * 母卷出烘箱信息智能物流传MES + * + * @return + */ + @Override + public JSONObject momRollBakeOutBound(JSONObject param) { + log.info("momRollBakeOutBound接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = "CamstarApi/MomRollBakeOutBound"; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("momRollBakeOutBound接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + + /** + * AGV将母卷从烘箱暂存位转移至暂存区,传MES + * + * @return + */ + @Override + public JSONObject momRollSemiFGInboundComplete(JSONObject param) { + log.info("momRollSemiFGInboundComplete接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = "CamstarApi/MomRollSemiFGInboundComplete"; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("momRollSemiFGInboundComplete接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + + /** + * 套轴任务完成,上架暂存区,智能物流PDA选任务、扫轴、扫料架货位,传MES套轴任务完成信息 + * + * @return + */ + @Override + public JSONObject airSwellWithPaperTubeAssComplete(JSONObject param) { + log.info("airSwellWithPaperTubeAssComplete接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = "CamstarApi/AirSwellWithPaperTubeAssComplete"; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("airSwellWithPaperTubeAssComplete接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + + /** + * LMS提前做/MES呼叫后做,立库子卷出库完成/母卷配送至分切机暂存位,AGV传MES 母卷配送完成信息/立库子卷出库完成信息 + * + * @return + */ + @Override + public JSONObject cutPlanMomRollDeliveryComplete(JSONObject param) { + log.info("cutPlanMomRollDeliveryComplete接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = "CamstarApi/CutPlanMomRollDeliveryComplete"; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("airSwellWithPaperTubeAssComplete接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + + /** + * 提前将/按呼叫指令配送(扫码校验配送先后顺序)气涨轴套装运输到分切机,智能物流传MES 到位信息 + * + * @return + */ + @Override + public JSONObject airSwellWithPaperTubeAssArrival(JSONObject param) { + log.info("airSwellWithPaperTubeAssArrival接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = "CamstarApi/AirSwellWithPaperTubeAssArrival"; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("airSwellWithPaperTubeAssArrival接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + + /** + * 入库完成,LMS回传MES,MES成品入库Move Out + * + * @return + */ + @Override + public JSONObject childRollFGInboundComplete(JSONObject param) { + log.info("childRollFGInboundComplete接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = "CamstarApi/ChildRollFGInboundComplete"; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("childRollFGInboundComplete接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + + /** + * 发货完成,LMS同步MES子卷及包装箱状态,MES更新信息 + * + * @return + */ + @Override + public JSONObject childRollFGOutboundComplete(JSONObject param) { + log.info("childRollFGOutboundComplete接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("MES_URL").getValue(); + String api = "CamstarApi/ChildRollFGOutboundComplete"; + url = url+api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("childRollFGOutboundComplete接口输出参数为:-------------------"+result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java new file mode 100644 index 000000000..0e736720f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java @@ -0,0 +1,211 @@ +package org.nl.wms.ext.mes.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.mes.service.MesToLmsService; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class MesToLmsServiceImpl implements MesToLmsService { + + /** + * 生箔烘箱: + * 母卷批次创建信息发送智能物流(MES生箔工序Move In) + * + * + * 返回成功一条参数状态"S": + * { + * "RTYPE": "S", + * "RTMSG": "成功", + * "RTOAL": 1, + * "RTDAT": [{ + * "ContainerName": "母卷号", + * "ResourceName": "设备号", + * "Weight": 80 + * }] + * } + * + * + * @return + */ + @Override + public JSONObject momRollFoilStart(JSONObject param) { + log.info("momRollFoilStart接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 0); + result.put("RTDAT", new JSONArray()); + System.out.println(result); + return result; + } + + /** + * MES获取AGV称重信息 + * + * @return + */ + @Override + public JSONObject momRollFoilWeighing(JSONObject param) { + log.info("momRollFoilStart接口输入参数为:-------------------"+param.toString()); + + JSONArray data=new JSONArray(); + JSONObject json=new JSONObject(); + json.put("ContainerName","母卷号"); + json.put("ResourceName","设备号"); + json.put("Weight",80); + json.put("WeighDate", DateUtil.now()); + data.add(json); + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", data); + System.out.println(result); + return result; + } + + /** + * MES执行下卷动作告诉LMS + * @param param + * @return + */ + @Override + public JSONObject momRollFoilComplete(JSONObject param) { + log.info("momRollFoilComplete接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + System.out.println(result); + return result; + } + + /** + * MES下达烘箱温度和时间配方给智能物流(MES 包装防护工序Move Out) + * @param param + * @return + */ + @Override + public JSONObject momRollBakeNextSpecTransfer(JSONObject param) { + log.info("momRollBakeNextSpecTransfer接口输入参数为:-------------------"+param.toString()); + + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + System.out.println(result); + return result; + } + + /** + * 分切包装段:分切计划(单表,包含母卷/改制子卷-包装箱号、空包装箱物料、纸筒/FRP管)MES下发智能物流 + * @param param + * @return + */ + @Override + public JSONObject cutPlanTransfer(JSONObject param) { + log.info("cutPlanTransfer接口输入参数为:-------------------"+param.toString()); + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + System.out.println(result); + return result; + } + + /** + * 分切即将完成,呼叫配送下一个母卷/改制子卷,MES传智能物流 + * @param param + * @return + */ + @Override + public JSONObject callNextAssAndMomRoll(JSONObject param) { + log.info("callNextAssAndMomRoll接口输入参数为:-------------------"+param.toString()); + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + System.out.println(result); + return result; + } + + /** + * 当母卷开始分切时,MES系统会将对应的子卷进站信息发送给只能物流系统,一方面物流系统可以预估下个母卷的送达时间,也可以闭环期分切计划指令 + * @param param + * @return + */ + @Override + public JSONObject childRollCutStartComp(JSONObject param) { + log.info("childRollCutStartComp接口输入参数为:-------------------"+param.toString()); + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + System.out.println(result); + return result; + } + + /** + * 包装完成,传智能物流包装箱与子卷关系及子卷属性值,LMS执行入库 + * @param param + * @return + */ + @Override + public JSONObject childRollPackComplete(JSONObject param) { + log.info("childRollPackComplete接口输入参数为:-------------------"+param.toString()); + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + System.out.println(result); + return result; + } + + /** + * 转单指令在MES平台查看后,更新信息,发送LMS(是否拆包、更新后的入库日期、是否更换外包装箱标签),LMS重打子卷标签、包装箱外标签 + * @param param + * @return + */ + @Override + public JSONObject inventoryTransferInfoSync(JSONObject param) { + log.info("inventoryTransferInfoSync接口输入参数为:-------------------"+param.toString()); + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + System.out.println(result); + return result; + } + + /** + * 子卷信息更新:计划外需求有可能入库完成后,ERP才回传计划外需求SalesOrder + * @param param + * @return + */ + @Override + public JSONObject childRollInfoUpdate(JSONObject param) { + log.info("childRollInfoUpdate接口输入参数为:-------------------"+param.toString()); + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + System.out.println(result); + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/LmsToSapController.java b/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/LmsToSapController.java new file mode 100644 index 000000000..50479a795 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/LmsToSapController.java @@ -0,0 +1,39 @@ +package org.nl.wms.ext.sap.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.ext.sap.service.LmsToSapService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "lms发送sap") +@RequestMapping("/api/lms") +@Slf4j +public class LmsToSapController { + private final LmsToSapService LmsToSapService; + + @PostMapping("/returnDelivery") + @Log("LMS回传SAP交货单") + @ApiOperation("LMS回传SAP交货单") + public ResponseEntity returnDelivery(@RequestBody JSONObject jo) { + return new ResponseEntity<>(LmsToSapService.returnDelivery(jo), HttpStatus.OK); + } + + @PostMapping("/returnMoveDtl") + @Log("LMS创建移库单") + @ApiOperation("LMS创建移库单") + public ResponseEntity returnMoveDtl(@RequestBody JSONObject jo) { + return new ResponseEntity<>(LmsToSapService.returnMoveDtl(jo), HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/SapToLmsController.java b/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/SapToLmsController.java new file mode 100644 index 000000000..9c711f084 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/sap/rest/SapToLmsController.java @@ -0,0 +1,47 @@ +package org.nl.wms.ext.sap.rest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.ext.sap.service.SapToLmsService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "sap发送lms") +@RequestMapping("/api/sap") +@Slf4j +public class SapToLmsController { + private final SapToLmsService sapToLmsService; + + @PostMapping("/getMaterialInfo") + @Log("SAP给LMS推送物料信息") + @ApiOperation("SAP给LMS推送物料信息") + public ResponseEntity getMaterialInfo(@RequestBody JSONArray rows) { + return new ResponseEntity<>(sapToLmsService.getMaterialInfo(rows), HttpStatus.OK); + } + + @PostMapping("/getDeliveryInfo") + @Log("SAP给LMS推送交货单信息") + @ApiOperation("SAP给LMS推送物料信息") + public ResponseEntity getDeliveryInfo(@RequestBody JSONObject jo) { + return new ResponseEntity<>(sapToLmsService.getDeliveryInfo(jo), HttpStatus.OK); + } + + @PostMapping("/getReturnDeliveryInfo") + @Log("SAP给LMS推送退货交货单信息") + @ApiOperation("SAP给LMS推送退货交货单信息") + public ResponseEntity getReturnDeliveryInfo(@RequestBody JSONObject jo) { + return new ResponseEntity<>(sapToLmsService.getReturnDeliveryInfo(jo), HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/LmsToSapService.java b/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/LmsToSapService.java new file mode 100644 index 000000000..6072282d9 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/LmsToSapService.java @@ -0,0 +1,43 @@ +package org.nl.wms.ext.sap.service; + +import com.alibaba.fastjson.JSONObject; + +public interface LmsToSapService { + /* + * LMS回传交货单信息给SAP + * ACTION 处理方式 + WADAT_IST 过账日期 + VBELN 交货单号 + POSNR 项目号 + MATNR 物料号 + LGORT 库位 + LFIMG 实际发货总重量 + VRKME 单位 + CHARG 批次 + PIKMG 拣配数量(子卷重量) + VRKME1 单位 + * + * */ + JSONObject returnDelivery(JSONObject jo); + + /*抬头 + * BLDAT 凭证日期 + BUDAT 过账日期 + BKTXT 凭证抬头文本 + XBLNR 参考 + + * 明细 + RSPOS 行号 + MATNR 物料编码 + BWART 移动类型 + MENGE 数量 + MEINS 基本计量单位 + LGORT 库存地点 + CHARG 批次编号 + UMLGO 收货库存地点 + UMCHA 收货批次 + KDAUF 销售订单 + KDPOS 销售订单行项目 + * */ + JSONObject returnMoveDtl(JSONObject jo); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/SapToLmsService.java b/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/SapToLmsService.java new file mode 100644 index 000000000..5ae7dd18d --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/SapToLmsService.java @@ -0,0 +1,19 @@ +package org.nl.wms.ext.sap.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +public interface SapToLmsService { + /* + * 获取物料信息 + * */ + JSONObject getMaterialInfo(JSONArray rows); + /* + * 获取交货单信息 + * */ + JSONObject getDeliveryInfo(JSONObject jo); + /* + * 获取退货交货单信息 + * */ + JSONObject getReturnDeliveryInfo(JSONObject jo); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java new file mode 100644 index 000000000..e2c0aee75 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java @@ -0,0 +1,139 @@ +package org.nl.wms.ext.sap.service.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.system.service.impl.ParamServiceImpl; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.ext.sap.service.LmsToSapService; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class LmsToSapServiceImpl implements LmsToSapService { + + @Override + public JSONObject returnDelivery(JSONObject jo) { + /* + * { + "ACTION": "处理方式", + "WADAT_IST": "过账日期", + "VBELN": "交货单号", + "POSNR": "项目号", + "MATNR": "物料号", + "LGORT": "库位", + "LFIMG": "实际发货总重量", + "VRKME": "单位", + "CHARG": "批次", + "PIKMG": "拣配数量(子卷重量)", + "VRKME1": "单位" + } + * */ + { + log.info("returnDelivery接口输入参数为:-------------------" + jo.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("SAP_URL").getValue(); + String api = ""; + url = url + api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(jo)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("returnDelivery接口输出参数为:-------------------" + result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + } + + @Override + public JSONObject returnMoveDtl(JSONObject jo) { + /* + * { + "BLDAT": "凭证日期", + "BUDAT": "过账日期", + "BKTXT": "凭证抬头文本", + "XBLNR": "参考", + "item": [{ + "RSPOS": "行号", + "MATNR": "物料编码", + "BWART": "移动类型", + "MENGE": "数量", + "MEINS": "基本计量单位", + "LGORT": "库存地点", + "CHARG": "批次编号", + "UMLGO": "收货库存地点", + "UMCHA": "收货批次", + "KDAUF": "销售订单", + "KDPOS": "销售订单行项目" + }] + } + * */ + { + log.info("returnMoveDtl接口输入参数为:-------------------" + jo.toString()); + + JSONObject result = new JSONObject(); + String isConnect = "1"; + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接MES!"); + result.put("data", new JSONObject()); + return result; + } + + JSONArray list = new JSONArray(); + + // String url = acsUrl + api; + String url = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("SAP_URL").getValue(); + String api = ""; + url = url + api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(jo)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + log.info("returnMoveDtl接口输出参数为:-------------------" + result.toString()); + + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + log.info("网络不通,操作失败!"); + } + return result; + } + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java new file mode 100644 index 000000000..ba4dd52ae --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java @@ -0,0 +1,99 @@ +package org.nl.wms.ext.sap.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.ext.sap.service.SapToLmsService; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SapToLmsServiceImpl implements SapToLmsService { + + @Override + public JSONObject getMaterialInfo(JSONArray rows) { + if (ObjectUtil.isEmpty(rows)) { + throw new BadRequestException("物料信息为空!"); + } + log.info("getMaterialInfo的输入参数为:------------------------" + rows.toString()); + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + + } + JSONObject jo = new JSONObject(); + jo.put("msg", "推送成功!"); + jo.put("code", "1"); + return jo; + } + + @Override + public JSONObject getDeliveryInfo(JSONObject jo) { + + log.info("getDeliveryInfo的输入参数为:------------------------" + jo.toString()); + /*for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + + }*/ + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + return result; + } + + @Override + public JSONObject getReturnDeliveryInfo(JSONObject jo) { + /** + * { + * "ACTION": "P", + * "BUDAT": "2022-09-26", + * "VBELN": "010101", + * "child": [ + * { + * "POSNR": "10", + * "MATNR": "BST00001", + * "LGORT": "CP01", + * "child": [ + * { + * "LFIMG": "50", + * "VRKME": "PC", + * "CHARG": "20220926", + * "PIKMG": "10", + * "VRKME1": "PC" + * } + * ] + * }, + * { + * "POSNR": "20", + * "MATNR": "BST00002", + * "LGORT": "CP01", + * "child": [ + * { + * "LFIMG": "50", + * "VRKME": "PC", + * "CHARG": "20220926", + * "PIKMG": "10", + * "VRKME1": "PC" + * } + * ] + * } + * ] + * } + * */ + + log.info("getReturnDeliveryInfo的输入参数为:------------------------" + jo.toString()); + + JSONObject result = new JSONObject(); + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", null); + return result; + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/ext/wql/AUTO_QUERYTASK.wql b/nladmin-system/src/main/java/org/nl/wms/ext/wql/AUTO_QUERYTASK.wql new file mode 100644 index 000000000..511960fde --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/ext/wql/AUTO_QUERYTASK.wql @@ -0,0 +1,92 @@ +[交易说明] + 交易名: 二楼到一楼业务 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.start_point_code TYPEAS f_string + 输入.end_point_code TYPEAS f_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + task.* + FROM + SCH_BASE_Task task + WHERE + task.is_delete = '0' + AND task.task_status = '01' + AND task.start_point_code in ('YQX01_WX','YQX02_WX') + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + task.* + FROM + SCH_BASE_Task task + WHERE + task.is_delete = '0' + AND task.task_status <> '99' + + OPTION 输入.start_point_code <> "" + task.start_point_code in 输入.start_point_code + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + task.* + FROM + SCH_BASE_Task task + WHERE + task.is_delete = '0' + AND task.task_status <> '99' + + OPTION 输入.end_point_code <> "" + task.next_point_code in 输入.end_point_code + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/rest/PersoncorrdeviceController.java b/nladmin-system/src/main/java/org/nl/wms/mps/rest/PersoncorrdeviceController.java new file mode 100644 index 000000000..d461d4443 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/rest/PersoncorrdeviceController.java @@ -0,0 +1,120 @@ + +package org.nl.wms.mps.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.mps.service.PersoncorrdeviceService; +import org.nl.wms.mps.service.dto.PersoncorrdeviceDto; +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; + +/** +* @author geng by +* @date 2022-05-26 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "人员设备维护管理") +@RequestMapping("/api/personcorrdevice") +@Slf4j +public class PersoncorrdeviceController { + + private final PersoncorrdeviceService personcorrdeviceService; + + @GetMapping + @Log("查询人员设备维护") + @ApiOperation("查询人员设备维护") + //@PreAuthorize("@el.check('personcorrdevice:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(personcorrdeviceService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增人员设备维护") + @ApiOperation("新增人员设备维护") + //@PreAuthorize("@el.check('personcorrdevice:add')") + public ResponseEntity create(@Validated @RequestBody PersoncorrdeviceDto dto){ + personcorrdeviceService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改人员设备维护") + @ApiOperation("修改人员设备维护") + //@PreAuthorize("@el.check('personcorrdevice:edit')") + public ResponseEntity update(@Validated @RequestBody PersoncorrdeviceDto dto){ + personcorrdeviceService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除人员设备维护") + @ApiOperation("删除人员设备维护") + //@PreAuthorize("@el.check('personcorrdevice:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + personcorrdeviceService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/addPersons") + @Log("添加人员") + @ApiOperation("添加人员") + //@PreAuthorize("@el.check('teamcorrperson:list')") + public ResponseEntity addPersons(@RequestBody JSONObject param) { + personcorrdeviceService.addPersons(param); + return new ResponseEntity<>( HttpStatus.OK); + } + + @GetMapping("/getDeviceByPerson") + @Log("查询设备") + @ApiOperation("查询设备") + //@PreAuthorize("@el.check('personcorrdevice:list')") + public ResponseEntity getDeviceByPerson(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(personcorrdeviceService.getDeviceByPerson(whereJson,page),HttpStatus.OK); + } + + @PostMapping("/getHeader") + @Log("查询表头") + @ApiOperation("查询表头") + //@PreAuthorize("@el.check('teamcorrperson:list')") + public ResponseEntity getHeader(@RequestBody JSONObject param) { + return new ResponseEntity<>( personcorrdeviceService.getHeader(param),HttpStatus.OK); + } + + @PostMapping("/getDeviceIdByUserId") + @Log("查询人员的设备") + @ApiOperation("查询人员的设备") + //@PreAuthorize("@el.check('teamcorrperson:list')") + public ResponseEntity getDeviceIdByUserId(@RequestBody JSONObject param) { + return new ResponseEntity<>( personcorrdeviceService.getDeviceIdByUserId(param),HttpStatus.OK); + } + + @PostMapping("/addDevices") + @Log("添加人员的设备") + @ApiOperation("添加人员的设备") + //@PreAuthorize("@el.check('teamcorrperson:list')") + public ResponseEntity addDevices(@RequestBody JSONObject param) { + personcorrdeviceService.addDevices(param); + return new ResponseEntity<>(HttpStatus.OK); + } + + @DeleteMapping("/deleteRow") + @Log("删除人员的设备") + @ApiOperation("删除人员的设备") + //@PreAuthorize("@el.check('teamcorrperson:list')") + public ResponseEntity deleteRow(@RequestBody JSONObject param) { + personcorrdeviceService.deleteRow(param); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceshiftorderController.java b/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceshiftorderController.java new file mode 100644 index 000000000..10d39face --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/rest/ProduceshiftorderController.java @@ -0,0 +1,145 @@ +package org.nl.wms.mps.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.mps.service.ProduceshiftorderService; +import org.nl.wms.mps.service.dto.ProduceshiftorderDto; +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; + +/** +* @author qinx +* @date 2022-05-24 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "工单管理") +@RequestMapping("/api/produceshiftorder") +@Slf4j +public class ProduceshiftorderController { + + private final ProduceshiftorderService produceshiftorderService; + + @GetMapping + @Log("查询工单") + @ApiOperation("查询工单") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(produceshiftorderService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增工单") + @ApiOperation("新增工单") + //@PreAuthorize("@el.check('produceshiftorder:add')") + public ResponseEntity create(@Validated @RequestBody ProduceshiftorderDto dto){ + produceshiftorderService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改工单") + @ApiOperation("修改工单") + //@PreAuthorize("@el.check('produceshiftorder:edit')") + public ResponseEntity update(@Validated @RequestBody ProduceshiftorderDto dto){ + produceshiftorderService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除工单") + @ApiOperation("删除工单") + //@PreAuthorize("@el.check('produceshiftorder:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + produceshiftorderService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping("/submits") + @Log("工单下发") + @ApiOperation("工单下发") + //@PreAuthorize("@el.check('produceshiftorder:edit')") + public ResponseEntity submits(@RequestBody JSONObject param){ + produceshiftorderService.submits(param); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/getDevice") + @Log("根据登录用户设备下拉") + @ApiOperation("根据登录用户设备下拉") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity getDevice(@RequestBody JSONObject param){ + return new ResponseEntity<>(produceshiftorderService.getDevice(param),HttpStatus.OK); + } + + @PostMapping("/getTable") + @Log("获取工单生产记录") + @ApiOperation("获取工单生产记录") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity getTable(@RequestBody JSONObject param){ + return new ResponseEntity<>(produceshiftorderService.getTable(param),HttpStatus.OK); + } + + @PostMapping("/openStart") + @Log("看板开工") + @ApiOperation("看板开工") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity openStart(@RequestBody JSONObject param){ + produceshiftorderService.openStart(param); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/saveReport") + @Log("看板报工") + @ApiOperation("看板报工") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity saveReport(@RequestBody JSONObject param){ + produceshiftorderService.saveReport(param); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/finish") + @Log("看板强制完成") + @ApiOperation("看板强制完成") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity finish(@RequestBody JSONObject param){ + produceshiftorderService.finish(param); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/getReportWork") + @Log("获取当前报工记录") + @ApiOperation("获取当前报工记录") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity getReportWork(@RequestBody JSONObject param){ + return new ResponseEntity<>(produceshiftorderService.getReportWork(param),HttpStatus.OK); + } + + @PostMapping("/forceFinish") + @Log("工单强制完成") + @ApiOperation("工单强制完成") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity forceFinish(@RequestBody JSONObject param){ + produceshiftorderService.forceFinish(param); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PostMapping("/getDtl") + @Log("获取当前工单下的工单生产记录") + @ApiOperation("获取当前工单下的工单生产记录") + //@PreAuthorize("@el.check('produceshiftorder:list')") + public ResponseEntity getDtl(@RequestBody JSONObject param){ + return new ResponseEntity<>(produceshiftorderService.getDtl(param),HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/rest/TeamcorrpersonController.java b/nladmin-system/src/main/java/org/nl/wms/mps/rest/TeamcorrpersonController.java new file mode 100644 index 000000000..10f28cd8e --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/rest/TeamcorrpersonController.java @@ -0,0 +1,65 @@ + +package org.nl.wms.mps.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.mps.service.TeamcorrpersonService; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** +* @author geng by +* @date 2022-05-26 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "班组人员维护管理") +@RequestMapping("/api/teamcorrperson") +@Slf4j +public class TeamcorrpersonController { + + private final TeamcorrpersonService teamcorrpersonService; + + @GetMapping + @Log("查询班组人员维护") + @ApiOperation("查询班组人员维护") + //@PreAuthorize("@el.check('teamcorrperson:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(teamcorrpersonService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping("/getPersonIdByTeamId") + @Log("根据班组查询人员id") + @ApiOperation("根据班组查询人员id") + //@PreAuthorize("@el.check('teamcorrperson:list')") + public ResponseEntity getPersonIdByTeamId(@RequestBody JSONObject param) { + return new ResponseEntity<>(teamcorrpersonService.getPersonIdByTeamId(param), HttpStatus.OK); + } + + @PostMapping("/addPersons") + @Log("添加班组人员关系") + @ApiOperation("添加班组人员关系") + //@PreAuthorize("@el.check('teamcorrperson:list')") + public ResponseEntity addPersons(@RequestBody JSONObject param) { + teamcorrpersonService.addPersons(param); + return new ResponseEntity<>( HttpStatus.OK); + } + + @Log("删除") + @ApiOperation("删除") + //@PreAuthorize("@el.check('workteam:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + teamcorrpersonService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/rest/WorkteamController.java b/nladmin-system/src/main/java/org/nl/wms/mps/rest/WorkteamController.java new file mode 100644 index 000000000..5a62c97b0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/rest/WorkteamController.java @@ -0,0 +1,85 @@ + +package org.nl.wms.mps.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.mps.service.WorkteamService; +import org.nl.wms.mps.service.dto.WorkteamDto; +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; + +/** +* @author geng by +* @date 2022-05-25 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "班组管理") +@RequestMapping("/api/workteam") +@Slf4j +public class WorkteamController { + + private final WorkteamService workteamService; + + @GetMapping + @Log("查询班组") + @ApiOperation("查询班组") + //@PreAuthorize("@el.check('workteam:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(workteamService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增班组") + @ApiOperation("新增班组") + //@PreAuthorize("@el.check('workteam:add')") + public ResponseEntity create(@Validated @RequestBody WorkteamDto dto){ + workteamService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改班组") + @ApiOperation("修改班组") + //@PreAuthorize("@el.check('workteam:edit')") + public ResponseEntity update(@Validated @RequestBody WorkteamDto dto){ + workteamService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除班组") + @ApiOperation("删除班组") + //@PreAuthorize("@el.check('workteam:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + workteamService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getClasssystem") + @Log("查询班制下拉") + @ApiOperation("查询班制下拉") + //@PreAuthorize("@el.check('workteam:list')") + public ResponseEntity getClasssystem(){ + return new ResponseEntity<>(workteamService.getClasssystem(),HttpStatus.OK); + } + + @PutMapping("/changeActive") + @Log("修改状态") + @ApiOperation("修改状态") + public ResponseEntity update(@RequestBody JSONObject json) { + workteamService.changeActive(json); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/PersoncorrdeviceService.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/PersoncorrdeviceService.java new file mode 100644 index 000000000..c8ad31c32 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/PersoncorrdeviceService.java @@ -0,0 +1,84 @@ + +package org.nl.wms.mps.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.mps.service.dto.PersoncorrdeviceDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author geng by +* @date 2022-05-26 +**/ +public interface PersoncorrdeviceService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param team_person_device_id ID + * @return Personcorrdevice + */ + PersoncorrdeviceDto findById(Long team_person_device_id); + + /** + * 根据编码查询 + * @param code code + * @return Personcorrdevice + */ + PersoncorrdeviceDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(PersoncorrdeviceDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(PersoncorrdeviceDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + void addPersons(JSONObject param); + + /** + * 设备 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map getDeviceByPerson(Map whereJson, Pageable page); + + Map getHeader(JSONObject param); + + JSONArray getDeviceIdByUserId(JSONObject param); + + void addDevices(JSONObject param); + + void deleteRow(JSONObject param); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/ProduceshiftorderService.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/ProduceshiftorderService.java new file mode 100644 index 000000000..ab70e94d2 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/ProduceshiftorderService.java @@ -0,0 +1,124 @@ +package org.nl.wms.mps.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.mps.service.dto.ProduceshiftorderDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author qinx +* @date 2022-05-24 +**/ +public interface ProduceshiftorderService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param produceorder_id ID + * @return Produceshiftorder + */ + ProduceshiftorderDto findById(Long produceorder_id); + + /** + * 根据编码查询 + * @param code code + * @return Produceshiftorder + */ + ProduceshiftorderDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(ProduceshiftorderDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(ProduceshiftorderDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 工单下发 + * @param param + */ + void submits(JSONObject param); + + /** + * 根据当前登录用户下拉 + * @param param + * @return + */ + JSONArray getDevice(JSONObject param); + + /** + * 获取工单生产记录 + * @param param + * @return + */ + JSONArray getTable(JSONObject param); + + /** + * 看板开工 + * @param param + */ + void openStart(JSONObject param); + + /** + * 看板报工 + * @param param + */ + void saveReport(JSONObject param); + + /** + * 看板强制完成 + * @param param + */ + void finish(JSONObject param); + + /** + * 获取当前报工记录 + * @param param + * @return + */ + JSONObject getReportWork(JSONObject param); + + + /** + * 工单强制完成 + * @param param + */ + void forceFinish(JSONObject param); + + /** + * 获取当前工单下的工单生产记录 + * @param param + * @return + */ + JSONArray getDtl(JSONObject param); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/TeamcorrpersonService.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/TeamcorrpersonService.java new file mode 100644 index 000000000..cfc13188f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/TeamcorrpersonService.java @@ -0,0 +1,34 @@ + +package org.nl.wms.mps.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.data.domain.Pageable; + +import java.util.Map; + +/** +* @description 服务接口 +* @author geng by +* @date 2022-05-26 +**/ +public interface TeamcorrpersonService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + JSONArray getPersonIdByTeamId(JSONObject param); + + void addPersons(JSONObject param); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/WorkteamService.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/WorkteamService.java new file mode 100644 index 000000000..8e8c03cb5 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/WorkteamService.java @@ -0,0 +1,74 @@ + +package org.nl.wms.mps.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.mps.service.dto.WorkteamDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author geng by +* @date 2022-05-25 +**/ +public interface WorkteamService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param team_id ID + * @return Workteam + */ + WorkteamDto findById(Long team_id); + + /** + * 根据编码查询 + * @param code code + * @return Workteam + */ + WorkteamDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(WorkteamDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(WorkteamDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 班制下拉 + * @return + */ + JSONArray getClasssystem(); + + void changeActive(JSONObject json); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/PersoncorrdeviceDto.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/PersoncorrdeviceDto.java new file mode 100644 index 000000000..f3d97c9ce --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/PersoncorrdeviceDto.java @@ -0,0 +1,27 @@ +package org.nl.wms.mps.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author geng by +* @date 2022-05-26 +**/ +@Data +public class PersoncorrdeviceDto implements Serializable { + + /** 班组人员设备对应标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long team_person_device_id; + + /** 操作工标识 */ + private Long jockey_id; + + /** 设备标识 */ + private Long device_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/ProduceshiftorderDto.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/ProduceshiftorderDto.java new file mode 100644 index 000000000..3bb51b818 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/ProduceshiftorderDto.java @@ -0,0 +1,159 @@ +package org.nl.wms.mps.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author qinx + * @description / + * @date 2022-05-24 + **/ +@Data +public class ProduceshiftorderDto implements Serializable { + + /** 生产班次工单标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long produceorder_id; + + /** + * 生产班次工单编号 + */ + private String produceorder_code; + + /** + * 机台工单号 + */ + private String producedeviceorder_code; + + /** + * 班次类型 + */ + private String shift_type_scode; + + /** + * 生产日期 + */ + private String produce_date; + + /** + * 计划数量 + */ + private BigDecimal plan_qty; + + /** + * 实际数量 + */ + private BigDecimal real_qty; + + /** + * 报工数量 + */ + private BigDecimal report_qty; + + /** + * 物料标识 + */ + private Long material_id; + + /** + * 物料单重 + */ + private BigDecimal material_weight; + + /** + * 托盘类型 + */ + private String vehicle_type; + + /** + * 计划生产开始时间 + */ + private String planproducestart_date; + + /** + * 计划生产结束时间 + */ + private String planproduceend_date; + + /** + * 实际生产开始时间 + */ + private String realproducestart_date; + + /** + * 实际生产结束时间 + */ + private String realproduceend_date; + + /** + * 工单状态 + */ + private String order_status; + + /** + * 是否搬运 + */ + private String is_needmove; + + /** + * 工单类型 + */ + private String order_type_scode; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 部门ID + */ + private Long sysdeptid; + + /** + * 公司ID + */ + private Long syscompanyid; + + /** + * 是否删除 + */ + private String is_delete; + + private String is_canupdate_update; + + private Long device_id; + private Long sale_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/TeamcorrpersonDto.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/TeamcorrpersonDto.java new file mode 100644 index 000000000..e14fedd04 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/TeamcorrpersonDto.java @@ -0,0 +1,27 @@ +package org.nl.wms.mps.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author geng by +* @date 2022-05-26 +**/ +@Data +public class TeamcorrpersonDto implements Serializable { + + /** 班组人员对应标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long team_person_id; + + /** 班组标识 */ + private Long team_id; + + /** 操作工标识 */ + private Long jockey_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/WorkteamDto.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/WorkteamDto.java new file mode 100644 index 000000000..3e41086cd --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/dto/WorkteamDto.java @@ -0,0 +1,63 @@ +package org.nl.wms.mps.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author geng by +* @date 2022-05-25 +**/ +@Data +public class WorkteamDto implements Serializable { + + /** 班组标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long team_id; + + /** 班组编码 */ + private String team_code; + + /** 班组名称 */ + private String team_name; + + /** 班制标识 */ + private Long classsystem_id; + + /** 备注 */ + private String remark; + + /** 是否启用 */ + private String is_active; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; + + /** 部门ID */ + private Long sysdeptid; + + /** 公司ID */ + private Long syscompanyid; + + /** 是否删除 */ + private String is_delete; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/PersoncorrdeviceServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/PersoncorrdeviceServiceImpl.java new file mode 100644 index 000000000..932766081 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/PersoncorrdeviceServiceImpl.java @@ -0,0 +1,250 @@ + +package org.nl.wms.mps.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.mps.service.PersoncorrdeviceService; +import org.nl.wms.mps.service.dto.PersoncorrdeviceDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author geng by + * @description 服务实现 + * @date 2022-05-26 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class PersoncorrdeviceServiceImpl implements PersoncorrdeviceService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String search = MapUtil.getStr(whereJson, "search"); + JSONObject map = new JSONObject(); + map.put("flag", "1"); + if (!StrUtil.isEmpty(search)) { + map.put("search", "%" + search + "%"); + } + JSONObject json = WQL.getWO("MPS_Personcorrdevice001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "view_person.jockey_id"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(PersoncorrdeviceDto.class); + return null; + } + + @Override + public PersoncorrdeviceDto findById(Long team_person_device_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + JSONObject json = wo.query("team_person_device_id = '" + team_person_device_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(PersoncorrdeviceDto.class); + } + return null; + } + + @Override + public PersoncorrdeviceDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(PersoncorrdeviceDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(PersoncorrdeviceDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setTeam_person_device_id(IdUtil.getSnowflake(1, 1).nextId()); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(PersoncorrdeviceDto dto) { + PersoncorrdeviceDto entity = this.findById(dto.getTeam_person_device_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + for (Long jockey_id : ids) { + wo.delete("jockey_id = '" + jockey_id + "'"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addPersons(JSONObject param) { + final JSONArray persons = param.getJSONArray("persons"); + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + for (int i = 0; i < persons.size(); i++) { + final JSONObject jsonObject = persons.getJSONObject(i); + final String id = jsonObject.getString("id"); + final JSONArray jsonArray = wo.query("jockey_id = '" + id + "'").getResultJSONArray(0); + if (ObjectUtil.isEmpty(jsonArray)) { + JSONObject map = new JSONObject(); + map.put("team_person_device_id", IdUtil.getSnowflake(1, 1).nextId()); + map.put("jockey_id", id); + wo.insert(map); + } + } + } + + @Override + public Map getDeviceByPerson(Map whereJson, Pageable page) { + String user_id = MapUtil.getStr(whereJson, "user_id"); + JSONObject map2 = new JSONObject(); + map2.put("flag", "3"); + map2.put("user_id", user_id); + //根据人员获取设备信息 + JSONObject json = WQL.getWO("MPS_Personcorrdevice001").addParamMap(map2).pageQuery(WqlUtil.getHttpContext(page), "device.device_code"); + JSONArray jsonArray = json.getJSONArray("content"); + JSONArray newContent = new JSONArray(); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + JSONObject map = new JSONObject(); + String device_id = jsonObject.getString("device_id"); + map.put("flag", "4"); + map.put("device_id", device_id); + //获取设备所拥有的项点信息 + JSONArray itemArray = WQL.getWO("MPS_Personcorrdevice001").addParamMap(map).process().getResultJSONArray(0); + JSONObject newMap = new JSONObject(); + newMap.put("team_person_device_id", jsonObject.getString("team_person_device_id")); + newMap.put("device_id", jsonObject.getString("device_id")); + newMap.put("device_code", jsonObject.getString("device_code")); + newMap.put("device_name", jsonObject.getString("device_name")); + newMap.put("workprocedure_code", jsonObject.getString("workprocedure_code")); + newMap.put("workprocedure_name", jsonObject.getString("workprocedure_name")); + //循环每个设备的项点信息,将项点所对应的键设为项点编码,对应动态表格的prop + for (int j = 0; j < itemArray.size(); j++) { + JSONObject itemObject = itemArray.getJSONObject(j); + newMap.put(itemObject.getString("item_code"), itemObject.getString("item_value")); + } + newContent.add(newMap); + } + json.put("content", newContent); + return json; + } + + @Override + public Map getHeader(JSONObject param) { + //动态获取设备类型下对应的项点信息 + String user_id = param.getString("user_id"); + JSONObject map = new JSONObject(); + map.put("flag", "2"); + map.put("user_id", user_id); + final JSONArray jsonArray = WQL.getWO("MPS_Personcorrdevice001").addParamMap(map).process().getResultJSONArray(0); + JSONArray newArray = new JSONArray(); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String item_name = jsonObject.getString("item_name"); + JSONObject json = new JSONObject(); + json.put("label", item_name); + //将表格prop设置为项点编码 + json.put("prop", jsonObject.getString("item_code")); + json.put("show", true); + if (item_name.length() >= 6) { + json.put("width", "150"); + } + newArray.add(json); + } + JSONObject resultMap = new JSONObject(); + resultMap.put("newArray", newArray); + return resultMap; + } + + @Override + public JSONArray getDeviceIdByUserId(JSONObject param) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + final JSONArray resultJSONArray = wo.query("jockey_id = '" + param.getString("user_id") + "'").getResultJSONArray(0); + return resultJSONArray; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addDevices(JSONObject param) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + final String user_id = param.getString("user_id"); + final JSONArray devices = param.getJSONArray("devices"); + final JSONObject is_exists = wo.query("jockey_id = '" + user_id + "' and (device_id is null or device_id = '" + "" + "')").uniqueResult(0); + if (ObjectUtil.isNotEmpty(is_exists)) { + wo.delete("jockey_id = '" + user_id + "'"); + } + for (int i = 0; i < devices.size(); i++) { + final JSONObject jsonObject = devices.getJSONObject(i); + final String device_id = jsonObject.getString("device_id"); + final JSONObject object = wo.query("jockey_id = '" + user_id + "' and device_id = '" + device_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(object)) { + JSONObject map = new JSONObject(); + map.put("team_person_device_id", IdUtil.getSnowflake(1, 1).nextId()); + map.put("jockey_id", user_id); + map.put("device_id", device_id); + wo.insert(map); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteRow(JSONObject param) { + JSONArray rows = param.getJSONArray("rows"); + final String user_id = param.getString("user_id"); + WQLObject wo = WQLObject.getWQLObject("pdm_bi_personcorrdevice"); + for (int i = 0; i < rows.size(); i++) { + final JSONObject jsonObject = rows.getJSONObject(i); + final String team_person_device_id = jsonObject.getString("team_person_device_id"); + final JSONArray resultJSONArray = wo.query("team_person_device_id = '" + team_person_device_id + "'").getResultJSONArray(0); + wo.delete("team_person_device_id = '" + team_person_device_id + "'"); + } + final JSONArray resultJSONArray = wo.query("jockey_id = '" + user_id + "'").getResultJSONArray(0); + if (ObjectUtil.isEmpty(resultJSONArray)){ + JSONObject map = new JSONObject(); + map.put("team_person_device_id",IdUtil.getSnowflake(1, 1).nextId()); + map.put("jockey_id",user_id); + wo.insert(map); + } + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceshiftorderServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceshiftorderServiceImpl.java new file mode 100644 index 000000000..464788719 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/ProduceshiftorderServiceImpl.java @@ -0,0 +1,438 @@ +package org.nl.wms.mps.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.dto.CurrentUser; +import org.nl.modules.system.service.dto.UserDto; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.basedata.master.service.ClassstandardService; +import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.mps.service.ProduceshiftorderService; +import org.nl.wms.mps.service.dto.ProduceshiftorderDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author qinx + * @description 服务实现 + * @date 2022-05-24 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class ProduceshiftorderServiceImpl implements ProduceshiftorderService { + + private final ClassstandardService classstandardService; + private final WmsToAcsService wmsToAcsService; + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String produceorder_code = MapUtil.getStr(whereJson, "produceorder_code"); + String material = MapUtil.getStr(whereJson, "material"); + String begin_time = MapUtil.getStr(whereJson, "begin_time"); + String end_time = MapUtil.getStr(whereJson, "end_time"); + String order_type_scode = MapUtil.getStr(whereJson, "order_type_scode"); + String order_status = MapUtil.getStr(whereJson, "order_status"); + String shift_type_scode = MapUtil.getStr(whereJson, "shift_type_scode"); + String sale_id = MapUtil.getStr(whereJson, "sale_id"); + JSONObject map = new JSONObject(); + map.put("flag", "1"); + map.put("order_type_scode", order_type_scode); + //map.put("order_status", order_status); + map.put("shift_type_scode", shift_type_scode); + map.put("begin_time", begin_time); + map.put("end_time", end_time); + if (StrUtil.isNotEmpty(order_status)) { + order_status = order_status.replace("[\"", "").replace("\"]", "").replace("\"", ""); + } + map.put("order_status", order_status); + //处理状态为未完成 + if (StrUtil.isNotEmpty(order_status) && order_status.contains("-1")) { + map.put("unFinish", "-1"); + map.put("order_status", order_status.replace("-1", "")); + } + if (StrUtil.isNotEmpty(produceorder_code)) { + map.put("produceorder_code", "%" + produceorder_code + "%"); + } + if (StrUtil.isNotEmpty(material)) { + map.put("material", "%" + material + "%"); + } + if (StrUtil.isNotEmpty(sale_id)) { + map.put("sale_id", "%" + sale_id + "%"); + } + JSONObject jsonObject = WQL.getWO("MPS_PRODUCEDURE001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "ShiftOrder.update_time desc"); + return jsonObject; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(ProduceshiftorderDto.class); + return null; + } + + @Override + public ProduceshiftorderDto findById(Long produceorder_id) { + WQLObject wo = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + JSONObject json = wo.query("produceorder_id = '" + produceorder_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(ProduceshiftorderDto.class); + } + return null; + } + + @Override + public ProduceshiftorderDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(ProduceshiftorderDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(ProduceshiftorderDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + CurrentUser currentUser= SecurityUtils.getCurrentUser(); + Long deptId = currentUser.getUser().getDeptId(); + String newCode = CodeUtil.getNewCode("PDM_SHIFTORDER"); + dto.setProduceorder_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setProduceorder_code(newCode); + dto.setProducedeviceorder_code(newCode); + dto.setOrder_status("00"); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + WQLObject wo = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + json.put("sysdeptid", deptId); + json.put("syscompanyid", deptId); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ProduceshiftorderDto dto) { + ProduceshiftorderDto entity = this.findById(dto.getProduceorder_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + for (Long produceorder_id : ids) { + JSONObject param = new JSONObject(); + param.put("produceorder_id", String.valueOf(produceorder_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submits(JSONObject param) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + JSONObject json = wo.query("produceorder_id = '" + param.getString("produceorder_id") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json.getString("device_id"))) throw new BadRequestException("请先绑定设备"); + + JSONArray orderArr = wo.query("device_id = '" + param.getString("device_id") + "' and order_status = '02'").getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(orderArr)) throw new BadRequestException("当前设备正在生产中"); + + json.put("order_status", "02"); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + wo.update(json); + } + + @Override + public JSONArray getDevice(JSONObject param) { + final String workprocedure_id = param.getString("workprocedure_id"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + JSONObject map = new JSONObject(); + map.put("flag", "4"); + map.put("jockey_id", currentUserId + ""); + map.put("workprocedure_id", workprocedure_id); + final JSONArray resultJSONArray = WQL.getWO("MPS_PRODUCEDURE001").addParamMap(map).process().getResultJSONArray(0); + return resultJSONArray; + } + + @Override + public JSONArray getTable(JSONObject param) { + //获取当前登录用户下的所有设备 + Long currentUserId = SecurityUtils.getCurrentUserId(); + JSONObject map1 = new JSONObject(); + map1.put("flag", "2"); + map1.put("jockey_id", currentUserId + ""); + JSONArray devices = WQL.getWO("MPS_PRODUCEDURE001").addParamMap(map1).process().getResultJSONArray(0); + //根据当前用户下的所有设备查询所属工序 + JSONObject map = new JSONObject(); + map.put("flag", "3"); + StringBuilder sb = new StringBuilder(); + if (ObjectUtil.isNotEmpty(devices)) { + sb.append("("); + for (int i = 0; i < devices.size(); i++) { + JSONObject device = devices.getJSONObject(i); + String workprocedure_id = device.getString("workprocedure_id"); + if (devices.size() - 1 == i) { + sb.append("'" + workprocedure_id + "')"); + } + if (devices.size() - 1 != i) { + sb.append("'" + workprocedure_id + "',"); + } + } + map.put("workprocedure_ids", sb.toString()); + } else { + map.put("workprocedure_ids", "('-1')"); + } + //根据当前用户的设备所属的工序查询属于自己的工单表 + JSONArray resultJSONArray = WQL.getWO("MPS_PRODUCEDURE001").addParamMap(map).process().getResultJSONArray(0); + return resultJSONArray; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void openStart(JSONObject param) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String device_id = param.getString("device_id"); + WQLObject wo_device = WQLObject.getWQLObject("pdm_bi_device"); + JSONObject device = wo_device.query("device_id = '" + device_id + "'").uniqueResult(0); + String device_code = device.getString("device_code"); + JSONObject row = param.getJSONObject("row"); + String produceorder_id = row.getString("produceorder_id"); + String workprocedure_id = row.getString("workprocedure_id"); + String produceorder_code = row.getString("produceorder_code"); + String material_id = row.getString("material_id"); + String material_code = row.getString("material_code"); + String material_name = row.getString("material_name"); + String material_spec = row.getString("material_spec"); + String is_needmove = row.getString("is_needmove"); + String plan_qty = row.getString("plan_qty"); + String order_status = row.getString("order_status"); + //开工时修改生产班次工单表 生产设备、以及工单状态 + WQLObject wo = WQLObject.getWQLObject("MPS_BD_ProduceShiftOrder"); + JSONObject jsonObject1 = wo.query("produceorder_id = '" + produceorder_id + "'").uniqueResult(0); + JSONObject produceorderMap = new JSONObject(); + produceorderMap.put("produceorder_id", produceorder_id); + produceorderMap.put("device_id", device_id); + produceorderMap.put("order_status", "02"); + produceorderMap.put("update_optid", currentUserId); + produceorderMap.put("update_optname", nickName); + produceorderMap.put("update_time", now); + if (order_status.equals("01")){ + produceorderMap.put("realproducestart_date", now); + } + wo.update(produceorderMap); + //同时工单记录表中插入一条数据 + WQLObject wo_record = WQLObject.getWQLObject("MPS_BD_MacOperateRecord"); + JSONObject recordMap = new JSONObject(); + recordMap.put("macoperate_id", IdUtil.getSnowflake(1, 1).nextId()); + recordMap.put("device_id", device_id); + recordMap.put("workprocedure_id", workprocedure_id); + recordMap.put("produceorder_id", produceorder_id); + recordMap.put("produceorder_code", produceorder_code); + recordMap.put("init_qty", jsonObject1.getString("real_qty")); + //填写生产记录表中的生产数量时,先判断是否已经生产过了,如果没有生产过,就将工单记录表中的计划数量付给记录表中的生产数量 + final JSONArray alreadyPro = wo_record.query("produceorder_id = '" + produceorder_id + "'").getResultJSONArray(0); + if (ObjectUtil.isEmpty(alreadyPro)) { + recordMap.put("produce_qty", plan_qty); + //同时向acs系统下发工单 问题是现在一个工单分多次执行,现在是每开工一次,向acs发送一次工单 + //acs那边就会新增多个工单 + //如果是第一次开工,就向acs下发工单 + // TODO + JSONArray array = new JSONArray(); + JSONObject acsObj = new JSONObject(); + acsObj.put("ext_order_id",produceorder_id); + acsObj.put("is_needmove",is_needmove); + acsObj.put("order_code",produceorder_code); + acsObj.put("qty",plan_qty); + acsObj.put("material_uuid",material_id); + acsObj.put("material_code",material_code); + acsObj.put("material_name",material_name); + acsObj.put("material_spec",material_spec); + acsObj.put("device_code",device_code); + array.add(acsObj); + wmsToAcsService.order(array); + } else { + Integer sum = 0; + //如果生产过了,就获取记录表中的报工数量,用计划数量减去生产过的报工数量的和,为这次的生产数量 + for (int i = 0; i < alreadyPro.size(); i++) { + JSONObject jsonObject = alreadyPro.getJSONObject(i); + String report_qty = jsonObject.getString("report_qty"); + sum += Integer.parseInt(report_qty); + } + Integer produce_qty = Integer.parseInt(plan_qty) - sum; + recordMap.put("produce_qty", produce_qty); + //wms向acs发送请求 工单恢复 + //如果不是第一次开工,就向acs发送恢复工单状态 + // TODO + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("ext_order_id",produceorder_id); + map.put("type","2"); + array.add(map); + wmsToAcsService.orderStatusUpdate(array); + } + recordMap.put("operatetime_start", now); + recordMap.put("jockey_id", currentUserId); + wo_record.insert(recordMap); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveReport(JSONObject param) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + final String report_qty = param.getString("report_qty"); + final JSONObject row = param.getJSONObject("row"); + final String produceorder_id = row.getString("produceorder_id"); + //报工时工单的工单状态为暂停,报工数量为这条工单上次加这次报工数量的和,也就是这条工单每次记录的和 + WQLObject wo = WQLObject.getWQLObject("MPS_BD_ProduceShiftOrder"); + JSONObject jsonObject = wo.query("produceorder_id = '" + produceorder_id + "'").uniqueResult(0); + JSONObject produceorderMap = new JSONObject(); + produceorderMap.put("produceorder_id",produceorder_id); + if (row.getString("report_qty").equals("0") || StrUtil.isEmpty(row.getString("report_qty"))){ + produceorderMap.put("report_qty",report_qty); + }else { + Integer sum = Integer.parseInt(row.getString("report_qty")) + Integer.parseInt(report_qty); + produceorderMap.put("report_qty",sum); + } + produceorderMap.put("order_status", "03"); + produceorderMap.put("update_optid", currentUserId); + produceorderMap.put("update_optname", nickName); + produceorderMap.put("update_time", now); + wo.update(produceorderMap); + //同时修改这条工单对应的记录表中最新的一条数据的报工数量 + WQLObject wo_record = WQLObject.getWQLObject("MPS_BD_MacOperateRecord"); + //获取最新的工单的对应记录信息 + JSONObject newRecord = wo_record.query("produceorder_id = '"+produceorder_id+"' and (operatetime_end is null or operatetime_end = '')").uniqueResult(0); + newRecord.put("report_qty",report_qty); + newRecord.put("finish_qty",jsonObject.getString("real_qty")); + Integer finishproduct_qty = Integer.parseInt(jsonObject.getString("real_qty")) - Integer.parseInt(newRecord.getString("init_qty")); + newRecord.put("finishproduct_qty",finishproduct_qty); + newRecord.put("operatetime_end",now); + wo_record.update(newRecord); + //wms向acs发送请求 工单暂停 + // 报工的时候同时向acs发送工单暂停状态 + // TODO + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("ext_order_id",produceorder_id); + map.put("type","1"); + array.add(map); + wmsToAcsService.orderStatusUpdate(array); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finish(JSONObject param) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + JSONObject row = param.getJSONObject("row"); + String produceorder_id = row.getString("produceorder_id"); + WQLObject wo = WQLObject.getWQLObject("MPS_BD_ProduceShiftOrder"); + JSONObject produceorderMap = new JSONObject(); + produceorderMap.put("produceorder_id",produceorder_id); + produceorderMap.put("order_status","04"); + produceorderMap.put("update_optid", currentUserId); + produceorderMap.put("device_id", null); + produceorderMap.put("update_optname", nickName); + produceorderMap.put("update_time", now); + produceorderMap.put("realproduceend_date", now); + wo.update(produceorderMap); + //wms向acs发送请求 工单强制完成 + // TODO + JSONArray array = new JSONArray(); + JSONObject map = new JSONObject(); + map.put("ext_order_id",produceorder_id); + map.put("type","3"); + array.add(map); + wmsToAcsService.orderStatusUpdate(array); + } + + @Override + public JSONObject getReportWork(JSONObject param) { + String produceorder_id = param.getString("produceorder_id"); + WQLObject wo = WQLObject.getWQLObject("MPS_BD_ProduceShiftOrder"); + JSONObject jsonProduceShiftOrder = wo.query("produceorder_id = '" + produceorder_id + "'").uniqueResult(0); + WQLObject wo_record = WQLObject.getWQLObject("MPS_BD_MacOperateRecord"); + //获取最新的工单的对应记录信息 + JSONObject jsonObject = wo_record.query("produceorder_id = '"+produceorder_id+"' and (operatetime_end is null or operatetime_end = '')").uniqueResult(0); + String finish_qty = jsonProduceShiftOrder.getString("real_qty"); + jsonObject.put("finish_qty",finish_qty); + Integer finishproduct_qty = Integer.parseInt(finish_qty) - Integer.parseInt(jsonObject.getString("init_qty")); + jsonObject.put("finishproduct_qty",finishproduct_qty); + return jsonObject; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void forceFinish(JSONObject param) { + this.finish(param); + } + + @Override + public JSONArray getDtl(JSONObject param) { + final String produceorder_id = param.getString("produceorder_id"); + JSONObject map = new JSONObject(); + map.put("flag","5"); + map.put("produceorder_id",produceorder_id); + JSONArray resultJSONArray = WQL.getWO("MPS_PRODUCEDURE001").addParamMap(map).process().getResultJSONArray(0); + return resultJSONArray; + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/TeamcorrpersonServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/TeamcorrpersonServiceImpl.java new file mode 100644 index 000000000..e70bd24a6 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/TeamcorrpersonServiceImpl.java @@ -0,0 +1,76 @@ + +package org.nl.wms.mps.service.impl; + + +import cn.hutool.core.map.MapUtil; +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.wms.mps.service.TeamcorrpersonService; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Map; + +/** + * @author geng by + * @description 服务实现 + * @date 2022-05-26 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class TeamcorrpersonServiceImpl implements TeamcorrpersonService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String team_id = MapUtil.getStr(whereJson, "team_id"); + JSONObject map = new JSONObject(); + map.put("flag", "1"); + map.put("team_id", team_id); + JSONObject json = WQL.getWO("MPS_Teamcorrperson001").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "teamPerson.jockey_id"); + return json; + } + + @Override + public JSONArray getPersonIdByTeamId(JSONObject param) { + WQLObject wo = WQLObject.getWQLObject("PDM_BI_TeamCorrPerson"); + final JSONArray resultJSONArray = wo.query("team_id = '" + param.getString("team_id") + "'").getResultJSONArray(0); + return resultJSONArray; + } + + @Override + public void addPersons(JSONObject param) { + WQLObject wo = WQLObject.getWQLObject("PDM_BI_TeamCorrPerson"); + final String team_id = param.getString("team_id"); + final JSONArray persons = param.getJSONArray("persons"); + for (int i = 0; i < persons.size(); i++) { + final JSONObject jsonObject = persons.getJSONObject(i); + final String id = jsonObject.getString("id"); + final JSONObject object = wo.query("team_id = '" + team_id + "' and jockey_id = '" + id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(object)) { + JSONObject map = new JSONObject(); + map.put("team_person_id", IdUtil.getSnowflake(1, 1).nextId()); + map.put("team_id", team_id); + map.put("jockey_id", id); + wo.insert(map); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + WQLObject wo = WQLObject.getWQLObject("PDM_BI_TeamCorrPerson"); + for (Long team_person_id : ids) { + wo.delete("team_person_id = '" + team_person_id + "'"); + } + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/WorkteamServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/WorkteamServiceImpl.java new file mode 100644 index 000000000..99a838a8c --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/service/impl/WorkteamServiceImpl.java @@ -0,0 +1,177 @@ + +package org.nl.wms.mps.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.common.utils.dto.CurrentUser; +import org.nl.modules.system.service.dto.UserDto; +import org.nl.wms.mps.service.WorkteamService; +import org.nl.wms.mps.service.dto.WorkteamDto; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author geng by + * @description 服务实现 + * @date 2022-05-25 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class WorkteamServiceImpl implements WorkteamService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workteam"); + final String search = MapUtil.getStr(whereJson, "search"); + String where = ""; + if (!StrUtil.isEmpty(search)) { + where = " AND (team_code like '%" + search + "%' OR team_name like '%" + search + "%' ) "; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "is_delete = '0'" + where, "update_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workteam"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(WorkteamDto.class); + return null; + } + + @Override + public WorkteamDto findById(Long team_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workteam"); + JSONObject json = wo.query("team_id = '" + team_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(WorkteamDto.class); + } + return null; + } + + @Override + public WorkteamDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workteam"); + JSONObject json = wo.query("team_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(WorkteamDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(WorkteamDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + CurrentUser currentUser = SecurityUtils.getCurrentUser(); + Long deptId = currentUser.getUser().getId(); + + //编码唯一性校验 + String team_code = dto.getTeam_code(); + WorkteamDto byCode = this.findByCode(team_code); + if (ObjectUtil.isNotEmpty(byCode)) throw new BadRequestException("编码已存在!"); + + dto.setTeam_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setSyscompanyid(deptId); + dto.setSysdeptid(deptId); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workteam"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(WorkteamDto dto) { + WorkteamDto entity = this.findById(dto.getTeam_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + //编码唯一性校验 + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workteam"); + String where = "is_delete = '0' and team_code = '" + dto.getTeam_code() + "' and team_id != '" + dto.getTeam_id() + "'"; + + JSONObject jsonObject = wo.query(where).uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) { + throw new BadRequestException("编码已存在!"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workteam"); + WQLObject wo_person = WQLObject.getWQLObject("PDM_BI_TeamCorrPerson"); + for (Long team_id : ids) { + wo.delete("team_id = '" + team_id + "'"); + wo_person.delete("team_id = '" + team_id + "'"); + } + } + + @Override + public JSONArray getClasssystem() { + // WQLObject wo = WQLObject.getWQLObject("PDM_BI_ClassSystem"); + // final JSONArray resultJSONArray = wo.query("is_delete = '0'").getResultJSONArray(0); + //return resultJSONArray; + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeActive(JSONObject json) { + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String is_active = "1"; + if (StrUtil.equals("1", json.getString("is_active"))) { + is_active = "0"; + } + json.put("is_active", is_active); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("PDM_BI_WorkTeam").update(json); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_PRODUCEDURE001.wql b/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_PRODUCEDURE001.wql new file mode 100644 index 000000000..4e7ed7cf4 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_PRODUCEDURE001.wql @@ -0,0 +1,178 @@ +[交易说明] + 交易名: 工单分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.jockey_id TYPEAS s_string + 输入.sale_id TYPEAS s_string + 输入.produceorder_id TYPEAS s_string + 输入.workprocedure_id TYPEAS s_string + 输入.order_type_scode TYPEAS s_string + 输入.order_status TYPEAS s_string + 输入.shift_type_scode TYPEAS s_string + 输入.begin_time TYPEAS s_string + 输入.end_time TYPEAS s_string + 输入.produceorder_code TYPEAS s_string + 输入.material TYPEAS s_string + 输入.product_series TYPEAS f_string + 输入.workprocedure_ids TYPEAS f_string + 输入.unFinish TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + ShiftOrder.*, + material.material_code, + material.material_name, + material.material_spec, + material.product_series, + classstandard.class_id, + classstandard.class_name, + device.device_name + FROM + MPS_BD_ProduceShiftOrder ShiftOrder + LEFT JOIN md_me_materialbase material ON material.material_id = ShiftOrder.material_id + LEFT JOIN pdm_bi_device device ON ShiftOrder.device_id = device.device_id + LEFT JOIN md_pb_classstandard classstandard ON classstandard.class_id = material.product_series + WHERE + ShiftOrder.is_delete = '0' + OPTION 输入.order_type_scode <> "" + ShiftOrder.order_type_scode = 输入.order_type_scode + ENDOPTION + OPTION 输入.unFinish <> "" + ShiftOrder.order_status <> '04' + ENDOPTION + OPTION 输入.order_status <> "" + find_in_set( ShiftOrder.order_status, 输入.order_status) + ENDOPTION + OPTION 输入.shift_type_scode <> "" + ShiftOrder.shift_type_scode = 输入.shift_type_scode + ENDOPTION + OPTION 输入.begin_time <> "" + ShiftOrder.produce_date >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + ShiftOrder.produce_date <= 输入.end_time + ENDOPTION + OPTION 输入.sale_id <> "" + ShiftOrder.sale_id like 输入.sale_id + ENDOPTION + OPTION 输入.produceorder_code <> "" + ShiftOrder.produceorder_code like 输入.produceorder_code + ENDOPTION + OPTION 输入.material <> "" + ( + material.material_code like 输入.material or + material.material_name like 输入.material or + material.material_spec like 输入.material + ) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + personDevice.*, + device.device_code, + device.device_name, + device.workprocedure_id + FROM + PDM_BI_PersonCorrDevice personDevice + LEFT JOIN PDM_BI_Device device ON personDevice.device_id = device.device_id + WHERE + device.is_delete = '0' and personDevice.jockey_id = 输入.jockey_id + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + shiftOrder.*, + workprocedure.workprocedure_name, + material.material_code, + material.material_name, + material.material_spec + FROM + MPS_BD_ProduceShiftOrder shiftOrder + left join PDM_BI_WorkProcedure workprocedure on workprocedure.workprocedure_id = shiftOrder.workprocedure_id + left join md_me_materialbase material on material.material_id = shiftOrder.material_id + WHERE + shiftOrder.is_delete = '0' and shiftOrder.order_status in ('01', '02', '03') + and shiftOrder.workprocedure_id in 输入.workprocedure_ids + order by + shiftOrder.update_time desc + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + personDevice.*, + device.device_code, + device.device_name + FROM + PDM_BI_PersonCorrDevice personDevice + LEFT JOIN PDM_BI_Device device ON personDevice.device_id = device.device_id + WHERE + device.is_delete = '0' and personDevice.jockey_id = 输入.jockey_id and device.workprocedure_id = 输入.workprocedure_id + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + record.*, + device.device_code, + device.device_name, + user.nick_name + FROM + MPS_BD_MacOperateRecord record + LEFT JOIN PDM_BI_Device device ON record.device_id = device.device_id + LEFT JOIN sys_user user ON user.user_id = record.jockey_id + WHERE + record.produceorder_id = 输入.produceorder_id + order by + record.operatetime_start + ENDSELECT + ENDQUERY + ENDIF + diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_Personcorrdevice001.wql b/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_Personcorrdevice001.wql new file mode 100644 index 000000000..1230bf0d1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_Personcorrdevice001.wql @@ -0,0 +1,130 @@ +[交易说明] + 交易名: 人员设备维护查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.user_id TYPEAS s_string + 输入.device_id TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + view_person.* + FROM + ( + SELECT + personDevice.*, + user.* + FROM + PDM_BI_PersonCorrDevice personDevice + LEFT JOIN sys_user user ON personDevice.jockey_id = user.user_id + WHERE + user.enabled = '1' + GROUP BY + personDevice.jockey_id + ) view_person + where + 1 = 1 + OPTION 输入.search <> "" + (view_person.username like 输入.search or + view_person.nick_name like 输入.search or + view_person.phone like 输入.search) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + personDevice.* , + device.device_code, + device.device_name, + item.item_code, + item.item_name + FROM + PDM_BI_PersonCorrDevice personDevice + LEFT JOIN sys_user user ON personDevice.jockey_id = user.user_id + LEFT JOIN PDM_BI_Device device ON personDevice.device_id = device.device_id + left join PDM_BI_DeviceItemValue deviceValue on deviceValue.device_id = device.device_id + left join PDM_BI_DeviceItem item on item.item_id = deviceValue.item_id + where + personDevice.jockey_id = 输入.user_id + GROUP BY + item.item_code + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + PAGEQUERY + SELECT + personDevice.*, + device.device_code, + device.device_name, + work.workprocedure_code, + work.workprocedure_name + FROM + PDM_BI_PersonCorrDevice personDevice + left join PDM_BI_Device device on device.device_id = personDevice.device_id + left join PDM_BI_WorkProcedure work on device.workprocedure_id = work.workprocedure_id + where + personDevice.jockey_id = 输入.user_id and (personDevice.device_id is not null or personDevice.device_id != "" ) + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + deviceItemValue.device_id, + deviceItemValue.item_id, + deviceItemValue.item_value, + item.item_code + FROM + PDM_BI_DeviceItemValue deviceItemValue + LEFT JOIN PDM_BI_Device device ON deviceItemValue.device_id = device.device_id + LEFT JOIN PDM_BI_DeviceItem item ON deviceItemValue.item_id = item.item_id + where + deviceItemValue.device_id = 输入.device_id + ENDSELECT + ENDQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_Teamcorrperson001.wql b/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_Teamcorrperson001.wql new file mode 100644 index 000000000..b6c862b8d --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/mps/wql/MPS_Teamcorrperson001.wql @@ -0,0 +1,58 @@ +[交易说明] + 交易名: 班组人员维护查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.team_id TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + teamPerson.*, + user.* + FROM + PDM_BI_TeamCorrPerson teamPerson + LEFT JOIN PDM_BI_WorkTeam team ON teamPerson.team_id = team.team_id + LEFT JOIN sys_user user ON teamPerson.jockey_id = user.user_id + WHERE + teamPerson.team_id = 输入.team_id + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java b/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java new file mode 100644 index 000000000..322deb7e4 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java @@ -0,0 +1,39 @@ +package org.nl.wms.pda.callmaterial.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pda.callmaterial.service.CallMaterialService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "手持叫料") +@RequestMapping("api/pda/callMaterial") +@Slf4j +public class CallMaterialController { + + private final CallMaterialService callMaterialService; + + @PostMapping("/queryPoint") + @Log("查询区域点位") + @ApiOperation("查询区域点位") + public ResponseEntity queryPoint() { + return new ResponseEntity<>(callMaterialService.queryPoint(), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("叫料确定") + @ApiOperation("叫料确定") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(callMaterialService.confirm(whereJson), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java b/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java new file mode 100644 index 000000000..e85a64bcf --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java @@ -0,0 +1,19 @@ +package org.nl.wms.pda.callmaterial.service; + +import com.alibaba.fastjson.JSONObject; + +public interface CallMaterialService { + + /** + * 查询区域点位 + * @return json + */ + JSONObject queryPoint(); + + /** + * 叫料确定 + * @param whereJson / + * @return JSONObject + */ + JSONObject confirm(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java new file mode 100644 index 000000000..9cd9cae14 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java @@ -0,0 +1,60 @@ +package org.nl.wms.pda.callmaterial.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.pda.callmaterial.service.CallMaterialService; +import org.nl.modules.wql.WQL; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class CallMaterialServiceImpl implements CallMaterialService { + private final AcsToWmsService acsToWmsService; + + @Override + public JSONObject queryPoint() { + JSONObject result = new JSONObject(); + // 1.查询区域:油漆区域 YQQY01 + JSONArray regionArr = WQL.getWO("PDA_CALLMATERIAL_01").addParam("flag", "1").process().getResultJSONArray(0); + // 2.根据区域查询对应的物料上料位 + JSONObject resultJson = new JSONObject(); + for (int i = 0; i < regionArr.size(); i++) { + JSONObject jsonRegion = regionArr.getJSONObject(i); + JSONArray pointArr = WQL.getWO("PDA_CALLMATERIAL_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); + jsonRegion.put("pointArr", pointArr); + } + resultJson.put("regionja", regionArr); + result.put("result", resultJson); + result.put("code", "1"); + result.put("desc", "查询成功"); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject confirm(JSONObject whereJson) { + JSONObject result = new JSONObject(); + // 1、准备参数:point_code、type = 4 + JSONObject param = new JSONObject(); + param.put("type","4"); + param.put("point_code",whereJson.getString("point_code")); + // 2、调用接口 + JSONObject json = acsToWmsService.apply(param); + if (StrUtil.equals(json.getString("status"), "200")) { + result.put("result", ""); + result.put("code", "1"); + result.put("desc", "操作成功"); + } else { + result.put("result", ""); + result.put("code", "0"); + result.put("desc", "操作失败:"+json.getString("message")); + } + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql b/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql new file mode 100644 index 000000000..3c39c5e1b --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql @@ -0,0 +1,77 @@ +[交易说明] + 交易名: 手持叫料查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_id TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + region_id, + region_code, + region_name + FROM + sch_base_region + WHERE + is_used = '1' + AND region_code = 'YQQY01' + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point_id, + point_code, + point_name + FROM + sch_base_point + WHERE + is_used = '1' + AND is_delete = '0' + AND is_host = '0' + AND device_point_type = '3' + + OPTION 输入.region_id <> "" + region_id = 输入.region_id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/rest/CallVehicleController.java b/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/rest/CallVehicleController.java new file mode 100644 index 000000000..c666046d1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/rest/CallVehicleController.java @@ -0,0 +1,39 @@ +package org.nl.wms.pda.callvehicle.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pda.callvehicle.service.CallVehicleService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "手持呼叫空托盘") +@RequestMapping("api/pda/callEmpty") +@Slf4j +public class CallVehicleController { + + private final CallVehicleService callVehicleService; + + @PostMapping("/queryPoint") + @Log("查询区域点位") + @ApiOperation("查询区域点位") + public ResponseEntity queryPoint() { + return new ResponseEntity<>(callVehicleService.queryPoint(), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("呼叫空托盘确定") + @ApiOperation("呼叫空托盘确定") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(callVehicleService.confirm(whereJson), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/CallVehicleService.java b/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/CallVehicleService.java new file mode 100644 index 000000000..66d4c7b5b --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/CallVehicleService.java @@ -0,0 +1,19 @@ +package org.nl.wms.pda.callvehicle.service; + +import com.alibaba.fastjson.JSONObject; + +public interface CallVehicleService { + + /** + * 查询区域点位 + * @return JSONObject + */ + JSONObject queryPoint(); + + /** + * 呼叫空托盘确定 + * @param whereJson / + * @return JSONObject + */ + JSONObject confirm(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/impl/CallVehicleServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/impl/CallVehicleServiceImpl.java new file mode 100644 index 000000000..db8882788 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/impl/CallVehicleServiceImpl.java @@ -0,0 +1,69 @@ +package org.nl.wms.pda.callvehicle.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.pda.callvehicle.service.CallVehicleService; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class CallVehicleServiceImpl implements CallVehicleService { + + private final AcsToWmsService acsToWmsService; + + @Override + public JSONObject queryPoint() { + JSONObject result = new JSONObject(); + // 1.查询区域:油漆区域 YQQY01、共挤区域 GJQY01 + JSONArray regionArr = WQL.getWO("PDA_CALLVEHICLE_01").addParam("flag", "1").process().getResultJSONArray(0); + // 2.根据区域查询对应的物料上料位 + JSONObject resultJson = new JSONObject(); + for (int i = 0; i < regionArr.size(); i++) { + JSONObject jsonRegion = regionArr.getJSONObject(i); + JSONArray pointArr = WQL.getWO("PDA_CALLVEHICLE_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); + jsonRegion.put("pointArr", pointArr); + } + resultJson.put("regionja", regionArr); + result.put("result", resultJson); + result.put("code", "1"); + result.put("desc", "查询成功"); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject confirm(JSONObject whereJson) { + JSONObject result = new JSONObject(); + // 1、准备参数:point_code、type:1为共挤区域,3为油漆区域 + JSONObject param = new JSONObject(); + + String region_id = whereJson.getString("region_id"); + JSONObject jsonObject = WQLObject.getWQLObject("sch_base_region").query("region_id ='" + region_id + "'").uniqueResult(0); + String region_code = jsonObject.getString("region_code"); + if (StrUtil.equals(region_code, "GJQY01")) param.put("type","1"); + if (StrUtil.equals(region_code, "YQQY01")) param.put("type","3"); + + param.put("point_code",whereJson.getString("point_code")); + param.put("vehicle_num",whereJson.getString("qty")); + // 2、调用接口 + JSONObject json = acsToWmsService.apply(param); + if (StrUtil.equals(json.getString("status"), "200")) { + result.put("result", ""); + result.put("code", "1"); + result.put("desc", "操作成功"); + } else { + result.put("result", ""); + result.put("code", "0"); + result.put("desc", "操作失败:"+json.getString("message")); + } + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/wql/PDA_CALLVEHICLE_01.wql b/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/wql/PDA_CALLVEHICLE_01.wql new file mode 100644 index 000000000..339dd16d5 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/wql/PDA_CALLVEHICLE_01.wql @@ -0,0 +1,77 @@ +[交易说明] + 交易名: 手持呼叫空托盘查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_id TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + region_id, + region_code, + region_name + FROM + sch_base_region + WHERE + is_used = '1' + AND region_code in ('YQQY01','GJQY01') + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point_id, + point_code, + point_name + FROM + sch_base_point + WHERE + is_used = '1' + AND is_delete = '0' + AND is_host = '0' + AND device_point_type = '1' + + OPTION 输入.region_id <> "" + region_id = 输入.region_id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/rest/EmptyAndQtyController.java b/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/rest/EmptyAndQtyController.java new file mode 100644 index 000000000..371d7c9ee --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/rest/EmptyAndQtyController.java @@ -0,0 +1,32 @@ +package org.nl.wms.pda.emptyandqty.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pda.emptyandqty.service.EmptyAndQtyService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "手持空托盘与数量绑定") +@RequestMapping("api/pda/emptyAndQty") +@Slf4j +public class EmptyAndQtyController { + + private final EmptyAndQtyService emptyAndQtyService; + + @PostMapping("/confirm") + @Log("绑定") + @ApiOperation("绑定") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(emptyAndQtyService.confirm(whereJson), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/service/EmptyAndQtyService.java b/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/service/EmptyAndQtyService.java new file mode 100644 index 000000000..70a1bd845 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/service/EmptyAndQtyService.java @@ -0,0 +1,13 @@ +package org.nl.wms.pda.emptyandqty.service; + +import com.alibaba.fastjson.JSONObject; + +public interface EmptyAndQtyService { + + /** + * 绑定 + * @param whereJson / + * @return JSONObject + */ + JSONObject confirm(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/service/impl/EmptyAndQtyServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/service/impl/EmptyAndQtyServiceImpl.java new file mode 100644 index 000000000..c87db6409 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/emptyandqty/service/impl/EmptyAndQtyServiceImpl.java @@ -0,0 +1,49 @@ +package org.nl.wms.pda.emptyandqty.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.master.service.StoragevehicleinfoService; +import org.nl.wms.basedata.master.service.dto.StoragevehicleinfoDto; +import org.nl.wms.pda.emptyandqty.service.EmptyAndQtyService; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class EmptyAndQtyServiceImpl implements EmptyAndQtyService { + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject confirm(JSONObject whereJson) { + String vehicle_code = whereJson.getString("vehicle_code"); + String qty = whereJson.getString("qty"); + + WQLObject vqTab = WQLObject.getWQLObject("PDM_BI_vehicleQty"); + StoragevehicleinfoDto byCode = SpringContextHolder.getBean(StoragevehicleinfoService.class).findByCode(vehicle_code); + + // 插入记录 + JSONObject json = new JSONObject(); + json.put("vehicleqty_id", IdUtil.getSnowflake(1, 1).nextId()); + json.put("vehicle_id", byCode.getStoragevehicle_id()); + json.put("vehicle_code", vehicle_code); + json.put("qty", qty); + json.put("is_task", "0"); + json.put("create_id", SecurityUtils.getCurrentUserId()); + json.put("create_name", SecurityUtils.getCurrentNickName()); + json.put("create_time", DateUtil.now()); + vqTab.insert(json); + // 返回成功 + JSONObject result = new JSONObject(); + result.put("srb", ""); + result.put("code", "1"); + result.put("desc", "操作成功"); + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/rest/SendMaterialController.java b/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/rest/SendMaterialController.java new file mode 100644 index 000000000..4e283d4c3 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/rest/SendMaterialController.java @@ -0,0 +1,39 @@ +package org.nl.wms.pda.sendmaterial.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pda.sendmaterial.service.SendMaterialService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "手持送料") +@RequestMapping("api/pda/sendMaterial") +@Slf4j +public class SendMaterialController { + + private final SendMaterialService sendMaterialService; + + @PostMapping("/queryPoint") + @Log("查询区域点位") + @ApiOperation("查询区域点位") + public ResponseEntity queryPoint() { + return new ResponseEntity<>(sendMaterialService.queryPoint(), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("送料确定") + @ApiOperation("送料确定") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(sendMaterialService.confirm(whereJson), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/SendMaterialService.java b/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/SendMaterialService.java new file mode 100644 index 000000000..8e00ec01c --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/SendMaterialService.java @@ -0,0 +1,19 @@ +package org.nl.wms.pda.sendmaterial.service; + +import com.alibaba.fastjson.JSONObject; + +public interface SendMaterialService { + + /** + * 查询区域点位 + * @return JSONObject + */ + JSONObject queryPoint(); + + /** + * 送料确定 + * @param whereJson / + * @return JSONObject + */ + JSONObject confirm(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/impl/SendMaterialServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/impl/SendMaterialServiceImpl.java new file mode 100644 index 000000000..315590199 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/impl/SendMaterialServiceImpl.java @@ -0,0 +1,69 @@ +package org.nl.wms.pda.sendmaterial.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.pda.sendmaterial.service.SendMaterialService; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SendMaterialServiceImpl implements SendMaterialService { + + private final AcsToWmsService acsToWmsService; + + @Override + public JSONObject queryPoint() { + JSONObject result = new JSONObject(); + // 1.查询区域:豪凯区域 HKQY01、共挤区域 GJQY01 + JSONArray regionArr = WQL.getWO("PDA_SENDMATERIAL_01").addParam("flag", "1").process().getResultJSONArray(0); + // 2.根据区域查询对应的物料上料位 + JSONObject resultJson = new JSONObject(); + for (int i = 0; i < regionArr.size(); i++) { + JSONObject jsonRegion = regionArr.getJSONObject(i); + JSONArray pointArr = WQL.getWO("PDA_SENDMATERIAL_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); + jsonRegion.put("pointArr", pointArr); + } + resultJson.put("regionja", regionArr); + result.put("result", resultJson); + result.put("code", "1"); + result.put("desc", "查询成功"); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject confirm(JSONObject whereJson) { + JSONObject result = new JSONObject(); + // 1、准备参数:point_code、type:2为共挤区域,8为豪凯区域 + JSONObject param = new JSONObject(); + + String region_id = whereJson.getString("region_id"); + JSONObject jsonObject = WQLObject.getWQLObject("sch_base_region").query("region_id ='" + region_id + "'").uniqueResult(0); + String region_code = jsonObject.getString("region_code"); + if (StrUtil.equals(region_code, "GJQY01")) param.put("type","2"); + if (StrUtil.equals(region_code, "HKQY01")) param.put("type","8"); + + param.put("point_code",whereJson.getString("point_code")); + param.put("qty",whereJson.getString("qty")); + // 2、调用接口 + JSONObject json = acsToWmsService.apply(param); + if (StrUtil.equals(json.getString("status"), "200")) { + result.put("result", ""); + result.put("code", "1"); + result.put("desc", "操作成功"); + } else { + result.put("result", ""); + result.put("code", "0"); + result.put("desc", "操作失败:"+json.getString("message")); + } + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/wql/PDA_SENDMATERIAL_01.wql b/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/wql/PDA_SENDMATERIAL_01.wql new file mode 100644 index 000000000..5c5c7cec1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/wql/PDA_SENDMATERIAL_01.wql @@ -0,0 +1,77 @@ +[交易说明] + 交易名: 手持送料查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_id TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + region_id, + region_code, + region_name + FROM + sch_base_region + WHERE + is_used = '1' + AND region_code in ('HKQY01','GJQY01') + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point_id, + point_code, + point_name + FROM + sch_base_point + WHERE + is_used = '1' + AND is_delete = '0' + AND is_host = '0' + AND device_point_type = '2' + + OPTION 输入.region_id <> "" + region_id = 输入.region_id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java b/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java new file mode 100644 index 000000000..4ba41544e --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java @@ -0,0 +1,39 @@ +package org.nl.wms.pda.sendvehicle.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pda.sendvehicle.service.SendVehicleService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@Api(tags = "手持送空托盘") +@RequestMapping("api/pda/sendEmpty") +@Slf4j +public class SendVehicleController { + + private final SendVehicleService sendVehicleService; + + @PostMapping("/queryPoint") + @Log("查询区域点位") + @ApiOperation("查询区域点位") + public ResponseEntity queryPoint() { + return new ResponseEntity<>(sendVehicleService.queryPoint(), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("送空托盘确定") + @ApiOperation("送空托盘确定") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(sendVehicleService.confirm(whereJson), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java b/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java new file mode 100644 index 000000000..f4d5ad0f1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java @@ -0,0 +1,19 @@ +package org.nl.wms.pda.sendvehicle.service; + +import com.alibaba.fastjson.JSONObject; + +public interface SendVehicleService { + + /** + * 查询区域点位 + * @return JSONObject + */ + JSONObject queryPoint(); + + /** + * 送空托盘确定 + * @param whereJson / + * @return JSONObject + */ + JSONObject confirm(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java new file mode 100644 index 000000000..a2578895b --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java @@ -0,0 +1,76 @@ +package org.nl.wms.pda.sendvehicle.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.wms.ext.acs.service.AcsToWmsService; +import org.nl.wms.pda.sendvehicle.service.SendVehicleService; +import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SendVehicleServiceImpl implements SendVehicleService { + + private final AcsToWmsService acsToWmsService; + + @Override + public JSONObject queryPoint() { + JSONObject result = new JSONObject(); + // 1.查询区域:输送区域 SSX01、油漆区域 YQQY01 + JSONArray regionArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "1").process().getResultJSONArray(0); + // 2.根据区域查询对应的物料上料位 + JSONObject resultJson = new JSONObject(); + for (int i = 0; i < regionArr.size(); i++) { + JSONObject jsonRegion = regionArr.getJSONObject(i); + if (StrUtil.equals(jsonRegion.getString("region_id"), RegionTypeEnum.SSX.getId())) { + JSONArray pointArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); + jsonRegion.put("pointArr", pointArr); + } else { + JSONArray pointArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "3").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); + jsonRegion.put("pointArr", pointArr); + } + } + resultJson.put("regionja", regionArr); + result.put("result", resultJson); + result.put("code", "1"); + result.put("desc", "查询成功"); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject confirm(JSONObject whereJson) { + JSONObject result = new JSONObject(); + // 1、准备参数:point_code、type:6为输送线区域,5为油漆区域 + JSONObject param = new JSONObject(); + + String region_id = whereJson.getString("region_id"); + JSONObject jsonObject = WQLObject.getWQLObject("sch_base_region").query("region_id ='" + region_id + "'").uniqueResult(0); + String region_code = jsonObject.getString("region_code"); + if (StrUtil.equals(region_code, "SSX01")) param.put("type","6"); + if (StrUtil.equals(region_code, "YQQY01")) param.put("type","5"); + + param.put("point_code",whereJson.getString("point_code")); + param.put("vehicle_code",whereJson.getString("vehicle_code")); + param.put("vehicle_num",whereJson.getString("qty")); + // 2、调用接口 + JSONObject json = acsToWmsService.apply(param); + if (StrUtil.equals(json.getString("status"), "200")) { + result.put("result", ""); + result.put("code", "1"); + result.put("desc", "操作成功"); + } else { + result.put("result", ""); + result.put("code", "0"); + result.put("desc", "操作失败:"+json.getString("message")); + } + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql b/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql new file mode 100644 index 000000000..4c7fdef73 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql @@ -0,0 +1,99 @@ +[交易说明] + 交易名: 手持送空托盘查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_id TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + region_id, + region_code, + region_name + FROM + sch_base_region + WHERE + is_used = '1' + AND region_code in ('SSX01','YQQY01') + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point_id, + point_code, + point_name + FROM + sch_base_point + WHERE + is_used = '1' + AND is_delete = '0' + AND is_host = '0' + AND device_point_type = '6' + + OPTION 输入.region_id <> "" + region_id = 输入.region_id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + point_id, + point_code, + point_name + FROM + sch_base_point + WHERE + is_used = '1' + AND is_delete = '0' + AND is_host = '0' + AND device_point_type = '4' + + OPTION 输入.region_id <> "" + region_id = 输入.region_id + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/rest/DeviceController.java b/nladmin-system/src/main/java/org/nl/wms/pdm/rest/DeviceController.java new file mode 100644 index 000000000..bec71efc3 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/rest/DeviceController.java @@ -0,0 +1,77 @@ + +package org.nl.wms.pdm.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.dto.DeviceDto; +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; + +/** +* @author geng by +* @date 2022-05-25 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "生产设备管理") +@RequestMapping("/api/device") +@Slf4j +public class DeviceController { + + private final DeviceService deviceService; + + @GetMapping + @Log("查询生产设备") + @ApiOperation("查询生产设备") + //@PreAuthorize("@el.check('device:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(deviceService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增生产设备") + @ApiOperation("新增生产设备") + //@PreAuthorize("@el.check('device:add')") + public ResponseEntity create(@Validated @RequestBody DeviceDto dto){ + deviceService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改生产设备") + @ApiOperation("修改生产设备") + //@PreAuthorize("@el.check('device:edit')") + public ResponseEntity update(@Validated @RequestBody DeviceDto dto){ + deviceService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除生产设备") + @ApiOperation("删除生产设备") + //@PreAuthorize("@el.check('device:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + deviceService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping("/changeActive") + @Log("修改点位启用状态") + @ApiOperation("修改点位启用状态") + public ResponseEntity changeActive(@RequestBody JSONObject json) { + deviceService.changeActive(json); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/rest/DeviceitemController.java b/nladmin-system/src/main/java/org/nl/wms/pdm/rest/DeviceitemController.java new file mode 100644 index 000000000..9e66e1c1e --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/rest/DeviceitemController.java @@ -0,0 +1,68 @@ + +package org.nl.wms.pdm.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pdm.service.DeviceitemService; +import org.nl.wms.pdm.service.dto.DeviceitemDto; +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; + +/** +* @author geng by +* @date 2022-05-25 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "生产设备扩展项管理") +@RequestMapping("/api/deviceitem") +@Slf4j +public class DeviceitemController { + + private final DeviceitemService deviceitemService; + + @GetMapping + @Log("查询生产设备扩展项") + @ApiOperation("查询生产设备扩展项") + //@PreAuthorize("@el.check('deviceitem:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(deviceitemService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增生产设备扩展项") + @ApiOperation("新增生产设备扩展项") + //@PreAuthorize("@el.check('deviceitem:add')") + public ResponseEntity create(@Validated @RequestBody DeviceitemDto dto){ + deviceitemService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改生产设备扩展项") + @ApiOperation("修改生产设备扩展项") + //@PreAuthorize("@el.check('deviceitem:edit')") + public ResponseEntity update(@Validated @RequestBody DeviceitemDto dto){ + deviceitemService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除生产设备扩展项") + @ApiOperation("删除生产设备扩展项") + //@PreAuthorize("@el.check('deviceitem:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + deviceitemService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/rest/ProcessrouteController.java b/nladmin-system/src/main/java/org/nl/wms/pdm/rest/ProcessrouteController.java new file mode 100644 index 000000000..e2b7be9d0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/rest/ProcessrouteController.java @@ -0,0 +1,96 @@ + +package org.nl.wms.pdm.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pdm.service.ProcessrouteService; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * @author Zz + * @date 2022-03-21 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "工艺路线管理") +@RequestMapping("/api/processroute") +@Slf4j +public class ProcessrouteController { + + private final ProcessrouteService processrouteService; + + @GetMapping + @Log("查询工艺路线") + @ApiOperation("查询工艺路线") + //@PreAuthorize("@el.check('processroute:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(processrouteService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增工艺路线") + @ApiOperation("新增工艺路线") + //@PreAuthorize("@el.check('processroute:add')") + public ResponseEntity create(@RequestBody JSONObject json) { + processrouteService.create(json); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改工艺路线") + @ApiOperation("修改工艺路线") + //@PreAuthorize("@el.check('processroute:edit')") + public ResponseEntity update(@RequestBody JSONObject whereJson) { + processrouteService.update(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除工艺路线") + @ApiOperation("删除工艺路线") + //@PreAuthorize("@el.check('processroute:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + processrouteService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("获取工序") + @ApiOperation("获取工序") + @GetMapping("/getWorkList") + public ResponseEntity getWorkList() { + return new ResponseEntity<>(processrouteService.getWorkList(), HttpStatus.OK); + } + + @Log("获取明细") + @ApiOperation("获取明细") + @GetMapping("/getDtl") + public ResponseEntity getDtl(@RequestParam Map map) { + return new ResponseEntity<>(processrouteService.getDtl(map), HttpStatus.OK); + } + + @Log("提交") + @ApiOperation("提交") + @PutMapping("/submit") + public ResponseEntity submit(@RequestBody JSONObject whereJson) { + processrouteService.submit(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("取消提交") + @ApiOperation("取消提交") + @PutMapping("/CancelSubmit") + public ResponseEntity CancelSubmit(@RequestBody JSONObject whereJson) { + processrouteService.CancelSubmit(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/rest/WorkProcedureController.java b/nladmin-system/src/main/java/org/nl/wms/pdm/rest/WorkProcedureController.java new file mode 100644 index 000000000..289ff8eb7 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/rest/WorkProcedureController.java @@ -0,0 +1,79 @@ + +package org.nl.wms.pdm.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.pdm.service.WorkProcedureService; +import org.nl.wms.pdm.service.dto.WorkProcedureDto; +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; + +/** + * + * @author Zz + * @date 2021-12-19 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "工序管理") +@RequestMapping("/api/workProcedure") +@Slf4j +public class WorkProcedureController { + + + private final WorkProcedureService workProcedureService; + + @GetMapping + @Log("查询工序") + @ApiOperation("查询工序") + //@PreAuthorize("@el.check('WorkProcedure:list')") + + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(workProcedureService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增工序") + @ApiOperation("新增工序") + //@PreAuthorize("@el.check('WorkProcedure:add')") + + public ResponseEntity create(@Validated @RequestBody WorkProcedureDto dto) { + workProcedureService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改工序") + @ApiOperation("修改工序") + //@PreAuthorize("@el.check('WorkProcedure:edit')") + + public ResponseEntity update(@Validated @RequestBody WorkProcedureDto dto) { + workProcedureService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除工序") + @ApiOperation("删除工序") + //@PreAuthorize("@el.check('WorkProcedure:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + workProcedureService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/downSelect") + @Log("查询工序下拉列表") + @ApiOperation("查询工序下拉列表") + public ResponseEntity downSelect() { + return new ResponseEntity<>(workProcedureService.downSelect(), HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/DeviceService.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/DeviceService.java new file mode 100644 index 000000000..147b5b825 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/DeviceService.java @@ -0,0 +1,68 @@ + +package org.nl.wms.pdm.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author geng by +* @date 2022-05-25 +**/ +public interface DeviceService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param device_id ID + * @return Device + */ + DeviceDto findById(Long device_id); + + /** + * 根据编码查询 + * @param code code + * @return Device + */ + DeviceDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(DeviceDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(DeviceDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + + void changeActive(JSONObject json); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/DeviceitemService.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/DeviceitemService.java new file mode 100644 index 000000000..158aa1160 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/DeviceitemService.java @@ -0,0 +1,65 @@ + +package org.nl.wms.pdm.service; + +import org.nl.wms.pdm.service.dto.DeviceitemDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author geng by +* @date 2022-05-25 +**/ +public interface DeviceitemService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param item_id ID + * @return Deviceitem + */ + DeviceitemDto findById(Long item_id); + + /** + * 根据编码查询 + * @param code code + * @return Deviceitem + */ + DeviceitemDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(DeviceitemDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(DeviceitemDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/ProcessrouteService.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/ProcessrouteService.java new file mode 100644 index 000000000..81661a9c4 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/ProcessrouteService.java @@ -0,0 +1,100 @@ + +package org.nl.wms.pdm.service; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.pdm.service.dto.ProcessrouteDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author Zz + * @description 服务接口 + * @date 2022-03-21 + **/ +public interface ProcessrouteService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param processroute_id ID + * @return Processroute + */ + ProcessrouteDto findById(String processroute_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Processroute + */ + ProcessrouteDto findByCode(String code); + + + /** + * 创建 + * + * @param json / + */ + void create(JSONObject json); + + /** + * 编辑 + * + * @param whereJson / + */ + void update(JSONObject whereJson); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 获取工序 + */ + JSONArray getWorkList(); + + /** + * 获取明细 + * + * @param map / + */ + JSONArray getDtl(Map map); + + /** + * 提交 + * + * @param whereJson / + */ + void submit(JSONObject whereJson); + + /** + * 取消提交 + * + * @param whereJson / + */ + void CancelSubmit(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkProcedureService.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkProcedureService.java new file mode 100644 index 000000000..37dd76114 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/WorkProcedureService.java @@ -0,0 +1,81 @@ + +package org.nl.wms.pdm.service; + +import com.alibaba.fastjson.JSONArray; +import org.nl.wms.pdm.service.dto.WorkProcedureDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author ldjun + * @description 服务接口 + * @date 2021-12-19 + **/ +public interface WorkProcedureService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param workProcedure_id ID + * @return WorkProcedure + */ + WorkProcedureDto findById(Long workProcedure_id); + + /** + * 根据编码查询 + * + * @param code code + * @return WorkProcedure + */ + WorkProcedureDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(WorkProcedureDto dto); + + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 编辑 + * + * @param dto / + */ + void update(WorkProcedureDto dto); + + + /** + * 获取下拉选列表 + * + * @return + */ + JSONArray downSelect(); + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/BomDto.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/BomDto.java new file mode 100644 index 000000000..f85d6b14e --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/BomDto.java @@ -0,0 +1,63 @@ +package org.nl.wms.pdm.service.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author geng by +* @date 2022-06-02 +**/ +@Data +public class BomDto implements Serializable { + + /** BOM单标识 */ + private String bom_uuid; + + /** BOM单编码 */ + private String bom_code; + + /** BOM单名称 */ + private String bom_name; + + /** 物料标识 */ + private String material_uuid; + + /** 产品工艺路线标识 */ + private String processroute_uuid; + + /** 成材率百分比 */ + private BigDecimal yield_rate; + + /** 成品率百分比 */ + private BigDecimal endproduct_rate; + + /** BOM单状态 */ + private String bom_status; + + /** 明细数 */ + private BigDecimal detail_count; + + /** 备注 */ + private String remark; + + /** 创建人 */ + private Long create_id; + + /** 创建人 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceDto.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceDto.java new file mode 100644 index 000000000..e1918955c --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceDto.java @@ -0,0 +1,79 @@ +package org.nl.wms.pdm.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author geng by + * @description / + * @date 2022-05-25 + **/ +@Data +public class DeviceDto implements Serializable { + + /** 设备标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long device_id; + + /** + * 设备编码 + */ + private String device_code; + + /** + * 设备名称 + */ + private String device_name; + + /** + * 设备型号 + */ + private String device_model; + + /** + * 外部编码 + */ + private String extend_code; + + /** + * 备注 + */ + private String remark; + + /** + * 是否启用 + */ + private String is_active; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 是否删除 + */ + private String is_delete; + + /** + * 设备产能 + */ + private BigDecimal productivity; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceitemDto.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceitemDto.java new file mode 100644 index 000000000..dc36e1a15 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/DeviceitemDto.java @@ -0,0 +1,54 @@ +package org.nl.wms.pdm.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author geng by + * @description / + * @date 2022-05-25 + **/ +@Data +public class DeviceitemDto implements Serializable { + + /** 项点标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long item_id; + + /** + * 项点编码 + */ + private String item_code; + + /** + * 项点名称 + */ + private String item_name; + + /** + * 默认值 + */ + private String default_value; + + /** + * 备注 + */ + private String remark; + + /** + * 顺序 + */ + private BigDecimal order_seq; + + /** + * 默认值类型 + */ + private String data_type; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/ProcessrouteDto.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/ProcessrouteDto.java new file mode 100644 index 000000000..bbaabc202 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/ProcessrouteDto.java @@ -0,0 +1,76 @@ +package org.nl.wms.pdm.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author Lxy +* @date 2022-03-21 +**/ +@Data +public class ProcessrouteDto implements Serializable { + + /** 工艺路线标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long processroute_id; + + /** 工艺路线编码 */ + private String processroute_code; + + /** 工艺路线名称 */ + private String processroute_name; + + /** 状态 */ + private String processroute_status; + + /** 明细数 */ + private BigDecimal detail_count; + + /** 备注 */ + private String remark; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; + + /** 审核人 */ + private Long audit_optid; + + /** 审核人姓名 */ + private String audit_optname; + + /** 审核时间 */ + private String audit_time; + + /** 部门ID */ + private Long sysdeptid; + + /** 公司ID */ + private Long syscompanyid; + + /** 是否删除 */ + private String is_delete; + + /** 外部标识 */ + private String ext_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/ProductprocessrouteDto.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/ProductprocessrouteDto.java new file mode 100644 index 000000000..4a800eeb2 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/ProductprocessrouteDto.java @@ -0,0 +1,78 @@ +package org.nl.wms.pdm.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** +* @description / +* @author zhouz +* @date 2022-03-22 +**/ +@Data +public class ProductprocessrouteDto implements Serializable { + + /** 产品工艺路线标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long productprocess_id; + + /** 物料标识 */ + private Long material_id; + + /** 工艺路线标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long processroute_id; + + /** 产品工艺路线状态 */ + private String productprocess_status; + + /** 明细数 */ + private BigDecimal detail_count; + + /** 备注 */ + private String remark; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 创建时间 */ + private String create_time; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; + + /** 修改时间 */ + private String update_time; + + /** 审核人 */ + private Long audit_optid; + + /** 审核人姓名 */ + private String audit_optname; + + /** 审核时间 */ + private String audit_time; + + /** 部门ID */ + private Long sysdeptid; + + /** 公司ID */ + private Long syscompanyid; + + /** 是否删除 */ + private String is_delete; + + /** 外部标识 */ + private String ext_id; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkProcedureDto.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkProcedureDto.java new file mode 100644 index 000000000..e4c693429 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/dto/WorkProcedureDto.java @@ -0,0 +1,110 @@ +package org.nl.wms.pdm.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ldjun + * @description / + * @date 2021-12-19 + **/ +@Data +public class WorkProcedureDto implements Serializable { + + /** 工序标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long workprocedure_id; + private Long sysdeptid; + private Long syscompanyid; + + /** + * 工序编码 + */ + private String workprocedure_code; + + /** + * 工序名称 + */ + private String workprocedure_name; + + /** + * 是否关键工序 + */ + private String is_keyworkprocedure; + + /** + * 是否完工汇报 + */ + private String is_finishback; + + /** + * 是否启用 + */ + private String is_used; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 是否删除 + */ + private String is_delete; + + /** + * 外部标识 + */ + private String ext_id; + + /** + * 业务组织标识 + */ + private Long org_id; + + /** + * 业务组织编码 + */ + private String org_code; + + /** + * 业务组织名字 + */ + private String org_name; + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; +} + diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceServiceImpl.java new file mode 100644 index 000000000..74ddc971f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceServiceImpl.java @@ -0,0 +1,140 @@ + +package org.nl.wms.pdm.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author geng by + * @description 服务实现 + * @date 2022-05-25 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class DeviceServiceImpl implements DeviceService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String search = MapUtil.getStr(whereJson, "search"); + JSONObject map = new JSONObject(); + map.put("flag", "1"); + if (!StrUtil.isEmpty(search)) { + map.put("search", "%" + search + "%"); + } + JSONObject json = WQL.getWO("PDM_BI_DEVICE01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "device.create_time DESC"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_device"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(DeviceDto.class); + return null; + } + + @Override + public DeviceDto findById(Long device_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_device"); + JSONObject json = wo.query("device_id = '" + device_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(DeviceDto.class); + } + return null; + } + + @Override + public DeviceDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_device"); + JSONObject json = wo.query("device_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(DeviceDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(DeviceDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + //编码唯一性校验 + String device_code = dto.getDevice_code(); + DeviceDto byCode = this.findByCode(device_code); + if (ObjectUtil.isNotEmpty(byCode)) throw new BadRequestException("编码已存在!"); + dto.setDevice_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_device"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(DeviceDto dto) { + DeviceDto entity = this.findById(dto.getDevice_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + //编码唯一性校验 + WQLObject wo = WQLObject.getWQLObject("pdm_bi_device"); + String where = "is_delete = '0' and device_code = '" + dto.getDevice_code() + "' and device_id != '" + dto.getDevice_id() + "'"; + + JSONObject jsonObject = wo.query(where).uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) { + throw new BadRequestException("编码已存在!"); + } + + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_device"); + WQLObject wo_value = WQLObject.getWQLObject("PDM_BI_DeviceItemValue"); + for (Long device_id : ids) { + wo.delete("device_id = '" + device_id + "'"); + wo_value.delete("device_id = '" + device_id + "'"); + } + } + + @Override + public void changeActive(JSONObject json) { + String is_used = "1"; + if (StrUtil.equals("1", json.getString("is_used"))) { + is_used = "0"; + } + json.put("is_used", is_used); + WQLObject.getWQLObject("PDM_BI_Device").update(json); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceitemServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceitemServiceImpl.java new file mode 100644 index 000000000..37487382b --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceitemServiceImpl.java @@ -0,0 +1,123 @@ + +package org.nl.wms.pdm.service.impl; + + +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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.wms.pdm.service.DeviceitemService; +import org.nl.wms.pdm.service.dto.DeviceitemDto; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author geng by + * @description 服务实现 + * @date 2022-05-25 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class DeviceitemServiceImpl implements DeviceitemService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_deviceitem"); + final String search = MapUtil.getStr(whereJson, "search"); + String where = ""; + if (!StrUtil.isEmpty(search)) { + where = " AND (item_code like '%" + search + "%' OR item_name like '%" + search + "%' ) "; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "1 = 1" + where, "order_seq"); + final JSONObject json = rb.pageResult(); + final JSONArray array = json.getJSONArray("content"); + for (int i = 0; i < array.size(); i++) { + final JSONObject jsonObject = array.getJSONObject(i); + jsonObject.put("is_show","1"); + } + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_deviceitem"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(DeviceitemDto.class); + return null; + } + + @Override + public DeviceitemDto findById(Long item_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_deviceitem"); + JSONObject json = wo.query("item_id = '" + item_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(DeviceitemDto.class); + } + return null; + } + + @Override + public DeviceitemDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_deviceitem"); + JSONObject json = wo.query("item_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(DeviceitemDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(DeviceitemDto dto) { + //编码唯一性校验 + String item_code = dto.getItem_code(); + DeviceitemDto byCode = this.findByCode(item_code); + if (ObjectUtil.isNotEmpty(byCode)) throw new BadRequestException("编码已存在!"); + dto.setItem_id(IdUtil.getSnowflake(1, 1).nextId()); + WQLObject wo = WQLObject.getWQLObject("pdm_bi_deviceitem"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(DeviceitemDto dto) { + DeviceitemDto entity = this.findById(dto.getItem_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + //编码唯一性校验 + WQLObject wo = WQLObject.getWQLObject("PDM_BI_DeviceItem"); + String where = "item_code = '" + dto.getItem_code() + "' and item_id != '" + dto.getItem_id()+"'"; + + JSONObject jsonObject = wo.query(where).uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) { + throw new BadRequestException("编码已存在!"); + } + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_deviceitem"); + for (Long item_id : ids) { + wo.delete("item_id = '" + item_id + "'"); + } + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProcessrouteServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProcessrouteServiceImpl.java new file mode 100644 index 000000000..ef93d5479 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProcessrouteServiceImpl.java @@ -0,0 +1,250 @@ + +package org.nl.wms.pdm.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 com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.common.utils.dto.CurrentUser; +import org.nl.modules.system.service.dto.UserDto; +import org.nl.wms.pdm.service.ProcessrouteService; +import org.nl.wms.pdm.service.dto.ProcessrouteDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Zz + * @description 服务实现 + * @date 2022-03-21 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class ProcessrouteServiceImpl implements ProcessrouteService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String processroute_code = MapUtil.getStr(whereJson, "processroute_code"); + HashMap map = new HashMap<>(); + + map.put("flag", "1"); + map.put("processroute_status", MapUtil.getStr(whereJson, "processroute_status")); + if (StrUtil.isNotEmpty(processroute_code)) map.put("processroute_code", "%" + processroute_code + "%"); + + JSONObject json = WQL.getWO("QP_BI_PROCESSROUTE01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "update_time desc"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_processroute"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(ProcessrouteDto.class); + return list; + } + + @Override + public ProcessrouteDto findById(String processroute_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_processroute"); + JSONObject json = wo.query("processroute_id = '" + processroute_id + "'").uniqueResult(0); + final ProcessrouteDto obj = json.toJavaObject(ProcessrouteDto.class); + return obj; + } + + @Override + public ProcessrouteDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_processroute"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + final ProcessrouteDto obj = json.toJavaObject(ProcessrouteDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(JSONObject json) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + Long deptId = SecurityUtils.getDeptId(); + + WQLObject mstTab = WQLObject.getWQLObject("pdm_bi_processroute"); // 工艺路线主表 + WQLObject dtlTab = WQLObject.getWQLObject("PDM_BI_ProcessRouteDtl"); // 工艺路线明细表 + WQLObject workTab = WQLObject.getWQLObject("pdm_bi_workprocedure"); // 工序表 + JSONArray jsonDataArr = json.getJSONArray("tableData"); + + // 插入主表 + JSONObject jsonMst = new JSONObject(); + jsonMst.put("processroute_id", IdUtil.getSnowflake(1, 1).nextId()); + jsonMst.put("processroute_code", json.getString("processroute_code")); + jsonMst.put("processroute_name", json.getString("processroute_name")); + jsonMst.put("processroute_status", "10"); + jsonMst.put("detail_count", jsonDataArr.size()); + jsonMst.put("remark", json.getString("remark")); + jsonMst.put("create_id", currentUserId); + jsonMst.put("create_name", nickName); + jsonMst.put("create_time", now); + jsonMst.put("sysdeptid", deptId); + jsonMst.put("syscompanyid", deptId); + mstTab.insert(jsonMst); + // 插入明细表 + for (int i = 0; i < jsonDataArr.size(); i++) { + JSONObject jsonObject = jsonDataArr.getJSONObject(i); + JSONObject jsonWork = workTab.query("workprocedure_id = '" + jsonObject.getString("workprocedure_id") + "'").uniqueResult(0); + + JSONObject jsonDtl = new JSONObject(); + jsonDtl.put("processroutedtl_id", IdUtil.getSnowflake(1, 1).nextId()); + jsonDtl.put("processroute_id", jsonMst.get("processroute_id")); + jsonDtl.put("workprocedure_no", i+1); + jsonDtl.put("workprocedure_id", jsonWork.get("workprocedure_id")); + jsonDtl.put("workprocedure_code", jsonWork.getString("workprocedure_code")); + jsonDtl.put("workprocedure_name", jsonWork.getString("workprocedure_name")); + jsonDtl.put("process_explain", jsonObject.getString("process_explain")); + jsonDtl.put("is_check", jsonObject.getString("is_check")); + dtlTab.insert(jsonDtl); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(JSONObject whereJson) { + String processroute_id = MapUtil.getStr(whereJson, "processroute_id"); + ProcessrouteDto entity = this.findById(processroute_id); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + + WQLObject mstTab = WQLObject.getWQLObject("pdm_bi_processroute"); // 工艺路线主表 + WQLObject dtlTab = WQLObject.getWQLObject("PDM_BI_ProcessRouteDtl"); // 工艺路线明细表 + WQLObject workTab = WQLObject.getWQLObject("pdm_bi_workprocedure"); // 工序表 + + JSONArray dataArr = whereJson.getJSONArray("tableData"); + // 更新主表 + JSONObject jsonMst = mstTab.query("processroute_id= '" + processroute_id + "'").uniqueResult(0); + jsonMst.put("processroute_code", whereJson.getString("processroute_code")); + jsonMst.put("processroute_name", whereJson.getString("processroute_name")); + jsonMst.put("remark", whereJson.getString("remark")); + jsonMst.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonMst.put("update_optname", SecurityUtils.getCurrentNickName()); + jsonMst.put("update_time", DateUtil.now()); + jsonMst.put("detail_count", dataArr.size()); + mstTab.update(jsonMst); + // 更新明细表 + JSONArray dtlArr = dtlTab.query("processroute_id = '" + processroute_id + "'").getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(dtlArr)) dtlTab.delete("processroute_id = '" + processroute_id + "'"); + for (int i = 0; i < dataArr.size(); i++) { + JSONObject jsonObject = dataArr.getJSONObject(i); + JSONObject jsonWork = workTab.query("workprocedure_id = '" + jsonObject.getString("workprocedure_id") + "'").uniqueResult(0); + + JSONObject jsonDtl = new JSONObject(); + jsonDtl.put("processroutedtl_id", IdUtil.getSnowflake(1, 1).nextId()); + jsonDtl.put("processroute_id", jsonMst.get("processroute_id")); + jsonDtl.put("workprocedure_no", i+1); + jsonDtl.put("workprocedure_id", jsonObject.get("workprocedure_id")); + jsonDtl.put("workprocedure_code", jsonWork.getString("workprocedure_code")); + jsonDtl.put("workprocedure_name", jsonWork.getString("workprocedure_name")); + jsonDtl.put("process_explain", jsonObject.getString("process_explain")); + jsonDtl.put("is_check", jsonObject.getString("is_check")); + dtlTab.insert(jsonDtl); + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_processroute"); + for (Long processroute_id : ids) { + JSONObject param = new JSONObject(); + param.put("processroute_id", String.valueOf(processroute_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONArray getWorkList() { + JSONArray resultJSONArray = WQL.getWO("QP_BI_PROCESSROUTE01").addParam("flag", "2").process().getResultJSONArray(0); + return resultJSONArray; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONArray getDtl(Map map) { + String processroute_id = MapUtil.getStr(map, "processroute_id"); + WQLObject dtlTab = WQLObject.getWQLObject("PDM_BI_ProcessRouteDtl"); + + JSONArray dtlArr = dtlTab.query("processroute_id ='" + processroute_id + "' order by workprocedure_no ASC").getResultJSONArray(0); + return dtlArr; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submit(JSONObject whereJson) { + JSONArray dataArr = whereJson.getJSONArray("data"); + + WQLObject mstTab = WQLObject.getWQLObject("pdm_bi_processroute"); // 工艺路线主表 + + for (int i = 0; i < dataArr.size(); i++) { + JSONObject json = dataArr.getJSONObject(i); + JSONObject jsonMst = mstTab.query("processroute_id ='" + json.getString("processroute_id") + "' and is_delete = '0'").uniqueResult(0); + if (!StrUtil.equals(jsonMst.getString("processroute_status"), "10")) { + throw new BadRequestException("只能对生成状态的提交"); + } + jsonMst.put("processroute_status", "20"); + jsonMst.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonMst.put("update_optname", SecurityUtils.getCurrentNickName()); + jsonMst.put("update_time", DateUtil.now()); + jsonMst.put("audit_optid", SecurityUtils.getCurrentUserId()); + jsonMst.put("audit_optname", SecurityUtils.getCurrentNickName()); + jsonMst.put("audit_time", DateUtil.now()); + mstTab.update(jsonMst); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void CancelSubmit(JSONObject whereJson) { + JSONArray dataArr = whereJson.getJSONArray("data"); + + WQLObject mstTab = WQLObject.getWQLObject("pdm_bi_processroute"); // 工艺路线主表 + + for (int i = 0; i < dataArr.size(); i++) { + JSONObject json = dataArr.getJSONObject(i); + JSONObject jsonMst = mstTab.query("processroute_id ='" + json.getString("processroute_id") + "' and is_delete = '0'").uniqueResult(0); + if (!StrUtil.equals(jsonMst.getString("processroute_status"), "20")) { + throw new BadRequestException("只能对提交状态的取消提交"); + } + jsonMst.put("processroute_status", "10"); + jsonMst.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonMst.put("update_optname", SecurityUtils.getCurrentNickName()); + jsonMst.put("update_time", DateUtil.now()); + jsonMst.put("audit_optid", ""); + jsonMst.put("audit_optname", ""); + jsonMst.put("audit_time", ""); + mstTab.update(jsonMst); + } + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkProcedureServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkProcedureServiceImpl.java new file mode 100644 index 000000000..76c0537e1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkProcedureServiceImpl.java @@ -0,0 +1,157 @@ + +package org.nl.wms.pdm.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.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.common.utils.dto.CurrentUser; +import org.nl.modules.system.service.dto.UserDto; +import org.nl.wms.pdm.service.WorkProcedureService; +import org.nl.wms.pdm.service.dto.WorkProcedureDto; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +/** + * @author ldjun + * @description 服务实现 + * @date 2021-12-19 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class WorkProcedureServiceImpl implements WorkProcedureService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String where = ""; + WQLObject wo = WQLObject.getWQLObject("PDM_BI_WorkProcedure"); + String search = (String) whereJson.get("search"); + if (!StrUtil.isEmpty(search)) { + where = " AND (workprocedure_code like '%" + search + "%' OR workprocedure_name like '%" + search + "%' ) "; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "is_delete= '0' " + where, "update_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workProcedure"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(WorkProcedureDto.class); + return list; + } + + @Override + public WorkProcedureDto findById(Long workProcedure_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workProcedure"); + JSONObject json = wo.query("workProcedure_id =" + workProcedure_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final WorkProcedureDto obj = json.toJavaObject(WorkProcedureDto.class); + return obj; + } + + @Override + public WorkProcedureDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workProcedure"); + JSONObject json = wo.query("workprocedure_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final WorkProcedureDto obj = json.toJavaObject(WorkProcedureDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(WorkProcedureDto dto) { + //判断编码是否存在 + String workprocedure_code = dto.getWorkprocedure_code(); + WorkProcedureDto byCode = this.findByCode(workprocedure_code); + if (ObjectUtil.isNotEmpty(byCode)) throw new BadRequestException("编码已存在!"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + Long deptId = SecurityUtils.getDeptId(); + + dto.setWorkprocedure_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setSyscompanyid(deptId); + dto.setSysdeptid(deptId); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workProcedure"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(WorkProcedureDto dto) { + WorkProcedureDto entity = this.findById(dto.getWorkprocedure_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + String workprocedure_code = entity.getWorkprocedure_code(); + WorkProcedureDto byCode = this.findByCode(workprocedure_code); + if (ObjectUtil.isNotEmpty(byCode) && !dto.getWorkprocedure_id().equals(byCode.getWorkprocedure_id())) + throw new BadRequestException("存在相同的编码!"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workProcedure"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("pdm_bi_workProcedure"); + for (Long workProcedure_id : ids) { + JSONObject param = new JSONObject(); + param.put("workprocedure_id", String.valueOf(workProcedure_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.delete(param); + } + } + + @Override + public JSONArray downSelect() { + //工序表【PDM_BI_WorkProcedure】 + WQLObject workProcedureTab = WQLObject.getWQLObject("PDM_BI_WorkProcedure"); + JSONArray resultJSONArray = workProcedureTab.query("is_delete = '0' and is_used ='1'", "workprocedure_code").getResultJSONArray(0); + return resultJSONArray; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql b/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql new file mode 100644 index 000000000..0578a92fb --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/wql/PDM_BI_DEVICE01.wql @@ -0,0 +1,58 @@ +[交易说明] + 交易名: 设备查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + device.* + FROM + PDM_BI_Device device + WHERE + device.is_delete = '0' + + OPTION 输入.search <> "" + (device.device_code like 输入.search or + device.device_name like 输入.search) + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF \ No newline at end of file diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QPDM_FACTORYCALENDAR.wql b/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QPDM_FACTORYCALENDAR.wql new file mode 100644 index 000000000..ce2058b7e --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QPDM_FACTORYCALENDAR.wql @@ -0,0 +1,64 @@ +[交易说明] + 交易名: 工厂日历分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.processroute_code TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + dar.*, + ( + case when dar.is_active = '0' then '否' + when dar.is_active = '1' then '是' end) AS active_name + FROM + pdm_bi_factorycalendar dar + WHERE + 1=1 + OPTION 输入.search <> "" + (dar.factorycalendar_code like 输入.search or + dar.factorycalendar_name like 输入.search) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QP_BI_PROCESSROUTE01.wql b/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QP_BI_PROCESSROUTE01.wql new file mode 100644 index 000000000..4f28a9533 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/pdm/wql/QP_BI_PROCESSROUTE01.wql @@ -0,0 +1,82 @@ +[交易说明] + 交易名: 工艺路线分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.processroute_status TYPEAS s_string + 输入.processroute_code TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + * + FROM + PDM_BI_ProcessRoute + WHERE + is_delete = '0' + + OPTION 输入.processroute_code <> "" + (processroute_code like 输入.processroute_code or + processroute_name like 输入.processroute_code) + ENDOPTION + + OPTION 输入.processroute_status <> "" + processroute_status = 输入.processroute_status + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + workprocedure_id AS value, + workprocedure_name AS label, + workprocedure_code AS code + FROM + PDM_BI_WorkProcedure + WHERE + is_delete = '0' + AND is_used = '1' + + ENDSELECT + ENDQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls b/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls new file mode 100644 index 0000000000000000000000000000000000000000..49ae8da69ce6d5020aa3736e7f5ed2d0e1f7169f GIT binary patch literal 214016 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 literal 0 HcmV?d00001 diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java b/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java new file mode 100644 index 000000000..9ed8523af --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java @@ -0,0 +1,52 @@ + +package org.nl.wms.sch; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.system.service.impl.ParamServiceImpl; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.http.HttpStatus; + +/** + * ACS连接工具类: + */ +public class AcsUtil { + public static JSONObject notifyAcs(String api, JSONArray list) { + //判断是否连接ACS系统 + String isConnect = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("IS_CONNECT_ACS").getValue(); + JSONObject result = new JSONObject(); + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接ACS!"); + result.put("data", new JSONObject()); + return result; + } + + //ACS地址:127.0.0.1:8010 + String acsUrl = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("ACS_URL").getValue(); + + String url = acsUrl + api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(list)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + + } catch (Exception e) { + String msg = e.getMessage(); + //ConnectException: Connection refused: connect + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONObject()); + } + //acs抛异常这里 + /*if (result.getString("status").equals(String.valueOf(HttpStatus.BAD_REQUEST.value()))) + throw new BadRequestException(result.getString("message"));*/ + + return result; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java new file mode 100644 index 000000000..2a94a7d44 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -0,0 +1,157 @@ +package org.nl.wms.sch.manage; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.sch.AcsUtil; +import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.modules.wql.core.bean.WQLObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Title: AbstractAcsTask.java Description:任务抽象类 + *

+ * Task状态:01生成 ,02:确定起点,03、确定终点,04、起点和终点都确认,05:下发,可以下发, 06、执行中 07、完成 + * 完成方式:01自动,02:wcs删除,03、wms删除,04、发给wcs失败自动删除 + * + * @author ldjun + * @created 2020年6月12日 下午5:53:28 + */ +public abstract class AbstractAcsTask { + + + /** + * @discription 在如果任务无法形成会一直定时刷新判断 + * @author ldjun + * @created 2020年6月12日 下午5:55:25 + */ + public List schedule() { + this.autoCreate(); + this.findStartPoint(); + this.findNextPoint(); + return addTask(); + } + + /** + * 添加任务进行下发 + * + * @return + */ + public List addTask() { + //任务基础表【sch_base_task】 + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONArray tasks = taskTab.query("handle_class = '" + this.getClass().getName() + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + List arr = new ArrayList<>(); + for (int i = 0, j = tasks.size(); i < j; i++) { + JSONObject json = tasks.getJSONObject(i); + AcsTaskDto taskDto = new AcsTaskDto(); + taskDto.setTask_id(json.getString("task_id")); + taskDto.setTask_code(json.getString("task_code")); + taskDto.setTask_type("1"); + taskDto.setRoute_plan_code("normal"); + taskDto.setStart_device_code(json.getString("start_point_code")); + taskDto.setNext_device_code(json.getString("next_point_code")); + taskDto.setVehicle_code(json.getString("vehicle_code")); + arr.add(taskDto); + } + return arr; + } + + /** + * @param taskObj 代表一条任务对象 + * @param status 代表wcs任务完成状态: //1:执行中,2:完成 ,3:acs取消 + * @return + * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 + * @author ldjun + * @created 2019年4月17日 下午8:51:50 + */ + public abstract void updateTaskStatus(JSONObject taskObj, String status); + + /** + * @returninvoke + * @discription 确定任务起点 + * @author ldjun + * @created 2020年6月12日 下午6:01:30 + */ + + public abstract void findStartPoint(); + + /** + * @return + * @discription 确定下一点位 + * @author ldjun + * @created 2020年6月12日 下午6:01:06 + */ + public abstract void findNextPoint(); + + /** + * @param form 创建任务需要的参数 + * @return 返回任务标识 + */ + public abstract String createTask(JSONObject form); + + /** + * 自动生成任务 + */ + public void autoCreate() { + + } + + + /** + * @return WCS的任务集合 + * @discription 重新下发给wcs任务 + * @author ldjun + * @created 2020年6月12日 下午5:52:28 + */ + public JSONObject renotifyAcs(String task_id) { + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONArray jsonArray = new JSONArray(); + JSONArray arr = taskTab.query("task_id = '" + task_id + "'").getResultJSONArray(0); + for (int i = 0, j = arr.size(); i < j; i++) { + JSONObject json = arr.getJSONObject(i); + AcsTaskDto taskDto = new AcsTaskDto(); + taskDto.setTask_id(json.getString("task_id")); + taskDto.setTask_code(json.getString("task_code")); + taskDto.setStart_device_code(json.getString("start_point_code")); + taskDto.setNext_device_code(json.getString("next_point_code")); + taskDto.setPriority("1"); + taskDto.setVehicle_code(json.getString("vehicle_code")); + taskDto.setTask_type("1"); + taskDto.setRoute_plan_code("normal"); + + jsonArray.add(JSONObject.parse(JSON.toJSONString(taskDto))); + + } + return AcsUtil.notifyAcs("api/wms/task", jsonArray); + } + + /** + * @param task_id 任务标识 + * @return + * @discription 强制结束完成任务 + * @author ldjun + * @created 2020年6月19日 上午10:34:58 + */ + public abstract void forceFinish(String task_id); + + /** + * @param task_id + * @return + * @discription 任务搬回原起点。 + * @author ldjun + * @created 2020年6月22日 下午8:40:58 + */ + public abstract void pullBack(String task_id); + + /** + * 取消任务 + * + * @param task_id + */ + public abstract void cancel(String task_id); + + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/manage/FinishTypeEnum.java b/nladmin-system/src/main/java/org/nl/wms/sch/manage/FinishTypeEnum.java new file mode 100644 index 000000000..a64986ffc --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/manage/FinishTypeEnum.java @@ -0,0 +1,25 @@ +package org.nl.wms.sch.manage; + +/** + * 完成方式:00自动,01:手动 + */ +public enum FinishTypeEnum { + AUTO("00", "自动"), + WCS_DELETE("01", "手动"); + private String name; + private String code; + + private FinishTypeEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getName() { + return name; + } + + public String getCode() { + return code; + } +} + diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java b/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java new file mode 100644 index 000000000..a432fa1b4 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/manage/TaskStatusEnum.java @@ -0,0 +1,31 @@ +package org.nl.wms.sch.manage; + +/** + * Task状态:00生成 ,01:下发,02、执行中,03、完成 + */ +public enum TaskStatusEnum { + CREATED("01", "生成"), + SURE_START("02", "确定起点"), + SURE_END("03", "确定终点"), + START_AND_POINT("04", "起点终点确认"), + ISSUE("05", "下发"), + EXECUTING("06", "执行中"), + FINISHED("07", "完成"); + + private String name; + private String code; + + private TaskStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getName() { + return name; + } + + public String getCode() { + return code; + } +} + diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/rest/PointController.java b/nladmin-system/src/main/java/org/nl/wms/sch/rest/PointController.java new file mode 100644 index 000000000..e65458932 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/rest/PointController.java @@ -0,0 +1,106 @@ + +package org.nl.wms.sch.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +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; + +/** + * @author ldjun + * @date 2021-08-19 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "点位管理") +@RequestMapping("/api/point") +@Slf4j +public class PointController { + + private final PointService pointService; + + @GetMapping + @Log("查询点位") + @ApiOperation("查询点位") + //@PreAuthorize("@el.check('point:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(pointService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增点位") + @ApiOperation("新增点位") + //@PreAuthorize("@el.check('point:add')") + public ResponseEntity create(@Validated @RequestBody PointDto dto) { + pointService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改点位") + @ApiOperation("修改点位") + //@PreAuthorize("@el.check('point:edit')") + public ResponseEntity update(@Validated @RequestBody PointDto dto) { + pointService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除点位") + @ApiOperation("删除点位") + //@PreAuthorize("@el.check('point:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + pointService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + @PutMapping("/changeActive") + @Log("修改点位启用状态") + @ApiOperation("修改点位启用状态") + //@PreAuthorize("@el.check('store:edit')") + public ResponseEntity update(@RequestBody JSONObject json) { + pointService.changeActive(json); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/getPoint") + @Log("查询点位下拉框") + @ApiOperation("查询点位下拉框") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity queryPoint(@RequestBody Map whereJson) { + return new ResponseEntity<>(pointService.getPoint(whereJson), HttpStatus.OK); + } + + @PutMapping("/syncStruct") + @Log("仓位同步") + @ApiOperation("仓位同步") + //@PreAuthorize("@el.check('store:edit')") + public ResponseEntity syncStruct() { + pointService.syncStruct(); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @GetMapping("/selectPoint") + @Log("查询点位管理") + @ApiOperation("查询点位管理") + //@PreAuthorize("@el.check('Point:list')") + public ResponseEntity selectPoint(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(pointService.selectPoint(whereJson,page),HttpStatus.OK); + } + @GetMapping("/getRegion") + @Log("获取区域") + @ApiOperation("获取区域") + public ResponseEntity getRegion(){ + return new ResponseEntity<>(pointService.getRegion(),HttpStatus.OK); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java b/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java new file mode 100644 index 000000000..4a4d9aee6 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/rest/RegionController.java @@ -0,0 +1,79 @@ + +package org.nl.wms.sch.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.sch.service.RegionService; +import org.nl.wms.sch.service.dto.RegionDto; +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; + +/** + * @author Liuxy + * @date 2022-08-11 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "区域管理管理") +@RequestMapping("/api/region") +@Slf4j +public class RegionController { + + private final RegionService regionService; + + @GetMapping + @Log("查询区域管理") + @ApiOperation("查询区域管理") + //@PreAuthorize("@el.check('region:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(regionService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增区域管理") + @ApiOperation("新增区域管理") + //@PreAuthorize("@el.check('region:add')") + public ResponseEntity create(@Validated @RequestBody RegionDto dto) { + regionService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改区域管理") + @ApiOperation("修改区域管理") + //@PreAuthorize("@el.check('region:edit')") + public ResponseEntity update(@Validated @RequestBody RegionDto dto) { + regionService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除区域管理") + @ApiOperation("删除区域管理") + //@PreAuthorize("@el.check('region:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + regionService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping("/changeActive") + @Log("修改点位启用状态") + @ApiOperation("修改点位启用状态") + //@PreAuthorize("@el.check('store:edit')") + public ResponseEntity update(@RequestBody JSONObject json) { + regionService.changeActive(json); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java b/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java new file mode 100644 index 000000000..65dfe7ccd --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java @@ -0,0 +1,131 @@ + +package org.nl.wms.sch.rest; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.sch.manage.FinishTypeEnum; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.TaskService; +import org.nl.wms.sch.service.dto.TaskDto; +import org.nl.wms.sch.tasks.TaskTypeEnum; +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; + +/** + * @author ldjun + * @date 2021-08-19 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "任务管理") +@RequestMapping("/api/task") +@Slf4j +public class TaskController { + + private final TaskService taskService; + + @GetMapping + @Log("查询任务") + @ApiOperation("查询任务") + //@PreAuthorize("@el.check('task:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(taskService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增任务") + @ApiOperation("新增任务") + //@PreAuthorize("@el.check('task:add')") + public ResponseEntity create(@Validated @RequestBody TaskDto dto) { + taskService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改任务") + @ApiOperation("修改任务") + //@PreAuthorize("@el.check('task:edit')") + public ResponseEntity update(@Validated @RequestBody TaskDto dto) { + taskService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除任务") + @ApiOperation("删除任务") + //@PreAuthorize("@el.check('task:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + taskService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/taskStatus") + @Log("获取任务状态列表") + @ApiOperation("获取任务状态列表") + public ResponseEntity getTaskStatus() { + TaskStatusEnum[] values = TaskStatusEnum.values(); + JSONArray arr = new JSONArray(); + for (TaskStatusEnum value : values) { + JSONObject json = new JSONObject(); + json.put("code", value.getCode()); + json.put("name", value.getName()); + arr.add(json); + } + //增加未完成状态 + JSONObject unFinish = new JSONObject(); + unFinish.put("code", "-1"); + unFinish.put("name", "未完成"); + arr.add(unFinish); + return new ResponseEntity<>(arr, HttpStatus.OK); + } + + @GetMapping("/taskType") + @Log("获取任务类型列表") + @ApiOperation("获取任务类型列表") + public ResponseEntity getTaskType() { + TaskTypeEnum[] values = TaskTypeEnum.values(); + JSONArray arr = new JSONArray(); + for (TaskTypeEnum value : values) { + JSONObject json = new JSONObject(); + json.put("code", value.getCode()); + json.put("name", value.getName()); + arr.add(json); + } + return new ResponseEntity<>(arr, HttpStatus.OK); + } + + @GetMapping("/finishType") + @Log("获取任务类型列表") + @ApiOperation("获取任务类型列表") + public ResponseEntity getFinishType() { + FinishTypeEnum[] values = FinishTypeEnum.values(); + JSONArray arr = new JSONArray(); + for (FinishTypeEnum value : values) { + JSONObject json = new JSONObject(); + json.put("code", value.getCode()); + json.put("name", value.getName()); + arr.add(json); + } + return new ResponseEntity<>(arr, HttpStatus.OK); + } + + @PutMapping("/operation") + @Log("任务操作") + @ApiOperation("任务操作") + //@PreAuthorize("@el.check('task:edit')") + public ResponseEntity update(@RequestBody Map map) { + taskService.operation(map); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/PointService.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/PointService.java new file mode 100644 index 000000000..eb9280f74 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/PointService.java @@ -0,0 +1,88 @@ + +package org.nl.wms.sch.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.sch.service.dto.PointDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @description 服务接口 + * @author ldjun + * @date 2021-12-07 + **/ +public interface PointService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param point_id ID + * @return Point + */ + PointDto findById(Long point_id); + + /** + * 根据编码查询 + * @param code code + * @return Point + */ + PointDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(PointDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(PointDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 编辑 + * + * @param json / + */ + void changeActive(JSONObject json); + + JSONArray getPoint(Map wherJson); + + void syncStruct(); + /** + * + * 获取点位 + */ + Map selectPoint(Map whereJson, Pageable page); + + /** + * + * 获取区域 + */ + JSONArray getRegion(); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java new file mode 100644 index 000000000..3c9de3014 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/RegionService.java @@ -0,0 +1,74 @@ + +package org.nl.wms.sch.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.sch.service.dto.RegionDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author Liuxy + * @description 服务接口 + * @date 2022-08-11 + **/ +public interface RegionService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param region_id ID + * @return Region + */ + RegionDto findById(Long region_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Region + */ + RegionDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(RegionDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(RegionDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + void changeActive(JSONObject json); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/TaskService.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/TaskService.java new file mode 100644 index 000000000..941189529 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/TaskService.java @@ -0,0 +1,87 @@ + +package org.nl.wms.sch.service; + +import org.nl.wms.sch.service.dto.TaskDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author ldjun + * @description 服务接口 + * @date 2021-08-19 + **/ +public interface TaskService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param task_id + * @return Task + */ + TaskDto findById(String task_id); + + /** + * 根据ID查询 + * + * @param taskdtl_id ID + * @return Task + */ + TaskDto findByDtlId(String taskdtl_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Task + */ + TaskDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(TaskDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(TaskDto dto); + + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 任务操作 + * + * @param param + */ + void operation(Map param); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java new file mode 100644 index 000000000..70e14417f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/PointDto.java @@ -0,0 +1,136 @@ +package org.nl.wms.sch.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ldjun + * @description / + * @date 2021-12-07 + **/ +@Data +public class PointDto implements Serializable { + + /** 点位标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long point_id; + + /** + * 点位编码 + */ + private String point_code; + + /** + * 点位名称 + */ + private String point_name; + + /** + * 所属区域 + */ + private Long region_id; + + /** + * 点位类型 + */ + private String point_type; + + /** + * 点位状态 + */ + private String point_status; + + /** + * 锁定类型 + */ + private String lock_type; + + /** + * 载具编码 + */ + private String vehicle_code; + + /** + * 载具数量 + */ + private Integer vehicle_qty; + + /** + * 载具类型 + */ + private String vehicle_type; + + /** + * 是否专机 + */ + private String is_host; + + /** + * 来源标识 + */ + private Long source_id; + + /** + * 备注 + */ + private String remark; + + /** + * 是否启用 + */ + private String is_used; + + /** + * 是否删除 + */ + private String is_delete; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 设备点位类型 + */ + private String device_point_type; + /** + * 生产区域 + */ + private String product_area; + /** + * 点位位置 + */ + private String point_location; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/RegionDto.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/RegionDto.java new file mode 100644 index 000000000..29aefe781 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/RegionDto.java @@ -0,0 +1,77 @@ +package org.nl.wms.sch.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Liuxy + * @description / + * @date 2022-08-11 + **/ +@Data +public class RegionDto implements Serializable { + + /** 区域标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long region_id; + + /** + * 区域编码 + */ + private String region_code; + + /** + * 区域名称 + */ + private String region_name; + + /** + * 备注 + */ + private String remark; + + /** + * 是否启用 + */ + private String is_used; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + /** + * 生产区域 + */ + private String product_area; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskDto.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskDto.java new file mode 100644 index 000000000..de4d68b62 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskDto.java @@ -0,0 +1,80 @@ +package org.nl.wms.sch.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** + * @description / + * @author ldjun + * @date 2021-12-23 + **/ +@Data +public class TaskDto implements Serializable { + /** 任务编码 */ + private String task_code; + + /** 任务类型 */ + private String task_type; + + /** 任务明细类型 */ + private String taskdtl_type; + + /** 指令状态 */ + private String task_status; + + /** 起始点位 */ + private String start_point_code; + + /** 下一点位 */ + private String next_point_code; + + /** 载具编码 */ + private String vehicle_code; + + /** 处理类 */ + private String handle_class; + + /** 任务完成类型 */ + private String finished_type; + + /** 备注 */ + private String remark; + + /** 是否删除 */ + private String is_delete; + + /** 创建时间 */ + private String create_time; + + /** 修改时间 */ + private String update_time; + + /** 任务明细标识 */ + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long taskdtl_id; + + /** 任务标识 */ + private Long task_id; + + /** 物料编码 */ + private String material_code; + + /** 车号 */ + private String car_no; + + /** 创建人 */ + private Long create_id; + + /** 创建人姓名 */ + private String create_name; + + /** 修改人 */ + private Long update_optid; + + /** 修改人姓名 */ + private String update_optname; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskQueryDto.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskQueryDto.java new file mode 100644 index 000000000..b274de8f9 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/dto/TaskQueryDto.java @@ -0,0 +1,95 @@ +package org.nl.wms.sch.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ldjun + * @description / + * @date 2021-12-23 + **/ +@Data +public class TaskQueryDto implements Serializable { + /** + * 任务编码 + */ + private String task_code; + + /** + * 任务类型 + */ + private String task_type; + + /** + * 任务明细类型 + */ + private String taskdtl_type; + + /** + * 指令状态 + */ + private String[] task_status; + + /** + * 起始点位 + */ + private String start_point_code; + + /** + * 下一点位 + */ + private String next_point_code; + + /** + * 载具编码 + */ + private String vehicle_code; + + /** + * 任务完成类型 + */ + private String finished_type; + + /** + * 备注 + */ + private String remark; + + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改时间 + */ + private String update_time; + + /** 任务明细标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long taskdtl_id; + + /** + * 任务标识 + */ + private Long task_id; + + /** + * 物料编码 + */ + private String material_code; + + /** + * 车号 + */ + private String car_no; + + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java new file mode 100644 index 000000000..47a819c52 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java @@ -0,0 +1,269 @@ +package org.nl.wms.sch.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author ldjun + * @description 服务实现 + * @date 2021-08-19 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class PointServiceImpl implements PointService { + @Override + public Map queryAll(Map whereJson, Pageable page) { + HashMap map = new HashMap(); + map.put("flag", "1"); + map.put("region_id", whereJson.get("region_id")); + map.put("ids", whereJson.get("ids")); + map.put("lock_type", whereJson.get("lock_type")); + map.put("point_status", whereJson.get("point_status")); + map.put("is_used", whereJson.get("is_used")); + map.put("point_type", whereJson.get("point_type")); + map.put("name", whereJson.get("name")); + JSONObject json = WQL.getWO("QSCH_BASE_POINT").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "point_code asc"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(PointDto.class); + return list; + } + + @Override + public PointDto findById(Long point_id) { + WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + JSONObject json = wo.query("point_id =" + point_id + "").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(PointDto.class); + } + final PointDto obj = json.toJavaObject(PointDto.class); + return obj; + } + + + @Override + public PointDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + JSONObject json = wo.query("point_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(PointDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(PointDto dto) { + String point_code = dto.getPoint_code(); + PointDto byCode = this.findByCode(point_code); + if (ObjectUtil.isNotEmpty(byCode)) { + throw new BadRequestException("存在相同的点位编码"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setPoint_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + Long region_id = dto.getRegion_id(); + JSONObject region_jo = WQLObject.getWQLObject("sch_base_region").query("region_id = '"+region_id+"'").uniqueResult(0); + dto.setProduct_area(region_jo.getString("product_area")); + + WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(PointDto dto) { + PointDto entity = this.findById(dto.getPoint_id()); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + for (Long point_id : ids) { + JSONObject param = new JSONObject(); + param.put("point_id", String.valueOf(point_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void changeActive(JSONObject json) { + + //如果是仓位点位,更新状态前,先去查询仓位点位所对应的库区是否启用,如果禁用抛出异常 + String struct_id = json.getString("point_id"); + String point_type = json.getString("point_type"); + if (point_type.equals("01")) { + JSONObject st_ivt_bsRealStorAttr = WQLObject.getWQLObject("ST_IVT_StructAttr").query(" struct_id = '" + struct_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(st_ivt_bsRealStorAttr)) { + String sect_id = st_ivt_bsRealStorAttr.getString("sect_id"); + JSONObject st_ivt_sectAttr = WQLObject.getWQLObject("ST_IVT_SectAttr").query(" sect_id = '" + sect_id + "' and is_used = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(st_ivt_sectAttr)) { + throw new BadRequestException("启用失败,请检查仓位点位所属库区是否启用!"); + } + } + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String is_used = "1"; + if (StrUtil.equals("1", json.getString("is_used"))) { + is_used = "0"; + } + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("sch_base_point").update(json); + + //如果启用,则同步更新仓位的状态 + json = new JSONObject(); + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + json.put("struct_id", struct_id); + WQLObject.getWQLObject("ST_IVT_StructAttr").update(json, " struct_id = '" + struct_id + "'"); + } + + @Override + public JSONArray getPoint(Map wherJson) { + String area_type = (String) wherJson.get("area_type"); + JSONArray point_rows = WQLObject.getWQLObject("sch_base_point").query("area_type IN (" + area_type + ") AND is_used = '1' AND is_delete = '0' order by point_code").getResultJSONArray(0); + return point_rows; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncStruct() { + WQLObject.getWQLObject("sch_base_point").delete(" point_type = '01'"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + JSONObject map = new JSONObject(); + map.put("flag", "2"); + JSONArray arrStruct = WQL.getWO("QSCH_BASE_POINT").addParamMap(map).process().getResultJSONArray(0); + WQLObject wo = WQLObject.getWQLObject("sch_base_point"); + for (int i = 0; i < arrStruct.size(); i++) { + JSONObject json = arrStruct.getJSONObject(i); + JSONObject structMap = new JSONObject(); + structMap.put("point_id", json.getString("struct_id")); + structMap.put("point_code", json.getString("struct_code")); + structMap.put("point_name", json.getString("struct_name")); + structMap.put("region_id", json.getString("region_id")); + structMap.put("source_id", json.getString("struct_id")); + structMap.put("point_type", "01"); + structMap.put("is_host", "0"); + structMap.put("is_used", json.getString("is_used")); + structMap.put("create_id", currentUserId); + structMap.put("create_name", nickName); + structMap.put("create_time", now); + structMap.put("update_optid", currentUserId); + structMap.put("update_optname", nickName); + structMap.put("update_time", now); + wo.insert(structMap); + } + } + + @Override + public Map selectPoint(Map whereJson, Pageable page) { + String search = MapUtil.getStr(whereJson, "search"); + String region_id = MapUtil.getStr(whereJson, "region_id"); + + JSONObject map = new JSONObject(); + + map.put("flag", "3"); + map.put("region_id", region_id); + if (ObjectUtil.isNotEmpty(search)) { + map.put("search", "%" + search + "%"); + } + JSONObject json = WQL.getWO("SCH_Point_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "point.point_code"); + return json; + } + + @Override + public JSONArray getRegion() { + JSONArray resultJSONArray = WQLObject.getWQLObject("SCH_BASE_Region").query("is_used = '1'").getResultJSONArray(0); + return resultJSONArray; + } + + //根据重量返回最大的 级数 + public String getLoadSeriesByqty(Double qty) { + JSONArray dictArr = WQLObject.getWQLObject("sys_dict_detail").query("dict_id ='108'", "label").getResultJSONArray(0); + String load_series = "4"; + for (int i = 0; i < dictArr.size(); i++) { + JSONObject dictObj = dictArr.getJSONObject(i); + double flag = dictObj.getDouble("label"); + if (flag >= qty) { + load_series = dictObj.getString("value"); + break; + } + } + return load_series; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java new file mode 100644 index 000000000..8f96f5103 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java @@ -0,0 +1,150 @@ + +package org.nl.wms.sch.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.sch.service.RegionService; +import org.nl.wms.sch.service.dto.RegionDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Liuxy + * @description 服务实现 + * @date 2022-08-11 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class RegionServiceImpl implements RegionService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String region_code = MapUtil.getStr(whereJson, "region_code"); + + HashMap map = new HashMap<>(); + map.put("flag", "1"); + if (ObjectUtil.isNotEmpty(region_code)) map.put("region_code",region_code+"%"); + + JSONObject json = WQL.getWO("QSCH_REGION_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "region.region_code ASC"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("sch_base_region"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(RegionDto.class); + return null; + } + + @Override + public RegionDto findById(Long region_id) { + WQLObject wo = WQLObject.getWQLObject("sch_base_region"); + JSONObject json = wo.query("region_id = '" + region_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(RegionDto.class); + } + return null; + } + + @Override + public RegionDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("sch_base_region"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(RegionDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(RegionDto dto) { + WQLObject wo = WQLObject.getWQLObject("sch_base_region"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + JSONObject jsonDto = wo.query("region_code = '" + dto.getRegion_code() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonDto)) throw new BadRequestException("编码已存在"); + + dto.setRegion_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(RegionDto dto) { + RegionDto entity = this.findById(dto.getRegion_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("sch_base_region"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + + WQLObject wo = WQLObject.getWQLObject("sch_base_region"); + for (Long region_id : ids) { + wo.delete("region_id ='"+region_id+"'"); + } + } + + @Override + public void changeActive(JSONObject json) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String is_used = "1"; + if (StrUtil.equals("1", json.getString("is_used"))) { + is_used = "0"; + } + json.put("is_used", is_used); + json.put("update_optid", currentUserId); + json.put("update_optname", nickName); + json.put("update_time", now); + WQLObject.getWQLObject("sch_base_region").update(json); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java new file mode 100644 index 000000000..a10dc861f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java @@ -0,0 +1,220 @@ + +package org.nl.wms.sch.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.sch.service.TaskService; +import org.nl.wms.sch.service.dto.TaskDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author ldjun + * @description 服务实现 + * @date 2021-08-19 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class TaskServiceImpl implements TaskService { + + @Override + public Map queryAll(Map form, Pageable page) { + + HashMap map = new HashMap<>(); + map.put("flag", "1"); + + JSONObject whereJson = JSONObject.parseObject(JSON.toJSONString(form)); + + String task_status = whereJson.getString("task_status"); + if (StrUtil.isNotEmpty(task_status)) { + task_status = task_status.replace("[\"", "").replace("\"]", "").replace("\"", ""); + } + map.put("task_status", task_status); + //处理状态为未完成 + if (StrUtil.isNotEmpty(task_status) && task_status.contains("-1")) { + map.put("unFinish", "-1"); + map.put("task_status", task_status.replace("-1", "")); + } + if (StrUtil.isNotEmpty(whereJson.getString("task_code"))) { + map.put("task_code", "%" + whereJson.getString("task_code") + "%"); + } + if (StrUtil.isNotEmpty(whereJson.getString("start_point_code"))) { + map.put("start_point_code", "%" + whereJson.getString("start_point_code") + "%"); + } + if (StrUtil.isNotEmpty(whereJson.getString("next_point_code"))) { + map.put("next_point_code", "%" + whereJson.getString("next_point_code") + "%"); + } + if (StrUtil.isNotEmpty(whereJson.getString("vehicle_code"))) { + map.put("vehicle_code", "%" + whereJson.getString("vehicle_code") + "%"); + } + if (StrUtil.isNotEmpty(whereJson.getString("task_type"))) { + map.put("task_type", whereJson.getString("task_type")); + } + if (StrUtil.isNotEmpty(whereJson.getString("taskdtl_type"))) { + map.put("taskdtl_type", whereJson.getString("taskdtl_type")); + } + if (StrUtil.isNotEmpty(whereJson.getString("finishTypeList"))) { + map.put("finishTypeList", whereJson.getString("finishTypeList")); + } + if (StrUtil.isNotEmpty(whereJson.getString("begin_time"))) { + map.put("begin_time", whereJson.getString("begin_time")); + } + if (StrUtil.isNotEmpty(whereJson.getString("end_time"))) { + map.put("end_time", whereJson.getString("end_time")); + } + JSONObject json = WQL.getWO("QSCH_TASK_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "task.update_time desc"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(TaskDto.class); + return list; + } + + @Override + public TaskDto findById(String task_id) { + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + JSONObject json = wo.query("task_id = '" + task_id + "'").uniqueResult(0); + final TaskDto obj = json.toJavaObject(TaskDto.class); + return obj; + } + + @Override + public TaskDto findByDtlId(String taskdtl_id) { + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + JSONObject json = wo.query("task_id = '" + taskdtl_id + "'").uniqueResult(0); + final TaskDto obj = json.toJavaObject(TaskDto.class); + return obj; + } + + @Override + public TaskDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + JSONObject json = wo.query("task_code ='" + code + "'").uniqueResult(0); + final TaskDto obj = json.toJavaObject(TaskDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(TaskDto dto) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + + dto.setTaskdtl_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setTask_id(dto.getTaskdtl_id()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(TaskDto dto) { + TaskDto entity = this.findById(dto.getTask_id() + ""); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + for (String taskdtl_id : ids) { + wo.delete("taskdtl_id = '" + taskdtl_id + "'"); + } + } + + @Override + public void operation(Map map) { + String task_id = MapUtil.getStr(map, "task_id"); + String method_name = MapUtil.getStr(map, "method_name"); + TaskDto dto = this.findByDtlId(task_id); + // 任务处理类 + String processing_class = dto.getHandle_class(); + String message = ""; + // 根据任务类型获取对应的任务操作类 + try { + Class clz = Class.forName(processing_class); + Object obj = clz.newInstance(); + // 调用每个任务类的method_name()强制结束方法 + Method m = obj.getClass().getMethod(method_name, String.class); + JSONObject result = (JSONObject) m.invoke(obj, task_id); + if (ObjectUtil.isEmpty(result)) return; + JSONArray arr = result.getJSONArray("errArr"); + WQLObject wo = WQLObject.getWQLObject("sch_base_task"); + if (ObjectUtil.isNotEmpty(arr)) { + for (int i = 0; i < arr.size(); i++) { + JSONObject json = arr.getJSONObject(i); + JSONObject param = new JSONObject(); + param.put("taskdtl_id", json.getString("taskdtl_id")); + param.put("remark", json.getString("message")); + wo.update(param); + } + throw new BadRequestException("任务操作失败!"); + } else { + JSONObject param = new JSONObject(); + param.put("task_id", task_id); + param.put("remark", "操作成功"); + wo.update(param); + } + } catch (InvocationTargetException e) { + if (ObjectUtil.isNull(e.getTargetException().getMessage())) { + message = e.getTargetException().toString(); + } else { + message = e.getTargetException().getMessage(); + } + throw new BadRequestException(message); + } catch (Exception e) { + e.printStackTrace(); + throw new BadRequestException("任务操作失败!"); + } + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_BASE_POINT.wql b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_BASE_POINT.wql new file mode 100644 index 000000000..221d83b48 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_BASE_POINT.wql @@ -0,0 +1,132 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_id TYPEAS s_string + 输入.lock_type TYPEAS s_string + 输入.name TYPEAS s_string + 输入.point_type TYPEAS s_string + 输入.point_status TYPEAS s_string + 输入.is_used TYPEAS s_string + 输入.ids TYPEAS f_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + point.point_id, + point.point_code, + point.point_name, + point.region_id, + region.region_name, + point.point_type, + point.point_status, + point.lock_type, + d1.label as point_type_name, + d4.label as point_status_name, + d3.label as lock_type_name, + point.vehicle_code, + point.source_id, + point.remark, + point.taskdtl_type, + point.taskdtl_id, + point.task_code, + point.inv_type, + point.inv_id, + point.inv_code, + point.is_used, + point.is_delete, + point.vehicle_qty, + point.create_name, + point.create_time, + point.update_optname, + point.update_time, + point.vehicle_type, + point.is_host, + point.device_point_type + FROM + sch_base_point point + LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id + LEFT JOIN sys_dict_detail d1 ON point.point_type = d1.value and d1.name='sch_point_type' + LEFT JOIN sys_dict_detail d3 ON point.lock_type = d3.value and d3.name='d_lock_type' + LEFT JOIN sys_dict_detail d4 ON point.point_status = d4.value and d4.name='sch_point_status' + WHERE + point.is_delete = '0' + OPTION 输入.region_id <> "" + point.region_id = 输入.region_id + ENDOPTION + OPTION 输入.ids <> "" + point.area_type in (输入.ids) + ENDOPTION + OPTION 输入.point_type <> "" + point.point_type = 输入.point_type + ENDOPTION + OPTION 输入.lock_type <> "" + point.lock_type = 输入.lock_type + ENDOPTION + OPTION 输入.point_status <> "" + point.point_status = 输入.point_status + ENDOPTION + OPTION 输入.lock_type = "00" + (point.vehicle_code is null or point.vehicle_code = '') + ENDOPTION + OPTION 输入.is_used <> "" + point.is_used = 输入.is_used + ENDOPTION + OPTION 输入.name <> "" + ( point.point_code like "%" 输入.name "%" or point.point_name like "%" 输入.name "%" ) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + struct.*,region.region_id + FROM + ST_IVT_StructAttr struct + left join + SCH_BASE_Region region on struct.region_id = region.region_id + WHERE + struct.is_delete = '0' + ENDSELECT + ENDQUERY + ENDIF + + + diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_REGION_01.wql b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_REGION_01.wql new file mode 100644 index 000000000..9bb640f32 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_REGION_01.wql @@ -0,0 +1,57 @@ +[交易说明] + 交易名: 区域分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.region_code TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + region.* + FROM + SCH_BASE_Region region + WHERE + 1=1 + + OPTION 输入.region_code <> "" + (region.region_code like 输入.region_code or + region.region_name like 输入.region_code) + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_TASK_01.wql b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_TASK_01.wql new file mode 100644 index 000000000..7d266e30a --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/QSCH_TASK_01.wql @@ -0,0 +1,112 @@ +[交易说明] + 交易名: 任务分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.task_status TYPEAS s_string + 输入.finished_type TYPEAS s_string + 输入.task_type TYPEAS s_string + 输入.start_point_code TYPEAS s_string + 输入.next_point_code TYPEAS s_string + 输入.task_code TYPEAS s_string + 输入.vehicle_code TYPEAS s_string + 输入.begin_time TYPEAS s_string + 输入.end_time TYPEAS s_string + 输入.unFinish TYPEAS s_string + 输入.taskdtl_type TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + task.*, + p1.point_name AS start_point_name, + region1.region_name AS start_area_name, + p2.point_name AS next_point_name, + region2.region_name AS next_area_name, + d3.label AS task_type_name, + d4.label AS taskdtl_type_name + FROM + sch_base_task task + LEFT JOIN sch_base_point p1 ON task.start_point_code = p1.point_code + LEFT JOIN SCH_BASE_Region region1 ON region1.region_id = p1.region_id + LEFT JOIN sch_base_point p2 ON task.next_point_code = p2.point_code + LEFT JOIN SCH_BASE_Region region2 ON region2.region_id = p2.region_id + LEFT JOIN sys_dict_detail d3 ON d3.`value` = task.task_type AND d3.`name` = 'SCH_TASK_TYPE' + LEFT JOIN sys_dict_detail d4 ON d4.`value` = task.taskdtl_type AND d4.`name` = 'SCH_TASK_TYPE_DTL' + WHERE + task.is_delete = '0' + OPTION 输入.task_type <> "" + task.task_type = 输入.task_type + ENDOPTION + OPTION 输入.taskdtl_type <> "" + task.taskdtl_type = 输入.taskdtl_type + ENDOPTION + OPTION 输入.finished_type <> "" + task.finished_type = 输入.finished_type + ENDOPTION + OPTION 输入.begin_time <> "" + task.create_time >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + task.create_time <= 输入.end_time + ENDOPTION + OPTION 输入.unFinish <> "" + task.task_status <> '07' + ENDOPTION + OPTION 输入.task_status <> "" + find_in_set( task.task_status, 输入.task_status) + ENDOPTION + OPTION 输入.vehicle_code <> "" + (task.vehicle_code like 输入.vehicle_code) + ENDOPTION + OPTION 输入.task_code <> "" + (task.task_code like 输入.task_code) + ENDOPTION + OPTION 输入.start_point_code <> "" + (task.start_point_code like 输入.start_point_code) + ENDOPTION + OPTION 输入.next_point_code <> "" + (task.next_point_code like 输入.next_point_code) + ENDOPTION + OPTION 输入.begin_time <> "" + task.create_time >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + task.create_time <= 输入.end_time + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/SCH_Point_01.wql b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/SCH_Point_01.wql new file mode 100644 index 000000000..7f179c721 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/SCH_Point_01.wql @@ -0,0 +1,121 @@ +[交易说明] + 交易名: 点位管理查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.search TYPEAS s_string + 输入.point_type TYPEAS s_string + 输入.point_code TYPEAS s_string + 输入.region_id TYPEAS s_string + 输入.point_status TYPEAS s_string + 输入.lock_type TYPEAS s_string + 输入.is_used TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + a.*,b.device_name + FROM + sch_base_point a + left join + pdm_base_device b on a.device_id = b.device_id + WHERE + a.is_delete = '0' + OPTION 输入.search <> "" + (a.point_code like 输入.search or + a.point_name like 输入.search) + ENDOPTION + OPTION 输入.point_type <> "" + a.point_type = 输入.point_type + ENDOPTION + OPTION 输入.area_type <> "" + a.area_type = 输入.area_type + ENDOPTION + OPTION 输入.point_status <> "" + a.point_status = 输入.point_status + ENDOPTION + OPTION 输入.lock_type <> "" + a.lock_type = 输入.lock_type + ENDOPTION + OPTION 输入.is_used <> "" + a.is_used = 输入.is_used + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + PAGEQUERY + SELECT + a.*,b.sect_code + FROM + ST_IVT_StructAttr a + left join + ST_IVT_SectAttr b on a.sect_id = b.sect_id + WHERE + a.is_delete = '0' + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "3" + PAGEQUERY + SELECT + point.*, + region.region_name + FROM + sch_base_point point + LEFT JOIN sch_base_region region ON point.region_id = region.region_id + WHERE + point.lock_type = '00' + AND point.is_used = '1' + AND point.is_delete = '0' + AND point.point_status = '00' + + OPTION 输入.search <> "" + (point.point_code like 输入.search or + point.point_name like 输入.search) + ENDOPTION + + OPTION 输入.region_id <> "" + point.region_id = 输入.region_id + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/sch.xls b/nladmin-system/src/main/java/org/nl/wms/sch/service/wql/sch.xls new file mode 100644 index 0000000000000000000000000000000000000000..6f5bbf559ea273126b9eb9681ce3185d2bd3da31 GIT binary patch literal 170496 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 literal 0 HcmV?d00001 diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java new file mode 100644 index 000000000..4b8810aca --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java @@ -0,0 +1,30 @@ +package org.nl.wms.sch.tasks; + +import lombok.Data; + +@Data +public class AcsTaskDto { + //任务标识 + private String task_id; + //任务编码 + private String task_code; + //任务类型 + private String task_type; + //起点 + private String start_device_code; + //下一点 + private String next_device_code; + //载具号 + private String vehicle_code; + //载具类型 + private String vehicle_type; + //优先级 + private String priority; + //备注 + private String remark; + //扩展参数 + private String params; + //路由类型 + private String route_plan_code; + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallEmpVehicleTask.java b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallEmpVehicleTask.java new file mode 100644 index 000000000..22442f556 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallEmpVehicleTask.java @@ -0,0 +1,292 @@ +package org.nl.wms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; + +@Service +@RequiredArgsConstructor +@Slf4j +public class CallEmpVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = CallEmpVehicleTask.class.getName(); + + @Override + @Transactional + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = taskObj.getString("task_id"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status,"0")) { + // 取消删除任务 + taskTab.delete("task_id = '"+task_id+"'"); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + } + + if(StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + // 更改任务状态为完成 + jsonTask.put("task_status",TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + + PointService point = SpringContextHolder.getBean(PointService.class); + // 校验起点是否存在 + PointDto start_point_code = point.findByCode(jsonTask.getString("start_point_code")); + if (ObjectUtil.isEmpty(start_point_code)) throw new BadRequestException("未找到可用点位:" + start_point_code); + // 校验终点是否存在 + PointDto next_point_code = point.findByCode(jsonTask.getString("next_point_code")); + if (ObjectUtil.isEmpty(start_point_code)) throw new BadRequestException("未找到可用点位:" + next_point_code); + + // 1.更新点位数量 2.解锁点位 + JSONObject jsonEmp = empTab.query("task_uuid = '" + task_id + "'").uniqueResult(0); + int vehicle_qty = JSONObject.parseObject(JSON.toJSONString(start_point_code)).getIntValue("vehicle_qty"); + BigDecimal vehicle_qty_point = NumberUtil.sub(String.valueOf(vehicle_qty), String.valueOf(jsonEmp.getIntValue("vehicle_qty"))); + + start_point_code.setVehicle_qty(Integer.valueOf(vehicle_qty_point.toString())); + if (StrUtil.equals(vehicle_qty_point.toString(), "0")) { + start_point_code.setPoint_status("00"); + start_point_code.setVehicle_type(""); + } + start_point_code.setLock_type("00"); + pointTab.update(JSONObject.parseObject(JSON.toJSONString(start_point_code))); + + // 完成单据状态 + jsonEmp.put("bill_status", "50"); + jsonEmp.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonEmp.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonEmp.put("update_time", DateUtil.now()); + empTab.update(jsonEmp); + } + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional + public String createTask(JSONObject form) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + String qty = form.getString("qty"); + String record_uuid = form.getString("record_uuid"); + String vehicle_type = form.getString("vehicle_type"); + + // 出库终点不能为空 + if (ObjectUtil.isEmpty(next_point_code)) { + throw new BadRequestException("终点不能为空"); + } else { + // 判断终点是否有正在执行的任务 + JSONObject beforTaskObj = taskTab.query("is_delete='0' and next_point_code='" + next_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(beforTaskObj)) throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); + } + // 载具数量不能为空 + if (ObjectUtil.isEmpty(qty)) throw new BadRequestException("载具数量不能为空"); + + /* + * 1. 点对点: 起点和终点都确定,直接创建任务 + * 2. 终点确定: 需要找到对应起点,在创建任务 具体找起点货位的规则在findBeginPoint()中 + */ + // 终点确定:找起点 + if (ObjectUtil.isEmpty(start_point_code)) { + JSONObject param = new JSONObject(); + param.put("next_point_code",next_point_code); + param.put("vehicle_qty",qty); + JSONObject json = this.findBeginPoint(param); + start_point_code = json.getString("start_point_code"); + vehicle_type = json.getString("vehicle_type"); + } else { + // 判断终点是否是空位 + JSONObject jsonPoint = pointTab.query("point_code = '" + start_point_code + "' and lock_type = '00' and point_status <> '02' and is_delete = '0' and is_used = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonPoint)) throw new BadRequestException("起点点位不可用或不存在"); + } + // 创建任务 + JSONObject jsonTask = new JSONObject(); + String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + + jsonTask.put("task_id", task_id); + jsonTask.put("taskdtl_id", task_id); + jsonTask.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + jsonTask.put("task_type", "04"); + jsonTask.put("taskdtl_type", "04"); + jsonTask.put("task_status", "01"); + jsonTask.put("start_point_code", start_point_code); + jsonTask.put("next_point_code", next_point_code); + jsonTask.put("handle_class", THIS_CLASS); + jsonTask.put("vehicle_type", vehicle_type); + jsonTask.put("create_name", SecurityUtils.getCurrentUsername()); + jsonTask.put("create_id", SecurityUtils.getCurrentUserId()); + jsonTask.put("create_time", DateUtil.now()); + jsonTask.put("acs_task_type", "1"); + taskTab.insert(jsonTask); + + // 锁定起点点位 + JSONObject jsonPoint = pointTab.query("point_code = '" + start_point_code + "'").uniqueResult(0); + jsonPoint.put("lock_type", "02"); + pointTab.update(jsonPoint); + + // 更新空载具单据状态 + if (ObjectUtil.isNotEmpty(record_uuid)) { + JSONObject jsonEmp = empTab.query("record_uuid ='" + record_uuid + "'").uniqueResult(0); + jsonEmp.put("bill_status","20"); + empTab.update(jsonEmp); + } + return task_id; + } + + @Override + @Transactional + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + + } + + @Override + public void cancel(String task_id) { + + } + + @Transactional + public JSONObject findBeginPoint(JSONObject json) { + String next_point_code = json.getString("next_point_code"); + String vehicle_qty = json.getString("vehicle_qty"); + if (ObjectUtil.isEmpty(next_point_code)) throw new BadRequestException("终点不能为空"); + if (ObjectUtil.isEmpty(vehicle_qty)) throw new BadRequestException("载具数量不能为空"); + + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject regionTab = WQLObject.getWQLObject("SCH_BASE_Region"); + WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + // 根据终点区域判断优先的起点区域 + JSONObject jsonPointEnd = pointTab.query("point_code = '" + next_point_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonPointEnd)) throw new BadRequestException("终点点位不存在"); + JSONObject jsonRegionEnd = regionTab.query("region_id ='" + jsonPointEnd.getString("region_id") + "'").uniqueResult(0); + + // 根据起点找到对应设备,根据设备查询工单表中 - 正在运行的工单中的载具类型 + String device_code = next_point_code.substring(0, next_point_code.indexOf("_")); + + DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); + DeviceDto deviceDto = deviceBean.findByCode(device_code); + if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); + JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); + /* + * 空托盘出库任务: + * 1.叠盘架B区、养生A区 --> 共挤线 (优先级:1叠盘架B区 2养生A区) + * 2.叠盘架A区、养生A区 --> 油漆线 (优先级:1叠盘架A区 2养生A区) + */ + String start_point_code = ""; + JSONObject map = new JSONObject(); + if (StrUtil.equals(jsonRegionEnd.getString("region_code"),RegionTypeEnum.GJQY.getCode())) { + // 共挤线呼叫空托盘业务:查找叠盘架B区是否有满足条件的点位 + map.put("flag", "1"); + map.put("vehicle_qty", vehicle_qty); + map.put("vehicle_type", jsonOrder.getString("vehicle_type")); + map.put("region_code", RegionTypeEnum.DPJQB.getCode()); + JSONObject jsonStartPointDPB = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonStartPointDPB)) { + start_point_code = jsonStartPointDPB.getString("point_code"); + } else { + // 为空说明叠盘架B区没有,则去养生A区找 : 只能找数量为1的空托盘 + map.put("flag", "3"); + map.put("region_code", RegionTypeEnum.YSQA.getCode()); + JSONObject jsonStartPointYSA = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); + + if (ObjectUtil.isNotEmpty(jsonStartPointYSA)) { + start_point_code = jsonStartPointYSA.getString("point_code"); + } else { + throw new BadRequestException("没有满足需求数量的点位"); + /* // 如果没有则需要从养生区A区里找到 > 1的货位 出库到叠盘架B中 + map.put("flag", "1"); + map.put("region_code", RegionTypeEnum.YSQA.getCode()); + // 起点 + JSONObject jsonStart = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(jsonStart)) throw new BadRequestException("没有满足需求数量的点位"); + // 终点 + JSONObject jsonEnd = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and point_status = '00' and lock_type = '00' and is_used = '1' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonEnd)) throw new BadRequestException("叠盘架B货位不足"); + + JSONObject parem = new JSONObject(); + parem.put("start_point_code",jsonStart.getString("point_code")); + parem.put("next_point_code",jsonEnd.getString("point_code")); + parem.put("qty",jsonStart.getString("vehicle_qty")); + parem.put("vehicle_type",jsonStart.getString("vehicle_qty")); + String task_id = this.createTask(parem); + + // 生成 叠盘架 -> 共挤线的任务 返回叠盘架B的点位code + start_point_code = jsonEnd.getString("point_code");*/ + } + + } + } else if (StrUtil.equals(jsonRegionEnd.getString("region_code"),RegionTypeEnum.YQQY.getCode())) { + // 油漆线呼叫空托盘业务:查找叠盘架A区是否有满足条件的点位 + map.put("flag", "1"); + map.put("vehicle_qty", vehicle_qty); + map.put("vehicle_type", jsonOrder.getString("vehicle_type")); + map.put("region_code", RegionTypeEnum.DPJQA.getCode()); + JSONObject jsonStartPointDPA = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonStartPointDPA)) { + start_point_code = jsonStartPointDPA.getString("point_code"); + } else { + // 为空说明叠盘架A区没有,则去养生A区找 + map.put("flag", "3"); + map.put("region_code", RegionTypeEnum.YSQA.getCode()); + JSONObject jsonStartPointYSA = WQL.getWO("ST_VEHICLE_OUT_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(jsonStartPointYSA)) throw new BadRequestException("没有满足需求数量的点位"); + start_point_code = jsonStartPointYSA.getString("point_code"); + } + } + JSONObject resuft = new JSONObject(); + resuft.put("start_point_code",start_point_code); + resuft.put("vehicle_type",jsonOrder.getString("vehicle_type")); + return resuft; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallMaterialTask.java b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallMaterialTask.java new file mode 100644 index 000000000..13762077c --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CallMaterialTask.java @@ -0,0 +1,306 @@ +package org.nl.wms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.st.IvtChangeTypeEnum; +import org.nl.wms.basedata.st.StoreIvtServiceImpl; +import org.nl.wms.common.StructFindUtil; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.wms.sch.service.impl.PointServiceImpl; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; + +@Service +public class CallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = CallMaterialTask.class.getName(); + + @Override + @Transactional + public void updateTaskStatus(JSONObject taskObj, String status) { + /** + *改变任务状态 + **/ + String task_id = taskObj.getString("task_id"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status,"0")) { + // 取消删除任务 + taskTab.delete("task_id = '"+task_id+"'"); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + //更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + HashMap map = new HashMap(); + map.put("bill_status", "40"); + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("ST_IVT_regionIO").update(map, "task_id='" + jsonTask.getString("task_id") + "'"); + + } + + if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + // 更新任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("remark", "任务执行完成"); + ///审核单据 增加库存 改变出入库表的状态 + WQLObject mstTab = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject mstObj = mstTab.query("task_id='" + task_id + "' and is_delete='0'").uniqueResult(0); + //审核 加库存可和用数量 + StoreIvtServiceImpl ivtService = new StoreIvtServiceImpl(); + mstObj.put("bill_status", "50"); + mstObj.put("confirm_optid", SecurityUtils.getCurrentUserId()); + mstObj.put("confirm_optname", SecurityUtils.getCurrentNickName()); + mstObj.put("confirm_time", DateUtil.now()); + mstTab.update(mstObj); + + String iostorinv_id = mstObj.getString("iostorinv_id"); + String next_point_code = mstObj.getString("end_point_code"); + String start_point_code = mstObj.getString("start_point_code"); + JSONObject param = new JSONObject(); + param.put("material_id", mstObj.getString("material_id")); + param.put("bill_id", iostorinv_id); + param.put("qty_unit_id", mstObj.getString("qty_unit_id")); + param.put("pcsn", mstObj.getString("pcsn")); + param.put("change_qty", mstObj.getString("qty")); + param.put("vehicle_code", mstObj.getString("vehicle_code")); + PointServiceImpl pointService = SpringContextHolder.getBean(PointServiceImpl.class); + PointDto nextPointDto = pointService.findByCode(next_point_code); + if (ObjectUtil.isNull(nextPointDto)) { + throw new BadRequestException("未找到可用点位:" + next_point_code); + } + PointDto startPointDto = pointService.findByCode(start_point_code); + if (ObjectUtil.isNull(startPointDto)) { + throw new BadRequestException("未找到可用点位:" + start_point_code); + } + param.put("struct_id", startPointDto.getPoint_id()); + ivtService.addIvtFlow(param, IvtChangeTypeEnum.SUB_IVT); + + //解锁仓位,托盘信息,回写到点位上去 + String vehicle_code = jsonTask.getString("vehicle_code"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + JSONObject startPointObj = pointTab.query("point_code='" + jsonTask.getString("start_point_code") + "'").uniqueResult(0); + startPointObj.put("lock_type", "00"); + startPointObj.put("point_status", "00"); + startPointObj.put("vehicle_code", ""); + startPointObj.put("vehicle_type", ""); + pointTab.update(startPointObj); + taskTab.update(jsonTask); + } + + } + + @Override + public void findStartPoint() { + String task_status = TaskStatusEnum.SURE_START.getCode(); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONArray taskArry = taskTab.query("task_status='" + task_status + "' AND handle_class='" + THIS_CLASS + "' AND is_delete='0' ").getResultJSONArray(0); + for (int i = 0; i < taskArry.size(); i++) { + JSONObject taskObj = taskArry.getJSONObject(i); + String task_id = taskObj.getString("task_id"); + //1 将任务修改为分配 2将终点写入,完成分配,3 加锁点位 + //找一个合适的仓位 + WQLObject ProcedureIOStable = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject IosObj = ProcedureIOStable.query("task_id='" + task_id + "' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(IosObj)) { + throw new BadRequestException("未找到任务号为'" + taskObj.getString("task_code") + "'的入库单据!"); + } + JSONObject param = new JSONObject(); + param.put("material_id", IosObj.getString("material_id")); + param.put("area_type", IosObj.getString("start_area")); + JSONObject inStructObj = StructFindUtil.getOutStruct(param); + if (ObjectUtil.isEmpty(inStructObj)) { + throw new BadRequestException("未找到合适的出库仓位!"); + } + //修改单据状态,将终点填入 + IosObj.put("bill_status", "20"); + IosObj.put("start_point_code", inStructObj.getString("struct_code")); + ProcedureIOStable.update(IosObj); + //终点加锁 + HashMap lock_map = new HashMap(); + lock_map.put("lock_type", "01"); + WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + inStructObj.getString("struct_code") + "'"); + //修改任务状态 + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentNickName()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional + public String createTask(JSONObject form) { + //请求参数 载具、起点、终点 + String vehicle_code = form.getString("vehicle_code"); + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + String vehicle_type = form.getString("vehicle_type"); + + String task_status = TaskStatusEnum.START_AND_POINT.getCode(); + String material_id = form.getString("material_id"); + String create_mode = form.getString("create_mode"); + String iostorinv_id = form.getString("iostorinv_id"); + + WQLObject taskTable = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject regionTable = WQLObject.getWQLObject("ST_IVT_regionIO"); + + if (StrUtil.isEmpty(next_point_code)) { + throw new BadRequestException("终点不能为空!"); + } + if (StrUtil.isEmpty(material_id)) { + throw new BadRequestException("物料标识不能为空!"); + } + if (StrUtil.isEmpty(create_mode)) { + throw new BadRequestException("创建方式不能为空!"); + } + //判断终点有没有未完成的指令 + JSONObject beforTaskObj = taskTable. + query("is_delete='0' and next_point_code='" + next_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'") + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(beforTaskObj)) { + throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); + } + PointServiceImpl pointService = SpringContextHolder.getBean(PointServiceImpl.class); + String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String start_area = ""; + String qty = ""; + String qty_unit_id = ""; + + if (StrUtil.isEmpty(start_point_code)) { + // 起点为空找到对应的起点 + JSONObject param = new JSONObject(); + param.put("next_point_code",next_point_code); + param.put("vehicle_type",vehicle_type); + param.put("material_id",material_id); + JSONObject ivtObj = this.findBeginPoint(param); + + qty = ivtObj.getString("canuse_qty"); + qty_unit_id = ivtObj.getString("qty_unit_id"); + start_point_code = ivtObj.getString("struct_code"); + } else { + // 不能空则为点对点,查找对应出入库单据 + if (ObjectUtil.isEmpty(iostorinv_id)) throw new BadRequestException("出库单id不能为空"); + JSONObject jsonRegion = regionTable.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + qty = jsonRegion.getString("qty"); + qty_unit_id = jsonRegion.getString("qty_unit_id"); + } + + PointDto startPoint = pointService.findByCode(start_point_code); + //起点点加锁 + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject startPointObj = pointTable.query("point_code='" + start_point_code + "'").uniqueResult(0); + startPointObj.put("lock_type", "01"); + pointTable.update(startPointObj); + + //减少库存可用数量 + StoreIvtServiceImpl ivtService = new StoreIvtServiceImpl(); + JSONObject param = new JSONObject(); + param.put("material_id", material_id); + param.put("bill_id", iostorinv_id); + param.put("qty_unit_id", qty_unit_id); + param.put("change_qty", qty); + param.put("struct_id", startPoint.getPoint_id()); + param.put("vehicle_code", startPoint.getVehicle_code()); + + ivtService.addIvtFlow(param, IvtChangeTypeEnum.SUB_CAN_USE); + JSONObject taskObj = new JSONObject(); + taskObj.put("task_id", task_id); + taskObj.put("taskdtl_id", task_id); + taskObj.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + taskObj.put("task_type", "02"); + taskObj.put("taskdtl_type", "02"); + taskObj.put("task_status", task_status); + taskObj.put("start_point_code", start_point_code); + taskObj.put("start_area", start_area); + taskObj.put("request_param", form.toJSONString()); + taskObj.put("next_point_code", next_point_code); + taskObj.put("vehicle_code", vehicle_code); + taskObj.put("handle_class", THIS_CLASS); + taskObj.put("is_auto_issue", "1"); + taskObj.put("create_name", SecurityUtils.getCurrentUsername()); + taskObj.put("create_id", SecurityUtils.getCurrentUserId()); + taskObj.put("create_time", DateUtil.now()); + taskObj.put("is_delete", "0"); + taskTable.insert(taskObj); + return task_id; + } + + @Override + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + + } + + @Override + public void cancel(String task_id) { + + } + + @Transactional + public JSONObject findBeginPoint(JSONObject json) { + String next_point_code = json.getString("next_point_code"); + String vehicle_type = json.getString("vehicle_type"); + String material_id = json.getString("material_id"); + + WQLObject regionTab = WQLObject.getWQLObject("SCH_BASE_Region"); + + // 根据起点判断是什么区域 然后要入到什么区 + PointDto endDto = SpringContextHolder.getBean(PointService.class).findByCode(next_point_code); + if (ObjectUtil.isEmpty(endDto)) throw new BadRequestException("终点点位不存在"); + JSONObject jsonEndRegion = regionTab.query("region_id = '" + endDto.getRegion_id() + "'").uniqueResult(0); + + /* + * 物料出库业务:目前只有1个业务,如果区域不正确则报错 + * 1.养生A区 --> 油漆线 + */ + JSONObject resuft = new JSONObject(); + if (StrUtil.equals(jsonEndRegion.getString("region_code"),RegionTypeEnum.YQQY.getCode())) { + JSONObject map = new JSONObject(); + map.put("flag", "3"); + map.put("vehicle_type", vehicle_type); + map.put("material_id", material_id); + map.put("region_code", RegionTypeEnum.YSQA.getCode()); + resuft = WQL.getWO("ST_REGION_OUT_01").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(resuft)) throw new BadRequestException("库存不足"); + } else { + throw new BadRequestException("业务类型错误"); + } + return resuft; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java new file mode 100644 index 000000000..307a001d1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java @@ -0,0 +1,120 @@ +package org.nl.wms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 普通点对点任务 + */ +@Service +public class PointToPointTask extends AbstractAcsTask { + @Override + @Transactional + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + + String task_id = taskObj.getString("task_id"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status,"0")) { + // 取消删除任务 + taskTab.delete("task_id = '"+task_id+"'"); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + } + + if(StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + // 完成 + jsonTask.put("task_status",TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + } + + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional + public String createTask(JSONObject form) { + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + String vehicle_code = form.getString("vehicle_code"); + String now = DateUtil.now(); + if (StrUtil.isEmpty(start_point_code)) { + throw new BadRequestException("起点不能为空!"); + } + /* if (StrUtil.isEmpty(next_point_code)) { + throw new BadRequestException("终点不能为空!"); + } + if (StrUtil.isEmpty(vehicle_code)) { + throw new BadRequestException("载具不能为空!"); + }*/ + String taskdtl_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + JSONObject task = new JSONObject(); + task.put("taskdtl_id", taskdtl_id); + task.put("task_id", taskdtl_id); + task.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + task.put("task_type", "05"); + task.put("taskdtl_type", "05"); + task.put("task_status", "01"); + task.put("start_point_code", start_point_code); + task.put("next_point_code", next_point_code); + task.put("vehicle_code", vehicle_code); + task.put("handle_class", this.getClass().getName()); + task.put("finished_type", "00"); + task.put("is_delete", "0"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + task.put("create_id", currentUserId); + task.put("create_name", SecurityUtils.getCurrentNickName()); + task.put("update_optid", currentUserId); + task.put("update_optname", SecurityUtils.getCurrentNickName()); + task.put("create_time", now); + task.put("update_time", now); + task.put("priority", "1"); + WQLObject.getWQLObject("SCH_BASE_Task").insert(task); + return taskdtl_id; + } + + @Override + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String taskdtl_id) { + + } + + @Override + public void cancel(String taskdtl_id) { + + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java new file mode 100644 index 000000000..3e17c1003 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java @@ -0,0 +1,44 @@ +package org.nl.wms.sch.tasks; + +/** + * 任务状态枚举 + */ +public enum RegionTypeEnum { + CPQYA(1, "CPQYA01", "成品区域A","1557538851726168064"), + YSQA(2, "YSQA01", "养生A区","1557539288307077120"), + YSQB(3, "YSQB01", "养生B区","1557539423292362752"), + GJQY(4, "GJQY01", "共挤区","1557539744848678912"), + YQQY(5, "YQQY01", "油漆区","1557913112412295168"), + DPJQA(6, "DPJQA01", "叠盘架A区","1558015562792177664"), + DPJQB(7, "DPJQB01", "叠盘架B区","1558015634472833024"), + KTPHCQA(8, "KTPHCQA01", "空托盘缓存A区","1558015810096730112"), + KTPHCQB(9, "KTPHCQB01", "空托盘缓存B区","1558015870570205184"), + HKQY(10, "HKQY01", "豪凯区域","1564862312702152704"), + CPQYB(11, "CPQYB01", "成品区域B","1564874102089584640"), + SSX(12, "SSX01", "输送线区域","1559374522581389312"); + + private int index; + private String code; + private String name; + private String id; + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public String getId() { + return id; + } + + RegionTypeEnum(int index, String code, String name, String id) { + this.index = index; + this.id = id; + this.code = code; + this.name = name; + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendEmpVehicleTask.java b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendEmpVehicleTask.java new file mode 100644 index 000000000..5974e211c --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendEmpVehicleTask.java @@ -0,0 +1,310 @@ +package org.nl.wms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.master.service.StoragevehicleinfoService; +import org.nl.wms.basedata.master.service.dto.StoragevehicleinfoDto; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.HashMap; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SendEmpVehicleTask extends AbstractAcsTask { + private final String THIS_CLASS = SendEmpVehicleTask.class.getName(); + + @Override + @Transactional + public void updateTaskStatus(JSONObject taskObj, String status) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String task_id = taskObj.getString("task_id"); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status,"0")) { + // 取消删除任务 + taskTab.delete("task_id = '"+task_id+"'"); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + } + + if(StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { + // 更改任务状态为完成 + jsonTask.put("task_status",TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + + String start_point_code = jsonTask.getString("start_point_code"); + + PointService point = SpringContextHolder.getBean(PointService.class); + // 校验起点是否存在 + PointDto startDto = point.findByCode(start_point_code); + if (ObjectUtil.isEmpty(startDto)) throw new BadRequestException("未找到可用点位:" + startDto); + // 校验终点是否存在 + PointDto nextDto = point.findByCode(jsonTask.getString("next_point_code")); + if (ObjectUtil.isEmpty(nextDto)) throw new BadRequestException("未找到可用点位:" + nextDto); + + // 1.更新点位数量 2.解锁点位 + JSONObject jsonEmp = empTab.query("task_uuid = '" + task_id + "'").uniqueResult(0); + int vehicle_qty = JSONObject.parseObject(JSON.toJSONString(nextDto)).getIntValue("vehicle_qty"); + BigDecimal vehicle_qty_point = NumberUtil.add(String.valueOf(vehicle_qty), String.valueOf(jsonEmp.getIntValue("vehicle_qty"))); + + nextDto.setVehicle_qty(Integer.valueOf(vehicle_qty_point.toString())); + nextDto.setPoint_status("01"); + nextDto.setLock_type("00"); + nextDto.setVehicle_type(jsonTask.getString("vehicle_type")); + nextDto.setVehicle_code(jsonTask.getString("vehicle_code")); + pointTab.update(JSONObject.parseObject(JSON.toJSONString(nextDto))); + + // 完成单据状态 + jsonEmp.put("bill_status", "50"); + jsonEmp.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonEmp.put("update_optname", SecurityUtils.getCurrentUsername()); + jsonEmp.put("update_time", DateUtil.now()); + empTab.update(jsonEmp); + } + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + + } + + @Override + @Transactional + public String createTask(JSONObject form) { + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + String vehicle_code = form.getString("vehicle_code"); + String qty = form.getString("qty"); + String record_uuid = form.getString("record_uuid"); + + String vehicle_type = ""; + // 入库起点不能为空 + if (ObjectUtil.isEmpty(start_point_code)) { + throw new BadRequestException("起点不能为空"); + } else { + // 判断起点是否有正在执行的任务 + JSONObject beforTaskObj = taskTab.query("is_delete='0' and start_point_code='" + start_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(beforTaskObj)) throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); + } + // 载具数量不能为空 + if (ObjectUtil.isEmpty(qty)) throw new BadRequestException("载具数量不能为空"); + + /* + * 1. 点对点: 起点和终点都确定,直接创建任务 + * 2. 起点确定: 需要找到对应终点,在创建任务 具体找终点货位的规则在findEndPoint()中 + */ + // 起点确定:找终点 + if (ObjectUtil.isEmpty(next_point_code)) { + JSONObject param = new JSONObject(); + param.put("start_point_code",start_point_code); + param.put("vehicle_qty",qty); + param.put("vehicle_code",vehicle_code); + JSONObject json = this.findEndPoint(param); + next_point_code = json.getString("EndPoint_code"); + vehicle_type = json.getString("vehicle_type"); + } else { + // 判断终点是否是空位 + JSONObject jsonPoint = pointTab.query("point_code = '" + next_point_code + "' and lock_type = '00' and point_status <> '02' and is_delete = '0' and is_used = '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonPoint)) throw new BadRequestException("终点点位不不可用或不存在"); + } + // 创建任务 + JSONObject jsonTask = new JSONObject(); + String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + + jsonTask.put("task_id", task_id); + jsonTask.put("taskdtl_id", task_id); + jsonTask.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + jsonTask.put("task_type", "03"); + jsonTask.put("taskdtl_type", "03"); + jsonTask.put("task_status", "01"); + jsonTask.put("start_point_code", start_point_code); + jsonTask.put("next_point_code", next_point_code); + jsonTask.put("vehicle_type", vehicle_type); + jsonTask.put("vehicle_code", vehicle_code); + jsonTask.put("handle_class", THIS_CLASS); + jsonTask.put("create_name", SecurityUtils.getCurrentUsername()); + jsonTask.put("create_id", SecurityUtils.getCurrentUserId()); + jsonTask.put("create_time", DateUtil.now()); + jsonTask.put("acs_task_type", "1"); + taskTab.insert(jsonTask); + + // 锁定终点点位 + JSONObject jsonPoint = pointTab.query("point_code = '" + next_point_code + "'").uniqueResult(0); + jsonPoint.put("lock_type", "02"); + pointTab.update(jsonPoint); + + // 更新空载具单据状态 + if (ObjectUtil.isNotEmpty(record_uuid)) { + JSONObject jsonEmp = empTab.query("record_uuid ='" + record_uuid + "'").uniqueResult(0); + jsonEmp.put("bill_status","20"); + empTab.update(jsonEmp); + } + return task_id; + } + + @Override + @Transactional + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + + } + + @Override + public void cancel(String task_id) { + + } + + @Transactional + public JSONObject findEndPoint(JSONObject json) { + String start_point_code = json.getString("start_point_code"); + String vehicle_qty = json.getString("vehicle_qty"); + String vehicle_code = json.getString("vehicle_code"); + + if (ObjectUtil.isEmpty(start_point_code)) throw new BadRequestException("起点不能为空"); + if (ObjectUtil.isEmpty(vehicle_qty)) throw new BadRequestException("载具数量不能为空"); + + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + WQLObject regionTab = WQLObject.getWQLObject("SCH_BASE_Region"); // 区域表 + WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); //空载具记录表 + WQLObject velicleTab = WQLObject.getWQLObject("md_pb_storagevehicleinfo"); // 载具表 + // 根据起点区域判断优先的终点区域 + JSONObject jsonPointStart = pointTab.query("point_code = '" + start_point_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonPointStart)) throw new BadRequestException("起点点位不存在"); + JSONObject jsonRegionStart = regionTab.query("region_id ='" + jsonPointStart.getString("region_id") + "'").uniqueResult(0); + + // 根据起点找到对应设备,根据设备查询工单表中 - 正在运行的工单中的载具类型 + String device_code = ""; + if (ObjectUtil.isEmpty(vehicle_code)) { + device_code = start_point_code.substring(0, start_point_code.indexOf("_")); + } + + String vehicle_type = ""; + + DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); + DeviceDto deviceDto = deviceBean.findByCode(device_code); + if (ObjectUtil.isEmpty(deviceDto)) { + // 如果说明是货梯业务:则判断载具号是否为空 + if (ObjectUtil.isEmpty(vehicle_code)) throw new BadRequestException("起点点位错误"); + // 根据载具号找对应的载具类型 + StoragevehicleinfoDto vehicleDto = SpringContextHolder.getBean(StoragevehicleinfoService.class).findByCode(vehicle_code); + if (ObjectUtil.isEmpty(vehicleDto)) throw new BadRequestException("载具不存在"); + vehicle_type = vehicleDto.getStoragevehicle_type(); + } else { + // 不为空说明不是货梯业务:则根据工单找到对应类型 + JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); + vehicle_type = jsonOrder.getString("vehicle_type"); + } + + /* + * 空托盘入库业务: + * 1.油漆线 --> 叠盘架A区、养生区A区 (优先级:1叠盘架A区 2.养生A区) + * 2.货梯 --> 叠盘架B区、养生区A区 (优先级:1叠盘架B区 2.养生A区) + */ + String EndPoint_code = ""; + HashMap map = new HashMap<>(); + if (StrUtil.equals(jsonRegionStart.getString("region_code"), RegionTypeEnum.YQQY.getCode())) { + // 油漆线入库:查找叠盘架A区是否有满足的空位 + map.put("flag", "1"); + map.put("vehicle_qty",vehicle_qty); + map.put("vehicle_type",vehicle_type); + map.put("region_code",RegionTypeEnum.DPJQA.getCode()); + JSONObject jsonEndPointDPA = WQL.getWO("ST_VEHICLE_IN_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonEndPointDPA)) { + EndPoint_code = jsonEndPointDPA.getString("point_code"); + } else { + // 为空说明没有相同的载具类型 + map.put("flag", "2"); + map.put("vehicle_type",""); + JSONObject jsonEndPointDPA2 = WQL.getWO("ST_VEHICLE_IN_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonEndPointDPA2)) { + EndPoint_code = jsonEndPointDPA2.getString("point_code"); + } else { + // 为空说明叠盘架A区上货位不足,则需要入库到养生A区 + map.put("flag", "3"); + map.put("region_code",RegionTypeEnum.YSQA.getCode() ); + JSONObject jsonEndPointYSA = WQL.getWO("ST_VEHICLE_IN_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(jsonEndPointYSA)) throw new BadRequestException("没有满足需求的空位"); + EndPoint_code = jsonEndPointYSA.getString("point_code"); + } + } + } else { + // 货梯入库:查找叠盘架B区是否有满足的空位 + map.put("flag", "1"); + map.put("vehicle_qty",vehicle_qty); + map.put("vehicle_type",vehicle_type); + map.put("region_code",RegionTypeEnum.DPJQB.getCode()); + JSONObject jsonEndPointDPB = WQL.getWO("ST_VEHICLE_IN_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonEndPointDPB)) { + EndPoint_code = jsonEndPointDPB.getString("point_code"); + } else { + // 为空说明没有相同的载具类型 + map.put("flag", "2"); + map.put("vehicle_type",""); + JSONObject jsonEndPointDPB2 = WQL.getWO("ST_VEHICLE_IN_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonEndPointDPB2)) { + EndPoint_code = jsonEndPointDPB2.getString("point_code"); + } else { + // 为空说明叠盘架B区上货位不足,则需要入库到养生A区 + map.put("flag", "3"); + map.put("region_code", RegionTypeEnum.YSQA.getCode()); + JSONObject jsonEndPointYSA = WQL.getWO("ST_VEHICLE_IN_02").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(jsonEndPointYSA)) throw new BadRequestException("没有满足需求的空位"); + EndPoint_code = jsonEndPointYSA.getString("point_code"); + } + } + } + JSONObject resuft = new JSONObject(); + resuft.put("EndPoint_code",EndPoint_code); + resuft.put("vehicle_type",vehicle_type); + return resuft; + } +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java new file mode 100644 index 000000000..e168e2177 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/SendMaterialTask.java @@ -0,0 +1,311 @@ +package org.nl.wms.sch.tasks; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.basedata.st.IvtChangeTypeEnum; +import org.nl.wms.basedata.st.StoreIvtServiceImpl; +import org.nl.wms.common.StructFindUtil; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.service.dto.PointDto; +import org.nl.wms.sch.service.impl.PointServiceImpl; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SendMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = SendMaterialTask.class.getName(); + + + @Override + @Transactional + public void updateTaskStatus(JSONObject taskObj, String status) { + /** + *改变任务状态 + **/ + String task_id = taskObj.getString("task_id"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + + if (StrUtil.equals(status,"0")) { + // 取消删除任务 + taskTab.delete("task_id = '"+task_id+"'"); + } + + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + //更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("car_no", taskObj.getString("car_no")); + taskTab.update(jsonTask); + HashMap map = new HashMap(); + map.put("update_optid", SecurityUtils.getCurrentUserId()); + map.put("update_optname", SecurityUtils.getCurrentNickName()); + map.put("update_time", DateUtil.now()); + map.put("bill_status", "40"); + WQLObject.getWQLObject("ST_IVT_regionIO").update(map, "task_id='" + jsonTask.getString("task_id") + "'"); + } + + if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + // 更新任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("remark", "任务执行完成"); + ///审核单据 增加库存 改变出入库表的状态 + WQLObject mstTab = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject mstObj = mstTab.query("task_id='" + task_id + "' and is_delete='0'").uniqueResult(0); + //审核 加库存可和用数量 + StoreIvtServiceImpl ivtService = new StoreIvtServiceImpl(); + mstObj.put("bill_status", "50"); + mstObj.put("confirm_optid", SecurityUtils.getCurrentUserId()); + mstObj.put("confirm_optname", SecurityUtils.getCurrentNickName()); + mstObj.put("confirm_time", DateUtil.now()); + mstTab.update(mstObj); + + String iostorinv_id = mstObj.getString("iostorinv_id"); + String bill_code = mstObj.getString("bill_code"); + String bill_type_scode =mstObj.getString("bill_type"); + String next_point_code = mstObj.getString("end_point_code"); + String start_point_code = mstObj.getString("start_point_code"); + JSONObject param = new JSONObject(); + param.put("material_id", mstObj.getString("material_id")); + param.put("bill_code", bill_code); + param.put("bill_type_scode", bill_type_scode); + param.put("bill_id", iostorinv_id); + param.put("qty_unit_id", mstObj.getString("qty_unit_id")); + param.put("pcsn", mstObj.getString("pcsn")); + param.put("change_qty", mstObj.getString("qty")); + param.put("vehicle_code", mstObj.getString("vehicle_code")); + param.put("region_id", mstObj.getString("start_region_id")); + param.put("is_full", mstObj.getString("is_full")); + param.put("stewing_time", mstObj.getString("stewing_time")); + param.put("producetask_id", mstObj.getString("producetask_id")); + param.put("io_type", mstObj.getString("io_type")); + + PointServiceImpl pointService = SpringContextHolder.getBean(PointServiceImpl.class); + PointDto nextPointDto = pointService.findByCode(next_point_code); + if (ObjectUtil.isNull(nextPointDto)) { + throw new BadRequestException("未找到可用点位:" + next_point_code); + } + PointDto startPointDto = pointService.findByCode(start_point_code); + if (ObjectUtil.isNull(startPointDto)) { + throw new BadRequestException("未找到可用点位:" + start_point_code); + } + param.put("struct_id", nextPointDto.getPoint_id()); + ivtService.addIvtFlow(param, IvtChangeTypeEnum.ADD_IVT_AND_CAN_USE); + // 解锁点位 + String vehicle_code = jsonTask.getString("vehicle_code"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONObject endpointObj = pointTab.query("point_code='" + jsonTask.getString("next_point_code") + "'").uniqueResult(0); + endpointObj.put("lock_type", "00"); + endpointObj.put("point_status", "02"); + endpointObj.put("vehicle_code", vehicle_code); + endpointObj.put("vehicle_type", jsonTask.getString("vehicle_type")); + pointTab.update(endpointObj); + taskTab.update(jsonTask); + + /* JSONObject startPointObj = pointTab.query("point_code='" + jsonTask.getString("start_point_code") + "'").uniqueResult(0); + startPointObj.put("lock_type", "00"); + startPointObj.put("point_status", "00"); + startPointObj.put("vehicle_code", ""); + pointTab.update(startPointObj); + taskTab.update(jsonTask);*/ + } + + } + + @Override + public void findStartPoint() { + + } + + @Override + public void findNextPoint() { + String task_status = TaskStatusEnum.SURE_START.getCode(); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONArray taskArry = taskTab.query("task_status='" + task_status + "' AND handle_class='" + THIS_CLASS + "' AND is_delete='0' ").getResultJSONArray(0); + for (int i = 0; i < taskArry.size(); i++) { + JSONObject taskObj = taskArry.getJSONObject(i); + String task_id = taskObj.getString("task_id"); + //1 将任务修改为分配 2将终点写入,完成分配,3 加锁点位 + //找一个合适的仓位 + WQLObject ProcedureIOStable = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject IosObj = ProcedureIOStable.query("task_id='" + task_id + "' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(IosObj)) { + throw new BadRequestException("未找到任务号为'" + taskObj.getString("task_code") + "'的入库单据!"); + } + JSONObject param = new JSONObject(); + param.put("material_id", IosObj.getString("material_id")); + param.put("area_type", IosObj.getString("end_area")); + param.put("vehicle_code", IosObj.getString("vehicle_code")); + JSONObject inStructObj = StructFindUtil.getInStruct(param); + if (ObjectUtil.isEmpty(inStructObj)) { + throw new BadRequestException("未找到合适的入库仓位!"); + } + //修改单据状态,将终点填入 + IosObj.put("bill_status", "20"); + IosObj.put("end_point_code", inStructObj.getString("struct_code")); + ProcedureIOStable.update(IosObj); + //终点加锁 + HashMap lock_map = new HashMap(); + lock_map.put("lock_type", "01"); + WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + inStructObj.getString("struct_code") + "'"); + //修改任务状态 + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); + taskObj.put("update_optname", SecurityUtils.getCurrentNickName()); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + } + + + } + + @Override + @Transactional + public String createTask(JSONObject form) { + //请求参数 载具、起点、终点 + String vehicle_code = form.getString("vehicle_code"); + String vehicle_type = form.getString("vehicle_type"); + String start_point_code = form.getString("start_point_code"); + String next_point_code = form.getString("next_point_code"); + + WQLObject taskTable = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject iosTable = WQLObject.getWQLObject("ST_IVT_regionIO"); + + + if (StrUtil.isEmpty(start_point_code)) { + throw new BadRequestException("起点不能为空!"); + } + //判断起点有没有未完成的指令 + JSONObject beforTaskObj = taskTable. + query("is_delete='0' and start_point_code='" + start_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'") + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(beforTaskObj)) { + throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); + } + + + if (StrUtil.isEmpty(next_point_code)) { + // 终点为空需要找终点 + JSONObject param = new JSONObject(); + param.put("start_point_code",start_point_code); + JSONObject endPoint = this.findEndPoint(param); + next_point_code = endPoint.getString("next_point_code"); + } + + //终点点加锁 + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject endPointObj = pointTable.query("point_code='" + next_point_code + "'").uniqueResult(0); + endPointObj.put("lock_type", "01"); + pointTable.update(endPointObj); + + // 创建任务 + PointService pointService = SpringContextHolder.getBean(PointService.class); + + JSONObject taskObj = new JSONObject(); + CodeUtil.getNewCode("TASK_CODE"); + String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + taskObj.put("task_id", task_id); + taskObj.put("taskdtl_id", task_id); + taskObj.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + taskObj.put("task_type", "01"); + taskObj.put("vehicle_type", vehicle_type); + taskObj.put("taskdtl_type", "01"); + taskObj.put("acs_task_type", "1"); + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("start_point_code", start_point_code); + PointDto startPoint = pointService.findByCode(start_point_code); + taskObj.put("start_area", startPoint.getRegion_id()); + taskObj.put("request_param", form.toJSONString()); + taskObj.put("next_point_code", next_point_code); + PointDto nextPoint = pointService.findByCode(next_point_code); + taskObj.put("next_area", nextPoint.getRegion_id()); + taskObj.put("vehicle_code", vehicle_code); + taskObj.put("handle_class", THIS_CLASS); + taskObj.put("is_auto_issue", "1"); + taskObj.put("create_name", SecurityUtils.getCurrentUsername()); + taskObj.put("create_id", SecurityUtils.getCurrentUserId()); + taskObj.put("create_time", DateUtil.now()); + taskObj.put("is_delete", "0"); + taskTable.insert(taskObj); + return task_id; + } + + + @Override + public void forceFinish(String task_id) { + JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) { + + } + + @Override + public void cancel(String task_id) { + + } + + @Transactional + public JSONObject findEndPoint(JSONObject json) { + String start_point_code = json.getString("start_point_code"); + + WQLObject regionTab = WQLObject.getWQLObject("SCH_BASE_Region"); + + // 根据起点判断是什么区域 然后要入到什么区 + PointDto startDto = SpringContextHolder.getBean(PointService.class).findByCode(start_point_code); + if (ObjectUtil.isEmpty(startDto)) throw new BadRequestException("起点点位不存在"); + JSONObject jsonStartRegion = regionTab.query("region_id = '" + startDto.getRegion_id() + "'").uniqueResult(0); + + /* + * 物料入库业务:目前只有2个业务,如果区域不正确则报错 + * 1.共挤线 --> 养生区A + * 2.豪凯线 --> 成品区 + */ + String next_point_code = ""; + if (StrUtil.equals(jsonStartRegion.getString("region_code"),RegionTypeEnum.GJQY.getCode())) { + JSONObject map = new JSONObject(); + map.put("flag", "2"); + map.put("region_code", RegionTypeEnum.YSQA.getCode()); + JSONObject jsonEndPoint = WQL.getWO("ST_REGION_IN_01").addParamMap(map).process().uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonEndPoint)) throw new BadRequestException("仓位不足"); + next_point_code = jsonEndPoint.getString("point_code"); + } else if (StrUtil.equals(jsonStartRegion.getString("region_code"),RegionTypeEnum.HKQY.getCode())) { + JSONObject map = new JSONObject(); + map.put("flag", "2"); + map.put("region_code", RegionTypeEnum.CPQYA.getCode()); + JSONObject jsonEndPoint = WQL.getWO("ST_REGION_IN_01").addParamMap(map).process().uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonEndPoint)) throw new BadRequestException("仓位不足"); + next_point_code = jsonEndPoint.getString("point_code"); + } + + JSONObject resuft = new JSONObject(); + resuft.put("next_point_code",next_point_code); + return resuft; + } + + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/sch/tasks/TaskTypeEnum.java b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/TaskTypeEnum.java new file mode 100644 index 000000000..9b0e82daf --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/sch/tasks/TaskTypeEnum.java @@ -0,0 +1,33 @@ +package org.nl.wms.sch.tasks; + +/** + * 任务状态枚举 + */ +public enum TaskTypeEnum { + IN_TASK(1, "01", "入库"), + Out_TASK(2, "02", "出库"), + IN_EMPTY_VEHICLE_TASK(3, "03", "入空载具"), + OUT_EMPTY_VEHICLE_TASK(4, "04", "出空载具"), + DUMPINV_TASK(5, "05", "转储"), + QUALITY_TASK(6, "06", "质检"), + MATERIAL_BACK_TASK(7, "07", "余料回库"); + + private int index; + private String code; + private String name; + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + TaskTypeEnum(int index, String code, String name) { + this.index = index; + this.code = code; + this.name = name; + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RegionioInController.java b/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RegionioInController.java new file mode 100644 index 000000000..6f237a2a0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RegionioInController.java @@ -0,0 +1,77 @@ + +package org.nl.wms.st.inbill.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.st.inbill.service.RegionioInService; +import org.nl.wms.st.inbill.service.dto.RegionioDto; +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; + +/** + * @author Liuxy + * @date 2022-08-11 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "区域入库管理") +@RequestMapping("/api/regionioIn") +@Slf4j +public class RegionioInController { + + private final RegionioInService rgionioInService; + + @GetMapping + @Log("查询区域入库") + @ApiOperation("查询区域入库") + //@PreAuthorize("@el.check('regionio:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(rgionioInService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增区域入库") + @ApiOperation("新增区域入库") + //@PreAuthorize("@el.check('regionio:add')") + public ResponseEntity create(@Validated @RequestBody RegionioDto dto) { + rgionioInService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改区域入库") + @ApiOperation("修改区域入库") + //@PreAuthorize("@el.check('regionio:edit')") + public ResponseEntity update(@Validated @RequestBody RegionioDto dto) { + rgionioInService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除区域入库") + @ApiOperation("删除区域入库") + //@PreAuthorize("@el.check('regionio:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + rgionioInService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("生成任务") + @ApiOperation("生成任务") + @PostMapping("/createTask") + public ResponseEntity createTask(@RequestBody JSONObject jsonObject) { + rgionioInService.createTask(jsonObject); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RegionioInService.java b/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RegionioInService.java new file mode 100644 index 000000000..c9435d311 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RegionioInService.java @@ -0,0 +1,79 @@ + +package org.nl.wms.st.inbill.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.st.inbill.service.dto.RegionioDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author Liuxy + * @description 服务接口 + * @date 2022-08-11 + **/ +public interface RegionioInService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param qty_unit_id ID + * @return Regionio + */ + RegionioDto findById(Long qty_unit_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Regionio + */ + RegionioDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(RegionioDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(RegionioDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 生成任务 + * + * @param jsonObject / + */ + void createTask(JSONObject jsonObject); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/dto/RegionioDto.java b/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/dto/RegionioDto.java new file mode 100644 index 000000000..8083a9eb4 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/dto/RegionioDto.java @@ -0,0 +1,156 @@ +package org.nl.wms.st.inbill.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Liuxy + * @description / + * @date 2022-08-11 + **/ +@Data +public class RegionioDto implements Serializable { + + /** 出入单标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long iostorinv_id; + + /** + * 单据编号 + */ + private String bill_code; + + /** + * 出入类型 + */ + private String io_type; + + /** + * 物料标识 + */ + private Long material_id; + + /** + * 批次 + */ + private String pcsn; + + /** + * 载具编码 + */ + private String vehicle_code; + + /** + * 数量 + */ + private BigDecimal qty; + + /** 数量单位标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long qty_unit_id; + + /** + * 单据状态 + */ + private String bill_status; + + /** + * 起始点位编码 + */ + private String start_point_code; + + /** + * 终点点位编码 + */ + private String end_point_code; + + /** + * 起始区域 + */ + private String start_region_id; + + /** + * 终点区域 + */ + private String end_region_id; + + /** + * 客户标识 + */ + private Long cust_id; + + /** + * 生成方式 + */ + private String create_mode; + + /** + * 任务标识 + */ + private Long task_id; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 确认人 + */ + private Long confirm_optid; + + /** + * 确认人姓名 + */ + private String confirm_optname; + + /** + * 确认时间 + */ + private String confirm_time; + + /** + * 是否删除 + */ + private String is_delete; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RegionioInServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RegionioInServiceImpl.java new file mode 100644 index 000000000..76706aa8f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RegionioInServiceImpl.java @@ -0,0 +1,231 @@ + +package org.nl.wms.st.inbill.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.pdm.service.DeviceService; +import org.nl.wms.pdm.service.dto.DeviceDto; +import org.nl.wms.sch.tasks.SendMaterialTask; +import org.nl.wms.st.inbill.service.RegionioInService; +import org.nl.wms.st.inbill.service.dto.RegionioDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** +* @description 服务实现 +* @author Liuxy +* @date 2022-08-11 +**/ +@Service +@RequiredArgsConstructor +@Slf4j +public class RegionioInServiceImpl implements RegionioInService { + + @Override + public Map queryAll(Map whereJson, Pageable page){ + String bill_code = MapUtil.getStr(whereJson, "bill_code"); + String vehicle_code = MapUtil.getStr(whereJson, "vehicle_code"); + String material_code = MapUtil.getStr(whereJson, "material_code"); + String pcsn = MapUtil.getStr(whereJson, "pcsn"); + String start_point_code = MapUtil.getStr(whereJson, "start_point_code"); + String end_point_code = MapUtil.getStr(whereJson, "end_point_code"); + String start_region_code = MapUtil.getStr(whereJson, "start_region_code"); + String end_region_code = MapUtil.getStr(whereJson, "end_region_code"); + + HashMap map = new HashMap<>(); + map.put("flag", "1"); + map.put("bill_status",MapUtil.getStr(whereJson, "bill_status")); + if (ObjectUtil.isNotEmpty(bill_code)) map.put("bill_code", bill_code + "%"); + if (ObjectUtil.isNotEmpty(vehicle_code)) map.put("vehicle_code", vehicle_code + "%"); + if (ObjectUtil.isNotEmpty(material_code)) map.put("material_code", material_code + "%"); + if (ObjectUtil.isNotEmpty(pcsn)) map.put("pcsn", pcsn + "%"); + if (ObjectUtil.isNotEmpty(start_point_code)) map.put("start_point_code", start_point_code + "%"); + if (ObjectUtil.isNotEmpty(end_point_code)) map.put("end_point_code", end_point_code + "%"); + if (ObjectUtil.isNotEmpty(start_region_code)) map.put("start_region_code", start_region_code + "%"); + if (ObjectUtil.isNotEmpty(end_region_code)) map.put("end_region_code", end_region_code + "%"); + + JSONObject json = WQL.getWO("ST_REGION_IN_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "ios.create_time DESC"); + return json; + } + + @Override + public List queryAll(Map whereJson){ + WQLObject wo = WQLObject.getWQLObject("st_ivt_regionio"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(RegionioDto.class); + return null; + } + + @Override + public RegionioDto findById(Long qty_unit_id) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_regionio"); + JSONObject json = wo.query("qty_unit_id = '" + qty_unit_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( RegionioDto.class); + } + return null; + } + + @Override + public RegionioDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_regionio"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( RegionioDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(RegionioDto dto) { + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + WQLObject vehicleTab = WQLObject.getWQLObject("MD_PB_StorageVehicleInfo"); + JSONObject jsonMater = materTab.query("material_id = '" + dto.getMaterial_id() + "'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(dto.getVehicle_code())) { + JSONObject jsonVehicle = vehicleTab.query("storagevehicle_code = '" + dto.getVehicle_code() + "' and is_delete = '0' and is_used= '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonVehicle)) { + throw new BadRequestException("载具不存在"); + } + } + + String bill_code = CodeUtil.getNewCode("IN_STORE_CODE"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setIostorinv_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setBill_code(bill_code); + dto.setIo_type("0"); + dto.setBill_status("10"); + dto.setCreate_mode("01"); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setQty_unit_id(jsonMater.getLongValue("base_unit_id")); + + WQLObject wo = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(RegionioDto dto) { + RegionioDto entity = this.findById(dto.getQty_unit_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + WQLObject vehicleTab = WQLObject.getWQLObject("MD_PB_StorageVehicleInfo"); + JSONObject jsonMater = materTab.query("material_id = '" + dto.getMaterial_id() + "'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(dto.getVehicle_code())) { + JSONObject jsonVehicle = vehicleTab.query("storagevehicle_code = '" + dto.getVehicle_code() + "' and is_delete = '0' and is_used= '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonVehicle)) { + throw new BadRequestException("载具不存在"); + } + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + dto.setBill_status("10"); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setQty_unit_id(jsonMater.getLongValue("base_unit_id")); + + WQLObject wo = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_regionio"); + for (Long iostorinv_id: ids) { + JSONObject param = wo.query("iostorinv_id = '" + String.valueOf(iostorinv_id) + "'").uniqueResult(0); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createTask(JSONObject jsonObject) { + String iostorinv_id = jsonObject.getString("iostorinv_id"); + + WQLObject wo = WQLObject.getWQLObject("ST_IVT_regionIO"); + WQLObject orderTab = WQLObject.getWQLObject("mps_bd_produceshiftorder"); + + JSONObject jsonIn = wo.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + String start_point_code = jsonIn.getString("start_point_code"); + + // 准备参数 并调用入库处理类中的创建任务方法 + JSONObject form = new JSONObject(); + form.put("vehicle_code", jsonIn.getString("vehicle_code")); + form.put("start_point_code", start_point_code); + form.put("next_point_code", jsonIn.getString("end_point_code")); + form.put("material_id", jsonIn.getString("material_id")); + form.put("qty", jsonIn.getString("qty")); + form.put("cust_id", jsonIn.getString("cust_id")); + form.put("create_mode", jsonIn.getString("create_mode")); + form.put("pcsn", jsonIn.getString("pcsn")); + form.put("iostorinv_id", iostorinv_id); + + // 根据起点点位 找到对应设备,根据设备找到对应工单,根据工单获取载具类型 + String device_code = start_point_code.substring(0, start_point_code.indexOf("_")); + + DeviceService deviceBean = SpringContextHolder.getBean(DeviceService.class); + DeviceDto deviceDto = deviceBean.findByCode(device_code); + if (ObjectUtil.isEmpty(deviceDto)) throw new BadRequestException("此设备不存在"); + JSONObject jsonOrder = orderTab.query("device_id = '" + deviceDto.getDevice_id() + "' and order_status = '02' and is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonOrder)) throw new BadRequestException("此设备未在生产中或不存在"); + + form.put("vehicle_type", jsonOrder.getString("vehicle_type")); + SendMaterialTask sendMaterialTask = new SendMaterialTask(); + String task_id = sendMaterialTask.createTask(form); + + JSONObject json = new JSONObject(); + json.put("task_id", task_id); + json.put("update_optid", SecurityUtils.getCurrentUserId()); + json.put("update_optname", SecurityUtils.getCurrentNickName()); + json.put("update_time", DateUtil.now()); + json.put("bill_status", "20"); + wo.update(json, "iostorinv_id = '" + iostorinv_id + "'"); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/ST_REGION_IN_01.wql b/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/ST_REGION_IN_01.wql new file mode 100644 index 000000000..31114c040 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/ST_REGION_IN_01.wql @@ -0,0 +1,139 @@ +[交易说明] + 交易名: 区域入库分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.bill_code TYPEAS s_string + 输入.bill_status TYPEAS s_string + 输入.vehicle_code TYPEAS s_string + 输入.material_code TYPEAS s_string + 输入.pcsn TYPEAS s_string + 输入.start_point_code TYPEAS s_string + 输入.end_point_code TYPEAS s_string + 输入.start_region_code TYPEAS s_string + 输入.end_region_code TYPEAS s_string + 输入.region_code TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + ios.*, + mater.material_code, + mater.material_name, + unit.unit_name, + region1.region_name AS start_region_name, + region2.region_name AS end_region_name, + point1.point_name AS start_point_name, + point2.point_name AS end_point_name + FROM + ST_IVT_regionIO ios + LEFT JOIN md_me_materialbase mater ON mater.material_id = ios.material_id + LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = ios.qty_unit_id + LEFT JOIN SCH_BASE_Region region1 ON region1.region_id = ios.start_region_id + LEFT JOIN SCH_BASE_Region region2 ON region2.region_id = ios.end_region_id + LEFT JOIN sch_base_point point1 ON point1.point_code = ios.start_point_code + LEFT JOIN sch_base_point point2 ON point2.point_code = ios.end_point_code + WHERE + ios.is_delete = '0' + AND ios.io_type = '0' + + OPTION 输入.bill_code <> "" + ios.bill_code like 输入.bill_code + ENDOPTION + + OPTION 输入.bill_status <> "" + ios.bill_status = 输入.bill_status + ENDOPTION + + OPTION 输入.vehicle_code <> "" + ios.vehicle_code like 输入.vehicle_code + ENDOPTION + + OPTION 输入.pcsn <> "" + ios.pcsn like 输入.pcsn + ENDOPTION + + OPTION 输入.material_code <> "" + (mater.material_code like 输入.material_code or + mater.material_name like 输入.material_code) + ENDOPTION + + OPTION 输入.start_point_code <> "" + (point1.point_code like 输入.start_point_code or + point1.point_name like 输入.start_point_code) + ENDOPTION + + OPTION 输入.end_point_code <> "" + (point2.point_code like 输入.end_point_code or + point2.point_name like 输入.end_point_code) + ENDOPTION + + OPTION 输入.start_region_code <> "" + (region1.region_code like 输入.start_region_code or + region1.region_name like 输入.start_region_code) + ENDOPTION + + OPTION 输入.end_region_code <> "" + (region2.region_code like 输入.end_region_code or + region2.region_name like 输入.end_region_code) + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point.* + FROM + sch_base_point point + LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id + WHERE + point.point_status = '00' + AND point.lock_type = '00' + AND point.is_used = '1' + AND point.is_delete = '0' + + OPTION 输入.region_code <> "" + region.region_code = 输入.region_code + ENDOPTION + + order by point.point_code DESC + + ENDSELECT + ENDQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/RegionioOutController.java b/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/RegionioOutController.java new file mode 100644 index 000000000..42b566f83 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/RegionioOutController.java @@ -0,0 +1,84 @@ + +package org.nl.wms.st.outbill.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.st.inbill.service.dto.RegionioDto; +import org.nl.wms.st.outbill.service.RegionioOutService; +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; + +/** + * @author Liuxy + * @date 2022-08-11 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "区域出库管理") +@RequestMapping("/api/regionioOut") +@Slf4j +public class RegionioOutController { + + private final RegionioOutService regionioOutService; + + @GetMapping + @Log("查询区域出库") + @ApiOperation("查询区域出库") + //@PreAuthorize("@el.check('regionio:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(regionioOutService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增区域出库") + @ApiOperation("新增区域出库") + //@PreAuthorize("@el.check('regionio:add')") + public ResponseEntity create(@Validated @RequestBody RegionioDto dto) { + regionioOutService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改区域入库") + @ApiOperation("修改区域入库") + //@PreAuthorize("@el.check('regionio:edit')") + public ResponseEntity update(@Validated @RequestBody RegionioDto dto) { + regionioOutService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除区域出库") + @ApiOperation("删除区域出库") + //@PreAuthorize("@el.check('regionio:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + regionioOutService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("生成任务") + @ApiOperation("生成任务") + @PostMapping("/createTask") + public ResponseEntity createTask(@RequestBody JSONObject jsonObject) { + regionioOutService.createTask(jsonObject); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getMaterial") + @Log("选择物料") + @ApiOperation("选择物料") + public ResponseEntity getMaterial(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(regionioOutService.getMaterial(whereJson,page),HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/RegionioOutService.java b/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/RegionioOutService.java new file mode 100644 index 000000000..9fc2b9d7f --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/RegionioOutService.java @@ -0,0 +1,87 @@ + +package org.nl.wms.st.outbill.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.st.inbill.service.dto.RegionioDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author Liuxy + * @description 服务接口 + * @date 2022-08-11 + **/ +public interface RegionioOutService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param qty_unit_id ID + * @return Regionio + */ + RegionioDto findById(Long qty_unit_id); + + /** + * 根据编码查询 + * + * @param code code + * @return Regionio + */ + RegionioDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(RegionioDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(RegionioDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 生成任务 + * + * @param jsonObject / + */ + void createTask(JSONObject jsonObject); + + /** + * 选择出库物料 + * + * @param whereJson 条件参数 + * @return List + */ + Map getMaterial(Map whereJson, Pageable page); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/RegionioOutServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/RegionioOutServiceImpl.java new file mode 100644 index 000000000..c10d88f7b --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/RegionioOutServiceImpl.java @@ -0,0 +1,226 @@ + +package org.nl.wms.st.outbill.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.wms.sch.tasks.CallMaterialTask; +import org.nl.wms.st.inbill.service.dto.RegionioDto; +import org.nl.wms.st.outbill.service.RegionioOutService; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** +* @description 服务实现 +* @author Liuxy +* @date 2022-08-11 +**/ +@Service +@RequiredArgsConstructor +@Slf4j +public class RegionioOutServiceImpl implements RegionioOutService { + + @Override + public Map queryAll(Map whereJson, Pageable page){ + String bill_code = MapUtil.getStr(whereJson, "bill_code"); + String vehicle_code = MapUtil.getStr(whereJson, "vehicle_code"); + String material_code = MapUtil.getStr(whereJson, "material_code"); + String pcsn = MapUtil.getStr(whereJson, "pcsn"); + String start_point_code = MapUtil.getStr(whereJson, "start_point_code"); + String end_point_code = MapUtil.getStr(whereJson, "end_point_code"); + String start_region_code = MapUtil.getStr(whereJson, "start_region_code"); + String end_region_code = MapUtil.getStr(whereJson, "end_region_code"); + + HashMap map = new HashMap<>(); + map.put("flag", "1"); + map.put("bill_status",MapUtil.getStr(whereJson, "bill_status")); + if (ObjectUtil.isNotEmpty(bill_code)) map.put("bill_code", bill_code + "%"); + if (ObjectUtil.isNotEmpty(vehicle_code)) map.put("vehicle_code", vehicle_code + "%"); + if (ObjectUtil.isNotEmpty(material_code)) map.put("material_code", material_code + "%"); + if (ObjectUtil.isNotEmpty(pcsn)) map.put("pcsn", pcsn + "%"); + if (ObjectUtil.isNotEmpty(start_point_code)) map.put("start_point_code", start_point_code + "%"); + if (ObjectUtil.isNotEmpty(end_point_code)) map.put("end_point_code", end_point_code + "%"); + if (ObjectUtil.isNotEmpty(start_region_code)) map.put("start_region_code", start_region_code + "%"); + if (ObjectUtil.isNotEmpty(end_region_code)) map.put("end_region_code", end_region_code + "%"); + + JSONObject json = WQL.getWO("ST_REGION_OUT_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "ios.create_time DESC"); + return json; + } + + @Override + public List queryAll(Map whereJson){ + WQLObject wo = WQLObject.getWQLObject("st_ivt_regionio"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(RegionioDto.class); + return null; + } + + @Override + public RegionioDto findById(Long qty_unit_id) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_regionio"); + JSONObject json = wo.query("qty_unit_id = '" + qty_unit_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( RegionioDto.class); + } + return null; + } + + @Override + public RegionioDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_regionio"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)){ + return json.toJavaObject( RegionioDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(RegionioDto dto) { + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + WQLObject vehicleTab = WQLObject.getWQLObject("MD_PB_StorageVehicleInfo"); + JSONObject jsonMater = materTab.query("material_id = '" + dto.getMaterial_id() + "'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(dto.getVehicle_code())) { + JSONObject jsonVehicle = vehicleTab.query("storagevehicle_code = '" + dto.getVehicle_code() + "' and is_delete = '0' and is_used= '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonVehicle)) { + throw new BadRequestException("载具不存在"); + } + } + + String bill_code = CodeUtil.getNewCode("OUT_STORE_CODE"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setIostorinv_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setBill_code(bill_code); + dto.setIo_type("1"); + dto.setBill_status("10"); + dto.setCreate_mode("01"); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setQty_unit_id(jsonMater.getLongValue("base_unit_id")); + + WQLObject wo = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(RegionioDto dto) { + RegionioDto entity = this.findById(dto.getQty_unit_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase"); + WQLObject vehicleTab = WQLObject.getWQLObject("MD_PB_StorageVehicleInfo"); + JSONObject jsonMater = materTab.query("material_id = '" + dto.getMaterial_id() + "'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(dto.getVehicle_code())) { + JSONObject jsonVehicle = vehicleTab.query("storagevehicle_code = '" + dto.getVehicle_code() + "' and is_delete = '0' and is_used= '1'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonVehicle)) { + throw new BadRequestException("载具不存在"); + } + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + dto.setBill_status("10"); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setQty_unit_id(jsonMater.getLongValue("base_unit_id")); + + WQLObject wo = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_regionio"); + for (Long iostorinv_id: ids) { + JSONObject param = wo.query("iostorinv_id = '" + String.valueOf(iostorinv_id) + "'").uniqueResult(0); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createTask(JSONObject jsonObject) { + String iostorinv_id = jsonObject.getString("iostorinv_id"); + WQLObject wo = WQLObject.getWQLObject("ST_IVT_regionIO"); + JSONObject jsonIn = wo.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + + // 准备参数 并调用入库处理类中的创建任务方法 + JSONObject form = new JSONObject(); + form.put("vehicle_code", jsonIn.getString("vehicle_code")); + form.put("start_point_code", jsonIn.getString("start_point_code")); + form.put("next_point_code", jsonIn.getString("end_point_code")); + form.put("material_id", jsonIn.getString("material_id")); + form.put("qty", jsonIn.getString("qty")); + form.put("cust_id", jsonIn.getString("cust_id")); + form.put("create_mode", jsonIn.getString("create_mode")); + form.put("pcsn", jsonIn.getString("pcsn")); + form.put("iostorinv_id", iostorinv_id); + CallMaterialTask callMaterialTask = new CallMaterialTask(); + String task_id = callMaterialTask.createTask(form); + + JSONObject json = new JSONObject(); + json.put("task_id", task_id); + json.put("update_optid", SecurityUtils.getCurrentUserId()); + json.put("update_optname", SecurityUtils.getCurrentNickName()); + json.put("update_time", DateUtil.now()); + json.put("bill_status", "20"); + wo.update(json, "iostorinv_id = '" + iostorinv_id + "'"); + } + + @Override + public Map getMaterial(Map whereJson, Pageable page) { + String material_code = MapUtil.getStr(whereJson, "material_code"); + + HashMap map = new HashMap<>(); + map.put("flag", "2"); + map.put("region_id", MapUtil.getStr(whereJson, "region_id")); + if (ObjectUtil.isNotEmpty(material_code)) map.put("material_code",material_code); + + JSONObject json = WQL.getWO("ST_REGION_OUT_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "ivt.instorage_time DESC"); + return json; + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/ST_REGION_OUT_01.wql b/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/ST_REGION_OUT_01.wql new file mode 100644 index 000000000..81c766228 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/ST_REGION_OUT_01.wql @@ -0,0 +1,180 @@ +[交易说明] + 交易名: 区域入库分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.bill_code TYPEAS s_string + 输入.bill_status TYPEAS s_string + 输入.vehicle_code TYPEAS s_string + 输入.material_code TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.pcsn TYPEAS s_string + 输入.start_point_code TYPEAS s_string + 输入.end_point_code TYPEAS s_string + 输入.start_region_code TYPEAS s_string + 输入.end_region_code TYPEAS s_string + 输入.region_id TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + 输入.region_code TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + ios.*, + mater.material_code, + mater.material_name, + unit.unit_name, + region1.region_name AS start_region_name, + region2.region_name AS end_region_name, + point1.point_name AS start_point_name, + point2.point_name AS end_point_name + FROM + ST_IVT_regionIO ios + LEFT JOIN md_me_materialbase mater ON mater.material_id = ios.material_id + LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = ios.qty_unit_id + LEFT JOIN SCH_BASE_Region region1 ON region1.region_id = ios.start_region_id + LEFT JOIN SCH_BASE_Region region2 ON region2.region_id = ios.end_region_id + LEFT JOIN sch_base_point point1 ON point1.point_code = ios.start_point_code + LEFT JOIN sch_base_point point2 ON point2.point_code = ios.end_point_code + WHERE + ios.is_delete = '0' + AND ios.io_type = '1' + + OPTION 输入.bill_code <> "" + ios.bill_code like 输入.bill_code + ENDOPTION + + OPTION 输入.bill_status <> "" + ios.bill_status = 输入.bill_status + ENDOPTION + + OPTION 输入.vehicle_code <> "" + ios.vehicle_code like 输入.vehicle_code + ENDOPTION + + OPTION 输入.pcsn <> "" + ios.pcsn like 输入.pcsn + ENDOPTION + + OPTION 输入.material_code <> "" + (mater.material_code like 输入.material_code or + mater.material_name like 输入.material_code) + ENDOPTION + + OPTION 输入.start_point_code <> "" + (point1.point_code like 输入.start_point_code or + point1.point_name like 输入.start_point_code) + ENDOPTION + + OPTION 输入.end_point_code <> "" + (point2.point_code like 输入.end_point_code or + point2.point_name like 输入.end_point_code) + ENDOPTION + + OPTION 输入.start_region_code <> "" + (region1.region_code like 输入.start_region_code or + region1.region_name like 输入.start_region_code) + ENDOPTION + + OPTION 输入.end_region_code <> "" + (region2.region_code like 输入.end_region_code or + region2.region_name like 输入.end_region_code) + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + PAGEQUERY + SELECT + ivt.*, + mater.material_code, + mater.material_name, + mater.material_spec, + mater.material_model, + unit.unit_name, + point.vehicle_code + FROM + ST_IVT_StructIvt ivt + LEFT JOIN md_me_materialbase mater ON mater.material_id = ivt.material_id + LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = ivt.qty_unit_id + LEFT JOIN sch_base_point point ON point.point_id = ivt.struct_id + WHERE + 1=1 + + OPTION 输入.region_id <> "" + point.region_id = 输入.region_id + ENDOPTION + + OPTION 输入.material_code <> "" + (mater.material_code like 输入.material_code or + mater.material_name like 输入.material_code) + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "3" + PAGEQUERY + SELECT + ivt.* + FROM + ST_IVT_StructIvt ivt + LEFT JOIN sch_base_point point ON point.point_id = ivt.struct_id + LEFT JOIN SCH_BASE_Region region ON region.region_id = point.region_id + WHERE + point.lock_type = '00' + AND point.point_status = '02' + + OPTION 输入.vehicle_type <> "" + point.vehicle_type = 输入.vehicle_type + ENDOPTION + + OPTION 输入.region_code <> "" + region.region_code = 输入.region_code + ENDOPTION + + OPTION 输入.material_id <> "" + ivt.material_id = 输入.material_id + ENDOPTION + + order by point.point_code DESC + + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/rest/InEmptyvehiclerecordController.java b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/rest/InEmptyvehiclerecordController.java new file mode 100644 index 000000000..ff0fce01c --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/rest/InEmptyvehiclerecordController.java @@ -0,0 +1,77 @@ + +package org.nl.wms.st.vehiclebill.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.st.vehiclebill.service.InEmptyvehiclerecordService; +import org.nl.wms.st.vehiclebill.service.dto.EmptyvehiclerecordDto; +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; + +/** + * @author Liuxy + * @date 2022-08-12 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "空载具入库管理") +@RequestMapping("/api/inemptyvehicle") +@Slf4j +public class InEmptyvehiclerecordController { + + private final InEmptyvehiclerecordService inEmptyvehiclerecordService; + + @GetMapping + @Log("查询空载具入库") + @ApiOperation("查询空载具入库") + //@PreAuthorize("@el.check('emptyvehiclerecord:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(inEmptyvehiclerecordService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增空载具入库") + @ApiOperation("新增空载具入库") + //@PreAuthorize("@el.check('emptyvehiclerecord:add')") + public ResponseEntity create(@Validated @RequestBody EmptyvehiclerecordDto dto) { + inEmptyvehiclerecordService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改空载具入库") + @ApiOperation("修改空载具入库") + //@PreAuthorize("@el.check('emptyvehiclerecord:edit')") + public ResponseEntity update(@Validated @RequestBody EmptyvehiclerecordDto dto) { + inEmptyvehiclerecordService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除空载具入库") + @ApiOperation("删除空载具入库") + //@PreAuthorize("@el.check('emptyvehiclerecord:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + inEmptyvehiclerecordService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("生成任务") + @ApiOperation("生成任务") + @PostMapping("/createTask") + public ResponseEntity createTask(@RequestBody JSONObject whereJson) { + inEmptyvehiclerecordService.createTask(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/rest/OutEmptyvehiclerecordController.java b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/rest/OutEmptyvehiclerecordController.java new file mode 100644 index 000000000..96b9c1b05 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/rest/OutEmptyvehiclerecordController.java @@ -0,0 +1,77 @@ + +package org.nl.wms.st.vehiclebill.rest; + + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.st.vehiclebill.service.OutEmptyvehiclerecordService; +import org.nl.wms.st.vehiclebill.service.dto.EmptyvehiclerecordDto; +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; + +/** + * @author Liuxy + * @date 2022-08-12 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "空载具出库管理") +@RequestMapping("/api/outemptyvehicle") +@Slf4j +public class OutEmptyvehiclerecordController { + + private final OutEmptyvehiclerecordService outEmptyvehiclerecordService; + + @GetMapping + @Log("查询空载具出库") + @ApiOperation("查询空载具出库") + //@PreAuthorize("@el.check('emptyvehiclerecord:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(outEmptyvehiclerecordService.queryAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增空载具出库") + @ApiOperation("新增空载具出库") + //@PreAuthorize("@el.check('emptyvehiclerecord:add')") + public ResponseEntity create(@Validated @RequestBody EmptyvehiclerecordDto dto) { + outEmptyvehiclerecordService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改空载具出库") + @ApiOperation("修改空载具出库") + //@PreAuthorize("@el.check('emptyvehiclerecord:edit')") + public ResponseEntity update(@Validated @RequestBody EmptyvehiclerecordDto dto) { + outEmptyvehiclerecordService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除空载具出库") + @ApiOperation("删除空载具出库") + //@PreAuthorize("@el.check('emptyvehiclerecord:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + outEmptyvehiclerecordService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("生成任务") + @ApiOperation("生成任务") + @PostMapping("/createTask") + public ResponseEntity createTask(@RequestBody JSONObject whereJson) { + outEmptyvehiclerecordService.createTask(whereJson); + return new ResponseEntity<>(HttpStatus.OK); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/InEmptyvehiclerecordService.java b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/InEmptyvehiclerecordService.java new file mode 100644 index 000000000..fc1bc34cb --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/InEmptyvehiclerecordService.java @@ -0,0 +1,79 @@ + +package org.nl.wms.st.vehiclebill.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.st.vehiclebill.service.dto.EmptyvehiclerecordDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author Liuxy + * @description 服务接口 + * @date 2022-08-12 + **/ +public interface InEmptyvehiclerecordService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param record_uuid ID + * @return Emptyvehiclerecord + */ + EmptyvehiclerecordDto findById(Long record_uuid); + + /** + * 根据编码查询 + * + * @param code code + * @return Emptyvehiclerecord + */ + EmptyvehiclerecordDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(EmptyvehiclerecordDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(EmptyvehiclerecordDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 生成任务 + * + * @param whereJson / + */ + void createTask(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/OutEmptyvehiclerecordService.java b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/OutEmptyvehiclerecordService.java new file mode 100644 index 000000000..d1365c82a --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/OutEmptyvehiclerecordService.java @@ -0,0 +1,79 @@ + +package org.nl.wms.st.vehiclebill.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.st.vehiclebill.service.dto.EmptyvehiclerecordDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @author Liuxy + * @description 服务接口 + * @date 2022-08-12 + **/ +public interface OutEmptyvehiclerecordService { + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * + * @param record_uuid ID + * @return Emptyvehiclerecord + */ + EmptyvehiclerecordDto findById(Long record_uuid); + + /** + * 根据编码查询 + * + * @param code code + * @return Emptyvehiclerecord + */ + EmptyvehiclerecordDto findByCode(String code); + + + /** + * 创建 + * + * @param dto / + */ + void create(EmptyvehiclerecordDto dto); + + /** + * 编辑 + * + * @param dto / + */ + void update(EmptyvehiclerecordDto dto); + + /** + * 多选删除 + * + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 生成任务 + * + * @param whereJson / + */ + void createTask(JSONObject whereJson); +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/dto/EmptyvehiclerecordDto.java b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/dto/EmptyvehiclerecordDto.java new file mode 100644 index 000000000..d79646783 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/dto/EmptyvehiclerecordDto.java @@ -0,0 +1,109 @@ +package org.nl.wms.st.vehiclebill.service.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Liuxy + * @description / + * @date 2022-08-12 + **/ +@Data +public class EmptyvehiclerecordDto implements Serializable { + + /** 记录标识 */ + /** + * 防止精度丢失 + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long record_uuid; + + /** + * 单据编号 + */ + private String bill_code; + + /** + * 单据类型 + */ + private String io_type; + + /** + * 单据状态 + */ + private String bill_status; + + /** + * 载具数量 + */ + private BigDecimal vehicle_qty; + + /** + * 起始点位 + */ + private String start_point_code; + + /** + * 下一点位 + */ + private String next_point_code; + + /** + * 起始区域 + */ + private Long start_region_id; + + /** + * 终点区域 + */ + private Long end_region_id; + + /** + * 任务标识 + */ + private Long task_uuid; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private Long create_id; + + /** + * 创建人姓名 + */ + private String create_name; + + /** + * 创建时间 + */ + private String create_time; + + /** + * 修改人 + */ + private Long update_optid; + + /** + * 修改人姓名 + */ + private String update_optname; + + /** + * 修改时间 + */ + private String update_time; + + /** + * 是否删除 + */ + private String is_delete; +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/impl/InEmptyvehiclerecordServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/impl/InEmptyvehiclerecordServiceImpl.java new file mode 100644 index 000000000..198188eb0 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/impl/InEmptyvehiclerecordServiceImpl.java @@ -0,0 +1,202 @@ + +package org.nl.wms.st.vehiclebill.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.tasks.SendEmpVehicleTask; +import org.nl.wms.st.vehiclebill.service.InEmptyvehiclerecordService; +import org.nl.wms.st.vehiclebill.service.dto.EmptyvehiclerecordDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Liuxy + * @description 服务实现 + * @date 2022-08-12 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class InEmptyvehiclerecordServiceImpl implements InEmptyvehiclerecordService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String bill_code = MapUtil.getStr(whereJson, "bill_code"); + + HashMap map = new HashMap<>(); + map.put("flag", "1"); + + if (ObjectUtil.isNotEmpty(bill_code)) map.put("bill_code",bill_code + "%"); + + JSONObject json = WQL.getWO("ST_VEHICLE_IN_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "st.create_time DESC"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(EmptyvehiclerecordDto.class); + return null; + } + + @Override + public EmptyvehiclerecordDto findById(Long record_uuid) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONObject json = wo.query("record_uuid = '" + record_uuid + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(EmptyvehiclerecordDto.class); + } + return null; + } + + @Override + public EmptyvehiclerecordDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(EmptyvehiclerecordDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(EmptyvehiclerecordDto dto) { + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String start_point_code = dto.getStart_point_code(); + String next_point_code = dto.getNext_point_code(); + // 判断起点是否为空! 入库起点不能为空 + if (ObjectUtil.isEmpty(start_point_code)) throw new BadRequestException("起点不能为空"); + // 根据点位编码找到对应的所属区域 + Long start_region_id = pointTab.query("point_code = '" + start_point_code + "'").uniqueResult(0).getLongValue("region_id"); + if (ObjectUtil.isNotEmpty(next_point_code)) { + Long end_region_id = pointTab.query("point_code = '" + next_point_code + "'").uniqueResult(0).getLongValue("region_id"); + dto.setEnd_region_id(end_region_id); + } + + dto.setRecord_uuid(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setBill_code(CodeUtil.getNewCode("KZJ_BILL_CODE")); + dto.setIo_type("0"); + dto.setBill_status("10"); + dto.setStart_region_id(start_region_id); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(EmptyvehiclerecordDto dto) { + EmptyvehiclerecordDto entity = this.findById(dto.getRecord_uuid()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String start_point_code = dto.getStart_point_code(); + String next_point_code = dto.getNext_point_code(); + // 判断起点是否为空! 入库起点不能为空 + if (ObjectUtil.isEmpty(start_point_code)) throw new BadRequestException("起点不能为空"); + // 根据点位编码找到对应的所属区域 + Long start_region_id = pointTab.query("point_code = '" + start_point_code + "'").uniqueResult(0).getLongValue("region_id"); + if (ObjectUtil.isNotEmpty(next_point_code)) { + Long end_region_id = pointTab.query("point_code = '" + next_point_code + "'").uniqueResult(0).getLongValue("region_id"); + dto.setEnd_region_id(end_region_id); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setStart_region_id(start_region_id); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + for (Long record_uuid : ids) { + JSONObject param = new JSONObject(); + param.put("record_uuid", String.valueOf(record_uuid)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createTask(JSONObject whereJson) { + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + + JSONObject jsonEmp = empTab.query("record_uuid = '" + whereJson.getString("record_uuid") + "'").uniqueResult(0); + // 准备参数 调用空载具处理类中的 创建任务的方法 + JSONObject param = new JSONObject(); + param.put("start_point_code", jsonEmp.getString("start_point_code")); + param.put("next_point_code", jsonEmp.getString("next_point_code")); + param.put("qty", jsonEmp.getString("vehicle_qty")); + param.put("record_uuid", jsonEmp.getString("record_uuid")); + + String task_id = new SendEmpVehicleTask().createTask(param); + // 更新空载具表中的任务id和单据状态 + PointService pointDto = SpringContextHolder.getBean(PointService.class); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + jsonEmp.put("task_uuid", Long.valueOf(task_id)); + jsonEmp.put("bill_status","20"); + jsonEmp.put("next_point_code",jsonTask.getString("next_point_code")); + jsonEmp.put("end_region_id",pointDto.findByCode(jsonTask.getString("next_point_code")).getRegion_id()); + jsonEmp.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonEmp.put("update_optname", SecurityUtils.getCurrentNickName()); + jsonEmp.put("update_time", DateUtil.now()); + empTab.update(jsonEmp); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/impl/OutEmptyvehiclerecordServiceImpl.java b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/impl/OutEmptyvehiclerecordServiceImpl.java new file mode 100644 index 000000000..bad1efc36 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/service/impl/OutEmptyvehiclerecordServiceImpl.java @@ -0,0 +1,202 @@ + +package org.nl.wms.st.vehiclebill.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 com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.wms.sch.service.PointService; +import org.nl.wms.sch.tasks.CallEmpVehicleTask; +import org.nl.wms.st.vehiclebill.service.OutEmptyvehiclerecordService; +import org.nl.wms.st.vehiclebill.service.dto.EmptyvehiclerecordDto; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Liuxy + * @description 服务实现 + * @date 2022-08-12 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class OutEmptyvehiclerecordServiceImpl implements OutEmptyvehiclerecordService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String bill_code = MapUtil.getStr(whereJson, "bill_code"); + + HashMap map = new HashMap<>(); + map.put("flag", "1"); + + if (ObjectUtil.isNotEmpty(bill_code)) map.put("bill_code",bill_code + "%"); + + JSONObject json = WQL.getWO("ST_VEHICLE_OUT_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "st.create_time DESC"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(EmptyvehiclerecordDto.class); + return null; + } + + @Override + public EmptyvehiclerecordDto findById(Long record_uuid) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONObject json = wo.query("record_uuid = '" + record_uuid + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(EmptyvehiclerecordDto.class); + } + return null; + } + + @Override + public EmptyvehiclerecordDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(EmptyvehiclerecordDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(EmptyvehiclerecordDto dto) { + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String start_point_code = dto.getStart_point_code(); + String next_point_code = dto.getNext_point_code(); + // 判断终点是否为空! 出库终点不能为空 + if (ObjectUtil.isEmpty(next_point_code)) throw new BadRequestException("终点不能为空"); + // 根据点位编码找到对应的所属区域 + Long end_region_id = pointTab.query("point_code = '" + next_point_code + "'").uniqueResult(0).getLongValue("region_id"); + if (ObjectUtil.isNotEmpty(start_point_code)) { + Long start_region_id = pointTab.query("point_code = '" + start_point_code + "'").uniqueResult(0).getLongValue("region_id"); + dto.setStart_region_id(start_region_id); + } + + dto.setRecord_uuid(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setBill_code(CodeUtil.getNewCode("KZJ_BILL_CODE")); + dto.setIo_type("1"); + dto.setBill_status("10"); + dto.setEnd_region_id(end_region_id); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(EmptyvehiclerecordDto dto) { + EmptyvehiclerecordDto entity = this.findById(dto.getRecord_uuid()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + String start_point_code = dto.getStart_point_code(); + String next_point_code = dto.getNext_point_code(); + // 判断起点是否为空! 入库起点不能为空 + if (ObjectUtil.isEmpty(next_point_code)) throw new BadRequestException("终点不能为空"); + // 根据点位编码找到对应的所属区域 + Long end_region_id = pointTab.query("point_code = '" + next_point_code + "'").uniqueResult(0).getLongValue("region_id"); + if (ObjectUtil.isNotEmpty(start_point_code)) { + Long start_region_id = pointTab.query("point_code = '" + start_point_code + "'").uniqueResult(0).getLongValue("region_id"); + dto.setStart_region_id(start_region_id); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setStart_region_id(end_region_id); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("st_ivt_emptyvehiclerecord"); + for (Long record_uuid : ids) { + JSONObject param = new JSONObject(); + param.put("record_uuid", String.valueOf(record_uuid)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createTask(JSONObject whereJson) { + WQLObject empTab = WQLObject.getWQLObject("st_ivt_EmptyVehicleRecord"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + + JSONObject jsonEmp = empTab.query("record_uuid = '" + whereJson.getString("record_uuid") + "'").uniqueResult(0); + // 准备参数 调用空载具处理类中的 创建任务的方法 + JSONObject param = new JSONObject(); + param.put("start_point_code", jsonEmp.getString("start_point_code")); + param.put("next_point_code", jsonEmp.getString("next_point_code")); + param.put("qty", jsonEmp.getString("vehicle_qty")); + param.put("record_uuid", jsonEmp.getString("record_uuid")); + + String task_id = new CallEmpVehicleTask().createTask(param); + // 更新空载具表中的任务id和单据状态 + PointService pointDto = SpringContextHolder.getBean(PointService.class); + JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + + jsonEmp.put("task_uuid", Long.valueOf(task_id)); + jsonEmp.put("bill_status","20"); + jsonEmp.put("start_point_code",jsonTask.getString("start_point_code")); + jsonEmp.put("start_region_id",pointDto.findByCode(jsonTask.getString("start_point_code")).getRegion_id()); + jsonEmp.put("update_optid", SecurityUtils.getCurrentUserId()); + jsonEmp.put("update_optname", SecurityUtils.getCurrentNickName()); + jsonEmp.put("update_time", DateUtil.now()); + empTab.update(jsonEmp); + } + +} diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_IN_01.wql b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_IN_01.wql new file mode 100644 index 000000000..74724e57d --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_IN_01.wql @@ -0,0 +1,61 @@ +[交易说明] + 交易名: 空载具入库分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.bill_code TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + st.*, + region1.region_name AS start_region_name, + region2.region_name AS endt_region_name + FROM + st_ivt_EmptyVehicleRecord st + LEFT JOIN sch_base_region region1 ON st.start_region_id = region1.region_id + LEFT JOIN sch_base_region region2 ON st.end_region_id = region2.region_id + WHERE + st.is_delete = '0' + AND st.io_type = '0' + + OPTION 输入.bill_code <> "" + st.bill_code like 输入.bill_code + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_IN_02.wql b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_IN_02.wql new file mode 100644 index 000000000..bdbbfb47a --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_IN_02.wql @@ -0,0 +1,108 @@ +[交易说明] + 交易名: 空载具入库业务 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.vehicle_qty TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + point.* + FROM + sch_base_point point + LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id + WHERE + point.lock_type = '00' + AND (12 - IFNULL(point.vehicle_qty,0)) >= 输入.vehicle_qty + + OPTION 输入.region_code <> "" + region.region_code = 输入.region_code + ENDOPTION + + OPTION 输入.vehicle_type <> "" + point.vehicle_type = 输入.vehicle_type + ENDOPTION + + order by point.vehicle_qty DESC + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point.* + FROM + sch_base_point point + LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id + WHERE + point.lock_type = '00' + AND IFNULL(point.vehicle_qty,0) = '0' + + OPTION 输入.region_code <> "" + region.region_code = 输入.region_code + ENDOPTION + + order by point.vehicle_qty DESC + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + point.* + FROM + sch_base_point point + LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id + WHERE + point.lock_type = '00' + AND point.point_status = '00' + + OPTION 输入.region_code <> "" + region.region_code = 输入.region_code + ENDOPTION + + order by point.point_code DESC + + ENDSELECT + ENDQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_OUT_01.wql b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_OUT_01.wql new file mode 100644 index 000000000..7c4919ce1 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_OUT_01.wql @@ -0,0 +1,61 @@ +[交易说明] + 交易名: 空载具出库分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.bill_code TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + st.*, + region1.region_name AS start_region_name, + region2.region_name AS endt_region_name + FROM + st_ivt_EmptyVehicleRecord st + LEFT JOIN sch_base_region region1 ON st.start_region_id = region1.region_id + LEFT JOIN sch_base_region region2 ON st.end_region_id = region2.region_id + WHERE + st.is_delete = '0' + AND st.io_type = '1' + + OPTION 输入.bill_code <> "" + st.bill_code like 输入.bill_code + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF diff --git a/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_OUT_02.wql b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_OUT_02.wql new file mode 100644 index 000000000..c49d544f9 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/wms/st/vehiclebill/wql/ST_VEHICLE_OUT_02.wql @@ -0,0 +1,114 @@ +[交易说明] + 交易名: 空载具出库业务 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.vehicle_qty TYPEAS s_string + 输入.vehicle_type TYPEAS s_string + 输入.region_code TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + point.* + FROM + sch_base_point point + LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id + WHERE + point.lock_type = '00' + AND point.point_status = '01' + AND IFNULL(point.vehicle_qty,0) >= 输入.vehicle_qty + + OPTION 输入.region_code <> "" + region.region_code = 输入.region_code + ENDOPTION + + OPTION 输入.vehicle_type <> "" + point.vehicle_type = 输入.vehicle_type + ENDOPTION + + order by point.vehicle_qty ASC + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + point.* + FROM + sch_base_point point + LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id + WHERE + point.lock_type = '00' + AND point.point_status = '01' + AND IFNULL(point.vehicle_qty,0) == 输入.vehicle_qty + + OPTION 输入.region_code <> "" + region.region_code = 输入.region_code + ENDOPTION + + OPTION 输入.vehicle_type <> "" + point.vehicle_type = 输入.vehicle_type + ENDOPTION + + order by point.point_code DESC + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point.* + FROM + sch_base_point point + LEFT JOIN SCH_BASE_Region region ON point.region_id = region.region_id + WHERE + point.lock_type = '00' + AND point.point_status = '00' + + OPTION 输入.region_code <> "" + region.region_code = 输入.region_code + ENDOPTION + + order by point.point_code DESC + + ENDSELECT + ENDQUERY + ENDIF diff --git a/nladmin-system/src/main/resources/config/application-dev.yml b/nladmin-system/src/main/resources/config/application-dev.yml index a3bbd8cde..fcfd85f80 100644 --- a/nladmin-system/src/main/resources/config/application-dev.yml +++ b/nladmin-system/src/main/resources/config/application-dev.yml @@ -6,12 +6,11 @@ spring: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy -# url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:nladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:nladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true -# username: ${DB_USER:root} + url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:lzhl_one_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true +# url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:nladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} -# password: ${DB_PWD:P@ssw0rd} - password: ${DB_PWD:12356} + password: ${DB_PWD:P@ssw0rd} +# password: ${DB_PWD:12356} # 初始连接数 initial-size: 5 # 最小连接数 diff --git a/nladmin-system/src/main/resources/template/generator/admin/Controller.ftl b/nladmin-system/src/main/resources/template/generator/admin/Controller.ftl index 2e211ff26..53f849f0b 100644 --- a/nladmin-system/src/main/resources/template/generator/admin/Controller.ftl +++ b/nladmin-system/src/main/resources/template/generator/admin/Controller.ftl @@ -4,7 +4,7 @@ package ${package}.rest; import org.springframework.data.domain.Pageable; import lombok.RequiredArgsConstructor; -import org.nl.annotation.Log; +import org.nl.modules.logging.annotation.Log; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import cn.dev33.satoken.annotation.SaCheckPermission; diff --git a/nladmin-system/src/main/resources/template/generator/admin/ServiceImpl.ftl b/nladmin-system/src/main/resources/template/generator/admin/ServiceImpl.ftl index b43ef85f7..6d4cfc703 100644 --- a/nladmin-system/src/main/resources/template/generator/admin/ServiceImpl.ftl +++ b/nladmin-system/src/main/resources/template/generator/admin/ServiceImpl.ftl @@ -14,10 +14,10 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import org.nl.utils.SecurityUtils; -import org.nl.wql.core.bean.ResultBean; -import org.nl.wql.core.bean.WQLObject; -import org.nl.wql.util.WqlUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; import lombok.extern.slf4j.Slf4j; import cn.hutool.core.util.ObjectUtil; @@ -71,7 +71,7 @@ public List<${className}Dto> queryAll(Map whereJson){ @Transactional(rollbackFor = Exception.class) public void create(${className}Dto dto) { Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); + String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); dto.set${pkChangeColName ? cap_first }(IdUtil.getSnowflake(1, 1).nextId()); @@ -94,7 +94,7 @@ public List<${className}Dto> queryAll(Map whereJson){ if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); + String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); dto.setUpdate_time(now); @@ -110,7 +110,7 @@ public List<${className}Dto> queryAll(Map whereJson){ @Transactional(rollbackFor = Exception.class) public void deleteAll(${pkColumnType}[] ids) { Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getNickName(); + String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); WQLObject wo = WQLObject.getWQLObject("${tableName}"); diff --git a/nladmin-system/src/main/resources/template/generator/front/index.ftl b/nladmin-system/src/main/resources/template/generator/front/index.ftl index fa74766af..1c4665fed 100644 --- a/nladmin-system/src/main/resources/template/generator/front/index.ftl +++ b/nladmin-system/src/main/resources/template/generator/front/index.ftl @@ -113,14 +113,13 @@ + + diff --git a/nladmin-ui/src/views/wms/basedata/master/customer/customerbase.js b/nladmin-ui/src/views/wms/basedata/master/customer/customerbase.js new file mode 100644 index 000000000..6523c0388 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/customer/customerbase.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/customerbase', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/customerbase/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/customerbase', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/nladmin-ui/src/views/wms/basedata/master/customer/index.vue b/nladmin-ui/src/views/wms/basedata/master/customer/index.vue new file mode 100644 index 000000000..9facbe86b --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/customer/index.vue @@ -0,0 +1,345 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/master/material/index.vue b/nladmin-ui/src/views/wms/basedata/master/material/index.vue new file mode 100644 index 000000000..46c32a441 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/material/index.vue @@ -0,0 +1,437 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/master/material/materialbase.js b/nladmin-ui/src/views/wms/basedata/master/material/materialbase.js new file mode 100644 index 000000000..719b2a112 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/material/materialbase.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/Materialbase', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/Materialbase/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/Materialbase', + method: 'put', + data + }) +} + +export function getMaterOptType(data) { + return request({ + url: 'api/Materialbase/getMaterOptType', + method: 'post', + data + }) +} + +export function isAlongMaterType(data) { + return request({ + url: 'api/Materialbase/isAlongMaterType', + method: 'post', + data + }) +} + +export function synchronize(data) { + return request({ + url: 'api/Materialbase/synchronize', + method: 'post', + data + }) +} + +export function getProductSeries() { + return request({ + url: 'api/Materialbase/getProductSeries', + method: 'get' + }) +} + +export default { add, edit, del, getMaterOptType, isAlongMaterType, synchronize, getProductSeries } diff --git a/nladmin-ui/src/views/wms/basedata/master/measure/index.vue b/nladmin-ui/src/views/wms/basedata/master/measure/index.vue new file mode 100644 index 000000000..e54da575d --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/measure/index.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/master/measure/mdPbMeasureunit.js b/nladmin-ui/src/views/wms/basedata/master/measure/mdPbMeasureunit.js new file mode 100644 index 000000000..ae700b992 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/measure/mdPbMeasureunit.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/mdPbMeasureunit', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/mdPbMeasureunit/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/mdPbMeasureunit', + method: 'put', + data + }) +} + +export function getUnit(params) { + return request({ + url: 'api/mdPbMeasureunit/getUnit', + method: 'get', + params + }) +} + +export default { add, edit, del, getUnit } diff --git a/nladmin-ui/src/views/wms/basedata/master/storagevehicleinfo/index.vue b/nladmin-ui/src/views/wms/basedata/master/storagevehicleinfo/index.vue new file mode 100644 index 000000000..327856bc6 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/storagevehicleinfo/index.vue @@ -0,0 +1,366 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/master/storagevehicleinfo/storagevehicleinfo.js b/nladmin-ui/src/views/wms/basedata/master/storagevehicleinfo/storagevehicleinfo.js new file mode 100644 index 000000000..63fdfc688 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/storagevehicleinfo/storagevehicleinfo.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/storagevehicleinfo', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/storagevehicleinfo/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/storagevehicleinfo', + method: 'put', + data + }) +} + +export function changeActive(data) { + return request({ + url: 'api/storagevehicleinfo/changeActive', + method: 'put', + data + }) +} + +export function getVehicle(code) { + return request({ + url: 'api/storagevehicleinfo/getVehicle/' + code, + method: 'get' + }) +} + +export default { add, edit, del, changeActive, getVehicle } diff --git a/nladmin-ui/src/views/wms/basedata/master/supp/index.vue b/nladmin-ui/src/views/wms/basedata/master/supp/index.vue new file mode 100644 index 000000000..d01b6b761 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/supp/index.vue @@ -0,0 +1,344 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/master/supp/supplierbase.js b/nladmin-ui/src/views/wms/basedata/master/supp/supplierbase.js new file mode 100644 index 000000000..d04cf8b2b --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/master/supp/supplierbase.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/supplierbase', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/supplierbase/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/supplierbase', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/nladmin-ui/src/views/wms/basedata/st/ivt/index.vue b/nladmin-ui/src/views/wms/basedata/st/ivt/index.vue new file mode 100644 index 000000000..895d698b7 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/st/ivt/index.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/st/ivt/structivt.js b/nladmin-ui/src/views/wms/basedata/st/ivt/structivt.js new file mode 100644 index 000000000..2e3f029f0 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/st/ivt/structivt.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/structivt', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/structivt/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/structivt', + method: 'put', + data + }) +} + +export function getStruct() { + return request({ + url: 'api/structivt/getStruct', + method: 'get' + }) +} + +export function getStructById(data) { + return request({ + url: 'api/structivt/getStructById', + method: 'post', + data + }) +} + +export function getUnits() { + return request({ + url: 'api/structivt/getUnits', + method: 'get' + }) +} + +export default { add, edit, del, getStruct, getStructById, getUnits } diff --git a/nladmin-ui/src/views/wms/basedata/st/sect/index.vue b/nladmin-ui/src/views/wms/basedata/st/sect/index.vue new file mode 100644 index 000000000..506b7d0f2 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/st/sect/index.vue @@ -0,0 +1,324 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/st/sect/sectattr.js b/nladmin-ui/src/views/wms/basedata/st/sect/sectattr.js new file mode 100644 index 000000000..18b511af7 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/st/sect/sectattr.js @@ -0,0 +1,43 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/sectattr', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/sectattr/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/sectattr', + method: 'put', + data + }) +} + +export function getSect(params) { + return request({ + url: 'api/sectattr/getSect', + method: 'get', + params + }) +} + +export function changeActive(data) { + return request({ + url: 'api/sectattr/changeActive', + method: 'put', + data + }) +} + +export default { add, edit, del, getSect, changeActive } diff --git a/nladmin-ui/src/views/wms/basedata/st/stor/index.vue b/nladmin-ui/src/views/wms/basedata/st/stor/index.vue new file mode 100644 index 000000000..7fab20ea9 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/st/stor/index.vue @@ -0,0 +1,400 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/st/stor/storattr.js b/nladmin-ui/src/views/wms/basedata/st/stor/storattr.js new file mode 100644 index 000000000..747d12b52 --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/st/stor/storattr.js @@ -0,0 +1,43 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/Storattr', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/Storattr/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/Storattr', + method: 'put', + data + }) +} + +export function getStor(params) { + return request({ + url: 'api/Storattr/getStor', + method: 'get', + params + }) +} + +export function changeActive(data) { + return request({ + url: 'api/Storattr/changeActive', + method: 'put', + data + }) +} + +export default { add, edit, del, getStor, changeActive } diff --git a/nladmin-ui/src/views/wms/basedata/st/struct/index.vue b/nladmin-ui/src/views/wms/basedata/st/struct/index.vue new file mode 100644 index 000000000..7767e230c --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/st/struct/index.vue @@ -0,0 +1,457 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/basedata/st/struct/structattr.js b/nladmin-ui/src/views/wms/basedata/st/struct/structattr.js new file mode 100644 index 000000000..fbcd30c8e --- /dev/null +++ b/nladmin-ui/src/views/wms/basedata/st/struct/structattr.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/structattr', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/structattr/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/structattr', + method: 'put', + data + }) +} + +export function changeActive(data) { + return request({ + url: 'api/structattr/changeActive', + method: 'put', + data + }) +} + +export default { add, edit, del, changeActive } diff --git a/nladmin-ui/src/views/wms/mps/device/device.js b/nladmin-ui/src/views/wms/mps/device/device.js new file mode 100644 index 000000000..b9017553f --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/device/device.js @@ -0,0 +1,74 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/device', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/device/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/device', + method: 'put', + data + }) +} + +export function getWorkprocedure() { + return request({ + url: 'api/device/getWorkprocedure', + method: 'get' + }) +} + +export function getItemByDevice(data) { + return request({ + url: 'api/device/getItemByDevice', + method: 'post', + data + }) +} + +export function savaDeviceItem(data) { + return request({ + url: 'api/device/savaDeviceItem', + method: 'post', + data + }) +} + +export function getItemByDeviceId(data) { + return request({ + url: 'api/device/getItemByDeviceId', + method: 'post', + data + }) +} + +export function copyAdd(data) { + return request({ + url: 'api/device/copyAdd', + method: 'post', + data + }) +} + +export function changeActive(data) { + return request({ + url: 'api/device/changeActive', + method: 'put', + data + }) +} + +export default { add, edit, del, getWorkprocedure, getItemByDeviceId, copyAdd, changeActive } diff --git a/nladmin-ui/src/views/wms/mps/device/index.vue b/nladmin-ui/src/views/wms/mps/device/index.vue new file mode 100644 index 000000000..bd3e6a59b --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/device/index.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/item/deviceitem.js b/nladmin-ui/src/views/wms/mps/item/deviceitem.js new file mode 100644 index 000000000..287219b3b --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/item/deviceitem.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/deviceitem', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/deviceitem/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/deviceitem', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/nladmin-ui/src/views/wms/mps/item/index.vue b/nladmin-ui/src/views/wms/mps/item/index.vue new file mode 100644 index 000000000..312d2f076 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/item/index.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/personcorrdevice/DevicesDialog.vue b/nladmin-ui/src/views/wms/mps/personcorrdevice/DevicesDialog.vue new file mode 100644 index 000000000..7a6ebf466 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/personcorrdevice/DevicesDialog.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/personcorrdevice/SelectDeviceDialog.vue b/nladmin-ui/src/views/wms/mps/personcorrdevice/SelectDeviceDialog.vue new file mode 100644 index 000000000..464acc7ac --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/personcorrdevice/SelectDeviceDialog.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/personcorrdevice/SelectPeersonDialog.vue b/nladmin-ui/src/views/wms/mps/personcorrdevice/SelectPeersonDialog.vue new file mode 100644 index 000000000..30230e9fb --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/personcorrdevice/SelectPeersonDialog.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/personcorrdevice/index.vue b/nladmin-ui/src/views/wms/mps/personcorrdevice/index.vue new file mode 100644 index 000000000..f30f60865 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/personcorrdevice/index.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/personcorrdevice/personcorrdevice.js b/nladmin-ui/src/views/wms/mps/personcorrdevice/personcorrdevice.js new file mode 100644 index 000000000..b6af73072 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/personcorrdevice/personcorrdevice.js @@ -0,0 +1,67 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/personcorrdevice', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/personcorrdevice/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/personcorrdevice', + method: 'put', + data + }) +} + +export function addPersons(data) { + return request({ + url: 'api/personcorrdevice/addPersons', + method: 'post', + data + }) +} + +export function getHeader(data) { + return request({ + url: 'api/personcorrdevice/getHeader', + method: 'post', + data + }) +} + +export function getDeviceIdByUserId(data) { + return request({ + url: 'api/personcorrdevice/getDeviceIdByUserId', + method: 'post', + data + }) +} + +export function addDevices(data) { + return request({ + url: 'api/personcorrdevice/addDevices', + method: 'post', + data + }) +} + +export function deleteRow(data) { + return request({ + url: 'api/personcorrdevice/deleteRow', + method: 'delete', + data + }) +} + +export default { add, edit, del, addPersons, getHeader, getDeviceIdByUserId, deleteRow, addDevices } diff --git a/nladmin-ui/src/views/wms/mps/produce/OutMaterDialog.vue b/nladmin-ui/src/views/wms/mps/produce/OutMaterDialog.vue new file mode 100644 index 000000000..e630ff705 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/produce/OutMaterDialog.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/produce/ViewDialog.vue b/nladmin-ui/src/views/wms/mps/produce/ViewDialog.vue new file mode 100644 index 000000000..edfd79cde --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/produce/ViewDialog.vue @@ -0,0 +1,383 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/produce/bigScreen.vue b/nladmin-ui/src/views/wms/mps/produce/bigScreen.vue new file mode 100644 index 000000000..6edb509d6 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/produce/bigScreen.vue @@ -0,0 +1,314 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/produce/index.vue b/nladmin-ui/src/views/wms/mps/produce/index.vue new file mode 100644 index 000000000..29f96482a --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/produce/index.vue @@ -0,0 +1,536 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/produce/outmaterial.js b/nladmin-ui/src/views/wms/mps/produce/outmaterial.js new file mode 100644 index 000000000..8ee469f48 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/produce/outmaterial.js @@ -0,0 +1,51 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/Materialbase', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/Materialbase/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/Materialbase', + method: 'put', + data + }) +} + +export function getMaterOptType(data) { + return request({ + url: 'api/Materialbase/getMaterOptType', + method: 'post', + data + }) +} + +export function isAlongMaterType(data) { + return request({ + url: 'api/Materialbase/isAlongMaterType', + method: 'post', + data + }) +} + +export function synchronize(data) { + return request({ + url: 'api/Materialbase/synchronize', + method: 'post', + data + }) +} + +export default { add, edit, del, getMaterOptType, isAlongMaterType, synchronize } diff --git a/nladmin-ui/src/views/wms/mps/produce/produceshiftorder.js b/nladmin-ui/src/views/wms/mps/produce/produceshiftorder.js new file mode 100644 index 000000000..fc7e636ad --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/produce/produceshiftorder.js @@ -0,0 +1,99 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/produceshiftorder', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/produceshiftorder/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/produceshiftorder', + method: 'put', + data + }) +} + +export function submits(data) { + return request({ + url: 'api/produceshiftorder/submits', + method: 'put', + data + }) +} + +export function getDevice(data) { + return request({ + url: 'api/produceshiftorder/getDevice', + method: 'post', + data + }) +} + +export function getTable(data) { + return request({ + url: 'api/produceshiftorder/getTable', + method: 'post', + data + }) +} + +export function openStart(data) { + return request({ + url: 'api/produceshiftorder/openStart', + method: 'post', + data + }) +} + +export function saveReport(data) { + return request({ + url: 'api/produceshiftorder/saveReport', + method: 'post', + data + }) +} + +export function finish(data) { + return request({ + url: 'api/produceshiftorder/finish', + method: 'post', + data + }) +} + +export function forceFinish(data) { + return request({ + url: 'api/produceshiftorder/forceFinish', + method: 'post', + data + }) +} + +export function getReportWork(data) { + return request({ + url: 'api/produceshiftorder/getReportWork', + method: 'post', + data + }) +} + +export function getDtl(data) { + return request({ + url: 'api/produceshiftorder/getDtl', + method: 'post', + data + }) +} + +export default { add, edit, del, submits, getDevice, getTable, openStart, saveReport, finish, getReportWork, forceFinish, getDtl } diff --git a/nladmin-ui/src/views/wms/mps/teamcorrperson/PersonDialog.vue b/nladmin-ui/src/views/wms/mps/teamcorrperson/PersonDialog.vue new file mode 100644 index 000000000..47f77eadd --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/teamcorrperson/PersonDialog.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/teamcorrperson/SelectPeersonDialog.vue b/nladmin-ui/src/views/wms/mps/teamcorrperson/SelectPeersonDialog.vue new file mode 100644 index 000000000..27381f9c8 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/teamcorrperson/SelectPeersonDialog.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/teamcorrperson/index.vue b/nladmin-ui/src/views/wms/mps/teamcorrperson/index.vue new file mode 100644 index 000000000..84628136c --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/teamcorrperson/index.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/mps/teamcorrperson/teamcorrperson.js b/nladmin-ui/src/views/wms/mps/teamcorrperson/teamcorrperson.js new file mode 100644 index 000000000..87dc011c9 --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/teamcorrperson/teamcorrperson.js @@ -0,0 +1,43 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/teamcorrperson', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/teamcorrperson/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/teamcorrperson', + method: 'put', + data + }) +} + +export function getPersonIdByTeamId(data) { + return request({ + url: 'api/teamcorrperson/getPersonIdByTeamId', + method: 'post', + data + }) +} + +export function addPersons(data) { + return request({ + url: 'api/teamcorrperson/addPersons', + method: 'post', + data + }) +} + +export default { add, edit, del, getPersonIdByTeamId, addPersons } diff --git a/nladmin-ui/src/views/wms/mps/teamcorrperson/workteam.js b/nladmin-ui/src/views/wms/mps/teamcorrperson/workteam.js new file mode 100644 index 000000000..824f1600d --- /dev/null +++ b/nladmin-ui/src/views/wms/mps/teamcorrperson/workteam.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/workteam', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/workteam/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/workteam', + method: 'put', + data + }) +} + +export function getClasssystem() { + return request({ + url: 'api/workteam/getClasssystem', + method: 'get' + }) +} + +export function changeActive(data) { + return request({ + url: 'api/workteam/changeActive', + method: 'put', + data + }) +} + +export default { add, edit, del, getClasssystem, changeActive } diff --git a/nladmin-ui/src/views/wms/pdm/base/routing/AddDialog.vue b/nladmin-ui/src/views/wms/pdm/base/routing/AddDialog.vue new file mode 100644 index 000000000..ac7b8ddc6 --- /dev/null +++ b/nladmin-ui/src/views/wms/pdm/base/routing/AddDialog.vue @@ -0,0 +1,274 @@ + + + + + + + diff --git a/nladmin-ui/src/views/wms/pdm/base/routing/index.vue b/nladmin-ui/src/views/wms/pdm/base/routing/index.vue new file mode 100644 index 000000000..d7b0d999b --- /dev/null +++ b/nladmin-ui/src/views/wms/pdm/base/routing/index.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/pdm/base/routing/processroute.js b/nladmin-ui/src/views/wms/pdm/base/routing/processroute.js new file mode 100644 index 000000000..b28bd9c9e --- /dev/null +++ b/nladmin-ui/src/views/wms/pdm/base/routing/processroute.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/processroute', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/processroute/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/processroute', + method: 'put', + data + }) +} + +export function getWorkList() { + return request({ + url: 'api/processroute/getWorkList', + method: 'get' + }) +} + +export function getDtl(params) { + return request({ + url: 'api/processroute/getDtl', + method: 'get', + params + }) +} + +export function submit(data) { + return request({ + url: 'api/processroute/submit', + method: 'put', + data + }) +} + +export function CancelSubmit(data) { + return request({ + url: 'api/processroute/CancelSubmit', + method: 'put', + data + }) +} + +export default { add, edit, del, getWorkList, getDtl, submit, CancelSubmit } diff --git a/nladmin-ui/src/views/wms/pdm/base/workProcedure/index.vue b/nladmin-ui/src/views/wms/pdm/base/workProcedure/index.vue new file mode 100644 index 000000000..f29f90b4b --- /dev/null +++ b/nladmin-ui/src/views/wms/pdm/base/workProcedure/index.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/pdm/base/workProcedure/workProcedure.js b/nladmin-ui/src/views/wms/pdm/base/workProcedure/workProcedure.js new file mode 100644 index 000000000..3cc498fc3 --- /dev/null +++ b/nladmin-ui/src/views/wms/pdm/base/workProcedure/workProcedure.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/workProcedure', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/workProcedure/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/workProcedure', + method: 'put', + data + }) +} + +export function downSelect() { + return request({ + url: 'api/workProcedure/downSelect' + }) +} + +export default { add, edit, del, downSelect } diff --git a/nladmin-ui/src/views/wms/pub/DeviceDialog.vue b/nladmin-ui/src/views/wms/pub/DeviceDialog.vue new file mode 100644 index 000000000..2c81c4053 --- /dev/null +++ b/nladmin-ui/src/views/wms/pub/DeviceDialog.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/pub/MaterDialog.vue b/nladmin-ui/src/views/wms/pub/MaterDialog.vue new file mode 100644 index 000000000..c2e942f4d --- /dev/null +++ b/nladmin-ui/src/views/wms/pub/MaterDialog.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/pub/PointDialog.vue b/nladmin-ui/src/views/wms/pub/PointDialog.vue new file mode 100644 index 000000000..84901eb45 --- /dev/null +++ b/nladmin-ui/src/views/wms/pub/PointDialog.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/sch/point/index.vue b/nladmin-ui/src/views/wms/sch/point/index.vue new file mode 100644 index 000000000..a18fd7379 --- /dev/null +++ b/nladmin-ui/src/views/wms/sch/point/index.vue @@ -0,0 +1,462 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/sch/point/point.js b/nladmin-ui/src/views/wms/sch/point/point.js new file mode 100644 index 000000000..19f681767 --- /dev/null +++ b/nladmin-ui/src/views/wms/sch/point/point.js @@ -0,0 +1,63 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/point', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/point/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/point', + method: 'put', + data + }) +} + +export function syncStruct() { + return request({ + url: 'api/point/syncStruct', + method: 'put' + }) +} + +export function findPoints(area_type) { + return request({ + url: 'api/point/area_type/' + area_type + }) +} + +export function changeActive(data) { + return request({ + url: 'api/point/changeActive', + method: 'put', + data + }) +} + +export function getPoint(data) { + return request({ + url: '/api/point/getPoint', + method: 'post', + data + }) +} + +export function getRegion() { + return request({ + url: '/api/point/getRegion', + method: 'get' + }) +} + +export default { add, edit, del, syncStruct, changeActive, findPoints, getPoint, getRegion } diff --git a/nladmin-ui/src/views/wms/sch/region/index.vue b/nladmin-ui/src/views/wms/sch/region/index.vue new file mode 100644 index 000000000..1d793ba64 --- /dev/null +++ b/nladmin-ui/src/views/wms/sch/region/index.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/sch/region/region.js b/nladmin-ui/src/views/wms/sch/region/region.js new file mode 100644 index 000000000..723ae2601 --- /dev/null +++ b/nladmin-ui/src/views/wms/sch/region/region.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/region', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/region/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/region', + method: 'put', + data + }) +} + +export function changeActive(data) { + return request({ + url: 'api/region/changeActive', + method: 'put', + data + }) +} + +export default { add, edit, del, changeActive } diff --git a/nladmin-ui/src/views/wms/sch/task/index.vue b/nladmin-ui/src/views/wms/sch/task/index.vue new file mode 100644 index 000000000..eab155cce --- /dev/null +++ b/nladmin-ui/src/views/wms/sch/task/index.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/sch/task/task.js b/nladmin-ui/src/views/wms/sch/task/task.js new file mode 100644 index 000000000..678aaccd6 --- /dev/null +++ b/nladmin-ui/src/views/wms/sch/task/task.js @@ -0,0 +1,64 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/task', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/task/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/task', + method: 'put', + data + }) +} + +export function getTaskStatus() { + return request({ + url: 'api/task/taskStatus', + method: 'get' + }) +} + +export function getTaskType() { + return request({ + url: 'api/task/taskType', + method: 'get' + }) +} + +export function getFinishType() { + return request({ + url: 'api/task/finishType', + method: 'get' + }) +} + +export function operation(data) { + return request({ + url: 'api/task/operation', + method: 'put', + data + }) +} + +export default { + add, + edit, + del, + operation, + getTaskStatus, + getTaskType, + getFinishType +} diff --git a/nladmin-ui/src/views/wms/st/inbill/index.vue b/nladmin-ui/src/views/wms/st/inbill/index.vue new file mode 100644 index 000000000..c2a5e9b5d --- /dev/null +++ b/nladmin-ui/src/views/wms/st/inbill/index.vue @@ -0,0 +1,449 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/inbill/regionioIn.js b/nladmin-ui/src/views/wms/st/inbill/regionioIn.js new file mode 100644 index 000000000..0bb1ff811 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/inbill/regionioIn.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/regionioIn', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/regionioIn/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/regionioIn', + method: 'put', + data + }) +} + +export function createTask(data) { + return request({ + url: 'api/regionioIn/createTask', + method: 'post', + data + }) +} + +export default { add, edit, del, createTask } diff --git a/nladmin-ui/src/views/wms/st/outbill/MaterDialog.vue b/nladmin-ui/src/views/wms/st/outbill/MaterDialog.vue new file mode 100644 index 000000000..6a90bc566 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/outbill/MaterDialog.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/outbill/index.vue b/nladmin-ui/src/views/wms/st/outbill/index.vue new file mode 100644 index 000000000..acbf4eaf0 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/outbill/index.vue @@ -0,0 +1,451 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/outbill/regionioOut.js b/nladmin-ui/src/views/wms/st/outbill/regionioOut.js new file mode 100644 index 000000000..8b82168bb --- /dev/null +++ b/nladmin-ui/src/views/wms/st/outbill/regionioOut.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/regionioOut', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/regionioOut/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/regionioOut', + method: 'put', + data + }) +} + +export function createTask(data) { + return request({ + url: 'api/regionioOut/createTask', + method: 'post', + data + }) +} + +export default { add, edit, del, createTask } diff --git a/nladmin-ui/src/views/wms/st/vehiclebill/PointDialog.vue b/nladmin-ui/src/views/wms/st/vehiclebill/PointDialog.vue new file mode 100644 index 000000000..88013d402 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/vehiclebill/PointDialog.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/vehiclebill/in/index.vue b/nladmin-ui/src/views/wms/st/vehiclebill/in/index.vue new file mode 100644 index 000000000..04db461b0 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/vehiclebill/in/index.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/vehiclebill/in/inemptyvehicl.js b/nladmin-ui/src/views/wms/st/vehiclebill/in/inemptyvehicl.js new file mode 100644 index 000000000..9ab525761 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/vehiclebill/in/inemptyvehicl.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/inemptyvehicle', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/inemptyvehicle/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/inemptyvehicle', + method: 'put', + data + }) +} + +export function createTask(data) { + return request({ + url: 'api/inemptyvehicle/createTask', + method: 'post', + data + }) +} + +export default { add, edit, del, createTask } diff --git a/nladmin-ui/src/views/wms/st/vehiclebill/out/index.vue b/nladmin-ui/src/views/wms/st/vehiclebill/out/index.vue new file mode 100644 index 000000000..8fe6d6919 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/vehiclebill/out/index.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/nladmin-ui/src/views/wms/st/vehiclebill/out/outemptyvehicl.js b/nladmin-ui/src/views/wms/st/vehiclebill/out/outemptyvehicl.js new file mode 100644 index 000000000..6143dde75 --- /dev/null +++ b/nladmin-ui/src/views/wms/st/vehiclebill/out/outemptyvehicl.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/outemptyvehicle', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/outemptyvehicle/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/outemptyvehicle', + method: 'put', + data + }) +} + +export function createTask(data) { + return request({ + url: 'api/outemptyvehicle/createTask', + method: 'post', + data + }) +} + +export default { add, edit, del, createTask }