From 9f93ea382cb28aadf5f013d88b287a53cc32d1cc Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 19 Mar 2025 17:34:36 +0800 Subject: [PATCH] =?UTF-8?q?manage=E6=9C=8D=E5=8A=A1=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=8A=9F=E8=83=BD=E7=A7=BB=E5=88=B0executor?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cf-dependencies/pom.xml | 10 +- .../src/main/resources/application.yaml | 2 +- .../executor/enums/DictTypeConstants.java | 6 + .../executor/enums/ErrorCodeConstants.java | 11 + .../enums/manage/parts/CategoryEnum.java | 23 + .../enums/manage/parts/ObjectEnum.java | 6 + .../enums/manage/parts/WhetherEnum.java | 17 + .../RemainPlatePlaceStyleEnum.java | 32 + .../remainPlate/RemainPlateStatusEnum.java | 22 + .../remainPlate/RemainPlateUseTypeEnum.java | 25 + .../cf-module-prod-executor-biz/pom.xml | 7 +- .../executor/config/VocieParameters.java | 26 + .../admin/manage/pack/PackController.java | 277 +++++ .../manage/pack/prePack/PackPlateList.java | 28 + .../manage/pack/prePack/PrePackData.java | 34 + .../pack/prePack/PrePackOptimizeInfo.java | 105 ++ .../manage/pack/prePack/PrePackReqVO.java | 30 + .../manage/pack/vo/DeleteOtherPartsReqVO.java | 37 + .../admin/manage/pack/vo/GroupNameList.java | 16 + .../admin/manage/pack/vo/OrderPackReqVO.java | 57 + .../admin/manage/pack/vo/OrderPackRespVO.java | 39 + .../admin/manage/pack/vo/OrderPartsReqVO.java | 39 + .../manage/pack/vo/OrderPartsRespVO.java | 69 ++ .../pack/vo/OrderPlateDetailsRespVO.java | 35 + .../manage/pack/vo/OrderPlateGroupRespVO.java | 23 + .../admin/manage/pack/vo/OtherPackReqVO.java | 50 + .../manage/pack/vo/PackDetailsReqVO.java | 28 + .../admin/manage/pack/vo/PackPageReqVO.java | 56 + .../admin/manage/pack/vo/PackReqVO.java | 34 + .../admin/manage/pack/vo/PackRespVO.java | 101 ++ .../manage/pack/vo/PackageDetailsReqVO.java | 42 + .../admin/manage/pack/vo/PackingReqVO.java | 21 + .../manage/pack/vo/PlateAndPartIdList.java | 23 + .../manage/pack/vo/PlateDetailsRespVO.java | 106 ++ .../manage/pack/vo/PrintOrderPackReqVO.java | 23 + .../manage/pack/vo/PrintOrderPackRespVO.java | 46 + .../admin/manage/parts/PartsController.java | 179 +++ .../manage/parts/vo/PartsCadPageReqVO.java | 88 ++ .../manage/parts/vo/PartsImportExcelVO.java | 74 ++ .../admin/manage/parts/vo/PartsPageReqVO.java | 108 ++ .../admin/manage/parts/vo/PartsRespVO.java | 111 ++ .../admin/manage/parts/vo/PartsSaveReqVO.java | 100 ++ .../manage/plate/PlateManageController.java | 189 +++ .../plate/RemainPlateManageController.java | 136 +++ .../plate/vo/plate/PlateImportExcelVO.java | 106 ++ .../plate/vo/plate/PlateImportRespVO.java | 28 + .../manage/plate/vo/plate/PlatePageReqVO.java | 75 ++ .../manage/plate/vo/plate/PlateRespVO.java | 77 ++ .../manage/plate/vo/plate/PlateSaveReqVO.java | 74 ++ .../plate/vo/remain/RemainPlatePageReqVO.java | 113 ++ .../plate/vo/remain/RemainPlateRespVO.java | 105 ++ .../plate/vo/remain/RemainPlateSaveReqVO.java | 102 ++ .../plate/vo/remain/RemainPlateUpSaveVO.java | 67 ++ .../plate/vo/remain/RemainPlateUptReqVO.java | 27 + .../admin/manage/process/vo/PlateDetails.java | 28 + .../manage/process/vo/ProcessPlateReqVO.java | 39 + .../manage/query/vo/pack/OrderPackageVO.java | 64 + .../query/vo/pack/PackageDetailsRespVO.java | 127 ++ .../vo/productionStatus/OrderModuleVO.java | 27 + .../productionStatus/OrderPlatePageReqVO.java | 47 + .../vo/productionStatus/OrderPlateRespVO.java | 33 + .../vo/productionStatus/PlatePageVO.java | 24 + .../admin/manage/test/TestController.java | 175 +++ .../admin/manage/voice/VoiceController.java | 66 + .../admin/manage/voice/vo/VoiceReqVO.java | 17 + .../dal/dataobject/manage/test/TestDO.java | 14 + .../remainplaten/RemainPlateDO.java | 6 + .../dal/mysql/manage/test/TestMapper.java | 12 + .../executor/dal/mysql/order/OrderMapper.java | 37 + .../dal/mysql/orderItem/OrderItemMapper.java | 67 ++ .../mysql/orderParts/OrderPartsMapper.java | 14 + .../dal/mysql/orderParts/PartsMapper.java | 163 +++ .../dal/mysql/pack/OrderPackageMapper.java | 78 ++ .../mysql/pack/OrderPrepackagedMapper.java | 6 + .../dal/mysql/plate/PlateGoodMapper.java | 80 ++ .../executor/dal/mysql/plate/PlateMapper.java | 21 + .../mysql/remainplaten/RemainPlateMapper.java | 133 +- .../rpc/config/RpcConfiguration.java | 5 +- .../service/manage/pack/PackService.java | 105 ++ .../service/manage/pack/PackServiceImpl.java | 1066 +++++++++++++++++ .../manage/parts/PartsExcelListener.java | 238 ++++ .../service/manage/parts/PartsService.java | 94 ++ .../manage/parts/PartsServiceImpl.java | 261 ++++ .../manage/plate/PlateExcelListener.java | 146 +++ .../manage/plate/PlateManageService.java | 100 ++ .../manage/plate/PlateManageServiceImpl.java | 226 ++++ .../RemainPlateManageService.java | 89 ++ .../RemainPlateManageServiceImpl.java | 198 +++ .../service/manage/voice/VoiceService.java | 24 + .../manage/voice/VoiceServiceImpl.java | 229 ++++ .../executor/util/file/ExcelListener.java | 68 ++ .../executor/util/file/ExcelReadUtil.java | 48 + .../executor/util/file/FileHelperUtil.java | 65 + .../util/number/NumberHelperUtil.java | 42 + .../manage/common/CommonStatusValidator.java | 27 + .../manage/common/ValidCommonStatus.java | 24 + .../manage/pack/OrderPackagedStatusValid.java | 33 + .../manage/pack/OrderPackagedValidator.java | 30 + .../validation/manage/pack/PackTypeValid.java | 33 + .../manage/pack/PackTypeValidator.java | 31 + .../manage/parts/PartsCategoryValid.java | 30 + .../manage/parts/PartsCategoryValidator.java | 28 + .../manage/parts/PartsNumberValid.java | 39 + .../manage/parts/PartsNumberValidator.java | 135 +++ .../placeStyle/PlaceStyleValidator.java | 35 + .../manage/placeStyle/ValidPlaceStyle.java | 27 + .../manage/type/TypeFieldValidator.java | 31 + .../manage/type/ValidTypeField.java | 24 + .../resources/mapper/order/OrderMapper.xml | 162 +++ .../mapper/orderItem/OrderItemMapper.xml | 285 +++++ .../mapper/orderParts/OrderPartsMapper.xml | 149 +++ .../mapper/pack/OrderPackageMapper.xml | 131 ++ .../mapper/plate/PlateGoodMapper.xml | 30 + .../resources/mapper/plate/PlateMapper.xml | 174 +++ .../mapper/remainplaten/RemainPlateMapper.xml | 4 + .../main/resources/type/excel_parts_add.xlsx | Bin 0 -> 13610 bytes .../main/resources/type/excel_plate_add.xlsx | Bin 0 -> 12060 bytes 117 files changed, 9000 insertions(+), 9 deletions(-) create mode 100644 cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/CategoryEnum.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/ObjectEnum.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/WhetherEnum.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlatePlaceStyleEnum.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlateStatusEnum.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlateUseTypeEnum.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/config/VocieParameters.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/PackController.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PackPlateList.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackData.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackOptimizeInfo.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/DeleteOtherPartsReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/GroupNameList.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPackReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPackRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPartsReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPartsRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPlateDetailsRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPlateGroupRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OtherPackReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackDetailsReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackPageReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackageDetailsReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackingReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PlateAndPartIdList.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PlateDetailsRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PrintOrderPackReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PrintOrderPackRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/PartsController.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsCadPageReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsImportExcelVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsPageReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsSaveReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/PlateManageController.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/RemainPlateManageController.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateImportExcelVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateImportRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlatePageReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateSaveReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlatePageReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateSaveReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateUpSaveVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateUptReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/process/vo/PlateDetails.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/process/vo/ProcessPlateReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/pack/OrderPackageVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/pack/PackageDetailsRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderModuleVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderPlatePageReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderPlateRespVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/PlatePageVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/test/TestController.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/voice/VoiceController.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/voice/vo/VoiceReqVO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/manage/test/TestDO.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/manage/test/TestMapper.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackService.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackServiceImpl.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsExcelListener.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsService.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsServiceImpl.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateExcelListener.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageService.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageServiceImpl.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/remainplaten/RemainPlateManageService.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/remainplaten/RemainPlateManageServiceImpl.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/voice/VoiceService.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/voice/VoiceServiceImpl.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/ExcelListener.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/ExcelReadUtil.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/FileHelperUtil.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/number/NumberHelperUtil.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/common/CommonStatusValidator.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/common/ValidCommonStatus.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/OrderPackagedStatusValid.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/OrderPackagedValidator.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/PackTypeValid.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/PackTypeValidator.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsCategoryValid.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsCategoryValidator.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsNumberValid.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsNumberValidator.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/placeStyle/PlaceStyleValidator.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/placeStyle/ValidPlaceStyle.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/type/TypeFieldValidator.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/type/ValidTypeField.java create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateGoodMapper.xml create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/excel_parts_add.xlsx create mode 100644 cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/excel_plate_add.xlsx diff --git a/cf-dependencies/pom.xml b/cf-dependencies/pom.xml index 2e2cfe5bc..ff852bb97 100644 --- a/cf-dependencies/pom.xml +++ b/cf-dependencies/pom.xml @@ -91,6 +91,8 @@ 2.1.0 1.0-2 4.1.2 + + 1.18 @@ -678,7 +680,6 @@ - com.monitorjbl @@ -687,7 +688,6 @@ - javax.xml.stream @@ -696,7 +696,6 @@ - com.aliyun @@ -754,6 +753,11 @@ xercesImpl ${xercesImpl.version} + + com.hynnet + jacob + ${jacob.version} + diff --git a/cf-gateway/src/main/resources/application.yaml b/cf-gateway/src/main/resources/application.yaml index f387f4be1..259857593 100644 --- a/cf-gateway/src/main/resources/application.yaml +++ b/cf-gateway/src/main/resources/application.yaml @@ -57,7 +57,7 @@ spring: - Path=/jmreport/** ## manage-server 服务 - id: manage-admin-api - uri: grayLb://manage-server + uri: grayLb://executor-server predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - Path=/admin-api/manage/** filters: diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java index abb691764..9448d0450 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/DictTypeConstants.java @@ -26,4 +26,10 @@ public class DictTypeConstants { public static final String UNIT_LENGTH = "length_unit"; // 长度单位 public static final String UNIT_AREA = "area_unit"; // 面积单位 public static final String UNIT_NUMBER = "area_number"; // 个数单位 + + public static final String PLATE_TEXTURE = "plate_texture_type";// 板件纹里 + + public static final String PART_CATEGORY = "part_category";// 配件主类型 + + public static final String BOOLEAN_STRING = "infra_boolean_string"; // Boolean 是否类型 } diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java index 356a423ee..0d61a360c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java @@ -95,4 +95,15 @@ public class ErrorCodeConstants { public static final ErrorCode ORDER_IMPORT_GROUPCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_013, "导入校验异常:板件{}下加工组编码{}不存在于加工组编码列表中"); public static final ErrorCode ORDER_IMPORT_ROOMCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_014, "导入校验异常:板件{}下房间编码{}不存在于房间编码列表中"); public static final ErrorCode ORDER_IMPORT_BODYCODE_NOT_EXIST_VALID_ERROR = new ErrorCode(1_002_031_015, "导入校验异常:板件{}下柜体编码{}不存在于柜体编码列表中"); + + // ========== manage配件 1_004_001_000 ========== + public static final ErrorCode PARTS_NOT_EXISTS = new ErrorCode(1_004_001_000, "配件不存在"); + public static final ErrorCode PARTS_GOOD_ID_EXISTS = new ErrorCode(1_004_001_001, "配件编号已存在"); + public static final ErrorCode PARTS_UNIT_NOT_NULL = new ErrorCode(1_004_001_002, "配件-组件或五金或封边条,单位禁止为空"); + public static final ErrorCode PARTS_EDGE_NOT_NULL = new ErrorCode(1_004_001_003, "配件-封边条颜色、宽厚禁止为空"); + + public static final ErrorCode FILE_NULL = new ErrorCode(1_004_001_004, "上传文件为空"); + public static final ErrorCode FILE_FORMAT_ERROR = new ErrorCode(1_004_001_005, "导入文件格式有误"); + public static final ErrorCode FILE_EXCEED_SIZE = new ErrorCode(1_004_001_006, "文件大小超过 10M"); + public static final ErrorCode FILE_CONTENT_NULL = new ErrorCode(1_004_001_007, "文件大小为空"); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/CategoryEnum.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/CategoryEnum.java new file mode 100644 index 000000000..4e59dbc1b --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/CategoryEnum.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.executor.enums.manage.parts; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 配件主类的枚举值 + */ +@Getter +@AllArgsConstructor +public enum CategoryEnum implements ObjectEnum{ + + ASSEMBLY("组件"), + HARDWARE("五金"), + EDGING("封边条"), + OTHER("其他"); + + /** + * 类别名称 + */ + private final String value; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/ObjectEnum.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/ObjectEnum.java new file mode 100644 index 000000000..c5f4f839d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/ObjectEnum.java @@ -0,0 +1,6 @@ +package com.cf.imes.module.executor.enums.manage.parts; + +public interface ObjectEnum { + + String getValue(); +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/WhetherEnum.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/WhetherEnum.java new file mode 100644 index 000000000..8402fcbf9 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/parts/WhetherEnum.java @@ -0,0 +1,17 @@ +package com.cf.imes.module.executor.enums.manage.parts; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum WhetherEnum implements ObjectEnum { + + TRUE("是"), + FALSE("否"); + + /** + * 类别名称 + */ + private final String value; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlatePlaceStyleEnum.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlatePlaceStyleEnum.java new file mode 100644 index 000000000..5c94e9a75 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlatePlaceStyleEnum.java @@ -0,0 +1,32 @@ +package com.cf.imes.module.executor.enums.manage.remainPlate; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 余料板放置枚举类 + */ +@Getter +@AllArgsConstructor +public enum RemainPlatePlaceStyleEnum { + + ZERO(0, "正面"), + ONE(1, "正面右转"), + TWO(2, "正面后转"), + THREE(3, "正面左转"), + FOUR(4, "反面"), + FIVE(5, "反面右转"), + SIX(6, "反面后转"), + SEVEN(7, "反面左转"); + + private final Integer status; + private String description; + + public boolean equals(Integer status) { + return this.status .equals(status) ; + } + + public boolean equals(RemainPlatePlaceStyleEnum enableStatusEnum) { + return enableStatusEnum != null && enableStatusEnum.status .equals(this.getStatus()) ; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlateStatusEnum.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlateStatusEnum.java new file mode 100644 index 000000000..0346e14e4 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlateStatusEnum.java @@ -0,0 +1,22 @@ +package com.cf.imes.module.executor.enums.manage.remainPlate; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RemainPlateStatusEnum { + UNUSED(0, "未使用"), + USED(1, "已使用"); + + private final Integer status; + private String description; + + public boolean equals(Integer status) { + return this.status .equals(status) ; + } + + public boolean equals(RemainPlateStatusEnum enableStatusEnum) { + return enableStatusEnum != null && enableStatusEnum.status .equals(this.getStatus()) ; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlateUseTypeEnum.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlateUseTypeEnum.java new file mode 100644 index 000000000..920bbf79c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/manage/remainPlate/RemainPlateUseTypeEnum.java @@ -0,0 +1,25 @@ +package com.cf.imes.module.executor.enums.manage.remainPlate; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RemainPlateUseTypeEnum { + + TYPE_ZERO(0, ""), + TYPE_ONE(1, "核销"), + TYPE_TWO(2, "排单"), + TYPE_THREE(3, "补板"); + + private final Integer status; + private String description; + + public boolean equals(Integer status) { + return this.status .equals(status) ; + } + + public boolean equals(RemainPlateUseTypeEnum enableStatusEnum) { + return enableStatusEnum != null && enableStatusEnum.status .equals(this.getStatus()) ; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml index 8878e9684..2b0c70176 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml @@ -173,8 +173,11 @@ stax-api - - + + + com.hynnet + jacob + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/config/VocieParameters.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/config/VocieParameters.java new file mode 100644 index 000000000..fb437bdc2 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/config/VocieParameters.java @@ -0,0 +1,26 @@ +package com.cf.imes.module.executor.config; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "voices.parameters") +public class VocieParameters { + + // 设置音频的质量( 越大越好,目前最大好像 22,最小为 4 ) + private Long quality; + + // 朗读声音大小 + private Long soundSize; + + // 朗读速度 + private Long readingSpeed; + + // 音频保存的路径 + private String path; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/PackController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/PackController.java new file mode 100644 index 000000000..ae4fdb073 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/PackController.java @@ -0,0 +1,277 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack; + + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.executor.controller.admin.manage.pack.prePack.PrePackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.DeleteOtherPartsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OtherPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackageDetailsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackingReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PlateDetailsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PrintOrderPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PrintOrderPackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO; +import com.cf.imes.module.executor.service.manage.pack.PackService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.cf.imes.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 生产打包 ") +@RestController +@RequestMapping("/manage/pack") +@Validated +public class PackController { + + + + @Resource + private PackService packService; + + + + + @GetMapping("/page") + @Operation(summary = "打包分页查询") + @PreAuthorize("@ss.hasPermission('manage:pack:query')") + public CommonResult> getPlatePage(@Valid PackPageReqVO pageReqVO) { + + return CommonResult.success(packService.getPackPage(pageReqVO)); + + } + + + @GetMapping("/getOrderPlate") + @Operation(summary = "查看生产订单对应的没有打包的板材信息") + @Parameter(name = "orderId", description = "生产单Id", required = true) + @PreAuthorize("@ss.hasAnyPermissions('manage:pack:export-lost-plate','manage:pack:pack')") + public CommonResult> getOrderPlateList(@Valid @RequestParam("orderId") Long orderId) { + + return success(packService.getOrderPlateList(orderId)); + + } + + + @GetMapping("/getOrderPlateList") + @Operation(summary = "查询多个生产单对应的板材信息") + @Parameter(name = "orderIds", description = "生产单ID", required = true) + @PreAuthorize("@ss.hasAnyPermissions('manage:pack:create','manage:pack:pre-pack','manage:pack:pack')") + public CommonResult> getOrdersPlateList(@Valid @RequestParam("orderIds") List orderIds) { + + return success(packService.getOrdersPlateList(orderIds)); + + } + + + @GetMapping("/getOrderPack") + @Operation(summary = "查看生产订单对应的包裹信息-未分页") + @PreAuthorize("@ss.hasAnyPermissions('manage:pack:export-pack-num','manage:pack:pack')") + public CommonResult> getOrderPack(@Valid PackageDetailsReqVO reqVO) { + + return success(packService.getOrderPack(reqVO)); + + } + + + @GetMapping("/getPageOrderPack") + @Operation(summary = "查看生产订单对应的包裹信息-分页") + @PreAuthorize("@ss.hasPermission('manage:pack:pack-details')") + public CommonResult> getPageOrderPack(@Valid PackageDetailsReqVO reqVO) { + + return success(packService.getPageOrderPack(reqVO)); + + } + + + + + + @GetMapping("/getParts") + @Operation(summary = "查看配件列表") + @PreAuthorize("@ss.hasPermission('manage:pack-parts:query')") + public CommonResult> getParts(@Valid OrderPartsReqVO reqVO) { + + return success(packService.getPartsList(reqVO)); + + + } + + + + + + + @PutMapping("/updatePack") + @Operation(summary = "板材包裹更新-即封包") + @PreAuthorize("@ss.hasPermission('manage:pack:update')") + public CommonResult updatePack(@Valid @RequestBody OrderPackReqVO packageVO) { + + return success(packService.updatePack(packageVO)); + + } + + + + + @PutMapping("/updateParts") + @Operation(summary = "配件包裹更新-即封包") + @PreAuthorize("@ss.hasPermission('manage:pack:update')") + public CommonResult updateParts(@Valid @RequestBody OrderPartsReqVO reqVO) { + + return success(packService.updateParts(reqVO)); + + + } + + + + + @GetMapping("/selectPack") + @Operation(summary = "查询包裹") + @Parameter(name = "orderId", description = "生产单Id", required = true) + @PreAuthorize("@ss.hasPermission('manage:pack:query')") + public CommonResult> selectPack(@Valid @RequestParam("orderId") Long orderId) { + + return success(packService.selectPack(orderId)); + + } + + + + @DeleteMapping("/deletePack") + @Operation(summary = "删除包裹及其关联的包裹信息(删除全部)") + @PreAuthorize("@ss.hasPermission('manage:pack:delete')") + public CommonResult deleteOrderPack (@Valid @RequestBody PackReqVO reqVO) { + + packService.deleteOrderPack(reqVO); + return success(true); + + } + + + + + @PutMapping("/unpacking") + @Operation(summary = "拆包-更改包裹为未封包") + @PreAuthorize("@ss.hasPermission('manage:pack:unpacking')") + public CommonResult unpacking(@Valid @RequestBody PackingReqVO reqVO) { + + OrderPackRespVO unpacking = packService.unpacking(reqVO.getPackageId()); + + return success(unpacking); + } + + + + + + +// @GetMapping("/print") +// @Operation(summary = "包裹订单打印") +// @PreAuthorize("@ss.hasPermission('manage:pack:query')") + public CommonResult printOrderPack (@Valid PrintOrderPackReqVO reqVO) { + + return success(packService.printOrderPack(reqVO)); + + } + + + + + +// @PostMapping("/insertParts") +// @Operation(summary = "新增配件包裹") +// @PreAuthorize("@ss.hasPermission('manage:pack:insert')") + public CommonResult addNewPartsPack (@Valid @RequestBody OrderPackReqVO reqVO) { + + return success(packService.addNewPartsPack(reqVO)); + + } + + + + + @PostMapping("/insertOtherPack") + @Operation(summary = "新增外部配件-即新增一个包裹") + @PreAuthorize("@ss.hasPermission('manage:pack:external-parts')") + public CommonResult addNewOtherPack(@Valid @RequestBody OtherPackReqVO reqVO) { + + return success(packService.addNewOtherPack(reqVO)); + + } + + + @PutMapping("/insertOther") + @Operation(summary = "新增外部配件") + @PreAuthorize("@ss.hasPermission('manage:pack:external-parts')") + public CommonResult addNewOtherParts (@Valid @RequestBody OtherPackReqVO reqVO) { + + return success(packService.addNewOtherParts(reqVO)); + + } + + + + @DeleteMapping("/deleteOtherParts") + @Operation(summary = "删除包裹中的外部配件") + @PreAuthorize("@ss.hasPermission('manage:pack:delete')") + public CommonResult deleteOtherParts (@Valid @RequestBody DeleteOtherPartsReqVO reqVO) { + + packService.deleteOtherParts(reqVO); + return success(true); + + + } + + + + + @GetMapping("/getPrePackInfo") + @Operation(summary = "查询预打包优化信息") + @PreAuthorize("@ss.hasPermission('manage:pack:pre-pack')") + public CommonResult getPrePackInfo ( @RequestParam("orderId") Long orderId) { + + return success(packService.getPrePackInfo(orderId)); + + } + + + + + @PostMapping("/saveOptimizeInfo") + @Operation(summary = "预打包保存优化信息") + @PreAuthorize("@ss.hasPermission('manage:pack:pre-pack')") + public CommonResult saveOptimizeInfo(@Valid @RequestBody PrePackReqVO reqVO) { + + packService.saveOptimizeInfo(reqVO); + + return success(true); + + + } + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PackPlateList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PackPlateList.java new file mode 100644 index 000000000..6cf1e7cd6 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PackPlateList.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.prePack; + + +import lombok.Builder; +import lombok.Data; +import lombok.ToString; + +@Data +@ToString(callSuper = true) +@Builder +public class PackPlateList { + + + // 包裹ID + private Long packId; + + // 包裹编号 + private String packNo; + + // 板材ID + private Long plateId; + + // 板材编号 + private String plateNo; + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackData.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackData.java new file mode 100644 index 000000000..693848a4b --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackData.java @@ -0,0 +1,34 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.prePack; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "预打包的优化结构") +@Data +@ToString(callSuper = true) +public class PrePackData { + + + @Schema(description = "包裹编号") + private String name; + + + @Schema(description = "点的位置信息") + private Double pointX; + private Double pointY; + + @Schema(description = "板材编号") + private String plateNo; + + @Schema(description = "板材宽度") + private Long plateWidth; + + @Schema(description = "板材高度") + private Long plateHeight; + + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackOptimizeInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackOptimizeInfo.java new file mode 100644 index 000000000..f72e3c91b --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackOptimizeInfo.java @@ -0,0 +1,105 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.prePack; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.Valid; +import java.util.List; + +@Schema(description = "预打包的优化结构") +@Data +@ToString(callSuper = true) +public class PrePackOptimizeInfo { + + + @Schema(description = "分组名称") + private String groupName; + + + @Schema(description = "优化的数据") + private List list; + + + + @Valid + @Data + public static class PrePackData { + + @Schema(description = "包裹编号") + private String name; + + @Schema(description = "") + private List list; + + } + + + @Valid + @Data + public static class PrerStoreyNum { + + @Schema(description = "包裹层数名称") + private String name; + + + @Schema(description = "") + private Long floor_place_width; + + @Schema(description = "") + private Long floor_place_height; + + @Schema(description = "") + private List list; + + } + + + @Valid + @Data + public static class PrerPlateData { + + @Schema(description = "小板名称") + private String name; + + + @Schema(description = "") + private String plateNo; + + @Schema(description = "") + private String plateId; + + @Schema(description = "") + private PrePlaceInfo placeInfo; + + } + + + @Valid + @Data + public static class PrePlaceInfo{ + + @Schema(description = "") + private String banid; + + @Schema(description = "") + private Double line; + + @Schema(description = "") + private Double x; + + @Schema(description = "") + private Double y; + + @Schema(description = "") + private Long pbg; + + @Schema(description = "") + private Long pbk; + + + } + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackReqVO.java new file mode 100644 index 000000000..a5211895a --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/prePack/PrePackReqVO.java @@ -0,0 +1,30 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.prePack; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 预打包保存优化信息") +@Data +@ToString(callSuper = true) +public class PrePackReqVO { + + + @Schema(description = "生产单ID") + @NotNull(message = "优化数据异常,请重新优化") + private Long orderId; + + + + @Schema(description = "优化信息") + @NotBlank(message = "优化数据异常,请重新优化") + private String optimizeInfo; + + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/DeleteOtherPartsReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/DeleteOtherPartsReqVO.java new file mode 100644 index 000000000..006bdc7f6 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/DeleteOtherPartsReqVO.java @@ -0,0 +1,37 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 删除其他配件 Request VO") +@Data +@ToString(callSuper = true) +public class DeleteOtherPartsReqVO { + + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "生产单号为空,请重新删除配件") + private Long orderId; + + + @Schema(description = "包裹Id", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "包裹号为空,请重新删除配件") + private Long packageId; + + @Schema(description = "配件ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "配件信息为空,请重新删除配件") + private Long partsId; + + + @Schema(description = "是否是其他类型的配件", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "配件类型为空,请重新删除配件") + private Boolean isOtherParts; + + + +} + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/GroupNameList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/GroupNameList.java new file mode 100644 index 000000000..38b68b54d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/GroupNameList.java @@ -0,0 +1,16 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + + +@Schema(description = "工序组名称") +@Data +public class GroupNameList { + + @Schema(description = "工序组名称") + private String name; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPackReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPackReqVO.java new file mode 100644 index 000000000..d58f05f3d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPackReqVO.java @@ -0,0 +1,57 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import com.cf.imes.module.executor.validation.manage.pack.PackTypeValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - 包裹新增 Request VO") +@Data +@ToString(callSuper = true) +public class OrderPackReqVO { + + + @Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long packId; + + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "生产单号为空") + private Long orderId; + + + @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String packNo; + + + @Schema(description = "包裹类型", requiredMode = Schema.RequiredMode.REQUIRED) + @PackTypeValid + private Integer packageType; + + +// @Schema(description = "包裹状态", requiredMode = Schema.RequiredMode.REQUIRED) +// private Long packStatus; + + + @Schema(description = "备注") + private String remark; + + + @Schema(description = "新增的板件ID", requiredMode = Schema.RequiredMode.REQUIRED) + private List addPlateIdList; + + + @Schema(description = "移除的板件ID", requiredMode = Schema.RequiredMode.REQUIRED) + private List deletePlateIdList; + + + @Schema(description = "新增的配件包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) + private List addPartsIdList; + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPackRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPackRespVO.java new file mode 100644 index 000000000..7b787863c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPackRespVO.java @@ -0,0 +1,39 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + + +@Schema(description = "管理后台 - 生产单包裹表 Response VO") +@Data +@Builder +public class OrderPackRespVO { + + @Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long id; + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String packageNo; + + @Schema(description = "包裹类型,-1未定义,0板材,1配件,2其他配件", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer packageType; + + @Schema(description = "包裹名", requiredMode = Schema.RequiredMode.REQUIRED) + private String name; + + @Schema(description = "包裹状态,0未封包,1已封包,2已入库,3已出库", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; + + @Schema(description = "组织ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long organId; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) + private String remark; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPartsReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPartsReqVO.java new file mode 100644 index 000000000..7d958e987 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPartsReqVO.java @@ -0,0 +1,39 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Schema(description = "管理后台 - 生产单模块表 Request VO") +@Data +//@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderPartsReqVO /*extends PageParam*/ { + + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "生产单号为空") + private Long orderId; + + + @Schema(description = "更新配件时传-包裹ID") + private Long packId; + + + @Schema(description = "新增的配件ID") + private List addPartsIdList; + + + @Schema(description = "更新配件时传-删除的配件ID") + private List deletePartsIdList; + + + @Schema(description = "新增的板件ID") + private List addPlateIdList; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPartsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPartsRespVO.java new file mode 100644 index 000000000..ae41da5e2 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPartsRespVO.java @@ -0,0 +1,69 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 配件列表详情 Response VO") +@Data +public class OrderPartsRespVO { + + + @Schema(description = "配件ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long partsId; + + @Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String name; + + @Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED) + private String model; + + @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) + private String spec; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long num; + + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED) + private String unit; + + @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) + private String brand; + + @Schema(description = "厂家", requiredMode = Schema.RequiredMode.REQUIRED) + private String factory; + + + @Schema(description = "配件类型", requiredMode = Schema.RequiredMode.REQUIRED) + private String type; + + + @Schema(description = "是否复合配件", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean isComposite; + + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) + private String remark; + + + @Schema(description = "配件颜色", requiredMode = Schema.RequiredMode.REQUIRED) + private String partsColor; + + @Schema(description = "配件宽度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsWidth; + + @Schema(description = "配件长度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsLength; + + @Schema(description = "配件厚度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsThickness; + + @Schema(description = "配件主类:1封边2五金3组件", requiredMode = Schema.RequiredMode.REQUIRED) + private String category; + + @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED) + private String subparts; + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPlateDetailsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPlateDetailsRespVO.java new file mode 100644 index 000000000..6398b9265 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPlateDetailsRespVO.java @@ -0,0 +1,35 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + + + +@Schema(description = "管理后台 - 查看生产单对应的板件信息") +@Data +@ExcelIgnoreUnannotated +public class OrderPlateDetailsRespVO { + + + @Schema(description = "板件总数", requiredMode = Schema.RequiredMode.REQUIRED) + private Long plateNum; + + @Schema(description = "已处理量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long plateProcessedNum; + + @Schema(description = "待处理量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long pendingNum; + + +// @Schema(description = "当前包裹的板件数", requiredMode = Schema.RequiredMode.REQUIRED) +// private Long currentPackNum; + + @Schema(description = "生产单对应的板件信息", requiredMode = Schema.RequiredMode.REQUIRED) + List plateDetailsRespVO; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPlateGroupRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPlateGroupRespVO.java new file mode 100644 index 000000000..dae807be7 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OrderPlateGroupRespVO.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Schema(description = "管理后台 - 板材列表显示 Response VO") +@Data +public class OrderPlateGroupRespVO { + + + @Schema(description = "房间id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long roomId; + + + @Schema(description = "房间名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String roomName; + + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OtherPackReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OtherPackReqVO.java new file mode 100644 index 000000000..f57d0e9db --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/OtherPackReqVO.java @@ -0,0 +1,50 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import com.cf.imes.framework.common.validation.NumberValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - 新增外部配件 Request VO") +@Data +@ToString(callSuper = true) +public class OtherPackReqVO { + + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "生产单号为空,请重新新增外部配件") + private Long orderId; + + + @Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "配件名称不能为空") + @Size(max = 64, message = "配件名称长度不能超过 64 个字符") + private String name; + + + @Schema(description = "配件数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "配件数量") + private Double num; + + + @Schema(description = "配件单位", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "配件单位不能为空") + @Size(max = 32, message = "配件单位长度不能超过 32 个字符") + private String unit; + + @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String packNo; + + + @Schema(description = "备注") + private String remark; + + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackDetailsReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackDetailsReqVO.java new file mode 100644 index 000000000..6c5880945 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackDetailsReqVO.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.module.executor.validation.manage.pack.PackTypeValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 查看包裹详情") +@Data +@ToString(callSuper = true) +public class PackDetailsReqVO extends PageParam { + + + @Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "包裹数据错误,请重新查看") + private Long packageId; + + + @Schema(description = "包裹类型", requiredMode = Schema.RequiredMode.REQUIRED) + @PackTypeValid + private Integer type; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackPageReqVO.java new file mode 100644 index 000000000..782427013 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackPageReqVO.java @@ -0,0 +1,56 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.module.executor.validation.manage.pack.OrderPackagedStatusValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Pattern; + +@Schema(description = "管理后台 - 打包分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PackPageReqVO extends PageParam { + + + @Schema(description = "打包状态(0:未打包,1:已打包)", requiredMode = Schema.RequiredMode.REQUIRED) + @OrderPackagedStatusValid + private Integer status; + + + @Schema(description = "订单号") + @Pattern(regexp = "^[0-9]*$",message = "生产单号必须为数字") + @Length(max = 19,message = "生产单号长度不能超过19") + private String orderId; + + + @Schema(description = "自定义单号") + @Length(max = 32,message = "自定义单号数据过长,请重新输入") + private String customOrderNo; + + + @Schema(description = "经销商") + @Length(max = 255, message = "经销商数据过长,请重新输入") + private String dealer; + + + @Schema(description = "客户") + @Length(max = 255, message = "客户数据过长,请重新输入") + private String customer; + + + @Schema(description = "地址") + @Length(max = 255, message = "收货地址数据过长,请重新输入") + private String address; + + + @Schema(description = "是否翻页-true:上,false:下") + private Boolean isUp; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackReqVO.java new file mode 100644 index 000000000..620e71dd0 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackReqVO.java @@ -0,0 +1,34 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 删除订单包裹 Request VO") +@Data +@ToString(callSuper = true) +public class PackReqVO { + + @Schema(description = "生产单ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "生产单号为空,请重新删除配件") + private Long orderId; + + + @Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "包裹信息为空,请重新删除配件") + private Long packageId; + + + @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long packageNo; + + + @Schema(description = "是否是其他类型的包裹", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "包裹类型为空,请重新删除配件") + private Boolean isOther; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackRespVO.java new file mode 100644 index 000000000..bb5c7a243 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackRespVO.java @@ -0,0 +1,101 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.List; + + +@Schema(description = "管理后台 - 生产单表 order_{N} Response VO") +@Data +@Setter +public class PackRespVO { + + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7788") + private Long id; + + + @Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7788") + private Long packId; + + + @Schema(description = "自定义单号", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private String customOrderNo; + + + @Schema(description = "经销商电话", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private String dealerPhoneNumber; + + + @Schema(description = "经销商", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private String dealer; + + + @Schema(description = "订单日期", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private LocalDateTime orderDate; + + + @Schema(description = "交付日期", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private LocalDateTime deliveryDate; + + + @Schema(description = "打包状态", requiredMode = Schema.RequiredMode.REQUIRED,example = "0") + private Integer packaged; + + + @Schema(description = "客户", requiredMode = Schema.RequiredMode.REQUIRED,example = "张三") + private String customer; + + + @Schema(description = "客户地址", requiredMode = Schema.RequiredMode.REQUIRED,example = "AABB") + private String address; + + + @Schema(description = "客户电话", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private String phoneNumber; + + + @Schema(description = "业务员", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private String salesman; + + + @Schema(description = "拆单员", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private String splitter; + + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + + + @Schema(description = "已打包数-包裹数") + private Long packCount; + + + @Schema(description = "已打包片数-已处理量") + private Long packPieceCount; + + + @Schema(description = "总片数-板件总数") + private Long totalPieceCount; + + + @Schema(description = "待处理量") + private Long pendingNum; + + + @Schema(description = "生产单对应的板材ID集") + private List plateIdList; + + @Schema(description = "生产单对应的包裹ID集") + private List packIdList; + +// @Schema(description = "生产单对应的板件信息", requiredMode = Schema.RequiredMode.REQUIRED) +// List plateDetailsRespVO; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackageDetailsReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackageDetailsReqVO.java new file mode 100644 index 000000000..7f38639da --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackageDetailsReqVO.java @@ -0,0 +1,42 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import com.cf.imes.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Pattern; + + +@Schema(description = "管理后台 - 查看生产单下对应的包裹信息") +@Data +@ToString(callSuper = true) +public class PackageDetailsReqVO extends PageParam { + + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED) + @Pattern(regexp = "^[0-9]*$",message = "生产单号必须为数字") + @Length(max = 19,message = "生产单号长度不能超过 19 位") + private String orderId; + + + @Schema(description = "板编号") + @Pattern(regexp = "^[0-9]*$",message = "板编号必须为数字") + @Length(max = 13,message = "板编号长度不能超过 13 位") + private String plateNo; + + + @Schema(description = "包裹状态") + private Boolean packStatus; + + + @Schema(description = "包裹编号") + @Pattern(regexp = "^[0-9]*$",message = "包裹编号必须为数字") + @Length(max = 13,message = "包裹编号长度不能超过 13 位") + private String packageNo; + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackingReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackingReqVO.java new file mode 100644 index 000000000..cd827a5ed --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PackingReqVO.java @@ -0,0 +1,21 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 拆包") +@Data +@ToString(callSuper = true) +public class PackingReqVO { + + + @Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "包裹异常,请查看是否封包") + private Long packageId; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PlateAndPartIdList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PlateAndPartIdList.java new file mode 100644 index 000000000..c93f63b45 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PlateAndPartIdList.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + + +@Schema(description = "板材和配件ID") +@Data +@ToString(callSuper = true) +public class PlateAndPartIdList { + + + @Schema(description = "板材ID") + private Long plateId; + + + @Schema(description = "配件ID") + private Long partsId; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PlateDetailsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PlateDetailsRespVO.java new file mode 100644 index 000000000..24d68fea0 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PlateDetailsRespVO.java @@ -0,0 +1,106 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + + +@Schema(description = "管理后台 - 板材详情(导出板材表) Response VO") +@Data +@ExcelIgnoreUnannotated +public class PlateDetailsRespVO { + + @Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long packageId; + + @Schema(description = "包裹号", requiredMode = Schema.RequiredMode.REQUIRED) + private String packageNo; + + @Schema(description = "房间名称", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("房间名称") + private String roomName; + + @Schema(description = "柜体名称", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("柜体名称") + private String cabinetName; + + @Schema(description = "房间ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String roomId; + + @Schema(description = "柜体ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String bodyId; + + @Schema(description = "生产单ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String orderId; + + @Schema(description = "板材ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String plateId; + + @Schema(description = "自定义板编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String customPlateNo; + + @Schema(description = "板编号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("板编号") + private String plateNo; + + @Schema(description = "板名称", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("板名称") + private String plateName; + + @Schema(description = "材料", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("材料") + private String material; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("颜色") + private String color; + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("宽度") + private Double width; + + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("长度") + private Double height; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("厚度") + private Double thickness; + + @Schema(description = "面积", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("面积") + private Double area; + + @Schema(description = "纹路", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("纹路") + private Integer texture; + + @Schema(description = "异形", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("异形") + private Boolean specialShaped; + + @Schema(description = "造型", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("造型") + private Boolean profiling; + + @Schema(description = "排孔", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("排孔") + private Boolean rowHole; + + @Schema(description = "加工组", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("加工组") + private String processGroup; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("备注") + private String remark; + + + @Schema(description = "加工组名称集合") + private List processGroupNameList; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PrintOrderPackReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PrintOrderPackReqVO.java new file mode 100644 index 000000000..a9df859a4 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PrintOrderPackReqVO.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 打印生产单的包裹 Request VO") +@Data +@ToString(callSuper = true) +public class PrintOrderPackReqVO { + + + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9822") + private Long orderId; + + + @Schema(description = "包裹id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9822") + private Long packageNo; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PrintOrderPackRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PrintOrderPackRespVO.java new file mode 100644 index 000000000..b84c8e937 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/pack/vo/PrintOrderPackRespVO.java @@ -0,0 +1,46 @@ +package com.cf.imes.module.executor.controller.admin.manage.pack.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 包裹打印显示 Response VO") +@Data +public class PrintOrderPackRespVO { + + @Schema(description = "自定义单号", requiredMode = Schema.RequiredMode.REQUIRED) + private String customOrderNo; + + + @Schema(description = "经销商", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private String dealer; + + + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7788") + private Long orderId; + + + @Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7788") + private Long packNo; + + + @Schema(description = "包裹序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7788") + private Long packNum; + + + + @Schema(description = "客户地址", requiredMode = Schema.RequiredMode.REQUIRED,example = "AABB") + private String address; + + + + @Schema(description = "板材列表", requiredMode = Schema.RequiredMode.REQUIRED,example = "AABB") + private List plateList; + + + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/PartsController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/PartsController.java new file mode 100644 index 000000000..c561682ea --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/PartsController.java @@ -0,0 +1,179 @@ +package com.cf.imes.module.executor.controller.admin.manage.parts; + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.excel.core.util.ExcelUtils; +import com.cf.imes.framework.operatelog.core.annotations.OperateLog; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsCadPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsImportExcelVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.orderParts.PartsDO; +import com.cf.imes.module.executor.service.manage.parts.PartsExcelListener; +import com.cf.imes.module.executor.service.manage.parts.PartsService; +import com.cf.imes.module.executor.util.file.ExcelReadUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.io.IOException; +import java.util.List; + +import static com.cf.imes.framework.common.pojo.CommonResult.success; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.IMPORT; + + +@Tag(name = "管理后台 - 配件管理") +@RestController +@RequestMapping("/manage/parts/") +@Validated +public class PartsController { + + @Resource + private PartsService partsService; + + final String IMPORT_TEMPLATE = "配件导入模板.xlsx"; + + @PostMapping("/create") + @Operation(summary = "创建配件") + @PreAuthorize("@ss.hasAnyPermissions('system:accessory:create','base:accessory:create')") + public CommonResult create(@Valid @RequestBody PartsSaveReqVO createReqVO) { + return success(partsService.create(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新配件") + @PreAuthorize("@ss.hasAnyPermissions('system:accessory:update','base:accessory:update')") + public CommonResult update(@Valid @RequestBody PartsSaveReqVO updateReqVO) { + partsService.update(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除配件") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "organId", description = "板材所属组织ID", example = "1024") + }) + @PreAuthorize("@ss.hasAnyPermissions('system:accessory:delete','base:accessory:delete')") + public CommonResult delete(@RequestParam("id") Long id, + @RequestParam(value = "organId",required = false, defaultValue = "0") Long organId) { + partsService.delete(id, organId); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得配件") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "organId", description = "板材所属组织ID", example = "1024") + }) + @PreAuthorize("@ss.hasAnyPermissions('system:accessory:update','base:accessory:update')") + public CommonResult get(@RequestParam("id") Long id, + @RequestParam(value = "organId", required = false, defaultValue = "0") Long organId) { + PartsDO partsDO = partsService.get(id, organId); + return success(BeanUtils.toBean(partsDO, PartsRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得配件分页") + @PreAuthorize("@ss.hasAnyPermissions('system:accessory:query','base:accessory:query')") + public CommonResult> getPage(@Valid PartsPageReqVO pageReqVO) { + PageResult pageResult = partsService.getPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PartsRespVO.class)); + } + + @GetMapping("/webcad/page") + @Operation(summary = "获得配件分页") + public CommonResult> webCadGetPage(@Valid PartsPageReqVO pageReqVO) { + PageResult pageResult = partsService.webCadGetPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PartsRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出配件文件") + @PreAuthorize("@ss.hasAnyPermissions('system:accessory:export','base:accessory:export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid PartsPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = partsService.getPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "配件表.xls", "数据", PartsRespVO.class, + BeanUtils.toBean(list, PartsRespVO.class)); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入配件模板") + @Parameter(name = "value", description = "文件类型", required = true, example = "0") + @PreAuthorize("@ss.hasAnyPermissions('system:accessory:export-template','base:accessory:export-template')") + public void importTemplate(HttpServletResponse response, @RequestParam("value") @NotEmpty(message = "文件路径不能为空") String value) { + partsService.exportTemplate(response, value); + } + + @PostMapping("/import") + @Operation(summary = "导入配件") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新", example = "true"), + @Parameter(name = "organId", description = "配件所属组织ID") + }) + @OperateLog(type = IMPORT) + @PreAuthorize("@ss.hasAnyPermissions('system:accessory:import','base:accessory:import')") + public void importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport, + @RequestParam(value = "organId", required = false, defaultValue = "0") Long organId, + HttpServletResponse response) throws Exception { + + ExcelReadUtil excelReadUtil = new ExcelReadUtil(); + PartsExcelListener listener = new PartsExcelListener(); + List list = excelReadUtil.read(file, PartsImportExcelVO.class, listener); + + if (!excelReadUtil.getFlag()) + ExcelUtils.write(response, IMPORT_TEMPLATE, "配件列表", PartsImportExcelVO.class, list); + else { + if (list.isEmpty()){ + PartsImportExcelVO partsImportExcelVO = PartsImportExcelVO.builder().result("导入失败,请保证导入文件中包含配件数据").build(); + list.add(partsImportExcelVO); + ExcelUtils.write(response, IMPORT_TEMPLATE, "配件列表", PartsImportExcelVO.class, list); + } else { + partsService.importPartsList(list, updateSupport, organId);// 成功,批量导入 + } + } + } + + @GetMapping("/cad/page") + @Operation(summary = "cad获得配件分页") +// @PreAuthorize("@ss.hasAnyPermissions('system:accessory:query','base:accessory:query')") + public CommonResult> getCadPage(@Valid PartsCadPageReqVO pageReqVO) { + PageResult pageResult = partsService.getCadPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PartsRespVO.class)); + } + + @GetMapping("/webcad/all") + @Operation(summary = "获取全部配件信息") + public CommonResult> getPlateAll(@RequestParam("category") String category) { + List list = partsService.getPartAll(category); + return success(BeanUtils.toBean(list, PartsRespVO.class)); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsCadPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsCadPageReqVO.java new file mode 100644 index 000000000..6a1ecb563 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsCadPageReqVO.java @@ -0,0 +1,88 @@ +package com.cf.imes.module.executor.controller.admin.manage.parts.vo; + +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.module.executor.validation.manage.parts.PartsNumberValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.Size; + +/** + * cad 传参 + */ +@Schema(description = "管理后台 - 配件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PartsCadPageReqVO extends PageParam { + + @Schema(description = "商品名称", example = "张三") + @Size(max = 64, message = "配件名称长度不能超过64个字符") + private String name; + + @Schema(description = "颜色") + @Size(max = 32, message = "颜色长度不能超过32个字符") + private String color; + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板") + @Size(max = 64, message = "材质长度不能超过64个字符") + private String material; + + @Schema(description = "配件类型", example = "2") + @Size(max = 32, message = "配件类型长度不能超过323个字符") + private String category; + + @Schema(description = "配件子类", example = "2") + @Size(max = 64, message = "配件子类长度不能超过64个字符") + private String type; + + @Schema(description = "型号") + @Size(max = 64, message = "配件型号长度不能超过64个字符") + private String model; + + @Schema(description = "规格") + @Size(max = 64, message = "配件规格不能超过64个字符") + private String spec; + + @Schema(description = "宽度") + @PartsNumberValid(name = "宽度") + private Double width; + + @Schema(description = "长度") + @PartsNumberValid(name = "长度") + private Double length; + + @Schema(description = "厚度") + @PartsNumberValid(name = "厚度") + private Double thickness; + + @Schema(description = "品牌") + @Size(max = 64, message = "配件品牌不能超过64个字符") + private String brand; + + @Schema(description = "厂家") + @Size(max = 128, message = "厂家长度不能超过64个字符") + private String factory; + + @Schema(description = "单位") + @Size(max = 32, message = "单位长度不能超过64个字符") + private String unit; + + @Schema(description = "是否复合部件:0 否 1 是") + private Boolean isComposite; + + @Schema(description = "备注", example = "你说的对") + @Size(max = 255, message = "备注长度不能超过255个字符") + private String remark; + + private Long organId; + + @Schema(description = "排序", example = "ascend") + private String order; + + @Schema(description = "排序字段", example = "id") + private String field; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsImportExcelVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsImportExcelVO.java new file mode 100644 index 000000000..d700c0279 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsImportExcelVO.java @@ -0,0 +1,74 @@ +package com.cf.imes.module.executor.controller.admin.manage.parts.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 配件导入模板 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class PartsImportExcelVO { + + @ExcelProperty("物料编号") + private String goodsId; + + @ExcelProperty("分类") + private String category; + + @ExcelProperty("复合") + private String isComposite; + + @ExcelProperty("子类") + private String type; + + @ExcelProperty("物料名称") + private String name; + + @ExcelProperty("型号") + private String model; + + @ExcelProperty("规格") + private String spec; + + @ExcelProperty("材质") + private String material; + + @ExcelProperty("颜色") + private String color; + + @ExcelProperty("品牌") + private String brand; + + @ExcelProperty("厂家") + private String factor; + + @ExcelProperty("长度")// float(8,3) + private String length; + + @ExcelProperty("宽度")// float(8,3) + private String width; + + @ExcelProperty("厚度") + private String thickness; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("价格")// float(8,3) + private String price; + + @ExcelProperty("单位") + private String unit; + + @ExcelProperty("上传结果") + private String result; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsPageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsPageReqVO.java new file mode 100644 index 000000000..b1a2b9b12 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsPageReqVO.java @@ -0,0 +1,108 @@ +package com.cf.imes.module.executor.controller.admin.manage.parts.vo; + +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.module.executor.validation.manage.parts.PartsNumberValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.Size; +import java.time.LocalDateTime; + +import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 查询 + */ +@Schema(description = "管理后台 - 配件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PartsPageReqVO extends PageParam { + + @Schema(description = "设计端商品ID", example = "26589") + @Size(max = 32, message = "配件编号长度不能超过32个字符") + private String goodsId; + + @Schema(description = "配件名称", example = "张三") + @Size(max = 64, message = "配件名称长度不能超过64个字符") + private String name; + + @Schema(description = "颜色") + @Size(max = 32, message = "颜色长度不能超过32个字符") + private String color; + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板") + @Size(max = 64, message = "材质长度不能超过64个字符") + private String material; + + @Schema(description = "配件类型", example = "2") + @Size(max = 32, message = "配件类型长度不能超过323个字符") + private String category; + + @Schema(description = "配件子类", example = "2") + @Size(max = 64, message = "配件子类长度不能超过64个字符") + private String type; + + @Schema(description = "型号") + @Size(max = 64, message = "配件型号长度不能超过64个字符") + private String model; + + @Schema(description = "规格") + @Size(max = 64, message = "配件规格不能超过64个字符") + private String spec; + + @Schema(description = "价格") + @PartsNumberValid(name = "价格") + private Double[] price; + + @Schema(description = "宽度") + @PartsNumberValid(name = "宽度") + private Double[] width; + + @Schema(description = "长度") + @PartsNumberValid(name = "长度") + private Double[] length; + + @Schema(description = "厚度") + @PartsNumberValid(name = "厚度") + private Double[] thickness; + + @Schema(description = "品牌") + @Size(max = 64, message = "配件品牌不能超过64个字符") + private String brand; + + @Schema(description = "厂家") + @Size(max = 128, message = "厂家长度不能超过64个字符") + private String factory; + + @Schema(description = "单位") + @Size(max = 32, message = "单位长度不能超过64个字符") + private String unit; + + @Schema(description = "是否复合部件:0 否 1 是") + private Boolean isComposite; + + @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", example = "你说的对") + @Size(max = 255, message = "子配件列表长度不能超过255个字符") + private String subparts; + + @Schema(description = "备注", example = "你说的对") + @Size(max = 255, message = "备注长度不能超过255个字符") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + private Long organId; + + @Schema(description = "排序", example = "ascend") + private String order; + + @Schema(description = "排序字段", example = "id") + private String field; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsRespVO.java new file mode 100644 index 000000000..1b13d2c87 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsRespVO.java @@ -0,0 +1,111 @@ +package com.cf.imes.module.executor.controller.admin.manage.parts.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.cf.imes.framework.common.validation.NumberValid; +import com.cf.imes.framework.excel.core.annotations.DictFormat; +import com.cf.imes.framework.excel.core.convert.DictConvert; +import com.cf.imes.module.executor.enums.DictTypeConstants; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.Size; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 配件 Response VO") +@Data +@ExcelIgnoreUnannotated +public class PartsRespVO { + + @Schema(description = "配件 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11238") + @ExcelProperty("配件ID") + @ExcelIgnore + private Long id; + + @Schema(description = "设计端商品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26589") + @ExcelProperty("配件编号") + private String goodsId; + + @Schema(description = "是否复合部件:0 否 1 是", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "是否复合部件", converter = DictConvert.class) + @DictFormat(DictTypeConstants.BOOLEAN_STRING) + private Boolean isComposite; + + @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") +// @ExcelProperty("子配件ID列表") + @ExcelIgnore + private String subparts; + + @Schema(description = "配件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("配件类型") + @DictFormat(DictTypeConstants.PART_CATEGORY) + private String category; + + @Schema(description = "配件子类", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("配件子类") + private String type; + + @Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @ExcelProperty("配件名称") + private String name; + + @Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("型号") + private String model; + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("材质") + private String material; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + @Size(max = 32, message = "颜色长度不能超过32个字符") + @ExcelProperty("颜色") + private String color; + + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("单位") + private String unit; + + @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("规格") + private String spec; + + @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("品牌") + private String brand; + + @Schema(description = "厂家", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("厂家") + private String factory; + + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "宽度") + @ExcelProperty("宽度") + private Double width; + + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "长度") + @ExcelProperty("长度") + private Double length; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "厚度") + @ExcelProperty("厚度") + private Double thickness; + + @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "价格") + @ExcelProperty("价格") + private Double price; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsSaveReqVO.java new file mode 100644 index 000000000..db70e8d7e --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/parts/vo/PartsSaveReqVO.java @@ -0,0 +1,100 @@ +package com.cf.imes.module.executor.controller.admin.manage.parts.vo; + +import com.cf.imes.framework.common.validation.NumberValid; +import com.cf.imes.module.executor.validation.manage.parts.PartsCategoryValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - 配件 新增/修改 Request VO") +@Data +public class PartsSaveReqVO { + + @Schema(description = "配件 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11238") + private Long id; + + @Schema(description = "设计端商品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26589") + @NotEmpty(message = "设计端商品ID不能为空") + @Size(max = 32, message = "设计端商品ID长度不能超过32个字符") + private String goodsId; + + @Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "配件名称不能为空") + @Size(max = 64, message = "配件名称长度不能超过64个字符") + private String name; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + @Size(max = 32, message = "颜色长度不能超过32个字符") +// @NotEmpty(message = "颜色不能为空") + private String color; + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotEmpty(message = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板不能为空") + @Size(max = 64, message = "材质长度不能超过64个字符") + private String material; + + @Schema(description = "配件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotEmpty(message = "配件类型不能为空") + @Size(max = 32, message = "配件类型长度不能超过32个字符") + @PartsCategoryValid + private String category; + + @Schema(description = "配件子类", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @Size(max = 64, message = "配件子类长度不能超过64个字符") + private String type; + + @Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotEmpty(message = "型号不能为空") + @Size(max = 64, message = "型号长度不能超过64个字符") + private String model; + + @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "价格") + private Double price; + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "宽度") + private Double width; + + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "长度") + private Double length; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + @NumberValid(name = "厚度") + private Double thickness; + + @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) + @Size(max = 64, message = "规格长度不能超过64个字符") + private String spec; + + @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) + @Size(max = 64, message = "品牌长度不能超过64个字符") + private String brand; + + @Schema(description = "厂家", requiredMode = Schema.RequiredMode.REQUIRED) + @Size(max = 128, message = "厂家长度不能超过128个字符") + private String factory; + + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotEmpty(message = "单位不能为空") + @Size(max = 32, message = "单位长度不能超过32个字符") + private String unit; + + @Schema(description = "是否复合部件:0 否 1 是", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "是否复合部件不能为空") + private Boolean isComposite; + + @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") + @Size(max = 255, message = "子配件列表长度不能超过255个字符") + private String subparts; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对") + @Size(max = 255, message = "备注长度不能超过255个字符") + private String remark; + + private Long organId; + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/PlateManageController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/PlateManageController.java new file mode 100644 index 000000000..86f07782d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/PlateManageController.java @@ -0,0 +1,189 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate; + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.excel.core.util.ExcelUtils; +import com.cf.imes.framework.operatelog.core.annotations.OperateLog; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateImportExcelVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlatePageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateRespVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; +import com.cf.imes.module.executor.service.manage.plate.PlateExcelListener; +import com.cf.imes.module.executor.service.manage.plate.PlateManageService; +import com.cf.imes.module.executor.util.file.ExcelReadUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.cf.imes.framework.common.pojo.CommonResult.success; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.IMPORT; + +@Tag(name = "管理后台 - 板材库管理") +@RestController +@RequestMapping("/manage/plate") +@Validated +public class PlateManageController { + + @Resource + private PlateManageService plateService; + + final String IMPORT_TEMPLATE = "板材导入模板.xlsx"; + + @PostMapping("/create") + @Operation(summary = "创建板材信息") + @PreAuthorize("@ss.hasAnyPermissions('manage:plate:create','base:plate:create')") + public CommonResult createPlate(@Valid @RequestBody PlateSaveReqVO createReqVO) { + return success(plateService.createPlate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新板材信息") + @PreAuthorize("@ss.hasAnyPermissions('manage:plate:update','base:plate:update')") + public CommonResult updatePlate(@Valid @RequestBody PlateSaveReqVO updateReqVO) { + plateService.updatePlate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除板材信息") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "organId", description = "板材所属组织ID", example = "1024") + }) + @PreAuthorize("@ss.hasAnyPermissions('manage:plate:delete','base:plate:delete')") + public CommonResult deletePlate(@RequestParam("id") Long id, + @RequestParam(value = "organId",required = false, defaultValue = "0") Long organId) { + plateService.deletePlate(id,organId); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得板材信息") + @Parameters({ + @Parameter(name = "id", description = "编号", required = true, example = "1024"), + @Parameter(name = "organId", description = "板材所属组织ID", required = true, example = "1024") + }) + @PreAuthorize("@ss.hasAnyPermissions('manage:plate:update','base:plate:update')") + public CommonResult getPlate(@RequestParam("id") Long id, + @RequestParam("organId") Long organId) { + PlateGoodDO plate = plateService.getPlate(id, organId); + return success(BeanUtils.toBean(plate, PlateRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得板材信息分页") + @PreAuthorize("@ss.hasAnyPermissions('manage:plate:query','base:plate:query')") + public CommonResult> getPlatePage(@Valid PlatePageReqVO pageReqVO) { + PageResult pageResult = plateService.getPlatePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PlateRespVO.class)); + } + + @GetMapping("/webcad/page") + @Operation(summary = "webcad获得板材信息分页") + public CommonResult> webCadGetPlatePage(@Valid PlatePageReqVO pageReqVO) { + PageResult pageResult = plateService.webCadGetPlatePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, PlateRespVO.class)); + } + + @GetMapping("/export") + @Operation(summary = "导出板材信息") + @PreAuthorize("@ss.hasAnyPermissions('manage:plate:export','base:plate:export')") + @OperateLog(type = EXPORT) + public void exportPlateExcel(@Valid PlatePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = plateService.getPlatePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "板材信息表.xls", "数据", PlateRespVO.class, + BeanUtils.toBean(list, PlateRespVO.class)); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入用户模板") + @PreAuthorize("@ss.hasAnyPermissions('system:plate:export-template','base:plate:export-template')") + public void importTemplate(HttpServletResponse response) throws IOException { +// // 手动创建导出 demo +// List list = Arrays.asList( +// PlateImportExcelVO.builder().goodsId("BD10010001").goodsName("18mm-多层板-暖白").material("多层板").width(String.valueOf(1220)).height(String.valueOf(2440)) +// .thickness(String.valueOf(18)).brand("AAA").spec("2440*1220*18").color("暖白").price("120").texture("无").build(), +// PlateImportExcelVO.builder().goodsId("BD10010002").goodsName("18mm-颗粒板-高级灰").material("多层板").width(String.valueOf(1220)).height(String.valueOf(2750)) +// .thickness(String.valueOf(18)).brand("鸿达树").spec("2750*1220*18").color("高级灰").price("120").texture("无").build() +// ); +// // 输出 +// ExcelUtils.write(response, IMPORT_TEMPLATE, "板材列表", PlateImportExcelVO.class, list); + + plateService.exportTemplate(response, "excel_plate_add.xlsx"); + } + +// @GetMapping("/get-import-template") +// @Operation(summary = "获得导入板材模板") +// @Parameter(name = "value", description = "文件类型", required = true, example = "0") +// public void importTemplate(HttpServletResponse response, @RequestParam("value") @NotEmpty(message = "文件路径不能为空") String value) { +// plateService.exportTemplate(response, value); +// } + + @PostMapping("/import") + @Operation(summary = "导入板材") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true"), + @Parameter(name = "organId", description = "板材所属组织ID") + }) + @OperateLog(type = IMPORT) +// @PreAuthorize("@ss.hasPermission('manage:plate:import')") + @PreAuthorize("@ss.hasAnyPermissions('manage:plate:import','base:plate:import')") + public void importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport, + @RequestParam(value = "organId") Long organId, + HttpServletResponse response) throws Exception { + ExcelReadUtil excelReadUtil = new ExcelReadUtil(); + PlateExcelListener listener = new PlateExcelListener(); + List list = excelReadUtil.read(file, PlateImportExcelVO.class, listener); + +// 判断文件是否导入成功 + if (!excelReadUtil.getFlag()) + ExcelUtils.write(response, IMPORT_TEMPLATE, "板材列表", PlateImportExcelVO.class, list); + else { + if (list.isEmpty()){ + PlateImportExcelVO plateImportExcelVO = PlateImportExcelVO.builder().result("导入失败,请保证导入文件中包含板材数据").build(); + list.add(plateImportExcelVO); + ExcelUtils.write(response, IMPORT_TEMPLATE, "板材列表", PlateImportExcelVO.class, list); + }else { + plateService.importPlateList(list, updateSupport, organId);// 成功,批量导入 + } + } + +// plateExcelUtil.clear(); + } + + + @GetMapping("/webcad/all") + @Operation(summary = "获取全部板材信息") + public CommonResult> webCadGetPlateAll() { + List list = plateService.getPlateAll(); + return success(BeanUtils.toBean(list, PlateRespVO.class)); + } + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/RemainPlateManageController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/RemainPlateManageController.java new file mode 100644 index 000000000..406f767bf --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/RemainPlateManageController.java @@ -0,0 +1,136 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate; + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.excel.core.util.ExcelUtils; +import com.cf.imes.framework.operatelog.core.annotations.OperateLog; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlatePageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlateRespVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlateSaveReqVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlateUptReqVO; +import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO; +import com.cf.imes.module.executor.service.manage.remainplaten.RemainPlateManageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; +import java.util.Set; + +import static com.cf.imes.framework.common.pojo.CommonResult.success; +import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 余料管理") +@RestController +@RequestMapping("/manage/remain-plate") +@Validated +public class RemainPlateManageController { + + @Resource + private RemainPlateManageService remainPlateService; + + @PostMapping("/create") + @Operation(summary = "添加余料(单个)") + @PreAuthorize("@ss.hasAnyPermissions('manage:remain-plate:create','placeorder:optimize')") + public CommonResult createRemainPlate(@Valid @RequestBody RemainPlateSaveReqVO createReqVO) { + return success(remainPlateService.createRemainPlate(createReqVO)); + } + + @PostMapping("/createMultiple") + @Operation(summary = "创建生产单余料板表(多个)") + @PreAuthorize("@ss.hasAnyPermissions('manage:remain-plate:create','placeorder:optimize')") + public CommonResult createRemainPlateMultiple(@Valid @RequestBody Set createReqVOS) { + return success(remainPlateService.createRemainPlateMultiple(createReqVOS)); + } + + @PutMapping("/update") + @Operation(summary = "余料修改") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:update')") + public CommonResult updateRemainPlate(@Valid @RequestBody RemainPlateSaveReqVO updateReqVO) { + remainPlateService.updateRemainPlate(updateReqVO); + return success(true); + } + + @PutMapping("/updateStatus") + @Operation(summary = "余料板批量核销") + @PreAuthorize("@ss.hasAnyPermissions('manage:remain-plate:update','manage:remain-plate:write-off')") + public CommonResult updateRemainPlate(@RequestBody RemainPlateUptReqVO updateReqVO) { + remainPlateService.updateRemainPlateStatus(updateReqVO.getIds(), + updateReqVO.getStatus(), + updateReqVO.getUseType(), + updateReqVO.getPlanId()); + return success(true); + } + + @PutMapping("/revertUpdate") + @Operation(summary = "余料板批量释放") + @PreAuthorize("@ss.hasAnyPermissions('manage:remain-plate:update','manage:remain-plate:release')") + public CommonResult revertRemainPlate(@RequestBody RemainPlateUptReqVO updateReqVO) { + remainPlateService.revertRemainPlateStatus(updateReqVO.getIds(),updateReqVO.getStatus()); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除余料") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('manage:remain-plate:delete')") + public CommonResult deleteRemainPlate(@RequestParam("id") Set ids) { + remainPlateService.deleteRemainPlate(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得生产单余料板表") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:query')") + public CommonResult getRemainPlate(@RequestParam("id") Long id) { + RemainPlateDO remainPlate = remainPlateService.getRemainPlate(id); + return success(BeanUtils.toBean(remainPlate, RemainPlateRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得生产单余料板表分页") + @PreAuthorize("@ss.hasAnyPermissions('manage:remain-plate:query','placeorder:optimize','placeorder:remain-insert','production:manager-list:calculate')") + public CommonResult> getRemainPlatePage(@Valid RemainPlatePageReqVO pageReqVO) { + PageResult pageResult = remainPlateService.getRemainPlatePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, RemainPlateRespVO.class)); + } + + @GetMapping("/pageAdd") + @Operation(summary = "获得生产单余料板可添加分页") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:query')") + public CommonResult> getRemainPlatePageToAdd(@Valid RemainPlatePageReqVO pageReqVO) { + PageResult pageResult = remainPlateService.getRemainPlatePageToAdd(pageReqVO); + return success(BeanUtils.toBean(pageResult, RemainPlateRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产单余料板表Excel") + @PreAuthorize("@ss.hasPermission('manage:remain-plate:export')") + @OperateLog(type = EXPORT) + public void exportRemainPlateExcel(@Valid RemainPlatePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = remainPlateService.getRemainPlatePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "生产单余料板表 order_remain_plate_{N}.xls", "数据", RemainPlateRespVO.class, + BeanUtils.toBean(list, RemainPlateRespVO.class)); + } + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateImportExcelVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateImportExcelVO.java new file mode 100644 index 000000000..d2bdc8bdb --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateImportExcelVO.java @@ -0,0 +1,106 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; + +/** + * 用户 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class PlateImportExcelVO { + + @ExcelProperty("*物料编号") + @NotEmpty(message = "物料编号不能为空") + private String goodsId; + + @ExcelProperty("*物料名称") + @NotEmpty(message = "物料名称不能为空") + private String goodsName; + + @ExcelProperty("*材质") + @NotEmpty(message = "材质不能为空") + private String material; + + @ExcelProperty("*颜色") + @NotEmpty(message = "颜色不能为空") + private String color; + + @ExcelProperty(value = "纹理") + @ColumnWidth(10) + private String texture; + + @ExcelProperty("宽度") + @ColumnWidth(10) + @NotEmpty(message = "宽度不能为空") + private String width; + + @ExcelProperty("高度")// float(8,3) + @ColumnWidth(10) + @NotEmpty(message = "高度不能为空") + private String height; + + @ExcelProperty("*厚度") + @ColumnWidth(10) + @NotEmpty(message = "厚度不能为空") + private String thickness; + + @ExcelProperty("规格") + @NotEmpty(message = "规格不能为空") + private String spec; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("品牌") + @NotEmpty(message = "品牌不能为空") + private String brand; + + @ExcelProperty("价格") + @NotEmpty(message = "价格不能为空") + private String price; + + @ExcelProperty("上传结果") + private String result; + + public boolean isValidGoods() { + return !(goodsId == null || goodsId.isEmpty() || goodsName == null || goodsName.isEmpty() || material == null || + material.isEmpty() || color == null || color.isEmpty() ||thickness.isEmpty() ); + } + +// 数据长度判断 + public boolean checkPrecision(Double number) { + if (number == null) { + return false; + } + // 将浮点数转换成字符串 + String numberStr = Double.toString(number); + + // 分割整数部分和小数部分 + String[] parts = numberStr.split("\\."); + String integerPart = parts[0]; + String decimalPart = parts.length > 1 ? parts[1] : ""; + + // 检查整数部分位数 + if (integerPart.length() > 5) { + return false; + } + + // 检查小数部分位数 + if (decimalPart.length() > 3) { + return false; + } + + return true; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateImportRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateImportRespVO.java new file mode 100644 index 000000000..b65a8b455 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateImportRespVO.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @projectName: cf_imes_back + * @author: 晨丰科技 + * @date: 2024/2/27 16:36 + */ + +@Schema(description = "管理后台 - 板材信息表 plate_{N}导入 Response VO") +@Data +@Builder +public class PlateImportRespVO { + @Schema(description = "创建成功的板材数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List createPlateNames; + + @Schema(description = "更新成功的板材数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List updatePlateNames; + + @Schema(description = "导入失败的板材集合,key 为板材名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED) + private Map failurePlateNames; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlatePageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlatePageReqVO.java new file mode 100644 index 000000000..20149a54f --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlatePageReqVO.java @@ -0,0 +1,75 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate; + +import com.cf.imes.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.Size; +import java.time.LocalDateTime; + +import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 板材信息表 plate_{N}分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PlatePageReqVO extends PageParam { + + @Schema(description = "客户的商品编号", example = "1") + @Size(max = 32, message = "商品编号长度不能超过32个字符") + private String goodsId; + + @Schema(description = "商品名称", example = "赵六") + @Size(max = 64, message = "商品名称长度不能超过64个字符") + private String goodsName; + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板") + @Size(max = 64, message = "材质长度不能超过64个字符") + private String material; + + @Schema(description = "颜色") + @Size(max = 32, message = "颜色长度不能超过32个字符") + private String color; + + @Schema(description = "纹理") + private Boolean texture; + + @Schema(description = "宽度") + private Double width; + + @Schema(description = "高度") + private Double height; + + @Schema(description = "厚度") + private Double thickness; + + @Schema(description = "价格", example = "3380") + private Double price; + + @Schema(description = "品牌") + @Size(max = 64, message = "品牌长度不能超过64个字符") + private String brand; + + @Schema(description = "规格") + @Size(max = 64, message = "规格长度不能超过64个字符") + private String spec; + + @Schema(description = "备注", example = "随便") + @Size(max = 255, message = "备注长度不能超过255个字符") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + private Long organId; + + @Schema(description = "排序", example = "ascend") + private String order; + + @Schema(description = "排序字段", example = "id") + private String field; +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateRespVO.java new file mode 100644 index 000000000..3297be00b --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateRespVO.java @@ -0,0 +1,77 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.cf.imes.framework.excel.core.annotations.DictFormat; +import com.cf.imes.framework.excel.core.convert.DictConvert; +import com.cf.imes.module.executor.enums.DictTypeConstants; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 板材信息表 plate_{N} Response VO") +@Data +@ExcelIgnoreUnannotated +public class PlateRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelIgnore + private Long id; + + @Schema(description = "客户的商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("商品编号") + private String goodsId; + + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @ExcelProperty("商品名称") + private String goodsName; + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("材质") + private String material; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("颜色") + private String color; + + @Schema(description = "纹理", example = "有") + @ExcelProperty(value = "纹理", converter = DictConvert.class) + @DictFormat(DictTypeConstants.PLATE_TEXTURE) + private Boolean texture; + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("宽度") + private Double width; + + @Schema(description = "高度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("高度") + private Double height; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("厚度") + private Double thickness; + + @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "3380") + @ExcelProperty("价格") + private Double price; + + @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("品牌") + private String brand; + + @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("规格") + private String spec; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelIgnore + private LocalDateTime createTime; + + private Long organId; +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateSaveReqVO.java new file mode 100644 index 000000000..5f06a8577 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/plate/PlateSaveReqVO.java @@ -0,0 +1,74 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate; + +import com.cf.imes.framework.common.validation.NumberValid; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Schema(description = "管理后台 - 板材信息表 plate_{N}新增/修改 Request VO") +@Data +public class PlateSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "客户的商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "客户的商品编号不能为空") + @Size(max = 32, message = "商品编号长度不能超过32个字符") + private String goodsId; + + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotEmpty(message = "商品名称不能为空") + @Size(max = 64, message = "商品名称长度不能超过64个字符") + private String goodsName; + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板不能为空") + @Size(max = 64, message = "材质长度不能超过64个字符") + private String material; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "颜色不能为空") + @Size(max = 32, message = "颜色长度不能超过32个字符") + private String color; + + @Schema(description = "纹理", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "纹理不能为空") + private Boolean texture; + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "宽度不能为空") + @NumberValid(name = "宽度") + private Double width; + + @Schema(description = "高度", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "高度不能为空") + @NumberValid(name = "高度") + private Double height; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "厚度不能为空") + @NumberValid(name = "厚度") + private Double thickness; + + @Schema(description = "价格", example = "3380") + @NumberValid(name = "价格") + private Double price; + + @Schema(description = "品牌") + @Size(max = 64, message = "品牌长度不能超过64个字符") + private String brand; + + @Schema(description = "规格") + @Size(max = 64, message = "规格长度不能超过64个字符") + private String spec; + + @Schema(description = "备注", example = "随便") + @Size(max = 255, message = "备注长度不能超过255个字符") + private String remark; + + private Long organId; +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlatePageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlatePageReqVO.java new file mode 100644 index 000000000..5290d5aaa --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlatePageReqVO.java @@ -0,0 +1,113 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain; + +import com.cf.imes.framework.common.pojo.PageParam; +import com.cf.imes.framework.common.validation.NumberValid; +import com.cf.imes.module.executor.validation.manage.common.ValidCommonStatus; +import com.cf.imes.module.executor.validation.manage.placeStyle.ValidPlaceStyle; +import com.cf.imes.module.executor.validation.manage.type.ValidTypeField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 生产单余料板表 order_remain_plate_{N}分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RemainPlatePageReqVO extends PageParam { + + @Schema(description = "ID", example = "16628") + @Pattern(regexp = "^[0-9]*$",message = "余料号应为数字") + private String id; + + @Schema(description = "排单 ID", example = "16628") + @Pattern(regexp = "^[0-9]*$",message = "使用排单号应为数字") + private String planId; + + @Schema(description = "组织id", example = "1") + private Long organId; + + @Schema(description = "初始排单 ID", example = "6628") + @Pattern(regexp = "^[0-9]*$",message = "排单号应为数字") + private String initPlanId; + + @Schema(description = "余料板状态,0未使用,1使用中", example = "0") + @ValidCommonStatus + private Integer status; + + @Schema(description = "是否为开料添加,0否,1是", example = "0") + private Boolean isCutting; + + @Schema(description = "使用类型,0核销,1排单,2补板", example = "0") + @ValidTypeField + private Integer useType; + + @Schema(description = "商品 ID", example = "7425") + @Size(max = 32, message = "商品ID长度不能超过32个字符") + private String goodsId; + + @Schema(description = "商品名", example = "晨丰") + @Size(max = 255, message = "商品名长度不能超过255个字符") + private String name; + + @Schema(description = "材料") + @Size(max = 50, message = "材料长度不能超过50个字符") + private String material; + + @Schema(description = "颜色") + @Size(max = 50, message = "颜色长度不能超过50个字符") + private String color; + + @Schema(description = "纹理") + private Boolean texture; + + @Schema(description = "宽度") + private BigDecimal[] width; + + @Schema(description = "长度") + private BigDecimal[] length; + + @Schema(description = "厚度") + @NumberValid(name = "厚度") + private BigDecimal thickness; + + @Schema(description = "品牌") + @Size(max = 50, message = "品牌长度不能超过50个字符") + private String brand; + + @Schema(description = "放置样式,0正面,1正面右转,2正面后转,3正面左转,4反面,5反面右转,6反面后转,7反面左转") + @ValidPlaceStyle + private Integer placeStyle; + + @Schema(description = "仓库名") + @Size(max = 64, message = "品牌长度不能超过64个字符") + private String store; + + @Schema(description = "数量", example = "18318") + private Integer count; + + @Schema(description = "备注", example = "随便") + @Size(max = 255, message = "品牌长度不能超过255个字符") + private String remark; + + @Schema(description = "轮廊数据,Json 串") + private String outLineJson; + + @Schema(description = "创建日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "排序", example = "ascend") + private String order; + + @Schema(description = "排序字段", example = "id") + private String field; +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateRespVO.java new file mode 100644 index 000000000..d64349b2e --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateRespVO.java @@ -0,0 +1,105 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 生产单余料板表 order_remain_plate_{N} Response VO") +@Data +@ExcelIgnoreUnannotated +public class RemainPlateRespVO { + + @Schema(description = "余料板 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16470") + @ExcelProperty("余料板 ID") + private Long id; + + @Schema(description = "组织id", example = "1") + @ExcelIgnore + private Long organId; + + @Schema(description = "排单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16628") + @ExcelProperty("排单 ID") + private Long planId; + + @Schema(description = "初始排单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6628") + @ExcelProperty("初始排单 ID") + private Long initPlanId; + + @Schema(description = "余料板状态,0未使用,1使用中", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("余料板状态,0未使用,1使用中") + private Integer status; + + @Schema(description = "是否为开料添加,0否,1是", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("是否为开料添加,0否,1是") + private Boolean isCutting; + + @Schema(description = "使用类型,0核销,1排单,2补板", example = "0") + @ExcelProperty("使用类型,0核销,1排单,2补板") + private Integer useType; + + @Schema(description = "商品 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7425") + @ExcelProperty("商品 ID") + private String goodsId; + + @Schema(description = "商品名", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰") + @ExcelProperty("商品名") + private String name; + + @Schema(description = "材料", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("材料") + private String material; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("颜色") + private String color; + + @Schema(description = "纹理 有 无", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("纹理 有 无") + private Boolean texture; + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("宽度") + private BigDecimal width; + + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("长度") + private BigDecimal length; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("厚度") + private BigDecimal thickness; + + @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("品牌") + private String brand; + + @Schema(description = "放置样式,0正面,1正面右转,2正面后转,3正面左转,4反面,5反面右转,6反面后转,7反面左转", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("放置样式,0正面,1正面右转,2正面后转,3正面左转,4反面,5反面右转,6反面后转,7反面左转") + private Integer placeStyle; + + @Schema(description = "仓库名", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("仓库名") + private String store; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "18318") + @ExcelProperty("数量") + private Integer count; + + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "轮廊数据,Json 串", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("轮廊数据,Json 串") + private String outLineJson; + + @Schema(description = "创建日期", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建日期") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateSaveReqVO.java new file mode 100644 index 000000000..d4cf7df07 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateSaveReqVO.java @@ -0,0 +1,102 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain; + +import com.cf.imes.framework.common.validation.NumberValid; +import com.cf.imes.module.executor.validation.manage.common.ValidCommonStatus; +import com.cf.imes.module.executor.validation.manage.placeStyle.ValidPlaceStyle; +import com.cf.imes.module.executor.validation.manage.type.ValidTypeField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 生产单余料板表 Request VO") +@Data +public class RemainPlateSaveReqVO { + + @Schema(description = "余料板 ID") + private Long id; + + @Schema(description = "组织id", example = "1") + private Long organId; + + @Schema(description = "排单 ID") + private Long planId; + + @Schema(description = "初始排单 ID") + private Long initPlanId; + + @Schema(description = "余料板状态,0未使用,1已使用", example = "1") + @ValidCommonStatus + private Integer status; + + @Schema(description = "是否为开料添加,0否,1是", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "是否为开料添加,0否,1是") + private Boolean isCutting; + + @Schema(description = "使用类型,0核销,1排单,2补板", example = "1") + @ValidTypeField + private Integer useType; + + @Schema(description = "商品 ID", example = "7425") + @Size(max = 32, message = "商品ID长度不能超过32个字符") + private String goodsId; + + @Schema(description = "商品名", example = "晨丰") + @Size(max = 255, message = "商品名长度不能超过255个字符") + private String name; + + @Schema(description = "材料", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "材料不能为空") + @Size(max = 50, message = "材料长度不能超过50个字符") + private String material; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "颜色不能为空") + @Size(max = 50, message = "颜色长度不能超过50个字符") + private String color; + + @Schema(description = "纹理 有 无", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean texture; + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "宽度不能为空") + @NumberValid(name = "宽度") + private BigDecimal width; + + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "长度不能为空") + @NumberValid(name = "长度") + private BigDecimal length; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "厚度不能为空") + @NumberValid(name = "厚度") + private BigDecimal thickness; + + @Schema(description = "品牌") + @Size(max = 50, message = "品牌长度不能超过50个字符") + private String brand; + + @Schema(description = "放置样式,0正面,1正面右转,2正面后转,3正面左转,4反面,5反面右转,6反面后转,7反面左转", example = "0") + @ValidPlaceStyle + private Integer placeStyle; + + @Schema(description = "仓库名") + @Size(max = 64, message = "仓库名长度不能超过64个字符") + private String store; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "18318") + @NotNull(message = "数量不能为空") + private Integer count; + + @Schema(description = "备注", example = "随便") + @Size(max = 255, message = "备注长度不能超过255个字符") + private String remark; + + @Schema(description = "轮廊数据,Json 串", requiredMode = Schema.RequiredMode.REQUIRED, example = "18318") + private String outLineJson; + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateUpSaveVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateUpSaveVO.java new file mode 100644 index 000000000..fb9f6cb93 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateUpSaveVO.java @@ -0,0 +1,67 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain; + +import com.cf.imes.framework.common.validation.NumberValid; +import com.cf.imes.module.executor.validation.manage.placeStyle.ValidPlaceStyle; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.math.BigDecimal; + +/** + * 余料修改字段 + */ +@Schema(description = "管理后台 - 余料修改字段 VO") +@Data +public class RemainPlateUpSaveVO { + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "宽度不能为空") + @NumberValid(name = "宽度") + private BigDecimal width; + + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "长度不能为空") + @NumberValid(name = "长度") + private BigDecimal length; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "厚度不能为空") + @NumberValid(name = "厚度") + private BigDecimal thickness; + + @Schema(description = "纹理 有 无", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean texture; + + @Schema(description = "材料", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "材料不能为空") + @Size(max = 50, message = "材料长度不能超过50个字符") + private String material; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "颜色不能为空") + @Size(max = 50, message = "颜色长度不能超过50个字符") + private String color; + + @Schema(description = "品牌") + @Size(max = 50, message = "品牌长度不能超过50个字符") + private String brand; + + @Schema(description = "仓库名") + @Size(max = 64, message = "品牌长度不能超过64个字符") + private String store; + + @Schema(description = "备注", example = "随便") + @Size(max = 255, message = "品牌长度不能超过255个字符") + private String remark; + + @Schema(description = "放置样式", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "余料放置样式不可为空") + @ValidPlaceStyle + private Integer placeStyle; + + @Schema(description = "轮廊数据,Json 串", requiredMode = Schema.RequiredMode.REQUIRED) + private String outLineJson; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateUptReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateUptReqVO.java new file mode 100644 index 000000000..f44cd4b08 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/plate/vo/remain/RemainPlateUptReqVO.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain; + +import com.cf.imes.module.executor.validation.manage.common.ValidCommonStatus; +import com.cf.imes.module.executor.validation.manage.type.ValidTypeField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Set; + +@Schema(description = "管理后台 - 生产单余料板表 order_remain_plate_{N} Response VO") +@Data +public class RemainPlateUptReqVO { + + @Schema(description = "余料板集", example = "16470") + private Set ids; + + @Schema(description = "余料板状态,0未使用,1使用中", example = "1") + @ValidCommonStatus + private Integer status; + + @Schema(description = "使用类型,1核销,2排单,3补板", example = "0") + @ValidTypeField + private Integer useType; + + @Schema(description = "排单 ID", example = "6628") + private Long planId; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/process/vo/PlateDetails.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/process/vo/PlateDetails.java new file mode 100644 index 000000000..7b963acb2 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/process/vo/PlateDetails.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.controller.admin.manage.process.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class PlateDetails { + + + + @Schema(description = "板编号") + private Long plateId; + + @Schema(description = "自定义板编号-板号") + private Long plateNo; + + @Schema(description = "长") + private Long length; + + @Schema(description = "宽") + private Long width; + + @Schema(description = "厚") + private Long thickness; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/process/vo/ProcessPlateReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/process/vo/ProcessPlateReqVO.java new file mode 100644 index 000000000..21d7fb724 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/process/vo/ProcessPlateReqVO.java @@ -0,0 +1,39 @@ +package com.cf.imes.module.executor.controller.admin.manage.process.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 查询板件") +@Data +@ToString(callSuper = true) +public class ProcessPlateReqVO { + + + @Schema(description = "工序类型",requiredMode = Schema.RequiredMode.REQUIRED) + private Long processType; + + + @Schema(description = "生产单号",requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + +// @Schema(description = "工序明细ID",requiredMode = Schema.RequiredMode.REQUIRED) +// private Long stepItemId; + + + @Schema(description = "生产单工序步骤ID", requiredMode = Schema.RequiredMode.REQUIRED,example = "11") + private Long processStepId; + + + @Schema(description = "加工项名称", requiredMode = Schema.RequiredMode.REQUIRED,example = "ABCD") + private String name; + + + @Schema(description = "柜体ID") + private Long bodyId; + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/pack/OrderPackageVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/pack/OrderPackageVO.java new file mode 100644 index 000000000..bd982749d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/pack/OrderPackageVO.java @@ -0,0 +1,64 @@ +package com.cf.imes.module.executor.controller.admin.manage.query.vo.pack; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 生产单包裹表 Response VO") +@Data +public class OrderPackageVO { + + + + @Schema(description = "主键-包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long id; + + @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED) + private Long orderId; + + @Schema(description = "自定义单号") + private String customOrderNo; + + @Schema(description = "客户") + private String customer; + + @Schema(description = "客户地址") + private String address; + + @Schema(description = "经销商") + private String dealer; + + @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String packageNo; + + @Schema(description = "包裹类型", requiredMode = Schema.RequiredMode.REQUIRED) + private Long type; + + @Schema(description = "包裹状态", requiredMode = Schema.RequiredMode.REQUIRED) + private Long status; + + @Schema(description = "组织ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long organId; + + @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED) + private String creator; + + @Schema(description = "包裹备注", requiredMode = Schema.RequiredMode.REQUIRED) + private String packRemark; + + @Schema(description = "生产单备注", requiredMode = Schema.RequiredMode.REQUIRED) + private String orderRemark; + + @Schema(description = "出库人", requiredMode = Schema.RequiredMode.REQUIRED) + private String updater; + + @Schema(description = "出库时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime updateTime; + + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/pack/PackageDetailsRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/pack/PackageDetailsRespVO.java new file mode 100644 index 000000000..c80507996 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/pack/PackageDetailsRespVO.java @@ -0,0 +1,127 @@ +package com.cf.imes.module.executor.controller.admin.manage.query.vo.pack; + + +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.GroupNameList; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 包裹详情 Response VO") +@Data +public class PackageDetailsRespVO { + + + @Schema(description = "生产单ID", requiredMode = Schema.RequiredMode.REQUIRED) + private String orderId; + + @Schema(description = "房间名称-板材类型显示", requiredMode = Schema.RequiredMode.REQUIRED) + private String roomName; + + @Schema(description = "柜体名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String cabinetName; + + + @Schema(description = "板材ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long plateId; + + @Schema(description = "板编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String plateNo; + + @Schema(description = "板名称", requiredMode = Schema.RequiredMode.REQUIRED) + private String plateName; + + @Schema(description = "材料", requiredMode = Schema.RequiredMode.REQUIRED) + private String material; + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + private String color; + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double width; + + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double height; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double thickness; + + @Schema(description = "面积", requiredMode = Schema.RequiredMode.REQUIRED) + private Double area; + + @Schema(description = "纹路", requiredMode = Schema.RequiredMode.REQUIRED) + private String texture; + + @Schema(description = "是否异型", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean specialShaped; + + @Schema(description = "是否造型", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean profiling; + + @Schema(description = "是否有孔", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean rowHole; + + @Schema(description = "加工组", requiredMode = Schema.RequiredMode.REQUIRED) + private String processGroup; + + + @Schema(description = "备注(板材和配件都要传递)", requiredMode = Schema.RequiredMode.REQUIRED) + private String remark; + + + @Schema(description = "加工组名称集合") + private List processGroupNameList; + + + + @Schema(description = "配件名称-配件类型显示", requiredMode = Schema.RequiredMode.REQUIRED) + private String name; + + @Schema(description = "配件ID", requiredMode = Schema.RequiredMode.REQUIRED) + private Long partsId; + + @Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED) + private String model; + + @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) + private String spec; + + @Schema(description = "明细配件类型, 2 五金/配件 3 其他 4 报价配件", requiredMode = Schema.RequiredMode.REQUIRED) + private String type; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + private Long num; + + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED) + private String unit; + + @Schema(description = "是否复合部件:0 否 1 是", requiredMode = Schema.RequiredMode.REQUIRED) + private Boolean isComposite; + + @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) + private String brand; + + @Schema(description = "厂家", requiredMode = Schema.RequiredMode.REQUIRED) + private String factory; + + + @Schema(description = "配件颜色", requiredMode = Schema.RequiredMode.REQUIRED) + private String partsColor; + + @Schema(description = "配件宽度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsWidth; + + @Schema(description = "配件长度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsLength; + + @Schema(description = "配件厚度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsThickness; + + @Schema(description = "配件主类:1封边2五金3组件", requiredMode = Schema.RequiredMode.REQUIRED) + private String category; + + @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED) + private String subparts; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderModuleVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderModuleVO.java new file mode 100644 index 000000000..b3f21d151 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderModuleVO.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.controller.admin.manage.query.vo.productionStatus; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + + +@Schema(description = "管理后台 - 生产单模块表 order_module_{N} Response VO") +@Data +public class OrderModuleVO { + + @Schema(description = "柜体 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "嘿嘿") + private Long bodyId; + + + @Schema(description = "加工组 id", example = "嘿嘿") + private Long groupId; + + + @Schema(description = "组合名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "嘿嘿") + private String name; + + + @Schema(description = "加工组名称", example = "嘿嘿") + private String groupName; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderPlatePageReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderPlatePageReqVO.java new file mode 100644 index 000000000..907ab4dc8 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderPlatePageReqVO.java @@ -0,0 +1,47 @@ +package com.cf.imes.module.executor.controller.admin.manage.query.vo.productionStatus; + + +import com.cf.imes.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + + +@Schema(description = "管理后台 - 生产单表 order_{N} 分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderPlatePageReqVO extends PageParam { + + + + @Schema(description = "生产状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2,3") + private List statusList; + + + @Schema(description = "订单号") + private Long orderNo; + + + @Schema(description = "自定义单号") + private String customOrderNo; + + + @Schema(description = "客户") + private String customer; + + + @Schema(description = "地址") + private String address; + + + @Schema(description = "经销商") + private String dealer; + + +} + + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderPlateRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderPlateRespVO.java new file mode 100644 index 000000000..b0b3d651a --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/OrderPlateRespVO.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.executor.controller.admin.manage.query.vo.productionStatus; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 板材信息表 Response VO") +@Data +public class OrderPlateRespVO { + + @Schema(description = "板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9822") + private Long id; + + @Schema(description = "板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + private String name; + + + @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) + private String color; + + @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double width; + + @Schema(description = "高度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double height; + + @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double thickness; + + @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) + private String material; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/PlatePageVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/PlatePageVO.java new file mode 100644 index 000000000..4d0226d68 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/query/vo/productionStatus/PlatePageVO.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.executor.controller.admin.manage.query.vo.productionStatus; + + +import com.cf.imes.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 板材信息表分页") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PlatePageVO extends PageParam { + + @Schema(description = "柜体 id",requiredMode = Schema.RequiredMode.REQUIRED) + private Long bodyId ; + + + @Schema(description = "加工组 id") + private Long groupId; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/test/TestController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/test/TestController.java new file mode 100644 index 000000000..960662b32 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/test/TestController.java @@ -0,0 +1,175 @@ +package com.cf.imes.module.executor.controller.admin.manage.test; + +import com.cf.imes.module.executor.dal.mysql.manage.test.TestMapper; +import com.jacob.activeX.ActiveXComponent; +import com.jacob.com.Dispatch; +import com.jacob.com.Variant; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.jetbrains.annotations.TestOnly; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import java.io.File; +import java.util.List; +import java.util.Random; + + +/** + * @author there + * 测试 controller + */ +@RestController +@RequestMapping("/manage/test") +@Tag(name = "测试") +public class TestController { + + @Resource + private TestMapper testMapper; + + + @GetMapping("/get") + @PermitAll + @Operation(summary = "测试") + public Object get() { + return testMapper.selectList(); + } + + + public class JacobTestController { + /* * + * 语音转文字并播放 + * + * @param text + */ + private static void convertTextToSpeech(String text) { + + + try { + + //jacob.dll没成功安装,执行这一步会出错 + //构建音频格式 调用注册表应用 + Dispatch spAudioFormat = new ActiveXComponent("Sapi.SpAudioFormat").getObject(); + //音频文件输出流 + Dispatch spFileStream = new ActiveXComponent("Sapi.SpFileStream").getObject(); + //构建音频对象 + Dispatch spVoice = new ActiveXComponent("Sapi.SpVoice").getObject(); + + //设置spAudioFormat音频流格式类型22 + Dispatch.put(spAudioFormat, "Type", new Variant(22)); + //设置spFileStream文件输出流的音频格式 + Dispatch.putRef(spFileStream, "Format", spAudioFormat); + + //设置spFileStream文件输出流参数地址等 + Dispatch.call(spFileStream, "Open", new Variant("E:AAAAA\48641486.wav"), new Variant(3), new Variant(true)); + //设置spVoice声音对象的音频输出流为输出文件对象 + Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream); + //设置spVoice声音对象的音量大小100 + Dispatch.put(spVoice, "Volume", new Variant(100)); + //设置spVoice声音对象的速度 0为正常速度,范围【..-2 -1 0 1 2..】 + Dispatch.put(spVoice, "Rate", new Variant(0)); + //设置spVoice声音对象中的文本内容 + Dispatch.call(spVoice, "Speak", new Variant(text)); + //关闭spFileStream输出文件 + Dispatch.call(spFileStream, "Close"); + + //释放资源 + spVoice.safeRelease(); + spAudioFormat.safeRelease(); + spFileStream.safeRelease(); + + } catch (Exception e) { + System.out.println(e.getMessage()); + + } + } + + /* private static XxlJobProperties aabb(){ + + XxlJobParameter xxlJobParameter = new XxlJobParameter(); + + xxlJobParameter.setEnabled(false); + xxlJobParameter.setAccessToken("1122"); + xxlJobParameter.setAddresses("五阿里乌"); + xxlJobParameter.setAppName("aaappn"); + XxlJobProperties bean = BeanUtils.toBean(xxlJobParameter, XxlJobProperties.class); + return bean; + + }*/ + + } + + + public static void deleteFiles(List filePaths) { + // 检查文件路径集合是否为空 + if (filePaths == null || filePaths.isEmpty()) { + System.out.println("文件路径集合为空"); + return; + } + + for (String filePath : filePaths) { + // 检查文件路径是否为空 + if (filePath == null || filePath.isEmpty()) { + System.out.println("文件路径为空"); + continue; + } + + File file = new File(filePath); + + // 检查文件是否存在 + if (!file.exists()) { + System.out.println("文件不存在:" + filePath); + continue; + } + + // 检查是否是文件 + if (!file.isFile()) { + System.out.println("路径指向的不是文件:" + filePath); + continue; + } + + // 尝试删除文件 + if (file.delete()) { + System.out.println("文件删除成功:" + filePath); + } else { + System.out.println("文件删除失败:" + filePath); + } + } + } + + + public static Integer aacc() { + + RedisTemplate re = new RedisTemplate<>(); + + int randomInt = new Random(System.currentTimeMillis()).nextInt(900) + 100;// 生成100到999之间的随机数 + + + return randomInt; + + } + + + @TestOnly + public static void main(String[] args) { + // test main + } + + +} + + + + + + + + + + + + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/voice/VoiceController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/voice/VoiceController.java new file mode 100644 index 000000000..5899912b9 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/voice/VoiceController.java @@ -0,0 +1,66 @@ +package com.cf.imes.module.executor.controller.admin.manage.voice; + + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.module.executor.controller.admin.manage.voice.vo.VoiceReqVO; +import com.cf.imes.module.executor.service.manage.voice.VoiceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +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 javax.annotation.Resource; +import javax.validation.Valid; + + +@Tag(name = "管理后台 - 语音播报") +@RestController +@RequestMapping("/manage/voice") +@Validated +public class VoiceController { + + + @Resource + private VoiceService voiceService; + + + @PostMapping() + @Operation(summary = "语音播报") + @PreAuthorize("@ss.hasPermission('manage:voice:insert')") + public CommonResult> voiceAnnouncements(@Valid @RequestBody VoiceReqVO reqVO ) throws Exception { + + + String sourceFile = voiceService.voiceAnnouncements(reqVO.getData()); + + + ResponseEntity voice = voiceService.getVoice(sourceFile); + + + // 删除生成的 mp3 文件 + voiceService.deleteFiles(sourceFile); + + + return CommonResult.success(voice); + +// String gzipFile = sourceFile+".zip"; +// +// // 压缩语音文件 +// voiceService.zipFiles(sourceFile, gzipFile); +// + + + + + } + + +} + + + + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/voice/vo/VoiceReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/voice/vo/VoiceReqVO.java new file mode 100644 index 000000000..5ce477b74 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/manage/voice/vo/VoiceReqVO.java @@ -0,0 +1,17 @@ +package com.cf.imes.module.executor.controller.admin.manage.voice.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 语音播报 Request VO") +@Data +@ToString(callSuper = true) +public class VoiceReqVO { + + + @Schema(description = "语音数据", requiredMode = Schema.RequiredMode.REQUIRED) + private String data; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/manage/test/TestDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/manage/test/TestDO.java new file mode 100644 index 000000000..90dd065ae --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/manage/test/TestDO.java @@ -0,0 +1,14 @@ +package com.cf.imes.module.executor.dal.dataobject.manage.test; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * @author there + */ +@Data +@TableName("test") +public class TestDO { + private Integer id; + private String name; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/remainplaten/RemainPlateDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/remainplaten/RemainPlateDO.java index 48e025cb9..c1e22602c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/remainplaten/RemainPlateDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/remainplaten/RemainPlateDO.java @@ -58,6 +58,12 @@ public class RemainPlateDO extends BaseDO { * 背面颜色 */ private String colorBlack; + + /** + * 纹理 + */ + private Boolean texture; + /** * 宽度 */ diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/manage/test/TestMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/manage/test/TestMapper.java new file mode 100644 index 000000000..231578a0d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/manage/test/TestMapper.java @@ -0,0 +1,12 @@ +package com.cf.imes.module.executor.dal.mysql.manage.test; + +import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.module.executor.dal.dataobject.manage.test.TestDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author there + */ +@Mapper +public interface TestMapper extends BaseMapperX { +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java index 7a9a0a4aa..2196e7b81 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/order/OrderMapper.java @@ -11,6 +11,10 @@ import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.QueryWrapperX; import com.cf.imes.framework.organ.core.aop.OrganIgnore; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PrintOrderPackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.productionStatus.OrderPlatePageReqVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderCountProducePeriodRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderOverdueRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPageReqVO; @@ -274,4 +278,37 @@ public interface OrderMapper extends BaseMapperX { List selectNoPlanOrderPlateCount(@Param(Constants.WRAPPER) Wrapper wrapper); List selectNoPlanOrderPlateList(@Param(Constants.WRAPPER) Wrapper wrapper,@Param("pageNo") Integer pageNo,@Param("pageSize") Integer pageSize); + + + default PageResult selectProductionPage(OrderPlatePageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .eqIfPresent(OrderDO::getId, pageReqVO.getOrderNo()) + .eqIfPresent(OrderDO::getCustomOrderNo, pageReqVO.getCustomOrderNo()) + .likeIfPresent(OrderDO::getCustomer, pageReqVO.getCustomer()) + .likeIfPresent(OrderDO::getAddress, pageReqVO.getAddress()) + .and(wrapper -> { + for (Long status : pageReqVO.getStatusList()) { + wrapper.or().eq(OrderDO::getStatus, status); + } + }) + .orderByDesc(OrderDO::getCreateTime)); + } + + + + List selectOrderIds(@Param("createTime") String createTime, @Param("organId") Long organId, @Param("orderId") Long orderId); + + + + List selectOrderIdsFalse(@Param("createTime") String createTime,@Param("organId") Long organId, @Param("orderId") Long orderId); + + + + + PrintOrderPackRespVO selectOrderPack(@Param("orderNo")Long orderNo, @Param("packageNo") Long packageNo, @Param("organId") Long organId); + + + + IPage selectOrderIdList(@Param("page") IPage page, @Param("pageReqVO") PackPageReqVO pageReqVO, @Param("organId") Long organId); + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java index d0aded8f1..374f89dec 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderItem/OrderItemMapper.java @@ -3,6 +3,13 @@ package com.cf.imes.module.executor.dal.mysql.orderItem; import com.baomidou.mybatisplus.core.metadata.IPage; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PlateAndPartIdList; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PlateDetailsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.process.vo.PlateDetails; +import com.cf.imes.module.executor.controller.admin.manage.process.vo.ProcessPlateReqVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.productionStatus.OrderModuleVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.productionStatus.OrderPlateRespVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.productionStatus.PlatePageVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsDetailRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlatesDetailRespVO; @@ -133,4 +140,64 @@ public interface OrderItemMapper extends BaseMapperX { @Param("organId") Long organId, @Param("deleted") Integer deleted); List selectOrderPlanList(@Param("orderId") Long orderId,@Param("roomIds") Set roomIds, @Param("bodyId") Long bodyId,@Param("organId") Long organId); + + List selectPrintPlateList(@Param("orderNo")Long orderNo, @Param("packageNo") Long packageNo, @Param("organId") Long organId); + + + + void deleteOrderPack(@Param("packId") Long packId,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + + void deleteOtherParts(@Param("partsId") Long partsId,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + + void insertPackId(@Param("plateIdList") List plateIdList, @Param("packId") Long packId,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + void deletePackId(@Param("deletePlateIdList") List deletePlateIdList,@Param("packId") Long packId,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + void insertPartsId(@Param("packId") Long packId, @Param("addPartsIdList") List addPartsIdList,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + void insertParts(@Param("addPartsList") List addPartsList, @Param("packId")Long packId, @Param("orderId") Long orderId,@Param("organId") Long organId); + + void deletePartsList(@Param("deletePartsList")List deletePartsList,@Param("packId") Long packId,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + default List selectPackList(Long packId, Long orderId , Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderItemDO::getOrganId, organId) + .eqIfPresent(OrderItemDO::getOrderId,orderId) + .eqIfPresent(OrderItemDO::getPackageId, packId)); + } + + + void deleteParts(@Param("packageId") Long packageId,@Param("orderId") Long orderId ,@Param("partsIds") List partsIds,@Param("organId") Long organId); + + void updateParts(@Param("partsId") Long partsId,@Param("packageId") Long packageId,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + default List selectPackPlateList(Long orderId, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderItemDO::getOrganId, organId) + .eqIfPresent(OrderItemDO::getOrderId, orderId)); + } + + + default List selectPackByPlateId(List plateId, Long orderId , Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderItemDO::getOrganId, organId) + .eqIfPresent(OrderItemDO::getOrderId,orderId) + .inIfPresent(OrderItemDO::getPlateId, plateId) + .select(OrderItemDO::getPackageId)); + } + + + List selectOrderPackPartsIds(@Param("orderId") Long orderId, @Param("organId") Long organId); + + List selectOrderPackPlateIds(@Param("orderId") Long orderId,@Param("organId") Long organId); + } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java index defb860c8..36d42dede 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/OrderPartsMapper.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.PackageDetailsRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsPageReqVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsPrintRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.PartGoodsRespVO; @@ -111,4 +113,16 @@ public interface OrderPartsMapper extends BaseMapperX { @Param("deleted")Integer deleted, @Param("roomId")Long roomId, @Param("bodyId")Long bodyId); + + IPage selectParts(@Param("page") IPage page, @Param("packageId") Long packageId, @Param("organId") Long organId); + + + List selectPartsList(@Param("orderId") Long orderId , @Param("organId") Long organId); + + + + void deleteOrderParts(@Param("partsIds") List partsIds,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + void updateParts(@Param("partsId") Long partsId,@Param("orderId") Long orderId,@Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/PartsMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/PartsMapper.java index 84436426b..aa18f884a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/PartsMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/orderParts/PartsMapper.java @@ -1,9 +1,15 @@ package com.cf.imes.module.executor.dal.mysql.orderParts; +import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsCadPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsPageReqVO; import com.cf.imes.module.executor.dal.dataobject.orderParts.PartsDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * 配件表 parts_{N} Mapper * @@ -16,4 +22,161 @@ public interface PartsMapper extends BaseMapperX { return selectOne(PartsDO::getGoodsId, goodId, PartsDO::getOrganId, organId); } + default PageResult selectPage(PartsPageReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(PartsDO::getOrganId, reqVO.getOrganId()) + .eqIfPresent(PartsDO::getCategory, reqVO.getCategory()) + .likeIfPresent(PartsDO::getGoodsId, reqVO.getGoodsId()) + .likeIfPresent(PartsDO::getColor, reqVO.getColor()) + .likeIfPresent(PartsDO::getType, reqVO.getType()) + .likeIfPresent(PartsDO::getName, reqVO.getName()) + .likeIfPresent(PartsDO::getMaterial, reqVO.getMaterial()) + .likeIfPresent(PartsDO::getModel, reqVO.getModel()) + .likeIfPresent(PartsDO::getSpec, reqVO.getSpec()) + .likeIfPresent(PartsDO::getBrand, reqVO.getBrand()) + .likeIfPresent(PartsDO::getFactory, reqVO.getFactory()) + .likeIfPresent(PartsDO::getUnit, reqVO.getUnit()) + .eqIfPresent(PartsDO::getIsComposite, reqVO.getIsComposite()) + .betweenIfPresent(PartsDO::getWidth, reqVO.getWidth()) + .betweenIfPresent(PartsDO::getLength, reqVO.getLength()) + .betweenIfPresent(PartsDO::getThickness, reqVO.getThickness()) + .likeIfPresent(PartsDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(PartsDO::getCreateTime, reqVO.getCreateTime()); + + if (reqVO.getOrder() == null) { + queryWrapper.orderByDesc(PartsDO::getId); + }else { + if (reqVO.getOrder().equals("ascend")) { + switch (reqVO.getField()) { + case "goodsId" -> queryWrapper.orderByAsc(PartsDO::getGoodsId); + case "isComposite" -> queryWrapper.orderByAsc(PartsDO::getIsComposite); + case "category" -> queryWrapper.orderByAsc(PartsDO::getCategory); + case "type" -> queryWrapper.orderByAsc(PartsDO::getType); + case "name" -> queryWrapper.orderByAsc(PartsDO::getName); + case "model" -> queryWrapper.orderByAsc(PartsDO::getModel); + case "material" -> queryWrapper.orderByAsc(PartsDO::getMaterial); + case "color" -> queryWrapper.orderByAsc(PartsDO::getColor); + case "unit" -> queryWrapper.orderByAsc(PartsDO::getUnit); + case "spec" -> queryWrapper.orderByAsc(PartsDO::getSpec); + case "brand" -> queryWrapper.orderByAsc(PartsDO::getBrand); + case "factory" -> queryWrapper.orderByAsc(PartsDO::getFactory); + case "width" -> queryWrapper.orderByAsc(PartsDO::getWidth); + case "length" -> queryWrapper.orderByAsc(PartsDO::getLength); + case "thickness" -> queryWrapper.orderByAsc(PartsDO::getThickness); + default -> { + // default不排序 + } + } + }else if (reqVO.getOrder().equals("descend")) { + switch (reqVO.getField()) { + case "goodsId" -> queryWrapper.orderByDesc(PartsDO::getGoodsId); + case "isComposite" -> queryWrapper.orderByDesc(PartsDO::getIsComposite); + case "category" -> queryWrapper.orderByDesc(PartsDO::getCategory); + case "type" -> queryWrapper.orderByDesc(PartsDO::getType); + case "name" -> queryWrapper.orderByDesc(PartsDO::getName); + case "model" -> queryWrapper.orderByDesc(PartsDO::getModel); + case "material" -> queryWrapper.orderByDesc(PartsDO::getMaterial); + case "color" -> queryWrapper.orderByDesc(PartsDO::getColor); + case "unit" -> queryWrapper.orderByDesc(PartsDO::getUnit); + case "spec" -> queryWrapper.orderByDesc(PartsDO::getSpec); + case "brand" -> queryWrapper.orderByDesc(PartsDO::getBrand); + case "factory" -> queryWrapper.orderByDesc(PartsDO::getFactory); + case "width" -> queryWrapper.orderByDesc(PartsDO::getWidth); + case "length" -> queryWrapper.orderByDesc(PartsDO::getLength); + case "thickness" -> queryWrapper.orderByDesc(PartsDO::getThickness); + default -> { + // default不排序 + } + } + } + } + + return selectPage(reqVO, queryWrapper); + } + + default PartsDO selectById(Long id , Long organId) { + return selectOne(PartsDO::getId, id, PartsDO::getOrganId, organId); + } + + default PartsDO selectExceptGoodID(Long id, String goodId , Long organId) { + return selectOne(new LambdaQueryWrapperX() + .ne(PartsDO::getId, id) + .eq(PartsDO::getGoodsId, goodId) + .eq(PartsDO::getOrganId, organId)); + } + + default PageResult selectCadPage(PartsCadPageReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(PartsDO::getOrganId, reqVO.getOrganId()) + .eqIfPresent(PartsDO::getCategory, reqVO.getCategory()) + .likeIfPresent(PartsDO::getColor, reqVO.getColor()) + .likeIfPresent(PartsDO::getType, reqVO.getType()) + .likeIfPresent(PartsDO::getName, reqVO.getName()) + .likeIfPresent(PartsDO::getMaterial, reqVO.getMaterial()) + .likeIfPresent(PartsDO::getModel, reqVO.getModel()) + .likeIfPresent(PartsDO::getSpec, reqVO.getSpec()) + .likeIfPresent(PartsDO::getBrand, reqVO.getBrand()) + .likeIfPresent(PartsDO::getFactory, reqVO.getFactory()) + .likeIfPresent(PartsDO::getUnit, reqVO.getUnit()) + .eqIfPresent(PartsDO::getIsComposite, reqVO.getIsComposite()) + .eqIfPresent(PartsDO::getWidth, reqVO.getWidth()) + .eqIfPresent(PartsDO::getLength, reqVO.getLength()) + .eqIfPresent(PartsDO::getThickness, reqVO.getThickness()) + .likeIfPresent(PartsDO::getRemark, reqVO.getRemark()); + + if (reqVO.getOrder() == null) { + queryWrapper.orderByDesc(PartsDO::getId); + }else { + if (reqVO.getOrder().equals("ascend")) { + switch (reqVO.getField()) { + case "isComposite" -> queryWrapper.orderByAsc(PartsDO::getIsComposite); + case "category" -> queryWrapper.orderByAsc(PartsDO::getCategory); + case "type" -> queryWrapper.orderByAsc(PartsDO::getType); + case "name" -> queryWrapper.orderByAsc(PartsDO::getName); + case "model" -> queryWrapper.orderByAsc(PartsDO::getModel); + case "material" -> queryWrapper.orderByAsc(PartsDO::getMaterial); + case "color" -> queryWrapper.orderByAsc(PartsDO::getColor); + case "unit" -> queryWrapper.orderByAsc(PartsDO::getUnit); + case "spec" -> queryWrapper.orderByAsc(PartsDO::getSpec); + case "brand" -> queryWrapper.orderByAsc(PartsDO::getBrand); + case "factory" -> queryWrapper.orderByAsc(PartsDO::getFactory); + case "width" -> queryWrapper.orderByAsc(PartsDO::getWidth); + case "length" -> queryWrapper.orderByAsc(PartsDO::getLength); + case "thickness" -> queryWrapper.orderByAsc(PartsDO::getThickness); + default -> { + // default不排序 + } + } + }else if (reqVO.getOrder().equals("descend")) { + switch (reqVO.getField()) { + case "isComposite" -> queryWrapper.orderByDesc(PartsDO::getIsComposite); + case "category" -> queryWrapper.orderByDesc(PartsDO::getCategory); + case "type" -> queryWrapper.orderByDesc(PartsDO::getType); + case "name" -> queryWrapper.orderByDesc(PartsDO::getName); + case "model" -> queryWrapper.orderByDesc(PartsDO::getModel); + case "material" -> queryWrapper.orderByDesc(PartsDO::getMaterial); + case "color" -> queryWrapper.orderByDesc(PartsDO::getColor); + case "unit" -> queryWrapper.orderByDesc(PartsDO::getUnit); + case "spec" -> queryWrapper.orderByDesc(PartsDO::getSpec); + case "brand" -> queryWrapper.orderByDesc(PartsDO::getBrand); + case "factory" -> queryWrapper.orderByDesc(PartsDO::getFactory); + case "width" -> queryWrapper.orderByDesc(PartsDO::getWidth); + case "length" -> queryWrapper.orderByDesc(PartsDO::getLength); + case "thickness" -> queryWrapper.orderByDesc(PartsDO::getThickness); + default -> { + // default不排序 + } + } + } + } + + return selectPage(reqVO, queryWrapper); + } + + default List getAllByOrganId(Long organId, String category) { + return selectList(new LambdaQueryWrapperX() + .eq(PartsDO::getOrganId, organId) + .eq(PartsDO::getCategory, category) + .eq(PartsDO::getDeleted, 0)); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPackageMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPackageMapper.java index 5500a45e7..2d710f180 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPackageMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPackageMapper.java @@ -1,7 +1,16 @@ package com.cf.imes.module.executor.dal.mysql.pack; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.cf.imes.framework.common.enums.OrderPackageStatusEnum; +import com.cf.imes.framework.common.enums.OrderPackageTypeEnum; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO; import com.cf.imes.module.executor.dal.dataobject.pack.OrderPackageDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -14,4 +23,73 @@ public interface OrderPackageMapper extends BaseMapperX { void updatePackList(@Param("orderId") Long orderId, @Param("packIds") List packIds, @Param("organId") Long organId); + IPage selectByOrderNo(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); + + default OrderPackageDO selectByPackNo(String packNo, Long organId) { + return selectOne(new LambdaQueryWrapperX() + .eq(OrderPackageDO::getOrganId, organId) + .eqIfPresent(OrderPackageDO::getPackageNo, packNo)); + } + + + + List selectPackPage(@Param("orderIds") List orderIds, @Param("organId") Long organId); + + + + default OrderPackageDO selectByPackId(Long packId, Long orderId, Long organId) { + return selectOne(new LambdaQueryWrapperX() + .eq(OrderPackageDO::getOrganId, organId) + .eq(OrderPackageDO::getDeleted,false) + .eqIfPresent(OrderPackageDO::getOrderId,orderId) + .eqIfPresent(OrderPackageDO::getId, packId)); + } + + + + void updateParts(@Param("packageId") Long packageId,@Param("orderId") Long orderId,@Param("organId") Long organId); + + + + default List selectPackStatus(Long orderId, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderPackageDO::getOrganId,organId) + .eq(OrderPackageDO::getDeleted,false) + .eqIfPresent(OrderPackageDO::getOrderId, orderId)); + } + + + default List selectPackList(Long orderId, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderPackageDO::getOrganId,organId) + .eq(OrderPackageDO::getDeleted,false) + .eqIfPresent(OrderPackageDO::getOrderId, orderId) + .eqIfPresent(OrderPackageDO::getStatus, OrderPackageStatusEnum.UNPACKED.getStatus())); + } + + + List selectPackPieceCount(@Param("orderIds") List orderIds, @Param("organId") Long organId); + + + // 删除当前生产单下所有的包裹 + default void updateDelete(Long orderId,Long organId) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper() + .set(OrderPackageDO::getDeleted, true) + .eq(OrderPackageDO::getOrganId,organId) + .eq(OrderPackageDO::getOrderId, orderId) + .eq(OrderPackageDO::getType, OrderPackageTypeEnum.PLATE.getType()); + update(wrapper); + } + + + List selectPackListByOrderId(@Param("orderId") Long orderId,@Param("organId") Long organId); + + + default List selectPackStatusList(Long orderId, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(OrderPackageDO::getOrganId,organId) + .eq(OrderPackageDO::getDeleted,false) + .eqIfPresent(OrderPackageDO::getOrderId, orderId) + .eq(OrderPackageDO::getStatus,OrderPackageStatusEnum.PACKAGED.getStatus())); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPrepackagedMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPrepackagedMapper.java index bc616afbd..356d7a893 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPrepackagedMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/pack/OrderPrepackagedMapper.java @@ -14,4 +14,10 @@ public interface OrderPrepackagedMapper extends BaseMapperX .eqIfPresent(OrderPrepackagedDO::getOrderId, orderId)); } + default OrderPrepackagedDO selectOrder(Long orderId, Long organId) { + return selectOne(new LambdaQueryWrapperX() + .eq(OrderPrepackagedDO::getOrganId, organId) + .eqIfPresent(OrderPrepackagedDO::getOrderId, orderId)); + } + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java index 3045628ed..55b2006d6 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateGoodMapper.java @@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlatePageReqVO; import com.cf.imes.module.executor.controller.admin.plate.vo.GoodsPlateFilterPageReqVO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.List; @@ -99,4 +101,82 @@ public interface PlateGoodMapper extends BaseMapperX { .in(PlateGoodDO::getGoodsId, goodsId)); } + default PlateGoodDO selectByGoodID(String goodId , Long organId) { + return selectOne(PlateGoodDO::getGoodsId, goodId, PlateGoodDO::getOrganId, organId); + } + + default PageResult selectPage(PlatePageReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(PlateGoodDO::getOrganId, reqVO.getOrganId()) + .likeIfPresent(PlateGoodDO::getGoodsId, reqVO.getGoodsId()) + .likeIfPresent(PlateGoodDO::getGoodsName, reqVO.getGoodsName()) + .likeIfPresent(PlateGoodDO::getMaterial, reqVO.getMaterial()) + .likeIfPresent(PlateGoodDO::getColor, reqVO.getColor()) + .eqIfPresent(PlateGoodDO::getWidth, reqVO.getWidth()) + .eqIfPresent(PlateGoodDO::getHeight, reqVO.getHeight()) + .eqIfPresent(PlateGoodDO::getThickness, reqVO.getThickness()) + .likeIfPresent(PlateGoodDO::getBrand, reqVO.getBrand()) + .likeIfPresent(PlateGoodDO::getSpec, reqVO.getSpec()) + .likeIfPresent(PlateGoodDO::getRemark, reqVO.getRemark()) + .eqIfPresent(PlateGoodDO::getTexture, reqVO.getTexture()) + .betweenIfPresent(PlateGoodDO::getCreateTime, reqVO.getCreateTime()); + + if (reqVO.getOrder() == null) { + queryWrapper.orderByDesc(PlateGoodDO::getId); + }else { + if (reqVO.getOrder().equals("ascend")) { + switch (reqVO.getField()) { + case "goodsId" -> queryWrapper.orderByAsc(PlateGoodDO::getGoodsId); + case "goodsName" -> queryWrapper.orderByAsc(PlateGoodDO::getGoodsName); + case "material" -> queryWrapper.orderByAsc(PlateGoodDO::getMaterial); + case "color" -> queryWrapper.orderByAsc(PlateGoodDO::getColor); + case "texture" -> queryWrapper.orderByAsc(PlateGoodDO::getTexture); + case "width" -> queryWrapper.orderByAsc(PlateGoodDO::getWidth); + case "height" -> queryWrapper.orderByAsc(PlateGoodDO::getHeight); + case "thickness" -> queryWrapper.orderByAsc(PlateGoodDO::getThickness); + case "brand" -> queryWrapper.orderByAsc(PlateGoodDO::getBrand); + default -> { + // default不排序 + } + } + }else if (reqVO.getOrder().equals("descend")) { + switch (reqVO.getField()) { + case "goodsId" -> queryWrapper.orderByDesc(PlateGoodDO::getGoodsId); + case "goodsName" -> queryWrapper.orderByDesc(PlateGoodDO::getGoodsName); + case "material" -> queryWrapper.orderByDesc(PlateGoodDO::getMaterial); + case "color" -> queryWrapper.orderByDesc(PlateGoodDO::getColor); + case "texture" -> queryWrapper.orderByDesc(PlateGoodDO::getTexture); + case "width" -> queryWrapper.orderByDesc(PlateGoodDO::getWidth); + case "height" -> queryWrapper.orderByDesc(PlateGoodDO::getHeight); + case "thickness" -> queryWrapper.orderByDesc(PlateGoodDO::getThickness); + case "brand" -> queryWrapper.orderByDesc(PlateGoodDO::getBrand); + default -> { + // default不排序 + } + } + } + } + + return selectPage(reqVO, queryWrapper); + } + + PlateGoodDO selectOneById(@Param("id") Long id, @Param("organId") Long organId); + + default Boolean isByGoodID(String goodId , Long organId) { + return selectList(PlateGoodDO::getGoodsId, goodId, PlateGoodDO::getOrganId, organId).size() > 0; + } + + default Boolean isByGoodIDAndId(String goodId , Long organId , Long id) { + return selectCount(new LambdaQueryWrapper() + .ne(PlateGoodDO::getId, id) + .eq(PlateGoodDO::getGoodsId, goodId) + .eq(PlateGoodDO::getOrganId, organId)) > 0; + } + + default List getAllByOrganId(Long organId) { + return selectList(new LambdaQueryWrapper() + .eq(PlateGoodDO::getOrganId, organId) + .eq(PlateGoodDO::getDeleted, 0)); + } + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java index 045133041..2f601d747 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/plate/PlateMapper.java @@ -9,6 +9,10 @@ import com.cf.imes.framework.common.enums.OrderPlateTypeEnum; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PlateDetailsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.process.vo.PlateDetails; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.PackageDetailsRespVO; import com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO; import com.cf.imes.module.executor.controller.admin.plan.vo.NotPlanOrderPlateRespVO; import com.cf.imes.module.executor.controller.admin.plan.vo.PlateDetailRespVO; @@ -295,4 +299,21 @@ public interface PlateMapper extends BaseMapperX { @Param("bodyId")Long bodyId, @Param("plateId")Long goodsId); // 汇总 + List selectListByOrderId(@Param("orderId") Long orderId, @Param("organId") Long organId); + + + default List selectplateByPlateNoList(String plateNo, Long orderId, Long organId) { + return selectList(new LambdaQueryWrapperX() + .eq(PlateDO::getOrganId, organId) + .eq(PlateDO::getDeleted,false) + .eq(PlateDO::getOrderId, orderId) + .likeIfPresent(PlateDO::getPlateNo, plateNo) + .select(PlateDO::getId)); + } + + List selectPackPlateNum(@Param("orderIds") List orderIds, @Param("organId") Long organId); + + List selectOrderNoPackPlateList(@Param("orderId") Long orderId, @Param("organId") Long organId); + + List selectOrderPlateList(@Param("orderIds") List orderIds, @Param("organId") Long organId); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java index f8aa96bde..7a4a27738 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/remainplaten/RemainPlateMapper.java @@ -1,6 +1,7 @@ package com.cf.imes.module.executor.dal.mysql.remainplaten; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -11,6 +12,7 @@ import org.apache.ibatis.annotations.Param; import java.util.Collection; import java.util.List; +import java.util.Set; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; @@ -72,5 +74,134 @@ public interface RemainPlateMapper extends BaseMapperX { } -// List selectTestSQL(@Param("sql") String sql); + default PageResult selectPage(com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlatePageReqVO reqVO) { + LambdaQueryWrapperX wrapper = new LambdaQueryWrapperX() + .likeIfPresent(RemainPlateDO::getId,reqVO.getId() != null ? reqVO.getId() : null) + .likeIfPresent(RemainPlateDO::getPlanId, reqVO.getPlanId() != null ? reqVO.getPlanId() : null) + .likeIfPresent(RemainPlateDO::getInitPlanId, reqVO.getInitPlanId() != null ? reqVO.getInitPlanId() : null) + .eqIfPresent(RemainPlateDO::getStatus, reqVO.getStatus()) + .eqIfPresent(RemainPlateDO::getGoodsId, reqVO.getGoodsId()) + .eqIfPresent(RemainPlateDO::getIsCutting, reqVO.getIsCutting()) + .likeIfPresent(RemainPlateDO::getName, reqVO.getName()) + .likeIfPresent(RemainPlateDO::getMaterial, reqVO.getMaterial()) + .likeIfPresent(RemainPlateDO::getColor, reqVO.getColor()) + .eqIfPresent(RemainPlateDO::getThickness, reqVO.getThickness()) + .eqIfPresent(RemainPlateDO::getBrand, reqVO.getBrand()) + .eqIfPresent(RemainPlateDO::getPlaceStyle, reqVO.getPlaceStyle()) + .likeIfPresent(RemainPlateDO::getStore, reqVO.getStore()) + .eqIfPresent(RemainPlateDO::getCount, reqVO.getCount()) + .eqIfPresent(RemainPlateDO::getTexture, reqVO.getTexture()) + .likeIfPresent(RemainPlateDO::getRemark, reqVO.getRemark()) + .eqIfPresent(RemainPlateDO::getUseType, reqVO.getUseType()) + .eqIfPresent(RemainPlateDO::getOrganId, reqVO.getOrganId()) + .eqIfPresent(RemainPlateDO::getOutLineJson, reqVO.getOutLineJson()) + .betweenIfPresent(RemainPlateDO::getWidth, reqVO.getWidth()) + .betweenIfPresent(RemainPlateDO::getLength, reqVO.getLength()) + .betweenIfPresent(RemainPlateDO::getCreateTime, reqVO.getCreateTime()); + + if (reqVO.getOrder() == null) { + wrapper.orderByDesc(RemainPlateDO::getId); + }else { + if (reqVO.getOrder().equals("ascend")) { + switch (reqVO.getField()) { + case "id" -> wrapper.orderByAsc(RemainPlateDO::getId); + case "length" -> wrapper.orderByAsc(RemainPlateDO::getLength); + case "width" -> wrapper.orderByAsc(RemainPlateDO::getWidth); + case "thickness" -> wrapper.orderByAsc(RemainPlateDO::getThickness); + case "material" -> wrapper.orderByAsc(RemainPlateDO::getMaterial); + case "color" -> wrapper.orderByAsc(RemainPlateDO::getColor); + case "texture" -> wrapper.orderByAsc(RemainPlateDO::getTexture); + case "brand" -> wrapper.orderByAsc(RemainPlateDO::getBrand); + case "store" -> wrapper.orderByAsc(RemainPlateDO::getStore); + case "initPlanId" -> wrapper.orderByAsc(RemainPlateDO::getInitPlanId); + case "planId" -> wrapper.orderByAsc(RemainPlateDO::getPlanId); + case "status" -> wrapper.orderByAsc(RemainPlateDO::getStatus); + default -> { + // default不排序 + } + } + }else if (reqVO.getOrder().equals("descend")) { + switch (reqVO.getField()) { + case "id" -> wrapper.orderByDesc(RemainPlateDO::getId); + case "length" -> wrapper.orderByDesc(RemainPlateDO::getLength); + case "width" -> wrapper.orderByDesc(RemainPlateDO::getWidth); + case "thickness" -> wrapper.orderByDesc(RemainPlateDO::getThickness); + case "material" -> wrapper.orderByDesc(RemainPlateDO::getMaterial); + case "color" -> wrapper.orderByDesc(RemainPlateDO::getColor); + case "texture" -> wrapper.orderByDesc(RemainPlateDO::getTexture); + case "brand" -> wrapper.orderByDesc(RemainPlateDO::getBrand); + case "store" -> wrapper.orderByDesc(RemainPlateDO::getStore); + case "initPlanId" -> wrapper.orderByDesc(RemainPlateDO::getInitPlanId); + case "planId" -> wrapper.orderByDesc(RemainPlateDO::getPlanId); + case "status" -> wrapper.orderByDesc(RemainPlateDO::getStatus); + default -> { + // default不排序 + } + } + } + } + + return selectPage(reqVO, wrapper); + } + + default PageResult selectPageToAdd(com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlatePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .neIfPresent(RemainPlateDO::getInitPlanId, reqVO.getInitPlanId()) + .eqIfPresent(RemainPlateDO::getStatus, reqVO.getStatus()) + .eqIfPresent(RemainPlateDO::getGoodsId, reqVO.getGoodsId()) + .likeIfPresent(RemainPlateDO::getName, reqVO.getName()) + .likeIfPresent(RemainPlateDO::getMaterial, reqVO.getMaterial()) + .likeIfPresent(RemainPlateDO::getColor, reqVO.getColor()) + .eqIfPresent(RemainPlateDO::getThickness, reqVO.getThickness()) + .eqIfPresent(RemainPlateDO::getBrand, reqVO.getBrand()) + .likeIfPresent(RemainPlateDO::getStore, reqVO.getStore()) + .eqIfPresent(RemainPlateDO::getCount, reqVO.getCount()) + .eqIfPresent(RemainPlateDO::getTexture, reqVO.getTexture()) + .likeIfPresent(RemainPlateDO::getRemark, reqVO.getRemark()) + .eqIfPresent(RemainPlateDO::getOrganId, reqVO.getOrganId()) + .eqIfPresent(RemainPlateDO::getOutLineJson, reqVO.getOutLineJson()) + .betweenIfPresent(RemainPlateDO::getWidth, reqVO.getWidth()) + .betweenIfPresent(RemainPlateDO::getLength, reqVO.getLength()) + .betweenIfPresent(RemainPlateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RemainPlateDO::getId)); + } + // 批量修改状态 + default void updateRemainPlateStatus(Set ids, Integer status, Integer useType, Long organId, Long planId) { + update(new UpdateWrapper() + .set("status", status) + .set("use_type", useType) + .set("plan_id",planId) + .eq("organ_id",organId) + .in("id", ids)); + } + + // 查询该排单是否已经添加余料 + default List selectRemainPlatesByInitPlanId(Long initPlanId, Integer deleted, Long organId) { + return selectList(new LambdaUpdateWrapper() + .eq(RemainPlateDO::getInitPlanId, initPlanId) + .eq(RemainPlateDO::getDeleted, deleted) + .eq(RemainPlateDO::getOrganId, organId)); + } + + // 判断该排单是否存在以使用的余料 + default List selectRemainPlatesByPlanId(Long planId, Integer status, Integer deleted, Long organId) { + return selectList(new LambdaUpdateWrapper() + .eq(RemainPlateDO::getPlanId, planId) + .eq(RemainPlateDO::getStatus, status) + .eq(RemainPlateDO::getDeleted, deleted) + .eq(RemainPlateDO::getOrganId, organId)); + } + + // 通过排单id批量余料板 + void deleteRemainPlate(@Param("initPlanId") Long initPlanId, @Param("organId") Long organId); + + // 根据使用排单id批量还原状态 + default void updateRemainPlateStatusByPlanId(Integer status, Integer useType,Long organId,Long planId) { + update(new UpdateWrapper() + .set("status", status) + .set("use_type", useType) + .set("plan_id","") + .eq("organ_id",organId) + .eq("plan_id", planId)); + } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java index b8da26103..5b1777709 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java @@ -10,6 +10,7 @@ import com.cf.imes.module.system.api.organ.OrganApi; import com.cf.imes.module.system.api.permission.PermissionApi; import com.cf.imes.module.system.api.process.ProcessApi; import com.cf.imes.module.system.api.process.ProcessGroupApi; +import com.cf.imes.module.system.api.setting.SettingApi; import com.cf.imes.module.system.api.systemconfig.SystemConfigApi; import com.cf.imes.module.system.api.user.AdminUserApi; import org.springframework.cloud.openfeign.EnableFeignClients; @@ -19,8 +20,8 @@ import org.springframework.context.annotation.Configuration; * @author there */ @Configuration(proxyBeanMethods = false) -@EnableFeignClients(clients = {AdminUserApi.class, MachineApi.class, DictDataApi.class, AdminUserApi.class, +@EnableFeignClients(clients = {AdminUserApi.class, MachineApi.class, DictDataApi.class, FileApi.class, ProcessGroupApi.class, FileApi.class, DataSourceApi.class, ApplicationApi.class, - ProcessApi.class, OrganApi.class, SystemConfigApi.class, CustomPlateNoSeqApi.class, PermissionApi.class}) + ProcessApi.class, OrganApi.class, SystemConfigApi.class, CustomPlateNoSeqApi.class, PermissionApi.class, SettingApi.class}) public class RpcConfiguration { } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackService.java new file mode 100644 index 000000000..beefa5e52 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackService.java @@ -0,0 +1,105 @@ +package com.cf.imes.module.executor.service.manage.pack; + + +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.executor.controller.admin.manage.pack.prePack.PrePackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.DeleteOtherPartsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OtherPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackageDetailsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PlateDetailsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PrintOrderPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PrintOrderPackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO; + +import java.util.List; + +public interface PackService { + + + // 打包分页查询 + PageResult getPackPage(PackPageReqVO pageReqVO); + + + // 查看生产订单对应的包裹信息 + List getOrderPack(PackageDetailsReqVO reqVO); + + + PageResult getPageOrderPack(PackageDetailsReqVO reqVO); + + + // 查看生产订单对应的板材信息 + List getOrderPlateList(Long orderId); + + + + // 查询多个生产单对应的板材信息 + List getOrdersPlateList(List orderIds); + + + + + + + // 查看配件列表分页 + List getPartsList(OrderPartsReqVO reqVO); + + OrderPackRespVO updateParts(OrderPartsReqVO reqVO); + + + // 拆包 + OrderPackRespVO unpacking(Long packageID); + + + + // 更新包裹 + OrderPackRespVO updatePack(OrderPackReqVO packageVO); + + + // 查询包裹 + List selectPack(Long orderId); + + + // 包裹订单打印 + PrintOrderPackRespVO printOrderPack(PrintOrderPackReqVO reqVO); + + + // 删除包裹及其关联的包裹信息(删除全部) + void deleteOrderPack(PackReqVO reqVO); + + + + // 新增外部配件包裹 + OrderPackRespVO addNewOtherPack(OtherPackReqVO reqVO); + + + // 新增外部配件 + OrderPartsRespVO addNewOtherParts(OtherPackReqVO reqVO); + + + + + // 删除包裹中的外部配件 + void deleteOtherParts(DeleteOtherPartsReqVO reqVO); + + + + // 新增配件-即新增一个包裹 + OrderPackRespVO addNewPartsPack(OrderPackReqVO reqVO); + + + + // 查询预打包优化信息 + String getPrePackInfo(Long orderId); + + + // 保存优化后的预打包信息 + void saveOptimizeInfo(PrePackReqVO reqVO); + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackServiceImpl.java new file mode 100644 index 000000000..b6c0be661 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/pack/PackServiceImpl.java @@ -0,0 +1,1066 @@ +package com.cf.imes.module.executor.service.manage.pack; + + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; +import com.cf.imes.framework.common.enums.OrderItemTypeEnum; +import com.cf.imes.framework.common.enums.OrderPackageStatusEnum; +import com.cf.imes.framework.common.enums.OrderPackageTypeEnum; +import com.cf.imes.framework.common.enums.OrderStatusEnum; +import com.cf.imes.framework.common.enums.UserSettingTypeEnum; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.Assert.AssertUtils; +import com.cf.imes.framework.common.util.json.JsonUtils; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd; +import com.cf.imes.framework.mybatis.core.query.QueryWrapperX; +import com.cf.imes.module.executor.api.plan.OrderPlanApi; +import com.cf.imes.module.executor.controller.admin.manage.pack.prePack.PackPlateList; +import com.cf.imes.module.executor.controller.admin.manage.pack.prePack.PrePackOptimizeInfo; +import com.cf.imes.module.executor.controller.admin.manage.pack.prePack.PrePackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.DeleteOtherPartsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.GroupNameList; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OrderPartsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.OtherPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackageDetailsReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PlateAndPartIdList; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PlateDetailsRespVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PrintOrderPackReqVO; +import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PrintOrderPackRespVO; +import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO; +import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO; +import com.cf.imes.module.executor.dal.dataobject.pack.OrderPackageDO; +import com.cf.imes.module.executor.dal.dataobject.pack.OrderPrepackagedDO; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; +import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; +import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper; +import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageMapper; +import com.cf.imes.module.executor.dal.mysql.pack.OrderPrepackagedMapper; +import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; +import com.cf.imes.module.system.api.setting.SettingApi; +import com.cf.imes.module.system.api.setting.dto.PackageConfigDTO; +import com.cf.imes.module.system.enums.ErrorCodeConstants; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.aop.framework.AopContext; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparator; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.CURRENTLY_NO_CONFIGURATION_AVAILABLE; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORDER_DATE_ERROR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORDER_NO_DATA_ERROR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORDER_PACK_DATA_ERROR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORDER_PACK_DATA_NULL_ERROR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORDER_PACK_ERROR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.PART_PACK_DATA_ERROR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.THE_CURRENT_PACKAGE_TYPE_IS_INCORRECT; + +@Service +@Validated +public class PackServiceImpl implements PackService { + + @Resource + private OrderPackageMapper orderPackageMapper; + + + @Resource + private OrderItemMapper orderItemMapper; + + @Resource + private OrderPartsMapper orderPartsMapper; + + @Resource + private PlateMapper orderPlateMapper; + + @Resource + private OrderMapper ordersMapper; + + @Resource + private SnowflakeIdWorker3rd idWorker; + + @Resource + private OrderPrepackagedMapper orderPrepackagedMapper; + + + @Resource + private SettingApi settingApi; + + @Resource + private OrderPlanApi orderPlanApi; + + + // 打包分页查询 + @Override + public PageResult getPackPage(PackPageReqVO pageReqVO) { + + PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + + List orderIds = new ArrayList<>(); + + + if (pageReqVO.getIsUp() != null) { + + return handleIsUpCase(pageReqVO, orderIds,pageReqVO.getIsUp()); + + } else { + + return handleNormalCase(pageReqVO, orderIds, page); + + } + + + } + + + + // 查看生产订单对应的板材信息 + @Override + public List getOrderPlateList(Long orderId) { + + // 查询订单对应的板件信息 + List plateDetailsRespVOS = orderPlateMapper.selectOrderNoPackPlateList(orderId, getUserOrganId()); + + if(plateDetailsRespVOS.isEmpty()){ + return new ArrayList<>(); + } + + for (PlateDetailsRespVO plateDetailsRespVO : plateDetailsRespVOS) { + StringBuilder name = new StringBuilder(); + if (!plateDetailsRespVO.getProcessGroupNameList().isEmpty()) { + for (GroupNameList groupNameList : plateDetailsRespVO.getProcessGroupNameList()) { + // 去除最后的逗号 + name.append(groupNameList.getName()).append(","); + + } + name = new StringBuilder(name.substring(0, name.length() - 1)); + } + plateDetailsRespVO.setProcessGroup(name.toString()); + } + + return plateDetailsRespVOS; + + + } + + + // 查询多个生产单对应的板材信息 + @Override + public List getOrdersPlateList(List orderIds) { + +// List orderDOS = ordersMapper.selectBatchIds(orderIds); +// orderDOS.forEach(f->{ +// if(OrderPackageStatusEnum.PACKAGED.equals(f.getPackaged())){ +//// throw exception(ORDER_IS_PACK_ERROR,f.getId()); +// } +// }); + + List plateDetailsRespVOS = orderPlateMapper.selectOrderPlateList(orderIds,getUserOrganId()); + + if (plateDetailsRespVOS.isEmpty()) { + + return new ArrayList<>(); + } + + List packageIds = plateDetailsRespVOS.stream().map(PlateDetailsRespVO::getPackageId).distinct().toList(); + List orderPackageDOS = new ArrayList<>(); + if (!packageIds.isEmpty()) { + orderPackageDOS = orderPackageMapper.selectBatchIds(packageIds); + } + + + for (PlateDetailsRespVO plateDetailsRespVO : plateDetailsRespVOS) { + StringBuilder name = new StringBuilder(); + if (!plateDetailsRespVO.getProcessGroupNameList().isEmpty()) { + for (GroupNameList groupNameList : plateDetailsRespVO.getProcessGroupNameList()) { + // 去除最后的逗号 + name.append(groupNameList.getName()).append(","); + } + name = new StringBuilder(name.substring(0, name.length() - 1)); + } + plateDetailsRespVO.setProcessGroup(name.toString()); + + plateDetailsRespVO.setPackageNo(orderPackageDOS.stream() + .filter(m -> m.getId().equals(plateDetailsRespVO.getPackageId())) + .map(OrderPackageDO::getPackageNo).findFirst().orElse("")); + + } + + return plateDetailsRespVOS; + + + } + + + // 查看生产订单对应的包裹信息 + @Override + public List getOrderPack(PackageDetailsReqVO reqVO) { + + + List orderPackageVOS = orderPackageMapper.selectPackListByOrderId(Long.valueOf(reqVO.getOrderId()), getUserOrganId()); + + if(orderPackageVOS.isEmpty()){ + return new ArrayList<>(); + } + + OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); + + AssertUtils.notEmpty(orderDO,ORDER_DATE_ERROR); + + orderPackageVOS.forEach(m -> { + m.setCustomOrderNo(orderDO.getCustomOrderNo()); + m.setCustomer(orderDO.getCustomer()); + m.setAddress(orderDO.getAddress()); + m.setDealer(orderDO.getDealer()); + m.setOrderRemark(orderDO.getRemark()); + } + ); + + return orderPackageVOS; + + } + + + @Override + public PageResult getPageOrderPack(PackageDetailsReqVO reqVO) { + + PageDTO page = new PageDTO<>(reqVO.getPageNo(), reqVO.getPageSize()); + + List packId = null; + + Long orderId = Long.valueOf(reqVO.getOrderId()); + + if (reqVO.getPlateNo() != null) { + + List plateId = orderPlateMapper.selectplateByPlateNoList(reqVO.getPlateNo(), orderId, getUserOrganId()) + .stream().map(PlateDO::getId).toList(); + + if (plateId.isEmpty()) { + return null; + } + + packId = orderItemMapper.selectPackByPlateId(plateId,orderId ,getUserOrganId()).stream().map(OrderItemDO::getPackageId).distinct().toList(); + + } + + + QueryWrapperX queryWrapperX = new QueryWrapperX<>(); + queryWrapperX + .eq("o.organ_id", getUserOrganId()) + .eq("o.deleted", false) + .eq("o.id", reqVO.getOrderId()) + .eq("op.deleted", false) + .likeIfPresent("op.package_no", reqVO.getPackageNo()) + .inIfPresent("op.id", packId) + .eqIfPresent("op.status", reqVO.getPackStatus()) + .orderByDesc("op.create_time"); + + + IPage orderPackageDOIPage = orderPackageMapper.selectByOrderNo(page, queryWrapperX); + + + if (CollUtil.isEmpty(orderPackageDOIPage.getRecords())) { + return new PageResult<>(); + } + + + return new PageResult<>(orderPackageDOIPage.getRecords(), orderPackageDOIPage.getTotal()); + + } + + + // 查看配件列表分页 + @Override + public List getPartsList(OrderPartsReqVO reqVO) { + + return orderPartsMapper.selectPartsList(reqVO.getOrderId(), getUserOrganId()); + + } + + + // 更新配件 + @Override + @Transactional(rollbackFor = Exception.class) + public OrderPackRespVO updateParts(OrderPartsReqVO reqVO) { + + validateOrdersExists(reqVO.getOrderId(),null); + + // 判断包裹ID是否为空,为空,走新增,不为空,走更新 + if (reqVO.getPackId() == null) { + + OrderPackageDO orderPackageDO = new OrderPackageDO(); + orderPackageDO.setOrderId(reqVO.getOrderId()); + orderPackageDO.setType(OrderPackageTypeEnum.PARTS.getType()); + orderPackageDO.setPackageNo(generatePackageNo()); + orderPackageDO.setStatus((OrderPackageStatusEnum.PACKAGED.getStatus())); + orderPackageMapper.insert(orderPackageDO); + // 生产单明细表新增包裹 ID + if (reqVO.getAddPartsIdList() != null) { + orderItemMapper.insertPartsId(orderPackageDO.getId(), reqVO.getAddPartsIdList(), reqVO.getOrderId(), getUserOrganId()); + } + + // 判断当前生产单的板材和配件是否已全部打包且当前生产单的包裹已全部封包 + if (validateOrderPack(reqVO.getOrderId())) { + + PackServiceImpl p = (PackServiceImpl)AopContext.currentProxy(); + p.updateOrderStatus(reqVO.getOrderId()); + + } + + return typeConversion(orderPackageDO); + + } + + + if(reqVO.getAddPartsIdList().isEmpty() && reqVO.getAddPlateIdList().isEmpty() && reqVO.getDeletePartsIdList().isEmpty()){ + throw exception(PART_PACK_DATA_ERROR); + } + + + OrderPackageDO orderPackageDO = orderPackageMapper.selectByPackId(reqVO.getPackId(),reqVO.getOrderId(), getUserOrganId()); + + AssertUtils.notEmpty(orderPackageDO,ORDER_PACK_DATA_ERROR); + List orderItemDOS = orderItemMapper.selectPackList(reqVO.getPackId(), reqVO.getOrderId(), getUserOrganId()); + List partsList = orderItemDOS.stream().map(OrderItemDO::getPartsId).distinct().toList(); + + + // 如果此时删除的包裹配件数量等于查询出来的配件数量,且新增的板材数量不为0,更改包裹的类型 + if (reqVO.getDeletePartsIdList().size() == partsList.size() && !reqVO.getAddPlateIdList().isEmpty()) { + + + // 删除生产单明细表配件对应的包裹ID + orderItemMapper.deletePartsList(reqVO.getDeletePartsIdList(), reqVO.getPackId(), reqVO.getOrderId(), getUserOrganId()); + + + // 生产单明细表板材新增对应的包裹ID + orderItemMapper.insertPackId(reqVO.getAddPlateIdList(), reqVO.getPackId(), reqVO.getOrderId(), getUserOrganId()); + + + // 更新包裹类型和包裹的状态 + orderPackageDO.setType(OrderPackageTypeEnum.PLATE.getType()); + orderPackageDO.setStatus(OrderPackageStatusEnum.PACKAGED.getStatus()); + orderPackageMapper.updateById(orderPackageDO); + return typeConversion(orderPackageDO); + + } + + + // 生产明细表新增的配件ID + if (!reqVO.getAddPartsIdList().isEmpty()) { + orderItemMapper.insertParts(reqVO.getAddPartsIdList(), reqVO.getPackId(), reqVO.getOrderId(), getUserOrganId()); + } + // 生产明细表删除的配件ID + if (!reqVO.getDeletePartsIdList().isEmpty()) { + orderItemMapper.deletePartsList(reqVO.getDeletePartsIdList(), reqVO.getPackId(), reqVO.getOrderId(), getUserOrganId()); + } + orderPackageDO.setStatus(OrderPackageStatusEnum.PACKAGED.getStatus()); + + orderPackageMapper.updateById(orderPackageDO); + + + // 判断当前生产单的板材和配件是否已全部打包且当前生产单的包裹已全部封包 + if (validateOrderPack(reqVO.getOrderId())) { + + PackServiceImpl p = (PackServiceImpl)AopContext.currentProxy(); + p.updateOrderStatus(reqVO.getOrderId()); + + } + + return typeConversion(orderPackageDO); + } + + + // 拆包 + @Override + @Transactional(rollbackFor = Exception.class) + public OrderPackRespVO unpacking(Long packageID) { + + OrderPackageDO packageDO = orderPackageMapper.selectById(packageID); + + AssertUtils.notEmpty(packageDO,ORDER_PACK_DATA_NULL_ERROR ); + + Long orderId = packageDO.getOrderId(); + + OrderDO orderDO = ordersMapper.selectById(orderId); + + AssertUtils.notEmpty(orderDO,ORDER_NO_DATA_ERROR); + + orderDO.setPackaged(OrderPackageStatusEnum.UNPACKED.getStatus()); + + if(orderDO.getStatus().equals(OrderStatusEnum.FINISH_PRODUCTION.getStatus())){ + orderDO.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus()); + orderDO.setFinishTime(null); + } + + ordersMapper.updateById(orderDO); + + packageDO.setStatus(OrderPackageStatusEnum.UNPACKED.getStatus()); + orderPackageMapper.updateById(packageDO); + return typeConversion(packageDO); + + + } + + + // 更新包裹 + @Override + @Transactional(rollbackFor = Exception.class) + public OrderPackRespVO updatePack(OrderPackReqVO packageVO) { + + validateOrdersExists(packageVO.getOrderId(),null); + + // 判断包裹ID是否为空,为空,走新增,不为空,走更新 + if (packageVO.getPackId() == null) { + + OrderPackageDO orderPackageDO = new OrderPackageDO(); + orderPackageDO.setOrderId(packageVO.getOrderId()); + orderPackageDO.setType(OrderPackageTypeEnum.PLATE.getType()); + orderPackageDO.setPackageNo(generatePackageNo()); + orderPackageDO.setStatus((OrderPackageStatusEnum.PACKAGED.getStatus())); + orderPackageDO.setRemark(packageVO.getRemark()); + orderPackageMapper.insert(orderPackageDO); + // 生产单明细表新增包裹 ID + if (packageVO.getAddPlateIdList() != null) { + orderItemMapper.insertPackId(packageVO.getAddPlateIdList(), orderPackageDO.getId(), packageVO.getOrderId(), getUserOrganId()); + } + + if (validateOrderPack(packageVO.getOrderId())) { + + PackServiceImpl p = (PackServiceImpl)AopContext.currentProxy(); + p.updateOrderStatus(packageVO.getOrderId()); + } + + return typeConversion(orderPackageDO); + } + + + if(packageVO.getAddPlateIdList().isEmpty() && packageVO.getAddPartsIdList().isEmpty() && packageVO.getDeletePlateIdList().isEmpty()){ + throw exception(PART_PACK_DATA_ERROR); + } + + + OrderPackageDO orderPackageDO = orderPackageMapper.selectByPackId(packageVO.getPackId(),packageVO.getOrderId(), getUserOrganId()); + + AssertUtils.notEmpty(orderPackageDO,ORDER_PACK_DATA_ERROR); + + List orderItemDOS = orderItemMapper.selectPackList(packageVO.getPackId(), packageVO.getOrderId(), getUserOrganId()); + List plateList = orderItemDOS.stream().map(OrderItemDO::getPlateId).distinct().toList(); + + + // 如果此时删除的包裹板材数量等于查询出来的板材数量,且新增的配件数量不为0,更改包裹的类型 + if (packageVO.getDeletePlateIdList().size() == plateList.size() && !packageVO.getAddPartsIdList().isEmpty()) { + + + // 删除生产单明细表板件对应的包裹ID + orderItemMapper.deletePackId(packageVO.getDeletePlateIdList(), packageVO.getPackId(), packageVO.getOrderId(), getUserOrganId()); + + + // 生产单明细表配件新增对应的包裹ID + orderItemMapper.insertParts(packageVO.getAddPartsIdList(), packageVO.getPackId(), packageVO.getOrderId(), getUserOrganId()); + + + // 更新包裹类型和包裹的状态 + orderPackageDO.setType(OrderPackageTypeEnum.PARTS.getType()); + orderPackageDO.setStatus(OrderPackageStatusEnum.PACKAGED.getStatus()); + orderPackageMapper.updateById(orderPackageDO); + return typeConversion(orderPackageDO); + + } + + + // 生产明细表新增包裹ID + if (!packageVO.getAddPlateIdList().isEmpty()) { + orderItemMapper.insertPackId(packageVO.getAddPlateIdList(), packageVO.getPackId(), packageVO.getOrderId(), getUserOrganId()); + } + + // 移除生产明细表中板件对应的包裹ID + if (!packageVO.getDeletePlateIdList().isEmpty()) { + orderItemMapper.deletePackId(packageVO.getDeletePlateIdList(), packageVO.getPackId(), packageVO.getOrderId(), getUserOrganId()); + } + orderPackageDO.setStatus(OrderPackageStatusEnum.PACKAGED.getStatus()); + + orderPackageMapper.updateById(orderPackageDO); + + + // 判断当前生产单的板材和配件是否已全部打包且当前生产单的包裹已全部封包 + if (validateOrderPack(packageVO.getOrderId())) { + + // 修改生产单的打包状态 + PackServiceImpl p = (PackServiceImpl)AopContext.currentProxy(); + p.updateOrderStatus(packageVO.getOrderId()); + + } + + return typeConversion(orderPackageDO); + + } + + + // 判断当前生产单的板材和配件是否已全部打包且当前生产单的包裹已全部封包 + public Boolean validateOrderPack(Long orderId) { + + List orderPackageDOS = orderPackageMapper.selectPackList(orderId, getUserOrganId()); + + if (!orderPackageDOS.isEmpty()) { + return false; + } + + List partsIds = orderItemMapper.selectOrderPackPartsIds(orderId, getUserOrganId()); + + List plateIds = orderItemMapper.selectOrderPackPlateIds(orderId, getUserOrganId()); + + return partsIds.isEmpty() && plateIds.isEmpty(); + + } + + + // 修改当前生产单的工序状态和生产单的状态 + @Transactional(rollbackFor = Exception.class) + public void updateOrderStatus(Long orderId) { + + OrderDO orderDO = ordersMapper.selectById(orderId); + + + // 修改生产单的打包状态为已打包 + orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus()); + + + if(orderPlanApi.getOrder(orderId).getData()){ + orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); + orderDO.setFinishTime(LocalDateTime.now()); + } + + + ordersMapper.updateById(orderDO); + + + + } + + + // 查询包裹 + @Override + public List selectPack(Long orderId) { + + List orderPackageDOS = orderPackageMapper.selectPackStatus(orderId, getUserOrganId()); + + return orderPackageDOS.stream().map(this::typeConversion).toList(); + + } + + + // 包裹订单打印 + @Override + public PrintOrderPackRespVO printOrderPack(PrintOrderPackReqVO reqVO) { + + PrintOrderPackRespVO printOrderPackRespVO = ordersMapper.selectOrderPack(reqVO.getOrderId(), reqVO.getPackageNo(), getUserOrganId()); + printOrderPackRespVO.setPlateList(orderItemMapper.selectPrintPlateList(reqVO.getOrderId(), reqVO.getPackageNo(), getUserOrganId())); + return printOrderPackRespVO; + + + } + + + // 删除包裹及其关联的包裹信息(删除全部) + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteOrderPack(PackReqVO reqVO) { + + + + // 判断包裹的类型是否为其他类型,如果是,则删除其包裹信息 + if (reqVO.getIsOther()) { + + List partsIds = orderItemMapper.selectPackList(reqVO.getPackageId(), reqVO.getOrderId(), getUserOrganId()) + .stream().map(OrderItemDO::getPartsId) + .distinct() + .toList(); + if(partsIds.isEmpty()){ + return; + } + + orderPartsMapper.deleteOrderParts(partsIds, reqVO.getOrderId(), getUserOrganId()); + + orderPackageMapper.updateParts(reqVO.getPackageId(), reqVO.getOrderId(), getUserOrganId()); + + orderItemMapper.deleteParts(reqVO.getPackageId(), reqVO.getOrderId(), partsIds, getUserOrganId()); + + List orderPackageDOS = orderPackageMapper.selectPackStatusList(reqVO.getOrderId(), getUserOrganId()); + + if(orderPackageDOS.isEmpty()){ + + OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); + + orderDO.setPackaged(OrderPackageStatusEnum.UNPACKED.getStatus()); + + ordersMapper.updateById(orderDO); + + } + + return; + } + + + + orderPackageMapper.updateParts(reqVO.getPackageId(), reqVO.getOrderId(), getUserOrganId()); + + orderItemMapper.deleteOrderPack(reqVO.getPackageId(), reqVO.getOrderId(), getUserOrganId()); + + orderPrepackagedMapper.deletePacked(reqVO.getOrderId(),getUserOrganId()); + + + List orderPackageDOS = orderPackageMapper.selectPackStatusList(reqVO.getOrderId(), getUserOrganId()); + + if(orderPackageDOS.isEmpty()){ + + OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); + + orderDO.setPackaged(OrderPackageStatusEnum.UNPACKED.getStatus()); + + ordersMapper.updateById(orderDO); + + } + + } + + + // 新增外部配件包裹表 + @Override + @Transactional(rollbackFor = Exception.class) + public OrderPackRespVO addNewOtherPack(OtherPackReqVO reqVO) { + + + // 配件表新增数据 + OrderPartsDO orderParts = BeanUtils.toBean(reqVO, OrderPartsDO.class); + // 因为是外部配件,所以配件类型的名称固定为 “ 外部配件” + orderParts.setType("外部配件"); + orderParts.setUnit(reqVO.getUnit()); + orderPartsMapper.insert(orderParts); + + + // 在包裹表中添加包裹编号和生产单号,修改包裹类型未其他配件类型 + OrderPackageDO orderPackageDO = new OrderPackageDO(); + orderPackageDO.setPackageNo(generatePackageNo()); + orderPackageDO.setOrderId(reqVO.getOrderId()); + orderPackageDO.setType(OrderPackageTypeEnum.OTHER_ACCESSORIES.getType()); + + // 新增包裹 + orderPackageMapper.insert(orderPackageDO); + + + // 在生产单明细表中添加数据(生产单号,配件ID,包裹ID,部件数量) + OrderItemDO orderItemDO = new OrderItemDO(); + orderItemDO.setOrderId(reqVO.getOrderId()); + orderItemDO.setType(OrderItemTypeEnum.QUOTATIONACCESSORIES.getType()); + orderItemDO.setPartsId(orderParts.getId()); + orderItemDO.setPackageId(orderPackageDO.getId()); + orderItemDO.setNum(reqVO.getNum()); + + + // 在生产单明细表中新增数据 + orderItemMapper.insert(orderItemDO); + + // 查看新增的包裹信息 + return typeConversion(orderPackageDO); + + + } + + + // 新增外部配件 + @Override + @Transactional(rollbackFor = Exception.class) + public OrderPartsRespVO addNewOtherParts(OtherPackReqVO reqVO) { + + OrderPackageDO orderPackageDO = orderPackageMapper.selectByPackNo(reqVO.getPackNo(), getUserOrganId()); + if (orderPackageDO.getType() != OrderPackageTypeEnum.OTHER_ACCESSORIES.getType().longValue()) { + throw exception(THE_CURRENT_PACKAGE_TYPE_IS_INCORRECT); + } + + + // 配件表新增数据 + OrderPartsDO orderParts = BeanUtils.toBean(reqVO, OrderPartsDO.class); + // 因为是外部配件,所以配件类型的名称固定为 “ 外部配件” + orderParts.setType("外部配件"); + orderParts.setUnit(reqVO.getUnit()); + orderPartsMapper.insert(orderParts); + + // 在生产单明细表中添加数据(生产单号,配件ID,包裹ID,部件数量) + OrderItemDO orderItemDO = new OrderItemDO(); + orderItemDO.setOrderId(reqVO.getOrderId()); + orderItemDO.setPartsId(orderParts.getId()); + orderItemDO.setPackageId(orderPackageDO.getId()); + orderItemDO.setNum(reqVO.getNum()); + + // 在生产单明细表中新增数据 + orderItemMapper.insert(orderItemDO); + + return BeanUtils.toBean(orderParts, OrderPartsRespVO.class); + + } + + + // 删除包裹中的外部配件 + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteOtherParts(DeleteOtherPartsReqVO reqVO) { + + + if (reqVO.getIsOtherParts()) { + // 更新配件表中配件为逻辑删除 + orderPartsMapper.updateParts(reqVO.getPartsId(), reqVO.getOrderId(), getUserOrganId()); + orderItemMapper.deleteOtherParts(reqVO.getPartsId(), reqVO.getOrderId(), getUserOrganId()); + } + + orderItemMapper.updateParts(reqVO.getPartsId(), reqVO.getPackageId(), reqVO.getOrderId(), getUserOrganId()); + + } + + + // 新增配件-即新增一个包裹 + @Override + @Transactional(rollbackFor = Exception.class) + public OrderPackRespVO addNewPartsPack(OrderPackReqVO reqVO) { + + OrderPackageDO orderPackageDO = new OrderPackageDO(); + orderPackageDO.setOrderId(reqVO.getOrderId()); + orderPackageDO.setType(reqVO.getPackageType()); + orderPackageDO.setStatus(OrderPackageStatusEnum.PACKAGED.getStatus()); + orderPackageDO.setPackageNo(generatePackageNo()); + orderPackageMapper.insert(orderPackageDO); + + orderItemMapper.insertPartsId(orderPackageDO.getId(), reqVO.getAddPartsIdList(), reqVO.getOrderId(), getUserOrganId()); + + return typeConversion(orderPackageDO); + + } + + + // 查询预打包优化信息 + @Override + public String getPrePackInfo(Long orderId) { + + + OrderPrepackagedDO orderPrepackagedDO = orderPrepackagedMapper.selectOrder(orderId, getUserOrganId()); + + + if (orderPrepackagedDO == null) { + return null; + } + + + return JsonUtils.unzipString(orderPrepackagedDO.getResult()); + + } + + + // 保存优化后的预打包信息 + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOptimizeInfo(PrePackReqVO reqVO) { + + + PackageConfigDTO userSetting = settingApi.getUserSetting(UserSettingTypeEnum.PREPACKAGED.getType()); + + String setting = userSetting.getSetting(); + + if (setting == null) { + + throw exception(CURRENTLY_NO_CONFIGURATION_AVAILABLE, UserSettingTypeEnum.PREPACKAGED.getName()); + } + + JsonNode settingParse = JsonUtils.parseTree(JsonUtils.unzipString(setting)); + + boolean autoPack = settingParse.get("autoPack").asBoolean(); + + + String optimizeInfo = reqVO.getOptimizeInfo(); + + // 自动打包,包裹表新增 + if (autoPack) { + + ArrayList orderPackageDOS = new ArrayList<>(); + + List packPlateNoLists = new ArrayList<>(); + + ObjectMapper objectMapper = new ObjectMapper(); + + JsonNode jsonNode = JsonUtils.parseTree(reqVO.getOptimizeInfo()); + + List asJsonObject = objectMapper.convertValue(jsonNode, new TypeReference<>() { + }); + + + asJsonObject.forEach(value -> { + + value.getList().forEach(prePackOptimizeInfo -> { + + String packageNo = generatePackageNo(); + prePackOptimizeInfo.setName(packageNo); + orderPackageDOS.add(OrderPackageDO.builder() + .packageNo(packageNo) + .type(OrderPackageTypeEnum.PLATE.getType()) + .orderId(reqVO.getOrderId()) + .status(OrderPackageStatusEnum.PACKAGED.getStatus()) + .build()); + prePackOptimizeInfo.getList().forEach(plate -> { + List list = plate.getList().stream().map(PrePackOptimizeInfo.PrerPlateData::getPlateId).toList(); + list.forEach(a -> packPlateNoLists.add(PackPlateList.builder() + .packNo(packageNo) + .plateId(Long.valueOf(a)) + .build())); + }); + + }); + + }); + + + optimizeInfo = JsonUtils.toJsonString(asJsonObject); + + List packageDOS = orderPackageMapper.selectPackStatus(reqVO.getOrderId(), getUserOrganId()); + + if (!packageDOS.isEmpty()) { + // 删除除配件和其他配件外的所有包裹 + orderPackageMapper.updateDelete(reqVO.getOrderId(), getUserOrganId()); + } + + // 包裹表新增包裹 + orderPackageMapper.insertBatch(orderPackageDOS); + + // 根据包裹编号查找包裹ID + orderPackageDOS.forEach(a -> + packPlateNoLists.stream().filter(f -> Objects.equals(f.getPackNo(), a.getPackageNo())) + .forEach(f -> f.setPackId(a.getId()))); + + List orderItemDOS = orderItemMapper.selectPackPlateList(reqVO.getOrderId(), getUserOrganId()); + + + packPlateNoLists.forEach(a -> + orderItemDOS.stream().filter(f -> Objects.equals(f.getPlateId(), a.getPlateId())) + .forEach(f -> f.setPackageId(a.getPackId()))); + + orderItemMapper.updateBatch(orderItemDOS); + + // 查询配件是否为空,为空,修改生产单的状态为已打包 + List partsIds = orderItemMapper.selectOrderPackPartsIds(reqVO.getOrderId(), getUserOrganId()); + + if (partsIds.isEmpty()) { + OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); + orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus()); + if(Boolean.TRUE.equals(orderPlanApi.getOrder(reqVO.getOrderId()).getData())){ + orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); + orderDO.setFinishTime(LocalDateTime.now()); + } + ordersMapper.updateById(orderDO); + } + + } + + + OrderPrepackagedDO orderPackOptimizeDO = orderPrepackagedMapper.selectOrder(reqVO.getOrderId(), getUserOrganId()); + + if (orderPackOptimizeDO == null) { + + OrderPrepackagedDO prepackagedDO = new OrderPrepackagedDO(); + prepackagedDO.setOrderId(reqVO.getOrderId()); + prepackagedDO.setResult(JsonUtils.zipString(optimizeInfo)); + orderPrepackagedMapper.insert(prepackagedDO); + return; + } + + orderPackOptimizeDO.setResult(JsonUtils.zipString(optimizeInfo)); + orderPrepackagedMapper.updateById(orderPackOptimizeDO); + + + } + + + // 日期格式转换 + public static String convertTime(String input) { + + SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + try { + Date date = inputFormat.parse(input); + date.setTime(date.getTime() + 8 * 60 * 60 * 1000); // 将时间转换为东夏令时 + return outputFormat.format(date); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + + // 生成包裹编号 + private String generatePackageNo() { + + long packNo = idWorker.nextId(); + long obtainingTime = SnowflakeIdWorker3rd.obtainingTime(); + + return (obtainingTime) + Long.toString(packNo).substring(2); + + } + + + private void validateOrdersExists(Long orderId, Long packId) { + + OrderDO orderDO = ordersMapper.selectById(orderId); + AssertUtils.notEmpty(orderDO,ORDER_PACK_ERROR); + + if(packId != null){ + OrderPackageDO orderPackageDO = orderPackageMapper.selectById(packId); + AssertUtils.notEmpty(orderPackageDO,ORDER_PACK_DATA_ERROR); + } + + } + + // 类型转换 + private OrderPackRespVO typeConversion(OrderPackageDO orderPackageDO) { + return OrderPackRespVO.builder() + .id(orderPackageDO.getId()) + .orderId(orderPackageDO.getOrderId()) + .organId(orderPackageDO.getOrganId()) + .packageNo(orderPackageDO.getPackageNo()) + .packageType(orderPackageDO.getType()) + .name(orderPackageDO.getName()) + .status(orderPackageDO.getStatus()) + .remark(orderPackageDO.getRemark()) + .build(); + + } + + + + // 打包翻页查询 + private PageResult handleIsUpCase(PackPageReqVO pageReqVO, List orderIds,Boolean isUp) { + + IPage packRespVOS = new PageDTO<>(); + + OrderDO order = ordersMapper.selectById(pageReqVO.getOrderId()); + AssertUtils.notEmpty(order, ORDER_DATE_ERROR); + + List packRespVOList = Boolean.TRUE.equals(isUp) ? + ordersMapper.selectOrderIds(order.getCreateTime().toString(), getUserOrganId(), order.getId()) : + ordersMapper.selectOrderIdsFalse(order.getCreateTime().toString(), getUserOrganId(), order.getId()); + + if (packRespVOList.isEmpty()) { + throw exception(NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE, Boolean.TRUE.equals(isUp) ? "第" : "最后"); + } + packRespVOS.setRecords(packRespVOList); + + packRespVOS.setTotal(1); + + orderIds.addAll(packRespVOS.getRecords().stream().map(PackRespVO::getId).toList()); + + return buildPageResult(orderIds,packRespVOS); + } + + + + // 打包分页查询 + private PageResult handleNormalCase(PackPageReqVO pageReqVO, List orderIds, PageDTO page) { + + pageReqVO.setCustomer(insertSeparator(pageReqVO.getCustomer())); + pageReqVO.setCustomOrderNo(insertSeparator(pageReqVO.getCustomOrderNo())); + pageReqVO.setAddress(insertSeparator(pageReqVO.getAddress())); + + + // 查询查询分页 + IPage packRespVOS = ordersMapper.selectOrderIdList(page, pageReqVO, getUserOrganId()); + + if (CollUtil.isEmpty(packRespVOS.getRecords())) { + return new PageResult<>(); + } + + orderIds.addAll(packRespVOS.getRecords().stream().map(PackRespVO::getId).toList()); + + return buildPageResult(orderIds, packRespVOS); + + } + + + + // 打包分页页面显示数据查询 + private PageResult buildPageResult(List orderIds,IPage packRespVOS){ + + if(orderIds.isEmpty()){ + return new PageResult<>(); + } + + + // 查询板材的总量 + List packRespVOList = orderPlateMapper.selectPackPlateNum(orderIds, getUserOrganId()); + + AssertUtils.notEmpty(packRespVOList, ErrorCodeConstants.ORDER_PLATE_ERROR); + + for (PackRespVO packRespVO : packRespVOList) { + packRespVO.setTotalPieceCount((long) packRespVO.getPlateIdList().size()); + packRespVO.setPlateIdList(null); + } + + + // 查询当前生产的包裹数量 + List respVOS = orderPackageMapper.selectPackPage(orderIds, getUserOrganId()); + + + for (PackRespVO packRespVO : respVOS) { + packRespVO.setPackCount((long) packRespVO.getPackIdList().size()); + packRespVO.setPackIdList(null); + } + + + // 查询当前生产单已经打包的板材数量 + List plateNum = orderPackageMapper.selectPackPieceCount(orderIds, getUserOrganId()); + + for (PackRespVO packRespVO : plateNum) { + packRespVO.setPackPieceCount((long) packRespVO.getPlateIdList().size()); + packRespVO.setPlateIdList(null); + } + + + for (PackRespVO vosRecords : packRespVOS.getRecords()) { + + // 板材总数 + vosRecords.setTotalPieceCount(packRespVOList.stream().filter(f -> Objects.equals(f.getId(), vosRecords.getId())).mapToLong(PackRespVO::getTotalPieceCount).sum()); + // 已打包数 + vosRecords.setPackCount(respVOS.stream().filter(f -> Objects.equals(f.getId(), vosRecords.getId())).mapToLong(PackRespVO::getPackCount).sum()); + // 已打包片数 + vosRecords.setPackPieceCount(plateNum.stream().filter(f -> Objects.equals(f.getId(), vosRecords.getId())).mapToLong(PackRespVO::getPackPieceCount).sum()); + // 待处理量 + vosRecords.setPendingNum(vosRecords.getTotalPieceCount() - vosRecords.getPackPieceCount()); + + } + + + return new PageResult<>(packRespVOS.getRecords(), packRespVOS.getTotal()); + + } + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsExcelListener.java new file mode 100644 index 000000000..1198f82bb --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsExcelListener.java @@ -0,0 +1,238 @@ +package com.cf.imes.module.executor.service.manage.parts; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.nacos.common.utils.StringUtils; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsImportExcelVO; +import com.cf.imes.module.executor.enums.manage.parts.CategoryEnum; +import com.cf.imes.module.executor.enums.manage.parts.ObjectEnum; +import com.cf.imes.module.executor.enums.manage.parts.WhetherEnum; +import com.cf.imes.module.executor.util.file.ExcelListener; +import lombok.extern.slf4j.Slf4j; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * 配件 导入监听器 + */ +@Slf4j +public final class PartsExcelListener extends ExcelListener { + + private static final String ZERO = "0"; + + /** + * 自定义用于暂时存储data + * 可以通过实例获取该值 + */ + private List datas = new ArrayList<>(); + + private boolean flag = true; + + private Map valueMap = new HashMap<>(); + + // 非空判断,错误写入;不为空则判断字符串长度是否超过 + private void isEmptyAndAdd(Supplier getter, Consumer setter,String msg, int maxLength) { + String value = getter.get(); + if (StringUtils.isEmpty(value)) { + setter.accept(msg + "不可为空"); + this.flag = false; + } else { // 字符长度判断 + isLong(value, setter, maxLength, msg); + } + } + + private void isEmpty(Supplier getter, Consumer setter,String msg) { + String value = getter.get(); + if (StringUtils.isEmpty(value)) { + setter.accept(msg + "不可为空"); + this.flag = false; + } + } + + //不为空时,判断长度 + private void isNotEmptyAndAdd(Supplier getter, Consumer setter,String msg, int maxLength) { + String value = getter.get(); + if (StringUtils.isNotEmpty(value)) { + isLong(value, setter, maxLength, msg); + } + } + + // 非空判断,并判断枚举值是否正确 + private & ObjectEnum> void isEmptyAndEnumAdd(Supplier getter, Consumer setter, String msg, Class enumClass) { + String value = getter.get(); + if (StringUtils.isEmpty(value)) { + setter.accept(msg + "不可为空"); + this.flag = false; + } else { + isNotEmptyToEnum(getter, setter, msg, enumClass); + } + } + + // 不为空,判断枚举值是否正确 + private & ObjectEnum> void isNotEmptyToEnum(Supplier getter, Consumer setter, String msg, Class enumClass) { + String value = getter.get(); + if (!StringUtils.isEmpty(value)) { + boolean isValid = false; + for (T enumValue : enumClass.getEnumConstants()) { + if (Objects.equals(enumValue.getValue(), value)) { + isValid = true; + break; + } + } + if (!isValid) { + setter.accept(msg + "请使用规范标识填写表格"); + this.flag = false; + } + } + } + + // 非空时判断字符串是否可以转换为Double,并判断整数位与小数位是否符合长度要求 + private void isEmptyAndDoubleAdd(Supplier getter, Consumer setter, String msg, int integerLength, int decimalLength) { + String value = getter.get(); + if (StringUtils.isNotEmpty(value)) { + // 判断是否可以转换 + try { + Double d = Double.parseDouble(value); + if (d < Double.parseDouble(ZERO)) { + setter.accept(msg + "必须大于0"); + } else { + // 处理科学计数法,保留小数点后四位 + DecimalFormat decimalFormat = new DecimalFormat("#.####"); + String valueString = decimalFormat.format(d); + + String[] split = valueString.split("\\."); + // 获取小数点前的位数 + int integerPartLength = split[0].length(); + // 获取小数点后的位数 + int fractionalPartLength = 0; + if (split.length > 2) { + fractionalPartLength = split[1].length(); + } + + if (integerPartLength > integerLength || fractionalPartLength > decimalLength) { + setter.accept(msg + "长度不合法,总长度不超过8位,小数点后不超过3位"); + } + } + } catch (NumberFormatException e) { + setter.accept(msg + "必须为数字"); + this.flag = false; + } + + } + } + // 判断字符串长度是否过长 + private void isLong(String value, Consumer setter, int maxLength, String msg) { + if (value.length() > maxLength) { + setter.accept(msg + "长度不能超过" + maxLength + "个字符"); + this.flag = false; + } + } + // 结果数据生成 + private String setResult(String result, String value) { + if (StringUtils.isEmpty(result)) { + return value; + } else { + return result + "," + value; + } + } + + /** + * 每解析一行都会回调invoke()方法 + * + * @param data 读取后的数据对象 + * @param context 内容 + */ + @Override + public void invoke(PartsImportExcelVO data, AnalysisContext context) { + +// 一,必须存在且合理 + isEmptyAndAdd(data::getGoodsId, data::setResult, setResult(data.getResult(), "物料编号"), 32); + isEmptyAndAdd(data::getName, data::setResult, setResult(data.getResult(), "物料名称"), 64); + isEmptyAndEnumAdd(data::getCategory, data::setResult, setResult(data.getResult(), "分类"), CategoryEnum.class); + isNotEmptyAndAdd(data::getCategory, data::setResult, setResult(data.getResult(), "分类"),32); + +// 二,分类,必须存在 + if (data.getCategory() != null ) { + if (!CategoryEnum.OTHER.getValue().equals(data.getCategory())) { // 不为其他 + isEmpty(data::getUnit, data::setResult, setResult(data.getResult(), "单位")); + if (CategoryEnum.EDGING.getValue().equals(data.getCategory())) { // 为封边 + isEmpty(data::getColor, data::setResult, setResult(data.getResult(), "颜色")); + isEmpty(data::getWidth, data::setResult, setResult(data.getResult(), "宽度")); + isEmpty(data::getThickness, data::setResult, setResult(data.getResult(), "厚度")); + } + } + } + +// 三,存在则判断是否符合 + isNotEmptyToEnum(data::getIsComposite, data::setResult, setResult(data.getResult(), "是否复合部件"), WhetherEnum.class); + isNotEmptyAndAdd(data::getType, data::setResult, setResult(data.getResult(), "子类型"), 64); + isNotEmptyAndAdd(data::getModel, data::setResult, setResult(data.getResult(), "型号"), 64); + isNotEmptyAndAdd(data::getColor, data::setResult, setResult(data.getResult(), "颜色"), 64); + isNotEmptyAndAdd(data::getMaterial, data::setResult, setResult(data.getResult(), "材质"), 64); + isNotEmptyAndAdd(data::getUnit, data::setResult, setResult(data.getResult(), "单位"), 32); + isNotEmptyAndAdd(data::getSpec, data::setResult, setResult(data.getResult(), "规格"), 64); + isNotEmptyAndAdd(data::getBrand, data::setResult, setResult(data.getResult(), "品牌"), 64); + isNotEmptyAndAdd(data::getFactor, data::setResult, setResult(data.getResult(), "厂家"), 128); + isEmptyAndDoubleAdd(data::getLength, data::setResult, setResult(data.getResult(), "长度"), 5 , 3); + isEmptyAndDoubleAdd(data::getWidth, data::setResult, setResult(data.getResult(), "宽度"), 5 , 3); + isEmptyAndDoubleAdd(data::getThickness, data::setResult, setResult(data.getResult(), "厚度"), 5 , 3); + isNotEmptyAndAdd(data::getRemark, data::setResult, setResult(data.getResult(), "备注"), 255); + + // 当为封边的时候,一定需要 +// if (StringUtils.isNotEmpty(data.getCategory())) { +// if (data.getCategory().equals(CategoryEnum.EDGING.getValue())) { +// isEmpty(data::getThickness, data::setResult, setResult(data.getResult(), "厚度")); +// isEmpty(data::getWidth, data::setResult, setResult(data.getResult(), "宽度")); +// } +// } + + if (data.getResult() != null) + data.setResult(data.getResult().replace("null,", "")); + valueMap.put(context.getCurrentRowNum(), data.getResult()); + datas.add(data); + } + + /** + * 读取完后操作 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + if (this.flag) + log.info("PlateExcelListener 所有数据读取完成"); + } + + /** + * 返回数据 + * + * @return 返回读取的数据集合 + **/ + public List getDates() { + return datas; + } + + /** + * 返回读取结果 + * + * @return 是否读取成功 + **/ + public boolean getFlag() { + return flag; + } + + /** + * 返回错误信息 + * + * @return String + **/ + public Map getValueMap() { + return valueMap; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsService.java new file mode 100644 index 000000000..01958b79e --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsService.java @@ -0,0 +1,94 @@ +package com.cf.imes.module.executor.service.manage.parts; + +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsCadPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsImportExcelVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.orderParts.PartsDO; +import org.springframework.boot.system.ApplicationHome; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.File; +import java.util.List; + +/** + * 配件表 parts_{N} Service 接口 + * + * @author 晨丰科技 + */ +public interface PartsService { + + /** + * 创建配件表 parts_{N} + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long create(@Valid PartsSaveReqVO createReqVO); + + /** + * 更新配件表 parts_{N} + * + * @param updateReqVO 更新信息 + */ + void update(@Valid PartsSaveReqVO updateReqVO); + + /** + * 删除配件表 parts_{N} + * + * @param id 编号 + */ + void delete(Long id, Long organId); + + /** + * 获得配件表 parts_{N} + * + * @param id 编号 + * @return 配件表 parts_{N} + */ + PartsDO get(Long id, Long organId); + + /** + * 获得配件表 parts_{N}分页 + * + * @param pageReqVO 分页查询 + * @return 配件表 parts_{N}分页 + */ + PageResult getPage(PartsPageReqVO pageReqVO); + + /** + * webcad获取配件表 parts_{N}分页 + * + * @param pageReqVO 分页查询 + * @return 配件表 parts_{N}分页 + */ + PageResult webCadGetPage(PartsPageReqVO pageReqVO); + + PageResult getCadPage(PartsCadPageReqVO pageReqVO); + + /** + * 生产导入文件模板下载 + */ + void exportTemplate(HttpServletResponse response, String value); + + /** + * 批量导入配件 + * + * @param importParts 导入配件列表 + * @param isUpdateSupport 是否支持更新 + */ + void importPartsList(List importParts, boolean isUpdateSupport, Long organId); + + + default String getSavePath() { + ApplicationHome applicationHome = new ApplicationHome(this.getClass()); + + // 保存目录位置根据项目需求可随意更改 + return applicationHome.getDir().getAbsolutePath() + File.separator + "type"; + + } + + List getPartAll(String category); +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsServiceImpl.java new file mode 100644 index 000000000..004ef0313 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/parts/PartsServiceImpl.java @@ -0,0 +1,261 @@ +package com.cf.imes.module.executor.service.manage.parts; + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.organ.core.aop.OrganIgnore; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsCadPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsImportExcelVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsPageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.parts.vo.PartsSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.orderParts.PartsDO; +import com.cf.imes.module.executor.dal.mysql.orderParts.PartsMapper; +import com.cf.imes.module.executor.enums.manage.parts.CategoryEnum; +import com.cf.imes.module.executor.util.file.FileHelperUtil; +import com.cf.imes.module.executor.util.number.NumberHelperUtil; +import com.cf.imes.module.system.api.organ.OrganApi; +import com.cf.imes.module.system.api.permission.PermissionApi; +import com.cf.imes.module.system.enums.ErrorCodeConstants; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; + + +/** + * 配件表 parts_{N} Service 实现类 + * + * @author 晨丰科技 + */ +@Service +@Validated +public class PartsServiceImpl implements PartsService { + + @Resource + private PartsMapper partsMapper; + + @Resource + private OrganApi organApi; + + @Resource + private PermissionApi permissionApi; + + @Resource + private NumberHelperUtil numberUtil; + + private final static String BASE_PARTS_IMPORT_PERMISSION = "base:accessory:import"; // 导入板材 + private final static String BASE_PARTS_DELETE_PERMISSION = "base:accessory:delete"; // 删除板材信息 + private final static String BASE_PARTS_CREATE_PERMISSION = "base:accessory:create"; // 创建板材信息 + private final static String BASE_PARTS_UPDATE_PERMISSION = "base:accessory:update"; // 更新板材信息 + private final static String BASE_PARTS_QUERY_PERMISSION = "base:accessory:query"; // 获得板材信息 + + + @Override + @OrganIgnore + public Long create(PartsSaveReqVO createReqVO) { + + validateFieldExists(createReqVO); + + PartsDO partsDO = BeanUtils.toBean(createReqVO, PartsDO.class); + Long organId = getOrganId(BASE_PARTS_CREATE_PERMISSION, getLoginUser().getId(), partsDO.getOrganId()); + partsDO.setOrganId(organId).setIsComposite(createReqVO.getIsComposite() != null && createReqVO.getIsComposite()); + // 判断是否存在--- goodsId + if (validateExistsByGoodsId(partsDO.getGoodsId(), organId)) { + throw exception(PARTS_GOOD_ID_EXISTS); + } + + partsMapper.insert(partsDO); + // 返回 + return partsDO.getId(); + } + + @Override + @OrganIgnore + @Transactional(rollbackFor = Exception.class) + public void update(PartsSaveReqVO updateReqVO) { + + validateFieldExists(updateReqVO); + + Long organId = getOrganId(BASE_PARTS_UPDATE_PERMISSION, getLoginUser().getId(), updateReqVO.getOrganId()); + // 校验id存在 + boolean index = validateExistsById(updateReqVO.getId(),organId); + + if (!index) { + throw exception(PARTS_NOT_EXISTS); + } + + // 校验goodsId是否存在 + if (!validateExistsExceptGoodsId(updateReqVO.getId(),updateReqVO.getGoodsId(),organId)) { + throw exception(PARTS_GOOD_ID_EXISTS); + } + // 更新 + updateReqVO.setOrganId(organId).setIsComposite(updateReqVO.getIsComposite() != null && updateReqVO.getIsComposite()); + PartsDO updateObj = BeanUtils.toBean(updateReqVO, PartsDO.class); + partsMapper.updateById(updateObj); + } + + @Override + @OrganIgnore + public void delete(Long id, Long organId) { + // 校验存在 + if (!validateExistsById(id, getOrganId(BASE_PARTS_DELETE_PERMISSION, getLoginUser().getId(), organId))) { + throw exception(PARTS_NOT_EXISTS); + } + + // 删除 + partsMapper.deleteById(id); + } + + private boolean validateExistsById(Long id, Long organId) { + if (partsMapper.selectById(id, organId) == null) { + return false; + } + return true; + } + + private boolean validateExistsByGoodsId(String goodsId, Long organId) { + if (partsMapper.selectByGoodID(goodsId, organId) == null) { + return false; + } + return true; + } + + private boolean validateExistsExceptGoodsId(Long id, String goodsId, Long organId) { + if (partsMapper.selectExceptGoodID(id, goodsId, organId) == null) { // 不存在相同的goods_id + return true; + } + return false; + } + + @Override + @OrganIgnore + public PartsDO get(Long id, Long organId) { + organId = getOrganId(BASE_PARTS_QUERY_PERMISSION, getLoginUser().getId(), organId); + return partsMapper.selectById(id, organId); + } + + @Override + @OrganIgnore + public PageResult getPage(PartsPageReqVO pageReqVO) { + pageReqVO.setOrganId(getOrganId(BASE_PARTS_QUERY_PERMISSION, getLoginUser().getId(), pageReqVO.getOrganId())) + .setLength(numberUtil.compareLength(pageReqVO.getLength())) + .setWidth(numberUtil.compareLength(pageReqVO.getWidth())) + .setThickness(numberUtil.compareLength(pageReqVO.getThickness())); + + return partsMapper.selectPage(pageReqVO); + } + + @Override + public PageResult webCadGetPage(PartsPageReqVO pageReqVO) { + pageReqVO.setLength(numberUtil.compareLength(pageReqVO.getLength())) + .setWidth(numberUtil.compareLength(pageReqVO.getWidth())) + .setThickness(numberUtil.compareLength(pageReqVO.getThickness())); + + return partsMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getCadPage(PartsCadPageReqVO pageReqVO) { +// pageReqVO.setOrganId(getOrganId(BASE_PARTS_QUERY_PERMISSION, getLoginUser().getId(), pageReqVO.getOrganId())); + + return partsMapper.selectCadPage(pageReqVO); + } + + @Override + @OrganIgnore + public void exportTemplate(HttpServletResponse response, String value) { + String rootPath = getSavePath(); + FileHelperUtil.getFile(rootPath, response, value); + } + + @Override + @OrganIgnore + public void importPartsList(List importParts, boolean isUpdateSupport, Long organId) { + + // 组织id + organId = getOrganId(BASE_PARTS_IMPORT_PERMISSION, getLoginUser().getId(), organId); + + // 批量插入集合 + List insertList = new ArrayList<>(); + // 批量更新集合 + List updateList = new ArrayList<>(); + + Long finalOrganId = organId; + + importParts.forEach(importPart -> { + // 判断如果不存在,在进行插入 + PartsDO existPlate = partsMapper.selectByGoodID(importPart.getGoodsId(), finalOrganId); + if (existPlate == null) { // 不存在 + insertList.add(BeanUtils.toBean(importPart, PartsDO.class).setOrganId(finalOrganId)); + return; + } + // 判断是否允许更新 + if (!isUpdateSupport) { + PartsDO partsDO = BeanUtils.toBean(importPart, PartsDO.class).setOrganId(finalOrganId).setId(existPlate.getId()); + updateList.add(partsDO); + } + }); +// 批量插入,批量更新 + if (!insertList.isEmpty()) { + partsMapper.insertBatch(insertList); + } + if (!updateList.isEmpty()) { + partsMapper.updateBatch(updateList); + } + } + + @Override + public List getPartAll(String category) { + return partsMapper.getAllByOrganId(OrganContextHolder.getOrganId(), category); + } + + private void validateOrganExists(Long organId) { + CommonResult index = organApi.validOrgan(organId); + if (!index.isSuccess()) { + throw exception(ErrorCodeConstants.ORGAN_NOT_EXISTS); + } + } + + // 组织id返回 + private Long getOrganId(String type, Long userId, Long organId) { + + boolean hasPermission = permissionApi.hasRoles(userId, type).getData(); + + Long organIdDefault = OrganContextHolder.getOrganId(); + + if (hasPermission && organId != null && organId != 0) { + + validateOrganExists(organId); + + organIdDefault = organId; + } + + return organIdDefault; + } + + // 必填字段判断 + private void validateFieldExists(PartsSaveReqVO partsSaveReqVO) { + if (!CategoryEnum.OTHER.getValue().equals(partsSaveReqVO.getCategory())) { // 不为其他 + if (partsSaveReqVO.getUnit() == null || partsSaveReqVO.getUnit().isEmpty()) { + throw exception(PARTS_UNIT_NOT_NULL); + } + if (CategoryEnum.EDGING.getValue().equals(partsSaveReqVO.getCategory())) { // 为封边 + if (partsSaveReqVO.getColor() == null || partsSaveReqVO.getWidth() == null || partsSaveReqVO.getThickness() == null) { + throw exception(PARTS_EDGE_NOT_NULL); + } + } + } + + } + + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateExcelListener.java new file mode 100644 index 000000000..88f900a0c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateExcelListener.java @@ -0,0 +1,146 @@ +package com.cf.imes.module.executor.service.manage.plate; + +import com.alibaba.excel.context.AnalysisContext; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateImportExcelVO; +import com.cf.imes.module.executor.util.file.ExcelListener; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +public final class PlateExcelListener extends ExcelListener { + + /** + * 自定义用于暂时存储data + * 可以通过实例获取该值 + */ + private List datas = new ArrayList<>(); + + private boolean flag = true; + + private Map valueMap = new HashMap<>(); + + /** + * 每解析一行都会回调invoke()方法 + * + * @param data 读取后的数据对象 + * @param context 内容 + */ + @Override + public void invoke(PlateImportExcelVO data, AnalysisContext context) { + if (!data.isValidGoods()) {//返回false,表示商品信息无效;否则返回true,表示商品信息有效 + data.setResult("板材【*】信息请填写完整"); + this.flag = false; + } + checkData(data.getHeight(),"高度",data); + checkData(data.getWidth(),"宽度",data); + checkData(data.getThickness(),"厚度",data); + if (data.getPrice() == null || data.getPrice().equals("")) { + data.setPrice("0"); + } + checkData(data.getPrice(),"价格",data); + checkTexture(data.getTexture(),"纹理",data); +// 字段长度判断 + checkLength(data.getGoodsId(),"物料编号",data,32); + checkLength(data.getGoodsName(),"物料名称",data,64); + checkLength(data.getMaterial(),"材质",data,64); + checkLength(data.getColor(),"颜色",data,32); + checkLength(data.getSpec(),"规格",data,64); + checkLength(data.getBrand(),"品牌",data,64); + checkLength(data.getRemark(),"备注",data,255); + + if (data.getResult() != null) + data.setResult(data.getResult().replace("null,", "")); + valueMap.put(context.getCurrentRowNum(), data.getResult()); + datas.add(data); + } + +// 错误判断 + private void checkData(String valueCheck, String head, PlateImportExcelVO data) { +// 长宽厚、价格判断非空 + if (valueCheck == null || valueCheck.equals("")) { + this.flag = false; + data.setResult(data.getResult() + "," + head + "信息缺少"); + } else { + try { + if (!data.checkPrecision(Double.valueOf(valueCheck))) { + data.setResult(data.getResult() + "," + head + "数据有误"); + this.flag = false; + } + } catch (NumberFormatException e) { + this.flag = false; + data.setResult(data.getResult() + "," + head + "需要填写数字"); + } + } + } + + private void checkTexture(String valueCheck, String head, PlateImportExcelVO data) { + + if (valueCheck != null && !valueCheck.equals("")) { + String value = valueCheck.trim(); + if (!value.equals("有") && !value.equals("无")) { + this.flag = false; + data.setResult(data.getResult() + "," + head + "信息有误"); + } else if (value.equals("有")) { + data.setTexture("有"); + } else { + data.setTexture("无"); + } + } + } + + + /** + * 字段长度判断 + */ + private void checkLength(String valueCheck, String head, PlateImportExcelVO data, int maxLength) { + if (valueCheck != null && !valueCheck.equals("")) { + if (valueCheck.length() > maxLength) { + this.flag = false; + data.setResult(data.getResult() + "," + head + "信息有误"); + } + } + } + + /** + * 读取完后操作 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + if (this.flag) + log.info("PlateExcelListener 所有数据读取完成"); + } + + /** + * 返回数据 + * + * @return 返回读取的数据集合 + **/ + public List getDates() { + return datas; + } + + /** + * 返回读取结果 + * + * @return 是否读取成功 + **/ + public boolean getFlag() { + return flag; + } + + /** + * 返回错误信息 + * + * @return String + **/ + public Map getValueMap() { + return valueMap; + } + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageService.java new file mode 100644 index 000000000..ccaecac11 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageService.java @@ -0,0 +1,100 @@ +package com.cf.imes.module.executor.service.manage.plate; + +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateImportExcelVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateImportRespVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlatePageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; +import org.springframework.boot.system.ApplicationHome; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.File; +import java.util.List; + +/** + * 板材信息表 plate_{N} Service 接口 + * + * @author 晨丰科技 + */ +public interface PlateManageService { + + /** + * 创建板材信息表 plate_{N} + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createPlate(@Valid PlateSaveReqVO createReqVO); + + /** + * 更新板材信息表 plate_{N} + * + * @param updateReqVO 更新信息 + */ + void updatePlate(@Valid PlateSaveReqVO updateReqVO); + + /** + * 删除板材信息表 plate_{N} + * + * @param id 编号 + */ + void deletePlate(Long id,Long organId); + + /** + * 获得板材信息表 plate_{N} + * + * @param id 编号 + * @return 板材信息表 plate_{N} + */ + PlateGoodDO getPlate(Long id, Long organId); + + /** + * 获得板材信息表 plate_{N} + * + * @param id 编号 + * @return 板材信息表 plate_{N} + */ + PlateGoodDO getPlateGoods(String id, Long organId); + + /** + * 获得板材信息表 plate_{N}分页 + * + * @param pageReqVO 分页查询 + * @return 板材信息表 plate_{N}分页 + */ + PageResult getPlatePage(PlatePageReqVO pageReqVO); + + /** + * webcad获取板材信息表 plate_{N}分页 + * + * @param pageReqVO 分页查询 + * @return 板材信息表 plate_{N}分页 + */ + PageResult webCadGetPlatePage(PlatePageReqVO pageReqVO); + + /** + * 批量导入板材 + * + * @param importUsers 导入板材列表 + * @param isUpdateSupport 是否支持更新 + * @return 导入结果 + */ + PlateImportRespVO importPlateList(List importUsers, boolean isUpdateSupport , Long organId); + + /** + * 生产导入文件模板下载 + */ + void exportTemplate(HttpServletResponse response, String value); + + default String getSavePath() { + ApplicationHome applicationHome = new ApplicationHome(this.getClass()); + + // 保存目录位置根据项目需求可随意更改 + return applicationHome.getDir().getAbsolutePath() + File.separator + "type"; + + } + + List getPlateAll(); +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageServiceImpl.java new file mode 100644 index 000000000..85cc121aa --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/plate/PlateManageServiceImpl.java @@ -0,0 +1,226 @@ +package com.cf.imes.module.executor.service.manage.plate; + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.organ.core.aop.OrganIgnore; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateImportExcelVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateImportRespVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlatePageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.plate.PlateSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO; +import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper; +import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; +import com.cf.imes.module.executor.util.file.FileHelperUtil; +import com.cf.imes.module.system.api.organ.OrganApi; +import com.cf.imes.module.system.api.permission.PermissionApi; +import com.cf.imes.module.system.enums.ErrorCodeConstants; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.PLATE_GOODS_ID_NOT_SAME; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_NOT_EXISTS; + +/** + * 板材信息表 plate_{N} Service 实现类 + * + * @author 晨丰科技 + */ +@Service +@Validated +public class PlateManageServiceImpl implements PlateManageService { + + @Resource + private PlateGoodMapper plateGoodMapper; + + @Resource + private OrganApi organApi; + + @Resource + private PermissionApi permissionApi; + + private final static String BASE_PLATE_IMPORT_PERMISSION = "base:plate:import"; // 导入板材 + private final static String BASE_PLATE_DELETE_PERMISSION = "base:plate:delete"; // 删除板材信息 + private final static String BASE_PLATE_CREATE_PERMISSION = "base:plate:create"; // 创建板材信息 + private final static String BASE_PLATE_UPDATE_PERMISSION = "base:plate:update"; // 更新板材信息 + private final static String BASE_PLATE_QUERY_PERMISSION = "base:plate:query"; // 获得板材信息 + + @Override + @OrganIgnore + public Long createPlate(PlateSaveReqVO createReqVO) { + PlateGoodDO plate = BeanUtils.toBean(createReqVO, PlateGoodDO.class); + +// 判断板材是否存在 + validateGoodExists(plate.getGoodsId(), + getOrganId(BASE_PLATE_CREATE_PERMISSION, getLoginUser().getId(), plate.getOrganId())); + + plateGoodMapper.insert(plate);// 组织id未传输 + // 返回 + return plate.getId(); + } + + @Override + @OrganIgnore + @Transactional(rollbackFor = Exception.class) + public void updatePlate(PlateSaveReqVO updateReqVO) { + // 校验存在 + Long organId = getOrganId(BASE_PLATE_UPDATE_PERMISSION, getLoginUser().getId(), updateReqVO.getOrganId()); + if (updateReqVO.getId() == null) { + throw exception(ErrorCodeConstants.PLATE_NOT_EXISTS); + } + validatePlateExists(Long.valueOf(updateReqVO.getId()), organId); + PlateGoodDO updateObj = BeanUtils.toBean(updateReqVO, PlateGoodDO.class); + // 校验板材goods_id是否相同 + if (plateGoodMapper.isByGoodIDAndId(updateReqVO.getGoodsId(), organId, Long.valueOf(updateReqVO.getId()))) { + throw exception(PLATE_GOODS_ID_NOT_SAME); + } + plateGoodMapper.updateById(updateObj); + } + + @Override + @OrganIgnore + @Transactional(rollbackFor = Exception.class) + public void deletePlate(Long id, Long organId) { + // 校验存在 + validatePlateExists(id, + getOrganId(BASE_PLATE_DELETE_PERMISSION, getLoginUser().getId(), organId)); + // 删除 + plateGoodMapper.deleteById(id); + } + + private void validatePlateExists(Long id, Long organId) { + if (plateGoodMapper.selectOneById(id, organId) == null) { + throw exception(REMAIN_PLATE_NOT_EXISTS); + } + } + + @Override + @OrganIgnore + public PlateGoodDO getPlate(Long id, Long organId) { + return plateGoodMapper.selectOneById(id, organId); + } + + @Override + public PlateGoodDO getPlateGoods(String id, Long organId) { + return plateGoodMapper.selectByGoodID(id, organId); + } + + @Override + @OrganIgnore + public PageResult getPlatePage(PlatePageReqVO pageReqVO) { +// if (permissionApi.hasRoles(getLoginUser().getId(), BASE_PLATE_QUERY_PERMISSION).getData()) { +// if (pageReqVO.getOrganId() != null && pageReqVO.getOrganId() != 0) { +// validateOrganExists(pageReqVO.getOrganId()); +// } +// } else { +// pageReqVO.setOrganId(OrganContextHolder.getOrganId()); +// } +// if (pageReqVO.getOrganId() == null || pageReqVO.getOrganId() == 0) { + pageReqVO.setOrganId(getOrganId(BASE_PLATE_QUERY_PERMISSION, getLoginUser().getId(), pageReqVO.getOrganId())); +// } + return plateGoodMapper.selectPage(pageReqVO); + } + + @Override + public PageResult webCadGetPlatePage(PlatePageReqVO pageReqVO) { + return plateGoodMapper.selectPage(pageReqVO); + } + + + @Override + @OrganIgnore + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public PlateImportRespVO importPlateList(List importPlates, boolean isUpdateSupport, Long organId) { + + organId = getOrganId(BASE_PLATE_IMPORT_PERMISSION, getLoginUser().getId(), organId); + + PlateImportRespVO respVO = PlateImportRespVO.builder().createPlateNames(new ArrayList<>()) + .updatePlateNames(new ArrayList<>()).failurePlateNames(new LinkedHashMap<>()).build(); +// 批量插入集合 + List insertList = new ArrayList<>(); +// 批量更新集合 + List updateList = new ArrayList<>(); + Long finalOrganId = organId; + importPlates.forEach(importPlate -> { + // 判断如果不存在,在进行插入 + PlateGoodDO existPlate = plateGoodMapper.selectByGoodID(importPlate.getGoodsId(), finalOrganId); + if (existPlate == null) { + respVO.getCreatePlateNames().add(importPlate.getGoodsName()); + insertList.add(BeanUtils.toBean(importPlate, PlateGoodDO.class) + .setOrganId(finalOrganId)); +// .setTexture(Boolean.valueOf(importPlate.getTexture())); + return; + } + // 判断是否允许更新 + if (!isUpdateSupport) { + respVO.getFailurePlateNames().put(importPlate.getGoodsName(), ErrorCodeConstants.PLATE_EXISTS.getMsg()); + PlateGoodDO plateDO = BeanUtils.toBean(importPlate, PlateGoodDO.class) + .setOrganId(finalOrganId) + .setId(existPlate.getId()); +// .setTexture(Boolean.valueOf(importPlate.getTexture())); + updateList.add(plateDO); + } + }); +// 批量插入,批量更新 + if (insertList.size() > 0) { + plateGoodMapper.insertBatch(insertList); + } + if (updateList.size() > 0) { + plateGoodMapper.updateBatch(updateList); + } + return respVO; + } + + @Override + @OrganIgnore + public void exportTemplate(HttpServletResponse response, String value) { + String rootPath = getSavePath(); + FileHelperUtil.getFile(rootPath, response, value); + } + + @Override + public List getPlateAll() { + return plateGoodMapper.getAllByOrganId(OrganContextHolder.getOrganId()); + } + + private void validateOrganExists(Long organId) { + CommonResult index = organApi.validOrgan(organId); + if (!index.isSuccess()) { + throw exception(ErrorCodeConstants.ORGAN_NOT_EXISTS); + } + } + + // 当前组织中板材是否存在 + private void validateGoodExists(String goodsId, Long organId) { + if (plateGoodMapper.selectByGoodID(goodsId, organId) != null) { + throw exception(ErrorCodeConstants.PLATE_EXISTS); + } + } + + // 组织id返回 + private Long getOrganId(String type, Long userId, Long organId) { + + boolean hasPermission = permissionApi.hasRoles(userId, type).getData(); + + Long organIdDefault = OrganContextHolder.getOrganId(); + + if (hasPermission && organId != null && organId != 0) { + + validateOrganExists(organId); + + organIdDefault = organId; + } + + return organIdDefault; + } +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/remainplaten/RemainPlateManageService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/remainplaten/RemainPlateManageService.java new file mode 100644 index 000000000..1cb891eae --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/remainplaten/RemainPlateManageService.java @@ -0,0 +1,89 @@ +package com.cf.imes.module.executor.service.manage.remainplaten; + +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlatePageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlateSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO; + +import javax.validation.Valid; +import java.util.Set; + +/** + * 生产单余料板表 Service 接口 + * + * @author 晨丰科技 + */ +public interface RemainPlateManageService { + + /** + * 创建生产单余料板表 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Boolean createRemainPlate(@Valid RemainPlateSaveReqVO createReqVO); + + /** + * 创建生产单余料板表 + * + * @param createReqVOS 创建信息 多个 + * @return 编号 + */ + Boolean createRemainPlateMultiple(@Valid Set createReqVOS); + + /** + * 批量核销 + * + * @param ids 编号 + * @param status 状态 + * @param useType 使用类型 + * @param planId 排单id + */ + void updateRemainPlateStatus(Set ids, Integer status,Integer useType,Long planId); + + /** + * 更新生产单余料板表 + * + * @param ids 编号 + * @param status 状态 + */ + void revertRemainPlateStatus(Set ids, Integer status); + + /** + * 核销板材库 + * + * @param updateReqVO 更新信息 + */ + void updateRemainPlate(@Valid RemainPlateSaveReqVO updateReqVO); + + /** + * 删除生产单余料板表 + * + * @param ids 编号 + */ + void deleteRemainPlate(Set ids); + + /** + * 获得生产单余料板表 + * + * @param id 编号 + * @return 生产单余料板表 + */ + RemainPlateDO getRemainPlate(Long id); + + /** + * 获得生产单余料板表 + * + * @param pageReqVO 分页查询 + * @return 生产单余料板表 + */ + PageResult getRemainPlatePage(RemainPlatePageReqVO pageReqVO); + + /** + * 查询可添加余料板 + * + * @param pageReqVO 分页查询 + * @return 生产单余料板表 + */ + PageResult getRemainPlatePageToAdd(RemainPlatePageReqVO pageReqVO); +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/remainplaten/RemainPlateManageServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/remainplaten/RemainPlateManageServiceImpl.java new file mode 100644 index 000000000..774638c62 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/remainplaten/RemainPlateManageServiceImpl.java @@ -0,0 +1,198 @@ +package com.cf.imes.module.executor.service.manage.remainplaten; + +import com.cf.imes.framework.common.enums.DeletedCodeEnum; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlatePageReqVO; +import com.cf.imes.module.executor.controller.admin.manage.plate.vo.remain.RemainPlateSaveReqVO; +import com.cf.imes.module.executor.dal.dataobject.remainplaten.RemainPlateDO; +import com.cf.imes.module.executor.dal.mysql.remainplaten.RemainPlateMapper; +import com.cf.imes.module.executor.enums.manage.remainPlate.RemainPlateStatusEnum; +import com.cf.imes.module.executor.enums.manage.remainPlate.RemainPlateUseTypeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_COUNT_MAX; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_ID_NOT_EXISTS; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_NOT_EXISTS; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_STATUS_NO_USED; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_STATUS_USED; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.REMAIN_PLATE_USR_TYPE; + +/** + * 生产单余料板表 order_remain_plate_{N} Service 实现类 + * + * @author 晨丰科技 + */ +@Service +@Validated +public class RemainPlateManageServiceImpl implements RemainPlateManageService { + + @Resource + private RemainPlateMapper remainPlateMapper; + + private static final Integer MAX_NUM = 999; // 余料单次最大条数 + @Override + public Boolean createRemainPlate(RemainPlateSaveReqVO createReqVO) { + List remainPlates = new ArrayList<>(); + // 限制新增数量不能超过999 + if (createReqVO.getCount() > MAX_NUM) { + throw exception(REMAIN_PLATE_COUNT_MAX); + } + // 插入 + if (createReqVO.getCount() >= 1) { + for (int i = 0; i < createReqVO.getCount(); i++) { + RemainPlateDO remainPlate = BeanUtils.toBean(createReqVO, RemainPlateDO.class).setCount(1).setOrganId(OrganContextHolder.getOrganId()); + remainPlates.add(remainPlate); + } + } + // 批量增加 + return remainPlateMapper.insertBatch(remainPlates); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean createRemainPlateMultiple(Set createReqVOS) { + Collection remainPlates = new ArrayList<>(); + createReqVOS.forEach(createReqVO -> { + // 判断该排单是否已经添加过余料 + if (remainPlateMapper.selectRemainPlatesByInitPlanId(createReqVO.getInitPlanId(), DeletedCodeEnum.NOT_DELETED.getStatus(), OrganContextHolder.getOrganId()).size() > 0) { + // 删除余料 + remainPlateMapper.deleteRemainPlate(createReqVO.getInitPlanId(), OrganContextHolder.getOrganId()); + } + RemainPlateDO remainPlate = BeanUtils.toBean(createReqVO, RemainPlateDO.class); + remainPlates.add(remainPlate); + }); + return remainPlateMapper.insertBatch(remainPlates); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateRemainPlateStatus(Set ids, Integer status, Integer useType, Long planId) { + // 余料存在判断 + validateRemainPlateExists(ids); + if (useType != RemainPlateUseTypeEnum.TYPE_ONE.getStatus() && useType != RemainPlateUseTypeEnum.TYPE_ZERO.getStatus()) { //余料使用状态为2或3 + // 判断该排单是否存在以使用的余料 + if (remainPlateMapper.selectRemainPlatesByPlanId(planId, RemainPlateStatusEnum.USED.getStatus(), + DeletedCodeEnum.NOT_DELETED.getStatus(), OrganContextHolder.getOrganId()).size() > 0) { + // 余料状态还原 + remainPlateMapper.updateRemainPlateStatusByPlanId(RemainPlateStatusEnum.UNUSED.getStatus(), RemainPlateUseTypeEnum.TYPE_ZERO.getStatus(), + OrganContextHolder.getOrganId(), planId); + } + } + if (ids != null){ + //判断是否符合核销标准 + validateRemainPlateStatus(ids, RemainPlateStatusEnum.USED.getStatus()); + //以id为条件批量修改余料库中的状态 + remainPlateMapper.updateRemainPlateStatus(ids, status, useType, OrganContextHolder.getOrganId(), planId); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void revertRemainPlateStatus(Set ids, Integer status) { + if (ids == null) { + throw exception(REMAIN_PLATE_ID_NOT_EXISTS); + } + // 判断余料的状态是否存在使用中 + validateRemainPlateStatus(ids, RemainPlateStatusEnum.UNUSED.getStatus()); + // 判断使用类型是否为核销 + for (Long id : ids) { + if (!validateRemainPlateUseType(id).equals(RemainPlateUseTypeEnum.TYPE_ONE.getStatus())) { + throw exception(REMAIN_PLATE_USR_TYPE); + } + } + remainPlateMapper.updateRemainPlateStatus(ids, status, null, OrganContextHolder.getOrganId(), 0L); + } + + @Override + public void updateRemainPlate(RemainPlateSaveReqVO updateReqVO) { + // 校验存在 + validateRemainPlateExists(updateReqVO.getId()); + // 是否使用 + if (validateRemainPlateStatus(updateReqVO.getId()) == RemainPlateStatusEnum.USED.getStatus()) { + throw exception(REMAIN_PLATE_STATUS_USED); + } + // 判断是否为开料添加 + RemainPlateDO updateObj = validateRemainPlateIsCutting(updateReqVO.getId()); + RemainPlateDO updateUpSaveVO = BeanUtils.toBean(updateReqVO, RemainPlateDO.class); + updateObj.setWidth(updateUpSaveVO.getWidth()).setLength(updateUpSaveVO.getLength()).setThickness(updateUpSaveVO.getThickness()) + .setMaterial(updateUpSaveVO.getMaterial()).setColor(updateUpSaveVO.getColor()).setBrand(updateUpSaveVO.getBrand()) + .setRemark(updateUpSaveVO.getRemark()).setStore(updateUpSaveVO.getStore()).setTexture(updateUpSaveVO.getTexture()) + .setPlaceStyle(updateUpSaveVO.getPlaceStyle()).setOutLineJson(updateUpSaveVO.getOutLineJson()); + remainPlateMapper.updateById(updateUpSaveVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteRemainPlate(Set ids) { + if (ids == null) { + throw exception(REMAIN_PLATE_ID_NOT_EXISTS); + } + // 余料存在判断 + validateRemainPlateExists(ids); + // 判断余料的状态是否存在使用中 + validateRemainPlateStatus(ids, RemainPlateStatusEnum.USED.getStatus()); + // 删除 + remainPlateMapper.deleteBatchIds(ids); + } + + // 判断余料板是否正在使用 + private void validateRemainPlateStatus(Set ids, Integer status) { + for (Long id : ids) { + if (validateRemainPlateStatus(id) == status) { + if (status == RemainPlateStatusEnum.USED.getStatus()) + throw exception(REMAIN_PLATE_STATUS_USED); + if (status == RemainPlateStatusEnum.UNUSED.getStatus()) + throw exception(REMAIN_PLATE_STATUS_NO_USED); + } + } + } + + private void validateRemainPlateExists(Long id) { + if (remainPlateMapper.selectById(id) == null) { + throw exception(REMAIN_PLATE_NOT_EXISTS); + } + } + private void validateRemainPlateExists(Set id) { + if (remainPlateMapper.selectBatchIds(id).isEmpty()) { + throw exception(REMAIN_PLATE_NOT_EXISTS); + } + } + private RemainPlateDO validateRemainPlateIsCutting(Long id) { + return remainPlateMapper.selectById(id); + } + + private Integer validateRemainPlateStatus(Long id) { + return remainPlateMapper.selectById(id).getStatus(); + } + + private Integer validateRemainPlateUseType(Long id) { + return remainPlateMapper.selectById(id).getUseType(); + } + + @Override + public RemainPlateDO getRemainPlate(Long id) { + return remainPlateMapper.selectById(id); + } + + @Override + public PageResult getRemainPlatePage(RemainPlatePageReqVO pageReqVO) { + return remainPlateMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getRemainPlatePageToAdd(RemainPlatePageReqVO pageReqVO) { + return remainPlateMapper.selectPageToAdd(pageReqVO.setStatus(RemainPlateStatusEnum.UNUSED.getStatus())); + } + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/voice/VoiceService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/voice/VoiceService.java new file mode 100644 index 000000000..de95e4cbc --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/voice/VoiceService.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.executor.service.manage.voice; + + +import org.springframework.http.ResponseEntity; + +import java.io.IOException; +import java.sql.SQLException; + +public interface VoiceService { + + + // 生成音频文件 + + String voiceAnnouncements(String data) throws IOException, SQLException; + + + // 把生成的音频文件进行压缩 + void zipFiles(String sourceFile, String gzipFile) throws IOException; + + void deleteFiles(String sourceFile); + + ResponseEntity getVoice(String sourceFile); + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/voice/VoiceServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/voice/VoiceServiceImpl.java new file mode 100644 index 000000000..b7047f52a --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/manage/voice/VoiceServiceImpl.java @@ -0,0 +1,229 @@ +package com.cf.imes.module.executor.service.manage.voice; + + +import com.cf.imes.module.executor.config.VocieParameters; +import com.jacob.activeX.ActiveXComponent; +import com.jacob.com.Dispatch; +import com.jacob.com.Variant; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.WritableByteChannel; +import java.util.Objects; +import java.util.Random; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@Service +@Slf4j +public class VoiceServiceImpl implements VoiceService{ + + @Resource + private VocieParameters vocieParameters; + + + + +// static { +// System.loadLibrary("jacob-1.18-x64"); +// } + + //生成音频文件 + @Override + public String voiceAnnouncements(String data) { + + + // 音频保存的路径 + String path = vocieParameters.getPath(); + + // 设置音频的质量( 越大越好,目前最大好像 22,最小为 4 ) + Long quality = vocieParameters.getQuality(); + + // 朗读声音大小 + Long soundSize = vocieParameters.getSoundSize(); + + // 朗读速度 + Long readingSpeed = vocieParameters.getReadingSpeed(); + + ActiveXComponent ax = null; + Dispatch spFileStream = null; + Dispatch spAudioFormat = null; + Dispatch spVoice = null; + try{ + ax = new ActiveXComponent("Sapi.SpFileStream"); + spFileStream = ax.getObject(); + + ax = new ActiveXComponent("Sapi.SpAudioFormat"); + spAudioFormat = ax.getObject(); + + spVoice = new ActiveXComponent("Sapi.SpVoice").getObject(); + // 设置音频流格式 + Dispatch.put(spAudioFormat, "Type", new Variant(quality)); + // 设置文件输出流格式 + Dispatch.putRef(spFileStream, "Format", spAudioFormat); + // 随机数,控制文件的名字 + int randomInt = new Random(System.currentTimeMillis()).nextInt(900) + 100;// 生成100到999之间的随机数 + // 文件的路径 + String filePath = path + randomInt + ".mp3"; + + // 调用输出文件流打开方法,创建一个.wav文件 + Dispatch.call(spFileStream, "Open", new Variant(filePath), new Variant(3), new Variant(true)); + // 设置声音对象的音频输出流为输出文件对象 + Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream); + // 设置音量 0 ~ 100 + Dispatch.put(spVoice, "Volume", new Variant(soundSize)); + // 设置朗读速度 -10 ~ +10 + Dispatch.put(spVoice, "Rate", new Variant(readingSpeed)); + + Dispatch.call(spVoice, "Speak", new Variant(data)); + + log.info("输出语音文件成功!"); + + return filePath; + + }catch(Exception e){ + e.printStackTrace(); + }finally { + // 关闭输出文件 + Dispatch.call(Objects.requireNonNull(spFileStream), "Close"); + Dispatch.putRef(Objects.requireNonNull(spVoice), "AudioOutputStream", null); + + Objects.requireNonNull(spAudioFormat).safeRelease(); + spFileStream.safeRelease(); + spVoice.safeRelease(); + ax.safeRelease(); + } + + return null; + } + + + + + + @Override + public ResponseEntity getVoice( String fileName) { + try { + File audioFile = new File(fileName); + if (!audioFile.exists()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); + } + + // 读取文件到字节数组 + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try (FileInputStream fileInputStream = new FileInputStream(audioFile)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fileInputStream.read(buffer)) != -1) { + byteArrayOutputStream.write(buffer, 0, bytesRead); + } + } + + byte[] audioBytes = byteArrayOutputStream.toByteArray(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.parseMediaType("audio/mpeg")); + headers.setContentLength(audioBytes.length); + headers.setCacheControl("must-revalidate, post-check=0, pre-check=0"); + + return new ResponseEntity<>(audioBytes, headers, HttpStatus.OK); + + } catch (IOException e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); + } + } + + + + + + + + + /** + * 把生成的音频文件进行压缩 + * @param fileNames 需要压缩的文件名称列表(包含相对路径) + * @param zipOutName 压缩后的文件名称 + **/ + @Override + public void zipFiles(String fileNames, String zipOutName) throws IOException { + WritableByteChannel writableByteChannel = null; + ByteBuffer buffer = ByteBuffer.allocate(2048); + FileInputStream fileInputStream = null; + FileChannel fileChannel = null; + try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipOutName))) { + writableByteChannel = Channels.newChannel(zipOutputStream); + File source = new File(fileNames); + zipOutputStream.putNextEntry(new ZipEntry(source.getName())); + fileInputStream = new FileInputStream(fileNames); + fileChannel = fileInputStream.getChannel(); + while (fileChannel.read(buffer) != -1) { + //更新缓存区位置 + buffer.flip(); + while (buffer.hasRemaining()) { + writableByteChannel.write(buffer); + } + buffer.rewind(); + } + fileChannel.close(); + + log.info("文件压缩成功"); + + + } catch (Exception e) { + log.error("batchZipFiles error fileNames:"); + } finally { + IOUtils.closeQuietly(writableByteChannel); + IOUtils.closeQuietly(fileChannel); + IOUtils.closeQuietly(fileInputStream); + buffer.clear(); + } + } + + + // 删除生成的 mp3 文件 + @Override + public void deleteFiles(String sourceFile) { + + // 检查文件路径是否为空 + if (sourceFile == null || sourceFile.isEmpty()) { + log.error("文件路径为空"); + } + + File file = new File(sourceFile); + + // 检查文件是否存在 + if (!file.exists()) { + log.error("文件不存在:" + sourceFile); + } + + // 检查是否是文件 + if (!file.isFile()) { + log.error("路径指向的不是文件:" + sourceFile); + } + + // 尝试删除文件 + if (file.delete()) { + log.error("文件删除成功:" + sourceFile); + } else { + log.error("文件删除失败:" + sourceFile); + } + } + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/ExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/ExcelListener.java new file mode 100644 index 000000000..ed15ca204 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/ExcelListener.java @@ -0,0 +1,68 @@ +package com.cf.imes.module.executor.util.file; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 文件读取监听 + */ +public class ExcelListener extends AnalysisEventListener { + /** + * 自定义用于暂时存储data + * 可以通过实例获取该值 + */ + private List dates = new ArrayList<>(); + + private boolean flag = true; + + private Map valueMap = new HashMap<>(); + + + @Override + public void invoke(T t, AnalysisContext analysisContext) { + // todo invoke + } + + /** + * 读取完后操作 + * + * @param context + */ + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // todo doAfterAllAnalysed + } + + /** + * 返回数据 + * + * @return 返回读取的数据集合 + **/ + public List getDates() { + return dates; + } + + /** + * 返回读取结果 + * + * @return 是否读取成功 + **/ + public boolean getFlag() { + return flag; + } + + /** + * 返回错误信息 + * + * @return String + **/ + public Map getValueMap() { + return valueMap; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/ExcelReadUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/ExcelReadUtil.java new file mode 100644 index 000000000..26b793d87 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/ExcelReadUtil.java @@ -0,0 +1,48 @@ +package com.cf.imes.module.executor.util.file; + +import com.alibaba.excel.EasyExcelFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 文件读取 + */ +@Slf4j +public final class ExcelReadUtil{ + + private String value; + private boolean flag; + + public List read(MultipartFile file, Class head, ExcelListener listener) throws IOException { + value = ""; + Long fileSize = 1024 * 1024 * 10L; // 10 MB + flag = FileHelperUtil.checkFile(file, fileSize); + + if (flag) { + EasyExcelFactory.read(file.getInputStream(), head, listener) + .autoCloseStream(true) // 不要自动关闭,交给 Servlet 自己处理 + .headRowNumber(1).sheet(0).doRead(); + //获取读取的数据 + List list = listener.getDates(); + flag = listener.getFlag(); + if (!flag) { + value = "导入数据有误"; + } + return list; + } + return new ArrayList<>(); + } + + public String getValue() { + return value; + } + + public boolean getFlag() { + return flag; + } + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/FileHelperUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/FileHelperUtil.java new file mode 100644 index 000000000..bb51dc6f6 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/file/FileHelperUtil.java @@ -0,0 +1,65 @@ +package com.cf.imes.module.executor.util.file; + +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URLEncoder; + +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.*; + +/** + * 文件相关工具类 + */ +public class FileHelperUtil { + + // 文件下载 + public static void getFile(String route, HttpServletResponse response, String value) { + // path是指想要下载的文件的路径 + File file = new File(route + File.separator + value); + // 获取文件名 + String filename = file.getName(); + // 将文件写入输入流 + try (FileInputStream fis = new FileInputStream(file)) { + byte[] buffer = new byte[fis.available()]; + fis.read(buffer); + fis.close(); + + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.addHeader("Content-Length", "" + file.length()); + OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); + response.setContentType("application/octet-stream"); + outputStream.write(buffer); + outputStream.flush(); + } catch (IOException ex) { + throw exception(FILE_NOT_EXISTS); + } + } + + // 文件条件判断 + public static boolean checkFile(MultipartFile file, + Long fileSize) { + if (file.isEmpty()) { + throw exception(FILE_NULL); + } + if (!(file.getOriginalFilename().endsWith(".xlsx") || file.getOriginalFilename().endsWith(".xls"))) { + throw exception(FILE_FORMAT_ERROR); + } + if (file.getSize() > fileSize) { + throw exception(FILE_EXCEED_SIZE); + } + if (file.getSize() == 0) { + throw exception(FILE_CONTENT_NULL); + } + + return true; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/number/NumberHelperUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/number/NumberHelperUtil.java new file mode 100644 index 000000000..a32567d29 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/number/NumberHelperUtil.java @@ -0,0 +1,42 @@ +package com.cf.imes.module.executor.util.number; + +import org.springframework.stereotype.Component; + +/** + * 数据处理相关工具类 + */ +@Component +public class NumberHelperUtil { + + public Double[] compareLength(Double[] numbers) { + if (numbers == null || numbers.length < 2) { + return numbers; // 如果数组为空或长度不足2,直接返回原数组 + } + + Double min = numbers[0]; + Double max = numbers[1]; + + // 检查前值和后值是否都为null或小于等于0 + if ((min == null || min <= 0) && (max == null || max <= 0)) { + return new Double[]{null, null}; // 忽略该字段 + } + + // 只输入前值,不输入后值 + if (max == null || max <= 0) { + return new Double[]{min, null}; + } + + // 不输入前值,只输入后值 + if (min == null || min <= 0) { + return new Double[]{null, max}; + } + + // 前值和后值都输入,且前值大于后值,则前值和后值交换 + if (min > max) { + return new Double[]{max, min}; + } + + return new Double[]{min, max}; + } + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/common/CommonStatusValidator.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/common/CommonStatusValidator.java new file mode 100644 index 000000000..5f7c94cc4 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/common/CommonStatusValidator.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.validation.manage.common; + +import com.cf.imes.module.executor.enums.manage.remainPlate.RemainPlateStatusEnum; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * 状态校验 + */ +public class CommonStatusValidator implements ConstraintValidator { + + private ValidCommonStatus annotation; + + @Override + public void initialize(ValidCommonStatus constraintAnnotation) { + this.annotation = constraintAnnotation; + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + if (value == null) { + value = RemainPlateStatusEnum.UNUSED.getStatus(); // 默认值为未使用 + } + return value == RemainPlateStatusEnum.UNUSED.getStatus() || value == RemainPlateStatusEnum.USED.getStatus(); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/common/ValidCommonStatus.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/common/ValidCommonStatus.java new file mode 100644 index 000000000..2159e6e1c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/common/ValidCommonStatus.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.executor.validation.manage.common; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 状态校验注解 + */ +@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = CommonStatusValidator.class) +@Documented +public @interface ValidCommonStatus { + String message() default "状态值必须为 0:未使用、1:已使用 "; + + Class[] groups() default {}; + + Class[] payload() default {}; +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/OrderPackagedStatusValid.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/OrderPackagedStatusValid.java new file mode 100644 index 000000000..5299328f0 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/OrderPackagedStatusValid.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.executor.validation.manage.pack; + + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +/** + * @author 打包状态校验注解 + */ +@Target({ + ElementType.FIELD, +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = {OrderPackagedValidator.class} +) +public @interface OrderPackagedStatusValid { + + String message() default "打包状态不合法"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/OrderPackagedValidator.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/OrderPackagedValidator.java new file mode 100644 index 000000000..7a00e9007 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/OrderPackagedValidator.java @@ -0,0 +1,30 @@ +package com.cf.imes.module.executor.validation.manage.pack; + +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.enums.OrderPackageStatusEnum; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * @author 打包状态校验器 + */ +public class OrderPackagedValidator implements ConstraintValidator { + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) { + + if (ObjectUtil.isNull(value)) { + return true; + } + + for (OrderPackageStatusEnum statusEnum : OrderPackageStatusEnum.values()) { + if (ObjectUtil.equal(statusEnum.getStatus(), value)) { + return true; + } + } + + return false; + + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/PackTypeValid.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/PackTypeValid.java new file mode 100644 index 000000000..dfc99e782 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/PackTypeValid.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.executor.validation.manage.pack; + + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author 包裹类型校验注解 + */ +@Target({ + ElementType.FIELD, +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = {PackTypeValidator.class} +) +public @interface PackTypeValid { + + String message() default "包裹类型不合法"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/PackTypeValidator.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/PackTypeValidator.java new file mode 100644 index 000000000..bd65ac67b --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/pack/PackTypeValidator.java @@ -0,0 +1,31 @@ +package com.cf.imes.module.executor.validation.manage.pack; + + +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.enums.OrderPackageTypeEnum; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * @author 包裹类型校验器 + */ +public class PackTypeValidator implements ConstraintValidator { + + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) { + + if (ObjectUtil.isNull(value)) { + return true; + } + + for (OrderPackageTypeEnum typeEnum : OrderPackageTypeEnum.values()) { + if (ObjectUtil.equal(typeEnum.getType(), value)) { + return true; + } + } + + return false; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsCategoryValid.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsCategoryValid.java new file mode 100644 index 000000000..7dfa342a1 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsCategoryValid.java @@ -0,0 +1,30 @@ +package com.cf.imes.module.executor.validation.manage.parts; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 配件主类校验注解 + */ +@Target({ + ElementType.FIELD, +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = {PartsCategoryValidator.class} +) +public @interface PartsCategoryValid { + + String message() default "配件主类不合法,1:封边条,2:五金,3:组件"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsCategoryValidator.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsCategoryValidator.java new file mode 100644 index 000000000..70ede9ea5 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsCategoryValidator.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.validation.manage.parts; + +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.module.executor.enums.manage.parts.CategoryEnum; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Objects; + +/** + * 配件主类校验 + */ +public class PartsCategoryValidator implements ConstraintValidator { + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (ObjectUtil.isNull(value)) { + return true; + } + for (CategoryEnum categoryEnum : CategoryEnum.values()) { + if (Objects.equals(categoryEnum.getValue(), value)) { + return true; + } + } + return false; + } + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsNumberValid.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsNumberValid.java new file mode 100644 index 000000000..6d7b82c4e --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsNumberValid.java @@ -0,0 +1,39 @@ +package com.cf.imes.module.executor.validation.manage.parts; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数组校验注解 + */ +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint(validatedBy = PartsNumberValidator.class) +public @interface PartsNumberValid { + + String name(); + + String message() default "数字不合法"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + int integer() default 5; + + int fraction() default 3; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsNumberValidator.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsNumberValidator.java new file mode 100644 index 000000000..34870709c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/parts/PartsNumberValidator.java @@ -0,0 +1,135 @@ +package com.cf.imes.module.executor.validation.manage.parts; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.math.BigDecimal; +import java.text.DecimalFormat; + +/** + * 数组校验 + */ +public class PartsNumberValidator implements ConstraintValidator { + + private static final String ZERO = "0"; + + private static final String GREATER_THAN_ZERO_NOTIFICATION = "%s必须大于0"; + + private static final String FLOAT_NUMBER_LENGTH_ERROR_NOTIFICATION = "%s长度不合法,总长度不超过8位,小数点后不超过3位"; + + private String name; + + private int integer; + + private int fraction; + + @Override + public void initialize(PartsNumberValid constraintAnnotation) { + this.name = constraintAnnotation.name(); + this.integer = constraintAnnotation.integer(); + this.fraction = constraintAnnotation.fraction(); + } + + @Override + public boolean isValid(Object value, ConstraintValidatorContext context) { + // 空的不校验,由原生@NotNull之类的进行判断 + if (value == null) { + return true; + } + + if (value instanceof Number[]) { + return validateArray((Number[]) value, context); + } else if (value instanceof Number) { + return validateSingleValue((Number) value, context); + } + + return true; + } + + private boolean validateArray(Number[] values, ConstraintValidatorContext context) { + for (Number value : values) { + if (!validateSingleValue(value, context)) { + return false; + } + } + return true; + } + + private boolean validateSingleValue(Number value, ConstraintValidatorContext context) { + // 提示信息 + String notification = null; + if (value instanceof Integer) { + notification = handleInteger(value.intValue()); + } else if (value instanceof Long) { + notification = handleLong(value.longValue()); + } else if (value instanceof Double) { + notification = handleDouble(value.doubleValue()); + } else if (value instanceof BigDecimal) { + notification = handleBigDecimal((BigDecimal) value); + } + if (notification != null) { + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值 + context.buildConstraintViolationWithTemplate(notification).addConstraintViolation(); + return false; + } + return true; + } + + private String handleInteger(Integer value) { + if (value < Integer.parseInt(ZERO)) { + return String.format(GREATER_THAN_ZERO_NOTIFICATION, name); + } + return null; + } + + private String handleLong(Long value) { + if (value < Long.parseLong(ZERO)) { + return String.format(GREATER_THAN_ZERO_NOTIFICATION, name); + } + return null; + } + + private String handleDouble(Double value) { + if (value < Double.parseDouble(ZERO)) { + return String.format(GREATER_THAN_ZERO_NOTIFICATION, name); + } + // 处理科学计数法,保留小数点后四位 + DecimalFormat decimalFormat = new DecimalFormat("#.####"); + String valueString = decimalFormat.format(value); + + String[] split = valueString.split("\\."); + // 获取小数点前的位数 + int integerPartLength = split[0].length(); + // 获取小数点后的位数 + int fractionalPartLength = 0; + if (split.length > 1) { + fractionalPartLength = split[1].length(); + } + + // 总位数不超过 8 位,小数点后位数不超过 3 位 + if (integerPartLength > integer || fractionalPartLength > fraction) { + return String.format(FLOAT_NUMBER_LENGTH_ERROR_NOTIFICATION, name); + } + return null; + } + + private String handleBigDecimal(BigDecimal value) { + if (value.compareTo(BigDecimal.ZERO) < 0) { + return String.format(GREATER_THAN_ZERO_NOTIFICATION, name); + } + + String[] split = value.toPlainString().split("\\."); + // 获取小数点前的位数 + int integerPartLength = split[0].length(); + // 获取小数点后的位数 + int fractionalPartLength = 0; + if (split.length > 1) { + fractionalPartLength = split[1].length(); + } + + // 总位数不超过 8 位,小数点后位数不超过 3 位 + if (integerPartLength > integer || fractionalPartLength > fraction) { + return String.format(FLOAT_NUMBER_LENGTH_ERROR_NOTIFICATION, name); + } + return null; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/placeStyle/PlaceStyleValidator.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/placeStyle/PlaceStyleValidator.java new file mode 100644 index 000000000..c51745c65 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/placeStyle/PlaceStyleValidator.java @@ -0,0 +1,35 @@ +package com.cf.imes.module.executor.validation.manage.placeStyle; + + +import com.cf.imes.module.executor.enums.manage.remainPlate.RemainPlatePlaceStyleEnum; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * 放置样式校验 + */ +public class PlaceStyleValidator implements ConstraintValidator { + + private ValidPlaceStyle annotation; + + @Override + public void initialize(ValidPlaceStyle constraintAnnotation) { + this.annotation = constraintAnnotation; + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + if (value == null) { + value = RemainPlatePlaceStyleEnum.ZERO.getStatus(); // 默认值为正面 + } + return value == RemainPlatePlaceStyleEnum.ONE.getStatus() + || value == RemainPlatePlaceStyleEnum.TWO.getStatus() + || value == RemainPlatePlaceStyleEnum.THREE.getStatus() + || value == RemainPlatePlaceStyleEnum.FOUR.getStatus() + || value == RemainPlatePlaceStyleEnum.FIVE.getStatus() + || value == RemainPlatePlaceStyleEnum.SIX.getStatus() + || value == RemainPlatePlaceStyleEnum.SEVEN.getStatus() + || value == RemainPlatePlaceStyleEnum.ZERO.getStatus(); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/placeStyle/ValidPlaceStyle.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/placeStyle/ValidPlaceStyle.java new file mode 100644 index 000000000..ced18e264 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/placeStyle/ValidPlaceStyle.java @@ -0,0 +1,27 @@ +package com.cf.imes.module.executor.validation.manage.placeStyle; + + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 放置样式校验注解 + */ +@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = PlaceStyleValidator.class) +@Documented +public @interface ValidPlaceStyle { + + String message() default " 放置样式不合法,0正面,1正面右转,2正面后转,3正面左转,4反面,5反面右转,6反面后转,7反面左转"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/type/TypeFieldValidator.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/type/TypeFieldValidator.java new file mode 100644 index 000000000..9ece4393c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/type/TypeFieldValidator.java @@ -0,0 +1,31 @@ +package com.cf.imes.module.executor.validation.manage.type; + +import com.cf.imes.module.executor.enums.manage.remainPlate.RemainPlateUseTypeEnum; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * 使用类型校验 + */ +public class TypeFieldValidator implements ConstraintValidator { + + private ValidTypeField annotation; + + @Override + public void initialize(ValidTypeField constraintAnnotation) { + this.annotation = constraintAnnotation; + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + // 如果值为 null,则不做校验,直接返回 true + if (value == null) { + value = RemainPlateUseTypeEnum.TYPE_ZERO.getStatus(); // 默认值为未使用 + } + return value == RemainPlateUseTypeEnum.TYPE_ONE.getStatus() || + value == RemainPlateUseTypeEnum.TYPE_TWO.getStatus() || + value == RemainPlateUseTypeEnum.TYPE_THREE.getStatus() || + value == RemainPlateUseTypeEnum.TYPE_ZERO.getStatus(); + } +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/type/ValidTypeField.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/type/ValidTypeField.java new file mode 100644 index 000000000..b4f7d2bf1 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/validation/manage/type/ValidTypeField.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.executor.validation.manage.type; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 使用类型校验注解 + */ +@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = TypeFieldValidator.class) +@Documented +public @interface ValidTypeField { + String message() default "状态值必须为 0:核销、1:排单 或 2:补板"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml index 4693d0ed4..ecddd99be 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/order/OrderMapper.xml @@ -467,5 +467,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml index c3c1cfa16..33c7a0990 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderItem/OrderItemMapper.xml @@ -371,4 +371,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE order_item + + SET package_id = 0 + + WHERE organ_id = #{organId} and order_id = #{orderId} and package_id = #{packId} ; + + + + + + + + + DELETE FROM order_item + + WHERE organ_id = #{organId} + and order_id = #{orderId} + and parts_id = #{partsId} + + + + + + + + + delete from order_item + + where organ_id = #{organId} + and order_id = #{orderId} + and package_id = #{packageId} + and parts_id in + + #{partsIds} + + + + + + + + + + update order_item + + set package_id = #{packId} + + where organ_id = #{organId} + and order_id = #{orderId} + and plate_id in + + #{id} + + + + + + + + + update order_item oi + + set package_id = 0 + + where + organ_id = #{organId} + and order_id = #{orderId} + and package_id = #{packId} + and plate_id in + + #{id} + + + + + + + + + + update order_item oi + + set package_id = #{packId} + + where organ_id = #{organId} + and order_id = #{orderId} + and parts_id in + + #{id} + + + + + + + + update order_item oi + + set package_id = #{packId} + + where organ_id = #{organId} + and order_id = #{orderId} + and parts_id in + + #{id} + + + + + + + + update order_item oi + + set package_id = 0 + + where + organ_id = #{organId} + and order_id = #{orderId} + and package_id = #{packId} + and parts_id in + + #{id} + + + + + + + + + update order_item + + set package_id = 0 + + where organ_id = #{organId} + and order_id = #{orderId} + and package_id = #{packageId} + and parts_id = #{partsId}; + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml index c7aac0c47..bc35bb0c3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/orderParts/OrderPartsMapper.xml @@ -245,4 +245,153 @@ and b.room_id = #{roomId} and b.body_id = #{bodyId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update order_parts op + + set op.deleted = true + where + op.organ_id = #{organId} + and op.order_id = #{orderId} + and op.deleted = false + and op.id in + + #{id} + + + + + + + + + UPDATE order_parts op + + SET op.deleted = true + + WHERE op.organ_id = #{organId} + and op.order_id = #{orderId} + and op.id = #{partsId}; + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/pack/OrderPackageMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/pack/OrderPackageMapper.xml index 795ca3b16..e83fbf4b4 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/pack/OrderPackageMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/pack/OrderPackageMapper.xml @@ -18,4 +18,135 @@ + + + + + + + + + + + + + + + + + + + + + + + UPDATE order_package + SET deleted = true + WHERE organ_id = #{organId} and order_id = #{orderId} and id = #{packageId} + + + + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateGoodMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateGoodMapper.xml new file mode 100644 index 000000000..3c708a400 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateGoodMapper.xml @@ -0,0 +1,30 @@ + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml index d198412db..0d2edb38e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/plate/PlateMapper.xml @@ -836,4 +836,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/remainplaten/RemainPlateMapper.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/remainplaten/RemainPlateMapper.xml index 968d56ad6..b21de3fa5 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/remainplaten/RemainPlateMapper.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/mapper/remainplaten/RemainPlateMapper.xml @@ -10,4 +10,8 @@ + + + delete from order_remain_plate where init_plan_id = #{initPlanId} and organ_id = #{organId} + \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/excel_parts_add.xlsx b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/resources/type/excel_parts_add.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1b34ecbb767ac10f3dba0418bd505ae1b007940d GIT binary patch literal 13610 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