From 5353351520faf101ce4e3af1e7acdda6a730ff89 Mon Sep 17 00:00:00 2001 From: lsymicc Date: Fri, 17 Jul 2026 17:24:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 + ruoyi-admin/pom.xml | 12 + .../main/java/com/ruoyi/RuoYiApplication.java | 6 + .../java/com/ruoyi/api/client/WcsClient.java | 23 +- .../java/com/ruoyi/api/constant/SysEnum.java | 3 +- .../api/controller/ErpServiceController.java | 41 ++ .../api/controller/ExternalApiController.java | 16 +- .../api/controller/WcsServiceController.java | 95 +++ .../java/com/ruoyi/api/domain/ApiLog.java | 11 + .../com/ruoyi/api/domain/ApiResponse.java | 14 +- .../com/ruoyi/api/service/ApiErpService.java | 126 ++++ .../com/ruoyi/api/service/ApiWcsService.java | 629 +++++++++++++++++ .../controller/ToErpApiController.java | 86 +++ .../controller/ToWcsApiController.java | 34 + .../controller/ToWmsApiController.java | 107 +++ .../ruoyi/apiService/domain/AgvMoveParam.java | 15 + .../domain/GenAgvSchedulingTaskRequest.java | 156 +++++ .../apiService/domain/PositionCodeData.java | 35 + .../apiService/domain/ReMaterialParam.java | 24 + .../ruoyi/apiService/domain/RequestEnter.java | 21 + .../domain/RequestEnterResponse.java | 26 + .../ruoyi/apiService/domain/ResponseBase.java | 22 + .../apiService/domain/WmsJobRequest.java | 33 + .../apiService/domain/erp/RollerInfo.java | 13 + .../receiveStockList/StockinListReceive.java | 12 + .../receiveStockList/StockinListResponse.java | 9 + .../receiveStockList/StockoutListReceive.java | 8 + .../StockoutListResponse.java | 9 + .../domain/wcs/WcsStockinReceive.java | 54 ++ .../domain/wcs/WcsStockinResponse.java | 42 ++ .../apiService/service/IToErpService.java | 42 ++ .../apiService/service/IToWcsService.java | 53 ++ .../apiService/service/IToWmsService.java | 44 ++ .../service/impl/ToErpServiceImpl.java | 641 ++++++++++++++++++ .../service/impl/ToWcsServiceImpl.java | 215 ++++++ .../service/impl/ToWmsServiceImpl.java | 639 +++++++++++++++++ .../bas/cargospace/domain/BasCargoSpace.java | 257 +------ .../mapper/BasCargoSpaceMapper.java | 9 + .../service/IBasCargoSpaceService.java | 31 + .../impl/BasCargoSpaceServiceImpl.java | 60 ++ ...obIdService.java => IBasJobIdService.java} | 2 +- .../id/job/service/impl/JobIdServiceImpl.java | 7 +- ...kNoService.java => IBasTaskNoService.java} | 2 +- .../service/impl/TaskNoServiceImpl.java | 5 +- .../ruoyi/bas/product/domain/BasProduct.java | 83 +-- .../controller/BasStockInfoController.java | 100 +++ .../com/ruoyi/bas/stock/domain/BasStock.java | 320 +-------- .../ruoyi/bas/stock/domain/BasStockInfo.java | 71 ++ .../bas/stock/mapper/BasStockInfoMapper.java | 86 +++ .../bas/stock/mapper/BasStockMapper.java | 40 +- .../stock/service/IBasStockInfoService.java | 81 +++ .../bas/stock/service/IBasStockService.java | 41 +- .../service/impl/BasStockInfoServiceImpl.java | 146 ++++ .../service/impl/BasStockServiceImpl.java | 93 ++- .../java/com/ruoyi/common/CargoSpaceCode.java | 45 ++ .../java/com/ruoyi/common/InTrayMsgCode.java | 12 + .../main/java/com/ruoyi/common/JobIdType.java | 67 ++ .../java/com/ruoyi/common/ProductType.java | 8 + .../java/com/ruoyi/common/RequestTitle.java | 20 + .../main/java/com/ruoyi/common/StockCode.java | 15 + .../com/ruoyi/common/StockStatusEnum.java | 26 + .../java/com/ruoyi/common/TaskIdType.java | 35 + .../java/com/ruoyi/common/TaskStatusEnum.java | 28 + .../main/java/com/ruoyi/common/TaskType.java | 66 ++ .../com/ruoyi/common/Utils/DecimalUtil.java | 27 + .../main/java/com/ruoyi/common/WcsUrl.java | 30 + .../com/ruoyi/in/bind/domain/InTrayMsg.java | 125 +--- .../ruoyi/in/bind/mapper/InTrayMsgMapper.java | 3 + .../in/bind/service/IInTrayMsgService.java | 11 + .../service/impl/InTrayMsgServiceImpl.java | 11 +- .../job/controller/InMydoJobController.java | 5 +- .../java/com/ruoyi/in/job/domain/MydoJob.java | 387 +---------- .../ruoyi/in/job/mapper/MydoJobMapper.java | 22 +- .../ruoyi/in/job/service/IMydoJobService.java | 155 +++-- .../job/service/impl/MydoJobServiceImpl.java | 478 ++++++++++++- .../in/jobdetail/domain/MydoJobDetail.java | 228 +------ .../jobdetail/mapper/MydoJobDetailMapper.java | 16 + .../service/IMydoJobDetailService.java | 15 + .../impl/MydoJobDetailServiceImpl.java | 51 ++ .../sotckindetail/domain/InStockinDetail.java | 155 ----- .../impl/InStockinDetailServiceImpl.java | 103 --- .../ruoyi/in/stockin/domain/InStockin.java | 188 +---- .../in/stockin/domain/InStockinSaveDTO.java | 2 +- .../in/stockin/mapper/InStockinMapper.java | 8 + .../in/stockin/service/IInStockinService.java | 22 + .../service/impl/InStockinServiceImpl.java | 47 +- .../controller/InStockinDetailController.java | 8 +- .../stockindetail/domain/InStockinDetail.java | 68 ++ .../mapper/InStockinDetailMapper.java | 53 +- .../service/IInStockinDetailService.java | 52 +- .../impl/InStockinDetailServiceImpl.java | 200 ++++++ .../kpi/service/impl/KpiServiceImpl.java | 3 - .../log/controller/RequestLogController.java | 98 +++ .../java/com/ruoyi/log/domain/RequestLog.java | 249 +++++++ .../ruoyi/log/mapper/RequestLogMapper.java | 69 ++ .../ruoyi/log/service/IRequestLogService.java | 92 +++ .../service/impl/RequestLogServiceImpl.java | 205 ++++++ .../job/controller/OutMydoJobController.java | 5 +- .../domain/OutStockoutManualAssignDTO.java | 1 + .../service/impl/OutStockoutServiceImpl.java | 250 ++++++- .../domain/OutStockoutDetail.java | 12 + .../mapper/OutStockoutDetailMapper.java | 8 + .../service/IOutStockoutDetailService.java | 8 + .../impl/OutStockoutDetailServiceImpl.java | 5 + .../job/controller/PdInMydoJobController.java | 5 +- .../controller/PdOutMydoJobController.java | 5 +- .../service/impl/PdStockpdServiceImpl.java | 6 +- .../ruoyi/pda/controller/PdaController.java | 66 +- .../com/ruoyi/pda/domain/BindTrayRequest.java | 54 +- .../com/ruoyi/pda/domain/TrayMsgBinding.java | 48 ++ .../{PdaService.java => IPdaService.java} | 32 +- .../pda/service/impl/PdaServiceImpl.java | 212 +++++- .../src/main/resources/application-druid.yml | 7 +- .../src/main/resources/application.yml | 8 +- ruoyi-admin/src/main/resources/logback.xml | 27 +- .../mapper/bas/BasCargoSpaceMapper.xml | 61 ++ .../mapper/bas/BasStockInfoMapper.xml | 114 ++++ .../resources/mapper/bas/BasStockMapper.xml | 71 +- .../mapper/in/InStockinDetailMapper.xml | 73 +- .../resources/mapper/in/InStockinMapper.xml | 42 +- .../resources/mapper/in/InTrayMsgMapper.xml | 26 +- .../mapper/in/MydoJobDetailMapper.xml | 20 +- .../resources/mapper/in/MydoJobMapper.xml | 156 +++-- .../mapper/out/OutStockoutDetailMapper.xml | 14 + .../mapper/out/OutStockoutMapper.xml | 1 + .../mapper/requestLog/RequestLogMapper.xml | 126 ++++ .../com/ruoyi/common/utils/SecurityUtils.java | 2 +- ruoyi-ui/src/views/bas/stock/index.vue | 20 +- sql/wms.sql | 10 +- 129 files changed, 7697 insertions(+), 2072 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/controller/ErpServiceController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/controller/WcsServiceController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/service/ApiErpService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/api/service/ApiWcsService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToErpApiController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToWcsApiController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToWmsApiController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/AgvMoveParam.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/GenAgvSchedulingTaskRequest.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/PositionCodeData.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/ReMaterialParam.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/RequestEnter.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/RequestEnterResponse.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/ResponseBase.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/WmsJobRequest.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/erp/RollerInfo.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockinListReceive.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockinListResponse.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockoutListReceive.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockoutListResponse.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/wcs/WcsStockinReceive.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/wcs/WcsStockinResponse.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToErpService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToWcsService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToWmsService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToErpServiceImpl.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToWcsServiceImpl.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToWmsServiceImpl.java rename ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/{JobIdService.java => IBasJobIdService.java} (66%) rename ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/{TaskNoService.java => IBasTaskNoService.java} (68%) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/bas/stock/controller/BasStockInfoController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/bas/stock/domain/BasStockInfo.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/bas/stock/mapper/BasStockInfoMapper.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/IBasStockInfoService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/impl/BasStockInfoServiceImpl.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/CargoSpaceCode.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/InTrayMsgCode.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/JobIdType.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/ProductType.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/RequestTitle.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/StockCode.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/StockStatusEnum.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/TaskIdType.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/TaskStatusEnum.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/TaskType.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/Utils/DecimalUtil.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/common/WcsUrl.java delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/domain/InStockinDetail.java delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/service/impl/InStockinDetailServiceImpl.java rename ruoyi-admin/src/main/java/com/ruoyi/in/{sotckindetail => stockindetail}/controller/InStockinDetailController.java (93%) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/domain/InStockinDetail.java rename ruoyi-admin/src/main/java/com/ruoyi/in/{sotckindetail => stockindetail}/mapper/InStockinDetailMapper.java (57%) rename ruoyi-admin/src/main/java/com/ruoyi/in/{sotckindetail => stockindetail}/service/IInStockinDetailService.java (57%) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/impl/InStockinDetailServiceImpl.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/log/controller/RequestLogController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/log/domain/RequestLog.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/log/mapper/RequestLogMapper.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/log/service/IRequestLogService.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/log/service/impl/RequestLogServiceImpl.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/pda/domain/TrayMsgBinding.java rename ruoyi-admin/src/main/java/com/ruoyi/pda/service/{PdaService.java => IPdaService.java} (51%) create mode 100644 ruoyi-admin/src/main/resources/mapper/bas/BasStockInfoMapper.xml create mode 100644 ruoyi-admin/src/main/resources/mapper/requestLog/RequestLogMapper.xml diff --git a/pom.xml b/pom.xml index bdf46de..6881add 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,9 @@ 0.9.1 2.3.1 3.0.2 + 5.8.27 + 3.5.14 + 1.18.30 @@ -170,6 +173,19 @@ ${ruoyi.version} + + + cn.hutool + hutool-all + ${hutool.version} + + + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatis-plus.version} + + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index cf467ea..45c35a7 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -54,6 +54,18 @@ ruoyi-generator + + + org.projectlombok + lombok + + + + cn.hutool + hutool-all + + + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java index d2a857a..6a2bfad 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java @@ -1,8 +1,11 @@ package com.ruoyi; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; /** * 启动程序 @@ -10,6 +13,9 @@ import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration; * @author ruoyi */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +@MapperScan("com.**.mapper") +@EnableScheduling +@EnableAsync public class RuoYiApplication { public static void main(String[] args) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/client/WcsClient.java b/ruoyi-admin/src/main/java/com/ruoyi/api/client/WcsClient.java index 0748aaa..08b14bd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/client/WcsClient.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/client/WcsClient.java @@ -30,19 +30,26 @@ public class WcsClient extends BaseExternalClient { // ── 接口1:下发入库任务 ─────────────────────────────────── - public ApiResponse sendPutawayTask(String stockinNo, String locationCode, - String trayNo, String priority) { + public ApiResponse sendPutawayTask(String stockinNo, String cargoSpaceId, + String trayCode, String priority) { String body = String.join("|", "PUTAWAY", String.valueOf(nextSeq()), - stockinNo, locationCode, trayNo, priority); + stockinNo, cargoSpaceId, trayCode, priority); return post(url("sendPutawayTask"), body, "WCS-下发入库任务", this::parseOkNg); } // ── 接口2:下发出库任务 ─────────────────────────────────── - public ApiResponse sendRetrieveTask(String stockoutNo, String locationCode, - String materialCode, String qty) { + public ApiResponse sendRetrieveTask(String stockoutNo, String cargoSpaceId, + String materialCode, String quantity) { String body = String.join("|", "RETRIEVE", String.valueOf(nextSeq()), - stockoutNo, locationCode, materialCode, qty); + stockoutNo, cargoSpaceId, materialCode, quantity); + return post(url("sendRetrieveTask"), body, "WCS-下发出库任务", this::parseOkNg); + } + + public ApiResponse sendStockoutTask(String jobId, String taskNo, + String cargoSpaceId, String taskType) { + String body = String.join("|", "RETRIEVE", String.valueOf(nextSeq()), + jobId, taskNo, cargoSpaceId, taskType); return post(url("sendRetrieveTask"), body, "WCS-下发出库任务", this::parseOkNg); } @@ -95,4 +102,8 @@ public class WcsClient extends BaseExternalClient { // WCS 返回 NG 属于业务失败 throw new BizException("WCS_NG", "WCS拒绝: " + (parts.length > 1 ? parts[1] : rawBody)); } + + + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/constant/SysEnum.java b/ruoyi-admin/src/main/java/com/ruoyi/api/constant/SysEnum.java index a4f235f..720d070 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/constant/SysEnum.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/constant/SysEnum.java @@ -6,7 +6,8 @@ package com.ruoyi.api.constant; public enum SysEnum { ERP("ERP", "ERP系统"), MES("MES", "MES系统"), - WCS("WCS", "WCS仓储控制系统"); + WCS("WCS", "WCS仓储控制系统"), + WMS("WMS", "WMS仓储管理系统"); private final String code; private final String desc; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ErpServiceController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ErpServiceController.java new file mode 100644 index 0000000..fb04b15 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ErpServiceController.java @@ -0,0 +1,41 @@ +package com.ruoyi.api.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping("/api/wmsService/erp") +public class ErpServiceController extends BaseController { + + /** + * 接受入库单据 + * @return + */ + @PostMapping("/sendErpStockinInfo") + public AjaxResult sendErpStockinInfo(){ + + + + return AjaxResult.success(); + } + + + /** + * 接受出库单据 + * @return + */ + @PostMapping("/sendErpStockoutInfo") + public AjaxResult sendErpStockoutInfo(){ + + + + return AjaxResult.success(); + } + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ExternalApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ExternalApiController.java index 81d2d72..b8a115e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ExternalApiController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/ExternalApiController.java @@ -74,23 +74,26 @@ public class ExternalApiController extends BaseController { return resp.isSuccess() ? success(resp.getData()) : error(resp.getMessage()); } + + + // ═══════════════ WCS ═══════════════ @PostMapping("/wcs/sendPutawayTask") public AjaxResult sendPutawayTask(@RequestParam String stockinNo, - @RequestParam String locationCode, - @RequestParam String trayNo, + @RequestParam String cargoSpaceId, + @RequestParam String trayCode, @RequestParam(defaultValue = "NORMAL") String priority) { - ApiResponse resp = wcsClient.sendPutawayTask(stockinNo, locationCode, trayNo, priority); + ApiResponse resp = wcsClient.sendPutawayTask(stockinNo, cargoSpaceId, trayCode, priority); return resp.isSuccess() ? success(resp.getData()) : error(resp.getMessage()); } @PostMapping("/wcs/sendRetrieveTask") public AjaxResult sendRetrieveTask(@RequestParam String stockoutNo, - @RequestParam String locationCode, + @RequestParam String cargoSpaceId, @RequestParam String materialCode, @RequestParam String qty) { - ApiResponse resp = wcsClient.sendRetrieveTask(stockoutNo, locationCode, materialCode, qty); + ApiResponse resp = wcsClient.sendRetrieveTask(stockoutNo, cargoSpaceId, materialCode, qty); return resp.isSuccess() ? success(resp.getData()) : error(resp.getMessage()); } @@ -114,4 +117,7 @@ public class ExternalApiController extends BaseController { ApiResponse resp = wcsClient.cancelTask(taskId); return resp.isSuccess() ? success(resp.getData()) : error(resp.getMessage()); } + + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/controller/WcsServiceController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/WcsServiceController.java new file mode 100644 index 0000000..9b8e65f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/controller/WcsServiceController.java @@ -0,0 +1,95 @@ +package com.ruoyi.api.controller; + + +import cn.hutool.json.JSONUtil; +import com.ruoyi.api.service.ApiWcsService; +import com.ruoyi.apiService.domain.ReMaterialParam; +import com.ruoyi.apiService.domain.WmsJobRequest; +import com.ruoyi.apiService.domain.wcs.WcsStockinReceive; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.log.domain.RequestLog; +import com.ruoyi.log.service.IRequestLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/wmsService/wcs") +public class WcsServiceController extends BaseController { + + @Autowired + ApiWcsService apiWcsService; + + @Autowired + IRequestLogService requestLogService; + + + /** + * 请求生成入库作业 + */ + @PostMapping("/requestMydoJobByTrayCode") + public AjaxResult requestEnterByTrayCode(@RequestBody WcsStockinReceive wcsStockinReiceive) { + AjaxResult ajaxResult = apiWcsService.requestMydoJobByTrayCode(wcsStockinReiceive); + RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wcsStockinReiceive), "入库任务创建请求",ajaxResult); + requestLogService.insertRequestLog(requestLog); + return ajaxResult; + } + + /** + * 请求补码作业 + */ + @PostMapping("/requestMydoJobByNoTrayCode") + public AjaxResult requestByNoTrayCode(@RequestBody WcsStockinReceive wcsStockinReiceive) { + AjaxResult ajaxResult = apiWcsService.requestMydoJobManual(wcsStockinReiceive); + RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wcsStockinReiceive), "请求补码作业",ajaxResult); + requestLogService.insertRequestLog(requestLog); + return ajaxResult; + } + + /** + * 入库、出库 任务完成回传 + * Map + * "wmsType": "任务类型" 1-入库 2-出库 3-agv搬运, + * taskNo:出库 入库任务号 + * trayCode:托盘码 + * positionCode1:起点 + * positionCode2:终点 + * containerCode:容器编码 + * + */ + @PostMapping("/jobFinish") + public AjaxResult jobFinish(@RequestBody WmsJobRequest wmsJobRequest) { + AjaxResult ajaxResult = apiWcsService.jobFinish(wmsJobRequest); + RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wmsJobRequest), "wcs任务回传",ajaxResult); + requestLogService.insertRequestLog(requestLog); + return ajaxResult; + } + + /** + * 放货有货,重新分配货位 + */ + @PostMapping("/reAssign") + public AjaxResult reAssign(@RequestBody ReMaterialParam reMaterialParam) { + AjaxResult ajaxResult = apiWcsService.reAssign(reMaterialParam); + RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(reMaterialParam), "入库重分货位",ajaxResult); + requestLogService.insertRequestLog(requestLog); + return ajaxResult; + } + + /** + * 取货无货,重新分配物料 + */ + @PostMapping("/reMaterial") + public AjaxResult reMaterial(@RequestBody ReMaterialParam reMaterialParam) { + AjaxResult ajaxResult = apiWcsService.reMaterial(reMaterialParam); + RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(reMaterialParam), "取货无货重分物料",ajaxResult); + requestLogService.insertRequestLog(requestLog); + return ajaxResult; + } + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/ApiLog.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/ApiLog.java index 0820943..eaa88c8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/ApiLog.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/ApiLog.java @@ -8,16 +8,27 @@ import java.time.LocalDateTime; public class ApiLog { private Long id; + /** */ private String sysCode; + /** 接口名称 */ private String interfaceName; + /** 请求url */ private String requestUrl; + /** 请求内容 */ private String requestBody; + /** 相应内容 */ private String responseBody; + /** 消息类型 */ private String msgType; + /** 请求状态 */ private Integer httpStatus; + /** */ private Long costMs; + /** */ private String status; + /** */ private String errorMsg; + /** */ private LocalDateTime createTime; public Long getId() { return id; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/ApiResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/ApiResponse.java index 49f51e2..91045c4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/domain/ApiResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/domain/ApiResponse.java @@ -1,11 +1,14 @@ package com.ruoyi.api.domain; +import lombok.Data; + /** * 外部接口统一响应包装 * 因各系统返回数据格式不一致,解析后统一转换为此对象 * * @param 业务数据类型 */ +@Data public class ApiResponse { private boolean success; @@ -31,16 +34,5 @@ public class ApiResponse { return r; } - // ── getters & setters ────────────────────────────────── - public boolean isSuccess() { return success; } - public void setSuccess(boolean success) { this.success = success; } - public String getCode() { return code; } - public void setCode(String code) { this.code = code; } - public String getMessage() { return message; } - public void setMessage(String message) { this.message = message; } - public T getData() { return data; } - public void setData(T data) { this.data = data; } - public String getRawBody() { return rawBody; } - public void setRawBody(String rawBody) { this.rawBody = rawBody; } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/ApiErpService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/ApiErpService.java new file mode 100644 index 0000000..233e76b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/ApiErpService.java @@ -0,0 +1,126 @@ +package com.ruoyi.api.service; + +import com.ruoyi.apiService.domain.ReMaterialParam; +import com.ruoyi.apiService.domain.WmsJobRequest; +import com.ruoyi.apiService.domain.wcs.WcsStockinReceive; +import com.ruoyi.apiService.service.IToErpService; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; +import com.ruoyi.bas.id.taskno.service.IBasTaskNoService; +import com.ruoyi.bas.product.service.IBasProductService; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.in.bind.service.IInTrayMsgService; +import com.ruoyi.in.job.service.IMydoJobService; +import com.ruoyi.in.jobdetail.service.IMydoJobDetailService; +import com.ruoyi.in.stockindetail.service.IInStockinDetailService; +import com.ruoyi.in.stockin.service.IInStockinService; +import com.ruoyi.log.service.IRequestLogService; +import com.ruoyi.out.stockout.service.IOutStockoutService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + + +@Slf4j +@Component +public class ApiErpService { + + @Autowired + private IMydoJobService mydoJobService; + @Autowired + private IMydoJobDetailService mydoJobDetailService; + @Autowired + private IBasTaskNoService basTaskNoService; + @Autowired + private IBasCargoSpaceService basCargoSpaceService; + @Autowired + private IOutStockoutService outStockoutService; + @Autowired + private IBasProductService basProductService; + @Autowired + private IBasJobIdService basJobIdService; + @Autowired + private IToErpService toErpService; + @Autowired + private IInStockinService inStockinService; + @Autowired + private IInStockinDetailService inStockinDetailService; + //条码绑定 + @Autowired + private IInTrayMsgService inTrayMsgService; + //库存 + @Autowired + private IBasStockService basStockService; + @Autowired + IRequestLogService requestLogService; + + + + /** + * 响应wcs请求-下发入库任务 + * @param wcsStockinReiceive + * @return + */ + @Transactional(rollbackFor = Exception.class) + public AjaxResult requestMydoJobByTrayCode(WcsStockinReceive wcsStockinReiceive) { + + + log.info("【wms请求响应】<常规入库>响应信息,作业号:{},任务号:{},分配货位:{}"); + + return AjaxResult.success(); + + } + + + /** + * 请求补码作业 + * @param wcsStockinReiceive + * @return + */ + @Transactional + public AjaxResult requestMydoJobManual(WcsStockinReceive wcsStockinReiceive) { + + + log.info("【补码请求】<补码入库>响应信息,作业号:{},任务号:{},分配货位:{}"); + + return AjaxResult.success(); + + } + + + /** + * wcs任务回传 + * @param wmsJobRequest + * @return + */ + public AjaxResult jobFinish(WmsJobRequest wmsJobRequest) { + + return AjaxResult.success(); + } + + + /** + * 放货有货 - 入库重分 + * @param reMaterialParam + * @return + */ + public AjaxResult reAssign(ReMaterialParam reMaterialParam) { + + return AjaxResult.success(); + } + + /** + * 取货无货 - 重分物料 + * @param reMaterialParam + * @return + */ + @Transactional + public AjaxResult reMaterial(ReMaterialParam reMaterialParam) { + + return AjaxResult.success(); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/service/ApiWcsService.java b/ruoyi-admin/src/main/java/com/ruoyi/api/service/ApiWcsService.java new file mode 100644 index 0000000..c043e3e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/service/ApiWcsService.java @@ -0,0 +1,629 @@ +package com.ruoyi.api.service; + +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.ruoyi.apiService.domain.ReMaterialParam; +import com.ruoyi.apiService.domain.RequestEnterResponse; +import com.ruoyi.apiService.domain.WmsJobRequest; +import com.ruoyi.apiService.domain.wcs.WcsStockinReceive; +import com.ruoyi.apiService.domain.wcs.WcsStockinResponse; +import com.ruoyi.apiService.service.IToErpService; +import com.ruoyi.bas.cargospace.domain.BasCargoSpace; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; +import com.ruoyi.bas.id.taskno.service.IBasTaskNoService; +import com.ruoyi.bas.product.service.IBasProductService; +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.domain.BasStockInfo; +import com.ruoyi.bas.stock.service.IBasStockInfoService; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.common.*; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.MessageUtils; +import com.ruoyi.in.bind.domain.InTrayMsg; +import com.ruoyi.in.bind.service.IInTrayMsgService; +import com.ruoyi.in.job.domain.MydoJob; +import com.ruoyi.in.job.service.IMydoJobService; +import com.ruoyi.in.jobdetail.domain.MydoJobDetail; +import com.ruoyi.in.jobdetail.service.IMydoJobDetailService; +import com.ruoyi.in.stockindetail.service.IInStockinDetailService; +import com.ruoyi.in.stockin.service.IInStockinService; +import com.ruoyi.log.domain.RequestLog; +import com.ruoyi.log.service.IRequestLogService; +import com.ruoyi.out.stockout.service.IOutStockoutService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.ruoyi.common.core.domain.AjaxResult.error; +import static com.ruoyi.common.core.domain.AjaxResult.success; +import static java.util.Locale.filter; + + +@Slf4j +@Component +public class ApiWcsService { + + @Autowired + private IMydoJobService mydoJobService; + @Autowired + private IMydoJobDetailService mydoJobDetailService; + @Autowired + private IBasTaskNoService basTaskNoService; + @Autowired + private IBasCargoSpaceService basCargoSpaceService; + @Autowired + private IOutStockoutService outStockoutService; + @Autowired + private IBasProductService basProductService; + @Autowired + private IBasJobIdService basJobIdService; + @Autowired + private IToErpService toErpService; + @Autowired + private IInStockinService inStockinService; + @Autowired + private IInStockinDetailService inStockinDetailService; + //条码绑定 + @Autowired + private IInTrayMsgService inTrayMsgService; + //库存 + @Autowired + private IBasStockService basStockService; + @Autowired + private IBasStockInfoService basStockInfoService; + @Autowired + IRequestLogService requestLogService; + + + /** + * 呼叫可用容器出库 + * @return + */ + public AjaxResult callContainerOut(int type){ + + //获取库存主表种所有可用容器,包括空托盘和非空且有余位的托盘 + List stockInfos = basStockInfoService.selectBasStockInfoList( + new BasStockInfo().builder().trayType(type).build() + ); + stockInfos = stockInfos.stream() + .filter(s -> s.getEmptyStatus() != 0) + .sorted(Comparator.comparing(BasStockInfo::getEmptyStatus)) + .collect(Collectors.toList()); + + + //按托盘余位出库,优先有货未放满的托盘 + //获取指定托盘类型的所有库存 +// List stocks = basStockService.selectBasStockList( +// new BasStock().builder().trayType(type).build() +// ); +// stocks = stocks.stream() +// .sorted(Comparator.comparing(BasStock::getAvailablePlace))//排序会优先筛选已放货但未放满的托盘 +// .filter(s -> s.getAvailablePlace() > 0) +// .filter(s -> s.getStockStatus().equals(1)) +// .collect(Collectors.toList()); + + if (stockInfos.isEmpty()){ + return AjaxResult.error("没有可用托盘容器"); + }else{ + //要出库的库存 + BasStockInfo stockInfo = stockInfos.get(0); + String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_EMPTY_PALLET); + //判断托盘【未满】或【空】区分任务类型 + int taskType = stockInfo.getEmptyStatus() == 1 ? TaskType.TASKTYPE_STOCKOUT_CONTAINER : TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY; + + MydoJob mydoJob = new MydoJob().builder() + .jobId(jobId) + .inOrOut(taskType) + .trayCode(stockInfo.getTrayCode()) + .status(TaskStatusEnum.READY.getCode()) + .trayType(type) + .warehouseId("01") + .build(); + mydoJobService.insertMydoJob(mydoJob); + + //todo 空托盘或余位托盘出库有无子任务? +// MydoJobDetail md = new MydoJobDetail().builder() +// .jobId(jobId) +// .jobDetailId(jobId + 1) +// .trayType(type) +// .stockQuantity(Convert.toInt(stock.getQuantity())) +// .build(); + + + //初始化参数 + HashMap paramMap = new HashMap<>(); + paramMap.put("reqCode", UUID.randomUUID().toString());//请求码 + paramMap.put("trayCode", mydoJob.getTrayCode());//容器编号 + paramMap.put("jobId", mydoJob.getJobId()); + paramMap.put("inOrOut", mydoJob.getInOrOut()); + paramMap.put("cargoSpaceId", mydoJob.getCargoSpaceId()); + paramMap.put("trayType", mydoJob.getTrayType());//高度 + paramMap.put("remark", ""); + + AjaxResult ajaxResult = sendOutMydoJob(paramMap); + if (ajaxResult.isSuccess()){ + log.info("【推送出库】<容器>出库,作业号:{},货位:{},托盘号:{}", jobId, mydoJob.getCargoSpaceId(), mydoJob.getTrayCode()); + mydoJob.setStatus(TaskStatusEnum.RUNNING.getCode()); + mydoJobService.updateMydoJob(mydoJob); + + //标记库存状态【冻结/占用】 + List stocks =basStockService.selectBasStockList( + new BasStock().builder().trayCode(stockInfo.getTrayCode()).build() + ); + for (BasStock stock : stocks){ + stock.setStockStatus(StockStatusEnum.OCCUPIED.getCode()); + basStockService.updateBasStock(stock); + } + + //货位状态更新 + basCargoSpaceService.updateBasCargoSpaceStatus(stockInfo.getCargoSpaceId(), stockInfo.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT); + + } + + } + + return AjaxResult.success(); + } + + + /** + * 响应wcs请求-下发入库任务 + * @param wcsStockinReiceive + * @return + */ + @Transactional(rollbackFor = Exception.class) + public AjaxResult requestMydoJobByTrayCode(WcsStockinReceive wcsStockinReiceive) { + + RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wcsStockinReiceive), "wcs请求入库作业"); + requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); + requestLog.setResponseStatus("0"); + requestLog.setIsSuccessful("1"); + requestLogService.insertRequestLog(requestLog); + + int type = mydoJobService.getTrayTypeByTrayCode(wcsStockinReiceive.getTrayCode()); + + // -------------------------检查推送的任务参数------------------------- + log.info( + "【wcs请求入库】托盘号:{},托盘类型:{},巷道口:{}",wcsStockinReiceive.getTrayCode(), type, wcsStockinReiceive.getRoadwayId() + ); + + //校验 - 条码空 + if (StrUtil.isEmpty(wcsStockinReiceive.getTrayCode())) { + log.warn("【wcs请求入库】请求条码异常,参数为空,请重试"); + return AjaxResult.error("请求条码异常,参数为空"); + } + + //>>>查询已经绑定的条码和物料信息 + List trayMsgs = inTrayMsgService.selectInTrayMsgList( + new InTrayMsg().builder().trayCode(wcsStockinReiceive.getTrayCode()).build() + ); + if (trayMsgs.size() == 0){ + log.warn("【入库请求】未找到该托盘的绑定信息,请确认是否有绑定操作,托盘条码:{}", wcsStockinReiceive.getTrayCode()); + return AjaxResult.error("未找到该托盘的绑定信息,请确认是否有绑定操作"); + } + + //入库货位分配 + BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceForStockin( + new BasCargoSpace().builder().roadwayId(wcsStockinReiceive.getRoadwayId()).theType(type).build() + ); + if (cargoSpace == null) { + log.warn("【货位分配】该类型托盘立库中无可用货位"); + return AjaxResult.error("【货位分配失败】该类型托盘立库中无可用货位"); + } + + String jobId; + String taskNo; + int taskType; + String instockinId; + String instockinDetailId; + + //判断入库类型 + if (trayMsgs.get(0).getProductId().equals(ProductType.EMPTY_TRAY)){ + jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN_EMPTY_PALLET); + taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_EMPTY_PALLET); + taskType = TaskType.TASKTYPE_STOCKIN_EMPTY_TRAY; + }else{ + jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN); + taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN); + taskType = TaskType.TASKTYPE_STOCKIN; + } + + //>>>生成wms的入库主作业 + MydoJob mydoJob = new MydoJob().builder() + .jobId(jobId) + .taskNo(taskNo) + .status(TaskStatusEnum.READY.getCode()) + .executionPhase("0") + .inOrOut(taskType) + .trayCode(wcsStockinReiceive.getTrayCode()) + .entranceId(wcsStockinReiceive.getEntranceId()) + .roadwayId(wcsStockinReiceive.getRoadwayId()) + .cargoSpaceId(cargoSpace.getCargoSpaceId()) + .cargoSpaceName(cargoSpace.getCargoSpaceName()) + .trayType(type) + .build(); + + if (mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode()) == null){ + mydoJobService.insertMydoJob(mydoJob); + log.info("【wms生成入库】<空托入库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), mydoJob.getCargoSpaceId()); + }else{ + log.info("【提示】<常规入库>wms已存在该条码作业,托盘号:{}",mydoJob.getTrayCode()); + } + + //>>>根据绑定物料信息条数循环生成子作业,单条绑定信息对应一条子任务 + int sum = 1; + for (InTrayMsg trayMsg : trayMsgs){ + + if (mydoJobDetailService.selectMydoJobDetailList( + new MydoJobDetail().builder().stockinDetailId(trayMsg.getStockinDetailId()).build() + ).isEmpty()){ + + if (trayMsg.getProductId().equals(ProductType.EMPTY_TRAY)){ + instockinId = null; + instockinDetailId = null; + }else { + instockinId = trayMsg.getStockinId(); + instockinDetailId = trayMsg.getStockinDetailId() + sum; + } + + MydoJobDetail detail = new MydoJobDetail().builder() + .jobId(jobId) + .jobDetailId(jobId + "-" + sum) + .inQuantity(1) + .productId(trayMsg.getProductId()) + .productName(basProductService.selectBasProductByProductId(trayMsg.getProductId()).getProductName()) + .rollerNumber(trayMsg.getRollerNumber()) + .inDate(mydoJob.getCreateTime()) + .inOrOutId(instockinId) + .inOrOutDId(instockinDetailId) + .stockinId(instockinId) + .stockinDetailId(instockinDetailId) + .status("1") + .trayType(mydoJob.getTrayType()) + .build(); + sum++; + mydoJobDetailService.insertMydoJobDetail(detail); + } + + } + + //货位状态更新为【入库预占用】 + cargoSpace.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN); + basCargoSpaceService.insertBasCargoSpace(cargoSpace); + + //返回wcs的响应信息 + WcsStockinResponse response = new WcsStockinResponse() + .builder() + .reqCode(wcsStockinReiceive.getTrayCode()) + .jobId(jobId) + .taskNo(taskNo) + .taskType(taskType) + .trayCode(wcsStockinReiceive.getTrayCode()) + .cargoSpaceId(cargoSpace.getCargoSpaceId()) + .build(); + + log.info("【wms请求响应】<常规入库>响应信息,作业号:{},任务号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo(), mydoJob.getCargoSpaceId()); + + return AjaxResult.success(response); + + + } + +//todo 补码 + /** + * 请求补码作业 + * @param wcsStockinReiceive + * @return + */ + @Transactional + public AjaxResult requestMydoJobManual(WcsStockinReceive wcsStockinReiceive) { + + RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wcsStockinReiceive), "补码请求入库作业"); + requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); + requestLog.setResponseStatus("0"); + requestLog.setIsSuccessful("1"); + requestLogService.insertRequestLog(requestLog); + + int type = mydoJobService.getTrayTypeByTrayCode(wcsStockinReiceive.getTrayCode()); + + //查绑定信息 + List trayMsgs = inTrayMsgService.selectInTrayMsgList( + new InTrayMsg().builder().trayCode(wcsStockinReiceive.getTrayCode()).build() + ); + + if (trayMsgs.size() == 0){ + log.warn("【补码请求】未找到该托盘的绑定信息,请确认绑定后进行补码操作,托盘条码:{}", wcsStockinReiceive.getTrayCode()); + return AjaxResult.error("未找到该托盘的绑定信息,请确认绑定后进行补码操作"); + } + + //通过绑定信息的物料编码获取任务类型 + String jobId; + String taskNo; + int taskType; + + if (trayMsgs.get(0).getProductId() == ProductType.EMPTY_TRAY){ + jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN_EMPTY_PALLET); + taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_EMPTY_PALLET); + taskType = TaskType.TASKTYPE_STOCKIN_EMPTY_TRAY; + }else{ + jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN); + taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN); + taskType = TaskType.TASKTYPE_STOCKIN; + } + + //校验是否已经有该条码的入库作业 + List jobs = mydoJobService.selectMydoJobList( + new MydoJob().builder() + .trayCode(wcsStockinReiceive.getTrayCode()) + .build() + ); + + if (!jobs.isEmpty()){ + log.warn("【补码请求】已经存在该条码的入库任务,,托盘条码:{}", wcsStockinReiceive.getTrayCode()); + return AjaxResult.error("未找到该托盘的绑定信息,请确认绑定后进行补码操作"); + } + + //分配货位 + BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceForStockin( + new BasCargoSpace().builder().roadwayId(wcsStockinReiceive.getRoadwayId()).theType(type).build() + ); + + //生成wms的入库主作业 + MydoJob mydoJob = new MydoJob().builder() + .jobId(jobId) + .taskNo(taskNo) + .status(TaskStatusEnum.READY.getCode()) + .executionPhase("0") + .inOrOut(taskType) + .trayCode(wcsStockinReiceive.getTrayCode()) + .entranceId(wcsStockinReiceive.getEntranceId()) + .roadwayId(wcsStockinReiceive.getRoadwayId()) + .cargoSpaceId(cargoSpace.getCargoSpaceId()) + .cargoSpaceName(cargoSpace.getCargoSpaceName()) + .trayType(type) + .build(); + + //循环生成子作业 + int sum = 1; + for (InTrayMsg trayMsg : trayMsgs){ + + if (mydoJobDetailService.selectMydoJobDetailList( + new MydoJobDetail().builder().stockinDetailId(trayMsg.getStockinDetailId()).build() + ).isEmpty()){ + MydoJobDetail detail = new MydoJobDetail().builder() + .jobId(jobId) + .jobDetailId(taskNo + "-" + sum) + .inQuantity(1) + .productId(trayMsg.getProductId()) + .productName(basProductService.selectBasProductByProductId(trayMsg.getProductId()).getProductName()) + .inDate(mydoJob.getCreateTime()) + .inOrOutId(trayMsg.getStockinId()) + .inOrOutDId(trayMsg.getStockinDetailId() + sum) + .stockinId(trayMsg.getStockinId()) + .stockinDetailId(trayMsg.getStockinDetailId() + sum) + .status("1") + .trayType(mydoJob.getTrayType()) + .build(); + sum++; + mydoJobDetailService.insertMydoJobDetail(detail); + } + + } + + //返回wcs响应信息 + WcsStockinResponse response = new WcsStockinResponse().builder() + .reqCode(wcsStockinReiceive.getTrayCode()) + .jobId(jobId) + .taskNo(taskNo) + .taskType(TaskType.TASKTYPE_STOCKIN) + .trayCode(wcsStockinReiceive.getTrayCode()) + .cargoSpaceId(cargoSpace.getCargoSpaceId()) + .build(); + log.info("【补码请求】<补码入库>响应信息,作业号:{},任务号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo(), mydoJob.getCargoSpaceId()); + + return AjaxResult.success(response); + +// HashMap result = new HashMap<>(); +// result.put("jobId", mydoJob.getJobId()); +// result.put("taskNo", mydoJob.getTaskNo()); +// result.put("cargoSpaceId", mydoJob.getCargoSpaceId()); +// result.put("roadwayId", mydoJob.getRoadwayId()); +// result.put("entranceId", mydoJob.getEntranceId()); +// return AjaxResult.success(result); + } + + + /** + * wcs任务回传 + * @param wmsJobRequest + * @return + */ + public AjaxResult jobFinish(WmsJobRequest wmsJobRequest) { + + MydoJob mydoJobParam = mydoJobService.selectMydoJobByJobId(wmsJobRequest.getJobId()); + + if (StrUtil.isEmpty(wmsJobRequest.getJobId())) { + log.warn("【wcs任务上报】请求异常,作业号为空!"); + return AjaxResult.error("作业号不能为空"); + } + + if (ObjUtil.isEmpty(mydoJobParam)) { + log.warn("【wcs任务上报】找不到该任务,请核对任务状态,作业号:{}", wmsJobRequest.getJobId()); + return AjaxResult.error("找不到该任务,请核对任务状态"); + } + + if (StrUtil.isEmpty(wmsJobRequest.getTrayCode())) { + log.warn("【wcs任务上报】请求异常,托盘条码为空!"); + return AjaxResult.error("条码不能为空"); + } + + + //根据任务类型处理账务 + switch (wmsJobRequest.getWmsType()) { + //入库 + case "1": + //自动完成任务 + mydoJobService.autoCompleteJob(wmsJobRequest.getJobId(), wmsJobRequest.getWmsType()); + break; + //出库 + case "2": + //自动完成任务 + mydoJobService.autoCompleteJob(wmsJobRequest.getJobId(), wmsJobRequest.getWmsType()); + break; + + default: + log.error("【wcs任务完成上报】执行失败,作业类型错误"); + return AjaxResult.error(MessageUtils.message("执行失败,作业类型错误")); + } + return AjaxResult.success(); + } + + + /** + * 放货有货 - 入库重分 + * @param reMaterialParam + * @return + */ + public AjaxResult reAssign(ReMaterialParam reMaterialParam) { + + //重新分配货位 + MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(reMaterialParam.getJobId()); + + String warehouseId = mydoJob.getWarehouseId(); + BasCargoSpace basCargoSpaceParam = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(reMaterialParam.getCargoSpaceId()); + + //标记异常货位状态 + if (basCargoSpaceParam != null) { + basCargoSpaceParam.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_EXCEPTION); + basCargoSpaceService.updateBasCargoSpace(basCargoSpaceParam); + } + + //重新查找可用货位 + BasCargoSpace newCargoSpace = basCargoSpaceService.selectBasCargoSpaceForStockin( + new BasCargoSpace().builder().roadwayId(mydoJob.getRoadwayId()).theType(mydoJob.getTrayType()).build() + ); + + if (newCargoSpace == null) { + return AjaxResult.error("没有空货位"); + } else { + //更新任务 + mydoJob.setCargoSpaceId(newCargoSpace.getCargoSpaceId()); + mydoJob.setFaultFlag("1"); + mydoJobService.updateMydoJob(mydoJob); + + //更新货位状态 + newCargoSpace.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN); + basCargoSpaceService.updateBasCargoSpace(newCargoSpace); + + return AjaxResult.success( + new RequestEnterResponse().builder() + .cargoSpaceId(newCargoSpace.getCargoSpaceId()) + .trayCode(mydoJob.getTrayCode()) + .JobId(reMaterialParam.getJobId()) + .reqCode(reMaterialParam.getReqCode()) + .build() + ); + } + } + + /** + * 取货无货 - 重分物料 + * @param reMaterialParam + * @return + */ + @Transactional + public AjaxResult reMaterial(ReMaterialParam reMaterialParam) { + + //>>>重新分配物料<<< + //获取上报的异常任务jobId + MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(reMaterialParam.getJobId()); + MydoJobDetail mydoJobDetailParam = new MydoJobDetail(); + mydoJobDetailParam.setJobId(mydoJob.getJobId()); + List mydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(mydoJobDetailParam); + + //获取出库单据号 + String stockOutId = mydoJobDetails.get(0).getInOrOutId(); + + //作废作业 + mydoJobService.cancelJob(reMaterialParam.getJobId()); + + //调用自动分配 + return outStockoutService.autoAssignOutStockout(stockOutId); + } + + + /** + * 推送入库回流作业 + * @param param + * @return + */ + public AjaxResult sendReturnMydoJob(Map param) { + + RequestLog requestLog = requestLogService.getRequestLog(WcsUrl.PUSH_IN_MYDO_JOB, "推送入库回流作业", JSONUtil.toJsonStr(param)); + requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); + requestLog.setResponseStatus("0"); + requestLog.setIsSuccessful("1"); + requestLogService.insertRequestLog(requestLog); + + if ("1".equals(requestLog.getIsSuccessful())) { + return AjaxResult.success(); + } + + return AjaxResult.error(); + } + + + public AjaxResult sendOutMydoJob(Map param) { + + RequestLog requestLog = requestLogService.getRequestLog(WcsUrl.PUSH_OUT_MYDO_JOB, "推送出库作业", JSONUtil.toJsonStr(param)); + requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); + requestLog.setResponseStatus("0"); + requestLog.setIsSuccessful("1"); + requestLogService.insertRequestLog(requestLog); + + if ("1".equals(requestLog.getIsSuccessful())) { + return AjaxResult.success(); + } + + return AjaxResult.error(); + } + + public AjaxResult sendMoveMydoJob(Map param) { + + RequestLog requestLog = requestLogService.getRequestLog(WcsUrl.PUSH_MOVE_MYDO_JOB, "推送移库作业", JSONUtil.toJsonStr(param)); + requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); + requestLog.setResponseStatus("0"); + requestLog.setIsSuccessful("1"); + requestLogService.insertRequestLog(requestLog); + + if ("1".equals(requestLog.getIsSuccessful())) { + return AjaxResult.success(); + } + + return AjaxResult.error(); + } + + + public AjaxResult sendEmptyTrayOutMydoJob(Map param) { + + RequestLog requestLog = requestLogService.getRequestLog(WcsUrl.PUSH_OUT_MYDO_JOB, "推送容器出库作业", JSONUtil.toJsonStr(param)); + requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); + requestLog.setResponseStatus("0"); + requestLog.setIsSuccessful("1"); + requestLogService.insertRequestLog(requestLog); + + if ("1".equals(requestLog.getIsSuccessful())) { + return AjaxResult.success(); + } + + return AjaxResult.error(); + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToErpApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToErpApiController.java new file mode 100644 index 0000000..30c2599 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToErpApiController.java @@ -0,0 +1,86 @@ +package com.ruoyi.apiService.controller; + + +import com.ruoyi.apiService.domain.receiveStockList.StockinListReceive; +import com.ruoyi.apiService.domain.receiveStockList.StockinListResponse; +import com.ruoyi.apiService.domain.receiveStockList.StockoutListReceive; +import com.ruoyi.apiService.service.IToErpService; +import com.ruoyi.common.core.domain.AjaxResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 作业统计 Controller + */ +@RestController +@RequestMapping("/api2erp") +public class ToErpApiController { + +// @Autowired +// private IToErpService toErpService; +// +// /** +// * 接收物料信息 +// */ +// @GetMapping("/receiveProduct") +// public AjaxResult receiveProduct() { +// return toErpService.receiveProduct(); +// } +// +// /** +// * 接收客户信息 +// */ +// @GetMapping("/receiveCustomer") +// public AjaxResult receiveCustomer() { +// return toErpService.receiveCustomer(); +// } +// +// /** +// * 接收供应商信息 +// */ +// @GetMapping("/receiveSupplier") +// public AjaxResult receiveSupplier() { +// return toErpService.receiveSupplier(); +// } +// +// /** +// * 接收入库单信息 +// */ +// @GetMapping("/receiveStockinList") +// public AjaxResult receiveStockinList(@RequestBody StockinListReceive stockinListReceive){ +// return toErpService.receiveStockinList(stockinListReceive); +// } +// +// /** +// * 接收出库单信息 +// */ +// @GetMapping("/receiveStockoutList") +// public AjaxResult receiveStockoutList(@RequestBody StockoutListReceive stockoutListReceive){ +// return toErpService.receiveStockoutList(stockoutListReceive); +// } +// +// /** +// * 接收盘点单信息 +// */ +// @GetMapping("/receiveInventoryList") +// public AjaxResult receiveInventoryList(){ +// return toErpService.receiveInventoryList(); +// } +// +// +// @PostMapping("/login") +// public AjaxResult login() { +// toErpService.login(); +// return AjaxResult.success(); +// } +// +// @PostMapping("/qqq") +// public AjaxResult qqq() { +// return toErpService.getErpStockinList(); +// } +// +// @RequestMapping("/getInStock") +// public AjaxResult getInStock(){ +// return toErpService.getInStock(); +// } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToWcsApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToWcsApiController.java new file mode 100644 index 0000000..26744af --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToWcsApiController.java @@ -0,0 +1,34 @@ +package com.ruoyi.apiService.controller; + + +import com.ruoyi.apiService.domain.AgvMoveParam; +import com.ruoyi.apiService.service.IToWcsService; +import com.ruoyi.common.core.domain.AjaxResult; +import org.springframework.beans.factory.annotation.Autowired; +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; + +/** + * 作业统计 Controller + */ +@RestController +@RequestMapping("/api2wcs") +public class ToWcsApiController { + + + @Autowired + private IToWcsService toWcsService; + + + /** + * 推送agv搬运作业 + * @return + */ + @PostMapping("/pushAgvMoveJob") + public AjaxResult pushAgvMoveJob(@RequestBody AgvMoveParam agvMoveParam) { +// return toWcsService.pushAgvMoveJob(agvMoveParam); + return null; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToWmsApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToWmsApiController.java new file mode 100644 index 0000000..6f035b9 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/controller/ToWmsApiController.java @@ -0,0 +1,107 @@ +package com.ruoyi.apiService.controller; + +import com.ruoyi.apiService.service.IToWmsService; +import com.ruoyi.log.service.IRequestLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 作业统计 Controller + */ +@RestController +@RequestMapping("/api2wms") +public class ToWmsApiController { + + @Autowired + private IToWmsService toWmsService; + @Autowired + private IRequestLogService requestLogService; + +// /** +// * 请求生成入库作业 +// */ +// @PostMapping("/requestMydoJobByTrayCode") +// public AjaxResult requestEnterByTrayCode(@RequestBody WcsStockinReiceive wcsStockinReiceive) { +// AjaxResult ajaxResult = toWmsService.requestMydoJobByTrayCode(wcsStockinReiceive); +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wcsStockinReiceive), "入库任务创建请求",ajaxResult); +// requestLogService.insertRequestLog(requestLog); +// return ajaxResult; +// } +// +// /** +// * 请求补码作业 +// */ +// @RequestMapping("/requestMydoJobByNoTrayCode") +// public AjaxResult requestByNoTrayCode(@RequestBody WcsStockinReiceive wcsStockinReiceive) { +// AjaxResult ajaxResult = toWmsService.requestMydoJobManual(wcsStockinReiceive); +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wcsStockinReiceive), "请求补码作业",ajaxResult); +// requestLogService.insertRequestLog(requestLog); +// return ajaxResult; +// } +// +// /** +// * 获取入库作业 +// */ +// @RequestMapping("/requestMydoJobByTrayCodeAndEntranceId") +// public AjaxResult requestEnterByTrayCodeAndEntranceId(@RequestBody RequestEnter requestEnter) { +// AjaxResult ajaxResult = toWmsService.requestEnterByTrayCodeAndEntranceId(requestEnter); +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(requestEnter), "获取入库作业",ajaxResult); +// requestLogService.insertRequestLog(requestLog); +// return ajaxResult; +// } +// +// +// /** +// * 入库、出库 任务完成回传 +// * Map +// * "wmsType": "任务类型" 1-入库 2-出库 3-agv搬运, +// * taskNo:出库 入库任务号 +// * trayCode:托盘码 +// * positionCode1:起点 +// * positionCode2:终点 +// * containerCode:容器编码 +// * +// */ +// @PostMapping("/jobFinish") +// public AjaxResult jobFinish(@RequestBody WmsJobRequest wmsJobRequest) { +// AjaxResult ajaxResult = toWmsService.jobFinish(wmsJobRequest); +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wmsJobRequest), "jobFinish",ajaxResult); +// requestLogService.insertRequestLog(requestLog); +// return ajaxResult; +// } +// +// /** +// * 放货有货,重新分配货位 +// */ +// @PostMapping("/reAssign") +// public AjaxResult reAssign(@RequestBody ReMaterialParam reMaterialParam) { +// AjaxResult ajaxResult = toWmsService.reAssign(reMaterialParam); +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(reMaterialParam), "reAssign",ajaxResult); +// requestLogService.insertRequestLog(requestLog); +// return ajaxResult; +// } +// +// /** +// * 取货无货,重新分配物料 +// */ +// @PostMapping("/reMaterial") +// public AjaxResult reMaterial(@RequestBody ReMaterialParam reMaterialParam) { +// AjaxResult ajaxResult = toWmsService.reMaterial(reMaterialParam); +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(reMaterialParam), "reMaterial",ajaxResult); +// requestLogService.insertRequestLog(requestLog); +// return ajaxResult; +// } + + + + /** + * 接收入库单据 + */ + + /** + * 接收出库单据 + */ + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/AgvMoveParam.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/AgvMoveParam.java new file mode 100644 index 0000000..6c975a0 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/AgvMoveParam.java @@ -0,0 +1,15 @@ +package com.ruoyi.apiService.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AgvMoveParam { + private String startPoint; + private String endPoint; + private String containerCode; + private String taskNo; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/GenAgvSchedulingTaskRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/GenAgvSchedulingTaskRequest.java new file mode 100644 index 0000000..da02d7e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/GenAgvSchedulingTaskRequest.java @@ -0,0 +1,156 @@ +package com.ruoyi.apiService.domain; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.UUID; + +/** + * 【生成AGV任务】请求接口 + */ +@Data +public class GenAgvSchedulingTaskRequest { + /** + * 请求编号 + * 同一个请求重复提交, 使用同一编号 + */ + @NotNull + private String reqCode = UUID.randomUUID().toString(); + /** + * 请求时间 + * 格式: “yyyy-MM-dd HH:mm:ss” + */ + private String reqTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).toString(); + /** + * 客户端编号 + * 客户端编号,如PDA,HCWMS等 + */ + private String clientCode; + /** + * 令牌号 + * 由调度系统颁发 + */ + private String tokenCode; + /** + * 任务类型 + * 内置任务类型: + * 厂内货架搬运: F01 + * 厂内货架空满交换: F02 + * 辊筒搬运接驳:F03 + * 厂内货架出库AGV待命:F04 + * 旋转货架: F05 + * 厂内电梯任务: F06 + * 以下为叉车专用任务类型 + * 高位货架到工作台: F11 + * 工作台到高位货架: F12 + * 巷道到工作台: F13 + * 工作台到巷道: F14 + * 高位货架到工作台(接驳) : F15 + * 工作台到高位货架 (接驳) : F16 + * 巷道到工作台(接驳) : F17 + * 工作台到巷道(接驳) : F18 + * 叉车电梯主任务: F20 + */ + @NotNull + private String taskTyp; + /** + * 容器类型(叉车/CTU专用) 叉车项目必传 + */ + private String ctnrTyp; + /** + * 容器编号 (叉车/CTU专用) + */ + private String ctnrCode; // + /** + * 容器数量(叉车堆叠专用),默认值1,仅记录堆叠的数量不记录堆叠的每个容器号 + */ + private String ctnrNum; + /** + * 任务模式 + * 0-普通move 1-出库move 2-入库move 3-移库move + */ + private String taskMode; + /** + * 工作位 + * 与RCS-2000端配置的位置名称一致, 工作位名称为字母\数字\或组合 + */ + private String wbCode; + /** + * 位置路径 + * AGV关键路径位置集合,与任务类型中模板配置的位置路径一一对应。待现场地图部署、配置完成后可获取 + */ + private List positionCodePath; + /** + * 货架编号 + * 不指定货架可以为空 + */ + private String podCode; + /** + * 货架方向 + * “180”,”0”,”90”,”-90” 分别对应地图的”左”,”右”,”上”,”下” + * 不指定方向可以为空 + * 如果终点不是工作台或工作台未配置操作方向则货架拣货方向podDir作为终点方向 + * 如果工作台配有操作方向,则系统会根据货架拣货方向podDir和工作台操作方向计算货架终点方向 + */ + private String podDir; + /** + * 货架类型, 传空时表示随机找个货架 + * 找空货架传参方式如下: + * -1: 代表不关心货架类型, 找到空货架即可. + * -2: 代表从工作位获取关联货架类型, 如果未配置, 只找空货架. + * 货架类型编号: 只找该货架类型的空货架 + */ + private String podTyp; + /** + * 物料批次 + * 物料批次或货架上的物料唯一编码,生成任务单时,货架与物料直接绑定时使用. (通过同时传podCode和materialLot来绑定或通过 wbCode 找到位置上的货架和materialLot来绑定) + * 如果是区域/策略内查找货架,可以匹配对应物料批次的货架,支持以下值: + * 0:区域/策略内查找空货架 + * 1:区域/策略内查找满货架 + * 其他值:查找指定物料批次对应的货架 + * 巷道任务通过该字段传入特征值 + */ + private String materialLot; + /** + * 优先级 + * 从(1~127)级,最大优先级最高。为空时,采用任务模板的优先级 + */ + private String priority; + /** + * AGV编号 + * 填写表示指定某一编号的AGV执行该任务 + */ + private String agvCode; + /** + * 任务单号 + * 选填, 不填系统自动生成 + */ + private String taskCode; + /** + * 组编号 + * CTU场景下用于按组出库,同组任务优先拼车。 如业务需要任务组间或组内按顺序出库,则需调用料箱顺序出库(CTU)接口。 + * 潜伏式场景下,通过组号来管理顺序出库的顺序,组号小的优先出库。 + */ + private String groupId; + /** + * 设备类型 + */ + private String agvTyp; + /** + * 选择策略 + * 区域/策略中挑选货架以及根据物料批次挑选货架时的先进先出规则,支持以下4个值: + * 1:按照货架到达储位的时间顺序,先进先出 + * 2:按照货架到达储位的时间顺序,先进后出 + * 9:按照货架绑定物料批次的时间顺序,先进先出 + * 10:按照货架绑定物料批次的时间顺序,先进后出 + */ + private String positionSelStrategy; + /** + * 自定义数据 + */ + private String data; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/PositionCodeData.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/PositionCodeData.java new file mode 100644 index 0000000..8a1d9a1 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/PositionCodeData.java @@ -0,0 +1,35 @@ +package com.ruoyi.apiService.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PositionCodeData { + /** + * 位置编号 - 单个编号不超过64位 + */ + private String positionCode; + /** + * 类型 + * + * 位置类型说明: + * 00表示:位置编号 + * 01表示:物料批次号 + * 02表示:策略编号(含多个区域) 如:第一个区域放不下, 可以放第二个区域 + * 03表示:货架编号,通过货架编号找到货架所在位置 + * 04表示:区域编号,在区域中查找可用位置 + * 05表示:仓位编号(叉车/CTU专用) + * 06表示:巷道编号 + * 07表示:容器编号 + * 08表示:巷道策略 + * 09表示:巷道区域 + * 10表示:巷道仓位 + * 11表示:输送线(机台)编号 + * 12表示:CTU工作台(梳齿工作站)编号 + * 13表示:搬运巷道指定货架出库 + */ + private String type; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/ReMaterialParam.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/ReMaterialParam.java new file mode 100644 index 0000000..0e870c3 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/ReMaterialParam.java @@ -0,0 +1,24 @@ +package com.ruoyi.apiService.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ReMaterialParam { + + /** 请求码 */ + String reqCode; + + /** 作业号 */ + String jobId; + + /** 异常货位 */ + String cargoSpaceId; + + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/RequestEnter.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/RequestEnter.java new file mode 100644 index 0000000..7effb34 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/RequestEnter.java @@ -0,0 +1,21 @@ +package com.ruoyi.apiService.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RequestEnter { + //物料码 + private String trayCode; + + //入库位置 + private String entranceId; + + private String warehouseId; + + private String roadwayId; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/RequestEnterResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/RequestEnterResponse.java new file mode 100644 index 0000000..831ce2f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/RequestEnterResponse.java @@ -0,0 +1,26 @@ +package com.ruoyi.apiService.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class RequestEnterResponse { + + /** 请求码 */ + String reqCode; + + /** 分配货位 */ + String cargoSpaceId; + + /** 条码 */ + String trayCode; + + /** 任务号 */ + String JobId; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/ResponseBase.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/ResponseBase.java new file mode 100644 index 0000000..f5fc7f3 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/ResponseBase.java @@ -0,0 +1,22 @@ +package com.ruoyi.apiService.domain; + +import lombok.Data; + +@Data +public class ResponseBase { + + /** + * 状态码 + */ + private String code; + + /** + * 响应信息 + */ + private String msg; + + /** + * 响应数据 + */ + private Object data; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/WmsJobRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/WmsJobRequest.java new file mode 100644 index 0000000..d4627ba --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/WmsJobRequest.java @@ -0,0 +1,33 @@ +package com.ruoyi.apiService.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WmsJobRequest { + + //任务id + private String jobId; + + //wms任务号 + private String taskNo; + + //wms任务类型 1-入库 2-出库 3-agv任务 + private String wmsType; + + //托盘编码 + private String trayCode; + + //拣选输送机 +// private String pickSsj; + //料架编码 +// private String containerCode; + //起点 +// private String positionCode1; + //终点 +// private String positionCode2; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/erp/RollerInfo.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/erp/RollerInfo.java new file mode 100644 index 0000000..48a04a2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/erp/RollerInfo.java @@ -0,0 +1,13 @@ +package com.ruoyi.apiService.domain.erp; + +import lombok.Builder; +import lombok.Data; + +/** + * 版辊信息 + */ +@Data +@Builder +public class RollerInfo { + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockinListReceive.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockinListReceive.java new file mode 100644 index 0000000..826e4ab --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockinListReceive.java @@ -0,0 +1,12 @@ +package com.ruoyi.apiService.domain.receiveStockList; + +import com.ruoyi.in.stockindetail.domain.InStockinDetail; +import lombok.Data; + +import java.util.List; + +@Data +public class StockinListReceive { + + private List stockinDetails; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockinListResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockinListResponse.java new file mode 100644 index 0000000..f21cd3a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockinListResponse.java @@ -0,0 +1,9 @@ +package com.ruoyi.apiService.domain.receiveStockList; + +import com.ruoyi.apiService.domain.ResponseBase; +import lombok.Data; + +@Data +public class StockinListResponse extends ResponseBase { + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockoutListReceive.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockoutListReceive.java new file mode 100644 index 0000000..3407fae --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockoutListReceive.java @@ -0,0 +1,8 @@ +package com.ruoyi.apiService.domain.receiveStockList; + +import lombok.Data; + +@Data +public class StockoutListReceive { + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockoutListResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockoutListResponse.java new file mode 100644 index 0000000..ae5a285 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/receiveStockList/StockoutListResponse.java @@ -0,0 +1,9 @@ +package com.ruoyi.apiService.domain.receiveStockList; + +import com.ruoyi.apiService.domain.ResponseBase; +import lombok.Data; + +@Data +public class StockoutListResponse extends ResponseBase { + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/wcs/WcsStockinReceive.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/wcs/WcsStockinReceive.java new file mode 100644 index 0000000..e7a669c --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/wcs/WcsStockinReceive.java @@ -0,0 +1,54 @@ +package com.ruoyi.apiService.domain.wcs; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.annotation.Nullable; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WcsStockinReceive { + + /** + * 请求码 + */ + @Nullable + String reqCode; + + /** + * 条码 + */ + private String trayCode; + + /** + * 入口 + */ + @Nullable + private String entranceId; + + /** + * 仓库 + */ + @Nullable + private String warehouseId; + + /** + * 巷道号 + */ + private String roadwayId; + + /** + * 托盘类型 + */ +// String trayType; + + /** + * 备注 + */ +// String remark; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/wcs/WcsStockinResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/wcs/WcsStockinResponse.java new file mode 100644 index 0000000..5a6ba26 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/domain/wcs/WcsStockinResponse.java @@ -0,0 +1,42 @@ +package com.ruoyi.apiService.domain.wcs; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WcsStockinResponse { + + /** + * 请求时传入的 reqCode,原样回传 + */ + String reqCode; + + /** + * 分配货位 + */ + String cargoSpaceId; + + /** 任务类型 */ + int taskType; + + /** + * 条码 + */ + String trayCode; + + /** + * 作业号 + */ + String jobId; + + /** + * 任务号 + */ + String taskNo; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToErpService.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToErpService.java new file mode 100644 index 0000000..a4d215d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToErpService.java @@ -0,0 +1,42 @@ +package com.ruoyi.apiService.service; + + +import com.ruoyi.apiService.domain.receiveStockList.StockinListReceive; +import com.ruoyi.apiService.domain.receiveStockList.StockinListResponse; +import com.ruoyi.apiService.domain.receiveStockList.StockoutListReceive; +import com.ruoyi.common.core.domain.AjaxResult; + + +import java.util.Map; + +/** + * 作业统计 Service 接口 + */ +public interface IToErpService { + + +// Map saveTransferBill(); +// +// Map billCompletedCallBack(); +// +// AjaxResult receiveProduct(); +// +// AjaxResult receiveCustomer(); +// +// AjaxResult receiveSupplier(); +// +// String login(); +// +// AjaxResult callErp(ReceiveOutStockConfirm receiveOutStockConfirm); +// +// AjaxResult receiveStockinList(StockinListReceive StockinListReceive); +// +// AjaxResult receiveStockoutList(StockoutListReceive stockoutListReceive); +// +// AjaxResult receiveInventoryList(); +// +// +// AjaxResult getErpStockinList(); +// +// AjaxResult getInStock(); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToWcsService.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToWcsService.java new file mode 100644 index 0000000..e6f6649 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToWcsService.java @@ -0,0 +1,53 @@ +package com.ruoyi.apiService.service; + + +import com.ruoyi.common.core.domain.AjaxResult; + +import java.util.HashMap; + +/** + * 作业统计 Service 接口 + */ +public interface IToWcsService { + + /** + * 呼叫空托盘出库 + * @param PalletType + */ + public AjaxResult callEmptyPalletOut(String PalletType); + + + /** + * 推送CTU出库任务 + */ + void pushOutMydoJob(); + + + /** + * 推送agv搬运作业 + * @return + */ +// AjaxResult pushAgvMoveJob(AgvMoveParam agvMoveParam); + + + /** + * 推送流利架入库任务 + */ + void pushInMydoJob(); + + /** + * 出库作业确认 + * @param outMydojobMakeSureParam + * @return + */ + AjaxResult outMydojobMakeSure(HashMap outMydojobMakeSureParam); + + /** + * 取消任务 + * @param taskNo + * @return + */ + AjaxResult cancelTaskByTaskNo(String taskNo); + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToWmsService.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToWmsService.java new file mode 100644 index 0000000..9a77929 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/IToWmsService.java @@ -0,0 +1,44 @@ +package com.ruoyi.apiService.service; + + +/** + * 作业统计 Service 接口 + */ +public interface IToWmsService { + +// /** +// * 根据托盘条码请求入库任务 +// */ +// AjaxResult requestMydoJobByTrayCode(WcsStockinReiceive wcsStockinReiceive); +// +// /** 请求补码作业 */ +// AjaxResult requestMydoJobManual(WcsStockinReiceive wcsStockinReiceive); +// +// /** +// * 入库、出库 任务完成回传 +// * Map +// * "wmsType": "任务类型" 1-入库 2-出库 +// * taskNo:出库 入库任务号 +// * trayCode:托盘码 +// * positionCode1:起点 +// * positionCode2:终点 +// * containerCode:容器编码 +// * +// */ +// AjaxResult jobFinish(WmsJobRequest wmsJobRequest); +// +// /** +// * 放货有货,重新分配货位 +// */ +// AjaxResult reAssign(ReMaterialParam reMaterialParam); +// +// /** +// * 取货无货,重新分配物料 +// */ +// AjaxResult reMaterial(ReMaterialParam reMaterialParam); +// +// /** +// * 获取入库作业 +// */ +// AjaxResult requestEnterByTrayCodeAndEntranceId(RequestEnter requestEnter); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToErpServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToErpServiceImpl.java new file mode 100644 index 0000000..a0cb00a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToErpServiceImpl.java @@ -0,0 +1,641 @@ +package com.ruoyi.apiService.service.impl; + + +import com.ruoyi.apiService.service.IToErpService; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; + +import com.ruoyi.bas.customer.service.IBasCustomerService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; +import com.ruoyi.bas.product.service.IBasProductService; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.bas.supplier.service.IBasSupplierService; +import com.ruoyi.common.core.redis.RedisCache; + +import com.ruoyi.in.stockindetail.service.IInStockinDetailService; +import com.ruoyi.in.stockin.service.IInStockinService; + + +import com.ruoyi.log.service.IRequestLogService; +import com.ruoyi.out.stockout.service.IOutStockoutService; +import com.ruoyi.out.stockoutdetail.service.IOutStockoutDetailService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 作业统计 Service 实现 + */ +@Slf4j +@Service +public class ToErpServiceImpl implements IToErpService { + + @Autowired + private IBasProductService basProductService; + + @Autowired + private IBasSupplierService basSupplierService; + + @Autowired + private IOutStockoutService outStockoutService; + + @Autowired + private IOutStockoutDetailService outStockoutDetailService; + + + //wms入库主单 + @Autowired + private IInStockinService inStockinService; + + //wms入库子单 + @Autowired + private IInStockinDetailService inStockinDetailService; + + //货位 + @Autowired + private IBasCargoSpaceService basCargoSpaceService; + + //库存 + @Autowired + private IBasStockService basStockService; + + //日志 + @Autowired + private IRequestLogService requestLogService; + + @Autowired + private IBasJobIdService basJobIdService; + + @Autowired + private IBasCustomerService basCustomerService; + + @Autowired + private RedisCache redisCache; + + + private static final String erpUrl = "http://115.190.99.109:5055"; + + private static final String loginUrl = erpUrl+"/webapi/v3/ov1/login"; + private static final String supplierListUrl = erpUrl+"/webapi/v3/store/supplierList"; + private static final String customerListUrl = erpUrl+"/sysa/mobilephone/salesmanage/custom/list.asp"; + private static final String productListUrl = erpUrl+"/sysa/mobilephone/salesmanage/product/billlist.asp"; + + private static final String TOKEN_KEY = "ZBAPI-Token"; + private static final String outStockListUrl = erpUrl+"/webapi/v3/store/KuOutApplyList"; + private static final String outStockConfirmUrl = erpUrl+"/webapi/v3/store/KuOutApplyEdit/edit"; + + private static final String getStockinListUrl = erpUrl+"/webapi/v3/store/KuInApplyList"; + private static final String stockinConfirmUrl = erpUrl+"/webapi/v3/store/KuInApplyEdit/edit"; + + + +// @Override +// public Map saveTransferBill() { +// HashMap map = new HashMap<>(); +// map.put("code","200"); +// return map; +// } +// +// @Override +// public Map billCompletedCallBack() { +// HashMap map = new HashMap<>(); +// map.put("code","200"); +// return map; +// } +// +// @Override +// public AjaxResult receiveProduct() { +// AspRequestParam erpCustomerParam = new AspRequestParam(); +// erpCustomerParam.setSession(login()); +// erpCustomerParam.setCmdkey("refresh"); +// List dataInfoList = new ArrayList<>(); +// dataInfoList.add(new AspRequestParam.DataInfo("pagesize", 100000)); +// dataInfoList.add(new AspRequestParam.DataInfo("pageindex", 1)); +// dataInfoList.add(new AspRequestParam.DataInfo("idProductClass", "532")); +// erpCustomerParam.setDatas(dataInfoList); +// String body = HttpRequest.post(productListUrl).header(TOKEN_KEY, login()).body(JSONUtil.toJsonStr(erpCustomerParam)).execute().body(); +// AspResponse responseBean = JSONUtil.toBean(body, AspResponse.class); +// for (List row : responseBean.getBody().getSource().getTable().getRows()) { +// BasProduct product = new BasProduct(); +// product.setProductGuid(row.get(2)); +// product.setProductId(row.get(2)); +// product.setProductName(row.get(1)); +// product.setCargoNo(row.get(0)); +// product.setSpec(row.get(3)); +// product.setUnit(row.get(4)); +// product.setSpare1(row.get(5)); +// product.setPrice(row.get(6)); +// product.setParentId(row.get(7)); +// product.setSpare3(row.get(8)); +// product.setSpare4(row.get(9)); +// product.setSpare5(row.get(10)); +// product.setSpare6(row.get(11)); +// product.setSpare7(row.get(12)); +// BasProduct basProduct = basProductService.selectBasProductByProductId(product.getProductId()); +// if (ObjUtil.isNotNull(basProduct)){ +// BeanUtil.copyProperties(product,basProduct); +// basProductService.updateBasProduct(basProduct); +// }else { +// basProductService.insertBasProduct(product); +// } +// } +// return AjaxResult.success(); +// } +// +// @Override +// public AjaxResult receiveCustomer() { +// AspRequestParam erpCustomerParam = new AspRequestParam(); +// erpCustomerParam.setSession(login()); +// erpCustomerParam.setCmdkey("refresh"); +// List dataInfoList = new ArrayList<>(); +// dataInfoList.add(new AspRequestParam.DataInfo("pagesize", 100000)); +// dataInfoList.add(new AspRequestParam.DataInfo("pageindex", 1)); +// erpCustomerParam.setDatas(dataInfoList); +// +// String body = HttpRequest.post(customerListUrl).header(TOKEN_KEY, login()).body(JSONUtil.toJsonStr(erpCustomerParam)).execute().body(); +// AspResponse responseBean = JSONUtil.toBean(body, AspResponse.class); +// for (List row : responseBean.getBody().getSource().getTable().getRows()) { +// BasCustomer customer = new BasCustomer(); +// customer.setCustomerName(Convert.toStr(row.get(0))); +// customer.setSalesman(Convert.toStr(row.get(1))); +// customer.setBusinessDepartment(Convert.toStr(row.get(2))); +// customer.setSupCustomer(Convert.toStr(row.get(3))); +// customer.setContactName(Convert.toStr(row.get(4))); +// customer.setMnemonicCode(Convert.toStr(row.get(5))); +// customer.setType(Convert.toStr(row.get(6))); +// customer.setTaxpayerRegistrationNumber(Convert.toStr(row.get(7))); +// customer.setOrganization(Convert.toStr(row.get(8))); +// customer.setRetailInvestor(Convert.toStr(row.get(9))); +// customer.setId(Convert.toStr(row.get(10))); +// customer.setCustomerNo(Convert.toStr(row.get(10))); +// customer.setShipment(Convert.toStr(row.get(11))); +// customer.setTaxCategory(Convert.toStr(row.get(12))); +// BasCustomer basCustomer = basCustomerService.selectBasCustomerById(customer.getId()); +// if (ObjUtil.isNotNull(basCustomer)){ +// basCustomerService.updateBasCustomer(customer); +// }else { +// basCustomerService.insertBasCustomer(customer); +// } +// } +// +// return AjaxResult.success(); +// } +// +// @Override +// public AjaxResult receiveSupplier() { +// ErpSupplierParam erpSupplierParam = new ErpSupplierParam(); +// erpSupplierParam.setPage_index(1); +// erpSupplierParam.setPage_size(100000); +// String body = HttpRequest.post(supplierListUrl).header(TOKEN_KEY, login()).body(JSONUtil.toJsonStr(erpSupplierParam)).execute().body(); +// ErpSupplierResponse responseBean = JSONUtil.toBean(body, ErpSupplierResponse.class); +// for (List row : responseBean.getRows()) { +// BasSupplier supplier = new BasSupplier(); +// supplier.setSupplierName(Convert.toStr(row.get(0))); +// supplier.setTaxpayerRegistrationNumber(Convert.toStr(row.get(1))); +// supplier.setId(Convert.toStr(row.get(2))); +// supplier.setSupplierNo(Convert.toStr(row.get(2))); +// supplier.setSupplierArae(Convert.toStr(row.get(3))); +// supplier.setContactName(Convert.toStr(row.get(4))); +// supplier.setContactNumber(Convert.toStr(row.get(5))); +// supplier.setCountry(Convert.toStr(row.get(6))); +// supplier.setTimeZone(Convert.toStr(row.get(7))); +// supplier.setUseable("1"); +// BasSupplier basSupplier = basSupplierService.selectBasSupplierById(supplier.getId()); +// if (ObjUtil.isNotNull(basSupplier)){ +// basSupplierService.updateBasSupplier(basSupplier); +// }else { +// basSupplierService.insertBasSupplier( supplier); +// } +// } +// return AjaxResult.success(); +// } +// +// @Override +// public AjaxResult receiveStockinList(StockinListReceive stockinListReceive){ +// +// //------------生成接口记录------------ +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(stockinListReceive), REICEIVE_ERP_STOCKIN_LIST); +// requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); +// requestLog.setResponseStatus("0"); +// requestLog.setIsSuccessful("1"); +// requestLogService.insertRequestLog(requestLog); +// +// +// //todo ------------参数校验------------ +// //检查重复单号 +// int count = inStockinService.selectInStockinList( +// new InStockin().builder().erpBill("这是一个ERP单号").build() +// ).size(); +// if (count > 0){ +// log.warn("【ERP推送错误】已存在该编号的入库单据,ERP单号:{}", "这是一个ERP单号"); +// return AjaxResult.error("已存在该编号的入库单据,ERP单号:" + 123); +// } +// +// +// //todo ------------生成入库主单------------ +// InStockin inStockin = new InStockin(); +// inStockin.setStockinId(basJobIdService.getId(JOB_RECEIVE_LIST_STOCKIN)); +// inStockin.setStockSource("ERP"); +// inStockin.setStatus(InStockInStatusEnum.RUNNING.getDesc()); +// inStockin.setErpBill("这是一个ERP单号"); +// inStockin.setCreateDate(new Date()); +// inStockin.setWarehouseId("01"); +// inStockin.setWarehouseName("立体库"); +// inStockin.setUserId(100L); +// inStockin.setUserName("这是一个用户Id"); +// inStockin.setDeptId(100L); +// inStockin.setDeptName("这是一个部门Id"); +// inStockinService.insertInStockin(inStockin); +// +// log.info("【ERP推送】下发入库单据,wms单号:{},ERP单号:{}",inStockin.getStockinId(), "这是一个ERP单号"); +// +// +// //todo ------------生成入库子单------------ +// List details = stockinListReceive.getStockinDetails(); +// for (int i = 1; i <= details.size(); i++) { +// InStockinDetail inStockinDetail = new InStockinDetail().builder() +// .stockinId(inStockin.getStockinId()) +// .stockinDetailId(inStockin.getStockinId() + "-" + i) +// .build(); +// inStockinDetailService.insertInStockinDetail(inStockinDetail); +// } +// +// +// return AjaxResult.success(); +// } +// +// @Override +// public AjaxResult receiveStockoutList(StockoutListReceive stockoutListReceive) { +// +// return AjaxResult.success(); +// } +// +// @Override +// public AjaxResult receiveInventoryList() { +// return null; +// } +// +// +// @Override +// public String login() { +// LoginParam loginParam = new LoginParam(); +// List datas = new ArrayList<>(); +// LoginParam.ErpUserDataInfo d1 = new LoginParam.ErpUserDataInfo("user", "txt:孙瑞雅"); +// LoginParam.ErpUserDataInfo d2 = new LoginParam.ErpUserDataInfo("password", "txt:888888"); +// LoginParam.ErpUserDataInfo d3 = new LoginParam.ErpUserDataInfo("serialnum", "txt:abcd1234"); +// LoginParam.ErpUserDataInfo d4 = new LoginParam.ErpUserDataInfo("rndcode", ""); +// datas.add(d1); +// datas.add(d2); +// datas.add(d3); +// datas.add(d4); +// loginParam.setDatas(datas); +// String post = HttpUtil.post(loginUrl, JSONUtil.toJsonStr(loginParam)); +// LoginResponse bean = JSONUtil.toBean(post, LoginResponse.class); +// if (!redisCache.hasKey("erpSession")){ +// redisCache.setCacheObject("erpSession", bean.getHeader().getSession(), 1500, TimeUnit.SECONDS); +// return bean.getHeader().getSession(); +// }else { +// return redisCache.getCacheObject("erpSession"); +// } +// } +// +// @Override +// public AjaxResult callErp(ReceiveOutStockConfirm receiveOutStockConfirm) { +// String body= HttpRequest.post(outStockConfirmUrl).header("ZBAPI-Token", login()).body(JSONUtil.toJsonStr(receiveOutStockConfirm)).execute().body(); +// CallErpResponse callErpResponse = JSONUtil.toBean(body, CallErpResponse.class); +// if (callErpResponse.getCode()==200){ +// return AjaxResult.success(); +// }else { +// if (callErpResponse.getCode()==300){ +// return AjaxResult.error("请求失败"); +// }else if (callErpResponse.getCode()==400){ +// return AjaxResult.error("token验证失败"); +// }else if (callErpResponse.getCode()==500){ +// return AjaxResult.error("服务器内部错误"); +// } +// return AjaxResult.error(callErpResponse.getMsg()); +// } +// } +// +// +// //入库单据执行计数(用于区分是否首次执行获取单据请求) +// int num = 0; +// +// /** +// * 入库单据 -> 请求入库单列表 +// * @return +// */ +//// @Scheduled(fixedDelay = 600_000) +// public AjaxResult getErpStockinList(){ +// +// ErpStockinParam erpStockinParam = new ErpStockinParam(); +// +// // 首次执行(num=0)时,同步所有单据数据 +// // 后续执行(num>0)仅同步指定时间内的单据数据 +// if (num > 0){ +// //当前时间 +// DateTime dateNow = DateUtil.date(); +// String dateStart = dateNow.offset(DateField.SECOND, -60).toString();//开始时间 +// String dateEnd = DateUtil.date().toString();//当前时间 +// //todo 请求筛选时间似乎时分秒条件无效,只能筛选年月日条件 +// //todo 请求筛选时间似乎时分秒条件无效,只能筛选年月日条件 +//// erpStockinParam.setDate3Start(dateStart);//请求筛选:开始时间 +//// erpStockinParam.setDate3End(dateEnd);//请求筛选:结束时间 +// } +// +// //测试参数 - 无主题筛选 - 默认关键字【冷】 +// erpStockinParam.setTitle(""); +// //测试参数 - 入库状态(0=全部, 1=待入库, 2=已入库, 3=已取消...) 默认 - 1 +// //erpStockinParam.setComplete1(1); +// //测试参数 - 无请求明细【0】 +// //erpStockinParam.setNeedList(0); +// +////=================================================================== 主单 ===================================================================== +// +// try { +// log.info(">>>>>>>>>>>>>>>>>>>> 开始更新入库单据 >>>>>>>>>>>>>>>>>>>>"); +// //------获取请求响应 +// String response = getResponse(getStockinListUrl, erpStockinParam, "更新入库单据"); +// if (response == null) { +// log.info("请求异常:响应信息为空!检查请求内容!"); +// return null; +// } +// //------处理响应信息 +// ErpStockinResponse res = JSONUtil.toBean(response, ErpStockinResponse.class); +// for (List list : res.getRows()) { +// //【入库id】校验单据是否存在 +// String kuin = Convert.toStr(list.get(1)); +// ErpInStockin erpInStockin = new ErpInStockin(); +// //获取入库主单参数 +// erpInStockin.setTitle(Convert.toStr(list.get(0)));//主题 +// erpInStockin.setKuin(kuin);//入库id +// erpInStockin.setComplete1(Convert.toStr(list.get(2)));//入库状态 +// erpInStockin.setCateid(Convert.toStr(list.get(3)));//申请人 +// erpInStockin.setDate3(Convert.toStr(list.get(4)));//申请日期 +// erpInStockin.setDate5(Convert.toStr(list.get(5)));//确认日期 +// erpInStockin.setCatein(Convert.toStr(list.get(6)));//审批人 +// erpInStockin.setIntro2(Convert.toStr(list.get(7)));//审批意见 +// erpInStockin.setIntro(Convert.toStr(list.get(8)));//备注 +// erpInStockin.setCaigou(Convert.toStr(list.get(9)));//其他采购单据 +// erpInStockin.setDate7(Convert.toStr(list.get(10)));//erp添加时间 +// erpInStockin.setKg(Convert.toStr(list.get(11)));//库管 +// erpInStockin.setSort1(Convert.toStr(list.get(12)));//入库类别 +// erpInStockin.setRkbh(Convert.toStr(list.get(13)));//入库编号 +// erpInStockin.setStatus(Convert.toStr(list.get(14)));//审批状态 +// erpInStockin.setKuinList(Convert.toStr(list.get(15)));//主单明细 +// erpInStockin.setSysIcusIInheritIdIidI413(Convert.toStr(list.get(16)));//客户名称 +// erpInStockin.setSysIcusIInheritIdIidI414(Convert.toStr(list.get(17)));// +// erpInStockin.setSysIcusIInheritIdIidI415(Convert.toStr(list.get(18)));//车号 +// String id = erpInStockin.getRkbh() + "_" + erpInStockin.getKuin(); +// erpInStockin.setStockinGuid(id);//guid +// //------校验单据是否已经在表中 - 新增/更新 +// if (ObjUtil.isNotNull(erpInStockinService.selectErpInStockinByKuin(kuin))) { +// erpInStockinService.updateErpInStockin(erpInStockin); +// }else{ +// erpInStockinService.insertErpInStockin(erpInStockin); +// } +// //------更新wms主单 +// AddStockinByErpStockin(erpInStockin); +////=================================================================== 明细 ===================================================================== +// //------根据主单【kuinlist】字段获取子单信息 +// if (erpStockinParam.getNeedList() == 1) { +// //------获取子单明细 +// JSONObject jsonObject = JSONUtil.parseObj(erpInStockin.getKuinList()); +// jsonObject.get("rows"); +// ErpStockinDetailResponse resDetail = JSONUtil.toBean(erpInStockin.getKuinList(), ErpStockinDetailResponse.class); +// +// //------生成子单信息 +// for (List details : resDetail.getRows()){ +// //获取入库子单数据 +// ErpInStockinDetail erpInStockinDetail = new ErpInStockinDetail(); +// erpInStockinDetail.setId(Convert.toLong(details.get(0)));//明细id +// erpInStockinDetail.setQuantity(Convert.toLong(details.get(9)));//入库数量 +// erpInStockinDetail.setAssistUnit(Convert.toLong(details.get(5)));//辅助单位 +// erpInStockinDetail.setAssistQuantity(Convert.toLong(details.get(9)));//辅助数量 +// erpInStockinDetail.setKu(0L);//库区 +// erpInStockinDetail.setPh(Convert.toStr(details.get(17)));//批号 +// erpInStockinDetail.setXlh(Convert.toStr(details.get(18)));//序列号 +// erpInStockinDetail.setDatesc(Convert.toStr(details.get(19)));//生产日期 +// erpInStockinDetail.setDateyx(Convert.toStr(details.get(20)));//有效日期 +// erpInStockinDetail.setDate2(Convert.toStr(details.get(21)));//到货日期 +// erpInStockinDetail.setSysIcusIInheritIdIidI1(Convert.toStr(details.get(29)));//装卸工 +// erpInStockinDetail.setSpare1(Convert.toStr(details.get(1)));//产品名称 - product_name +// erpInStockinDetail.setSpare2(Convert.toStr(details.get(2)));//产品型号 - product_id +// +// //自动分配货位区域 +//// String cargoSpace = getCargoSpaceByProductInfo(Convert.toStr(details.get(2))); +//// erpInStockinDetail.setWarehousePositionID(cargoSpace);//货位 +// +// //关联主单 +// erpInStockinDetail.setKuin(erpInStockin.getKuin());//入库id +// erpInStockinDetail.setRkbh(erpInStockin.getRkbh());//入库编号 +// erpInStockinDetail.setSpare3(erpInStockin.getStockinGuid());//入库单guid +// +// //------校验数据是否已经在表中 - 新增/更新 +// if (ObjUtil.isNotNull(erpInStockinDetailService.selectErpInStockinDetailById(erpInStockinDetail.getId()))) { +// erpInStockinDetailService.updateErpInStockinDetail(erpInStockinDetail); +// }else{ +// erpInStockinDetailService.insertErpInStockinDetail(erpInStockinDetail); +// } +// +// //------更新wms子单 +// AddStockinDetailByErpStockinDetail(erpInStockinDetail); +// } +// }else { +// log.info("请求未获取子单详情【needList:0】"); +// } +// +// } +// }catch(Exception e){ +// log.error("获取/同步单据异常:" + e.getMessage()); +// return AjaxResult.error(); +// } +// +// log.info("<<<<<<<<<<<<<<<<<<<< 更新入库单据完成 <<<<<<<<<<<<<<<<<<<<"); +// num++; +// return AjaxResult.success(); +// } +// +// +// +// /** +// * 生成入库单据 -> 获取请求响应 +// * @param url 请求地址 +// * @param param 请求参数 +// * @param remark +// * @return 响应信息 +// */ +// public String getResponse(String url, Object param, String remark){ +// try { +// //------获取请求响应 +// String requestSession = login(); +// String response = HttpRequest.post(url) +// .header(TOKEN_KEY,requestSession) +// .body(JSONUtil.toJsonStr(param)) +// .execute() +// .body(); +// +// //生成请求记录 +// RequestLog requestLog = new RequestLog(); +// requestLog.setRequestTime(DateUtil.now()); +// requestLog.setSourceSystem("wms"); +// requestLog.setTargetSystem("erp"); +// requestLog.setEndpoint(remark); +// requestLog.setRequestUrl(url); +// requestLog.setRequestMethod("POST"); +// requestLog.setRequestBody(JSONUtil.toJsonStr(param)); +// requestLog.setResponseBody(JSONUtil.toJsonStr(response)); +// requestLog.setIsSuccessful("1"); +// requestLogService.insertRequestLog(requestLog); +// +// return response; +// } catch (Exception e) { +// log.error("请求异常:" + e.getMessage()); +// } +// +// return null; +// } +// +// +// +// @Autowired +// private ObjectMapper objectMapper; +// +// //获取入库单据 +// +// public AjaxResult getInStock(){ +// //创建请求体 +// InStockinNQueryRequest inStockinNQueryRequest = new InStockinNQueryRequest(); +// inStockinNQueryRequest.setComplete1(0);//查找未执行的单据 +// inStockinNQueryRequest.setSort1(0); +// // 设置日期范围为当天 +// String today = DateUtil.today(); +//// inStockinNQueryRequest.setDate3Start(today + " 00:00:00"); +//// inStockinNQueryRequest.setDate3End(today + " 23:59:59"); +// inStockinNQueryRequest.setDate3Start("2025-11-03" + " 00:00:00"); +// inStockinNQueryRequest.setDate3End("2025-11-03" + " 23:59:59"); +// inStockinNQueryRequest.setDate5Start("2025-11-03" + " 00:00:00"); +// inStockinNQueryRequest.setDate5End("2025-11-03" + " 23:59:59"); +// inStockinNQueryRequest.setTitle("打冷"); +// inStockinNQueryRequest.setNeedList(1); +// inStockinNQueryRequest.setPageIndex(1); +// inStockinNQueryRequest.setPageSize(0); +// String jsonStr = ""; +// try { +// jsonStr = objectMapper.writeValueAsString(inStockinNQueryRequest); +// } catch (Exception e) { +// log.error("JSON序列化失败", e); +// return AjaxResult.error("JSON序列化失败"); +// } +// // 获取ERP数据 +// String body = HttpRequest.post(getStockinListUrl).header(TOKEN_KEY, login()).body(jsonStr).execute().body(); +// // 解析响应 +// ErpInStockinNResponse response = JSONUtil.toBean(body, ErpInStockinNResponse.class); +// if (response != null && response.getRows() != null) { +// List> rows = response.getRows(); +// for (List row : rows) { +// // 0: 入库主题, 1: 入库id, 2: 入库状态, 3: 申请人, 4: 申请日期, 5: 确认日期, 6: 审批人, 7: 审批意见, +// // 8: 入库备注, 9: 关联其他单据id, 10: 添加时间, 11: 库管id, 12: 入库类别, 13: 入库编号, +// // 14: 审批状态, 15: 产品明细, 16: 客户名称, 17: 磅单编号, 18: 入库车号 +// String erpStockInId = Convert.toStr(row.get(13)); // 入库id +// // 检查本地是否存在 +// InStockinN existing = inStockinNService.selectInStockinNByStockinIdAndDate(erpStockInId, "2025-11-03"); +// if (existing == null) { +// // 不存在则插入 +// String stockinId = "RK" + DateUtil.format(DateUtil.date(), "yyyyMMddHHmmssSSS"); +// InStockinN newStockin = new InStockinN(); +// newStockin.setStockinGuid(UUID.randomUUID().toString()); +// newStockin.setStockinId(stockinId); +// newStockin.setStatus(1);//未执行 +// newStockin.setSubject(Convert.toStr(row.get(0))); +// newStockin.setErpStockinId(erpStockInId); +// newStockin.setErpStatus(row.get(2).toString()); // 假设状态映射需要转换 +// newStockin.setApplicant(Convert.toStr(row.get(3))); +// newStockin.setApplyDate(Convert.toStr(row.get(4))); +// newStockin.setConfirmDate(Convert.toStr(row.get(5))); +// newStockin.setApprover(Convert.toStr(row.get(6))); +// newStockin.setApprovalComment(Convert.toStr(row.get(7))); +// newStockin.setRemark(Convert.toStr(row.get(8))); +// newStockin.setRelatedDocId(Convert.toStr(row.get(9))); +// newStockin.setCreatedAt(Convert.toStr(row.get(10))); +// newStockin.setKeeperId(Convert.toLong(row.get(11))); +// newStockin.setCategory(Convert.toStr(row.get(12))); +// newStockin.setEntryCode(Convert.toStr(row.get(1))); +// newStockin.setApprovalStatus(Convert.toLong(row.get(14))); +// newStockin.setProductDetails(Convert.toStr(row.get(15))); +// newStockin.setCustomerName(Convert.toStr(row.get(16))); +// newStockin.setWeighbillNo(Convert.toStr(row.get(17))); +// newStockin.setVehicleNo(Convert.toStr(row.get(18))); +// newStockin.setOrderSrc("ERP"); +// try { +// BigDecimal orderSum = new BigDecimal("0"); +// cn.hutool.json.JSONObject detailsObjForSum = JSONUtil.parseObj(newStockin.getProductDetails()); +// cn.hutool.json.JSONArray detailRowsForSum = detailsObjForSum.getJSONArray("Rows"); +// if (detailRowsForSum != null) { +// for (int si = 0; si < detailRowsForSum.size(); si++) { +// cn.hutool.json.JSONArray sd = detailRowsForSum.getJSONArray(si); +// orderSum = orderSum.add(Convert.toBigDecimal(sd.get(9))); +// } +// } +// newStockin.setOrderNum(orderSum); +// } catch (Exception ignore) { +// } +// +// inStockinNService.insertInStockinN(newStockin); +// // 解析并落库产品明细(Rows) +// try { +// JSONObject detailsObj = JSONUtil.parseObj(newStockin.getProductDetails()); +// JSONArray detailRows = detailsObj.getJSONArray("Rows"); +// if (detailRows != null) { +// for (int i = 0; i < detailRows.size(); i++) { +// JSONArray d = detailRows.getJSONArray(i); +// String stockinDetailId = newStockin.getStockinId() + "-" + (i + 1); +// InStockinDetailN detail = new InStockinDetailN(); +// detail.setStockinDetailId(stockinDetailId); +// detail.setErpDetailId(Convert.toInt(d.get(0))); +// detail.setStockinGuid(newStockin.getStockinGuid()); +// detail.setStockinId(newStockin.getStockinId()); +// detail.setProductName(Convert.toStr(d.get(1))); +// detail.setProductModel(Convert.toStr(d.get(2))); +// detail.setUnit(Convert.toStr(d.get(3))); +// detail.setUnitPrice(Convert.toBigDecimal(d.get(5))); +// detail.setAuxUnit(Convert.toStr(d.get(6))); +// detail.setAttr1(Convert.toStr(d.get(7))); +// detail.setAttr2(Convert.toStr(d.get(8))); +// detail.setQuantity(Convert.toBigDecimal(d.get(9))); +// detail.setInQuantity(Convert.toBigDecimal(d.get(10))); +// detail.setAuxQuantity(Convert.toBigDecimal(d.get(11))); +// detail.setTotalPrice(Convert.toBigDecimal(d.get(12))); +// detail.setCostUnitPrice(Convert.toBigDecimal(d.get(13))); +// detail.setCostTotalPrice(Convert.toBigDecimal(d.get(14))); +// detail.setAccountingCostTotal(Convert.toBigDecimal(d.get(15))); +// detail.setAccountingQuantity(Convert.toBigDecimal(d.get(16))); +// detail.setAccountingStatus(Long.valueOf(Convert.toInt(d.get(17)))); +// detail.setBatchNo(Convert.toStr(d.get(18))); +// detail.setSerialNo(Convert.toStr(d.get(19))); +// detail.setProductionDate(Convert.toStr(d.get(20))); +// detail.setExpiryDate(Convert.toStr(d.get(21))); +// detail.setArrivalDate(Convert.toStr(d.get(22))); +// detail.setRemark(Convert.toStr(d.get(23))); +// detail.setCustom1(Convert.toStr(d.get(24))); +// detail.setCustom2(Convert.toStr(d.get(25))); +// detail.setCustom3(Convert.toStr(d.get(26))); +// detail.setCustom4(Convert.toStr(d.get(27))); +// detail.setCustom5(Convert.toStr(d.get(28))); +// detail.setCustom6(Convert.toStr(d.get(29))); +// detail.setStevedore(Convert.toStr(d.get(30))); +// detail.setOrderSrc("ERP"); +// inStockinDetailNService.insertInStockinDetailN(detail); +// } +// } +// +// } catch (Exception e) { +// log.error("解析并落库产品明细失败: {}", e.getMessage()); +// } +// } +// } +// } +// return AjaxResult.success(body); +// } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToWcsServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToWcsServiceImpl.java new file mode 100644 index 0000000..a74d3e4 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToWcsServiceImpl.java @@ -0,0 +1,215 @@ +package com.ruoyi.apiService.service.impl; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONUtil; +import com.ruoyi.apiService.service.IToWcsService; + +import com.ruoyi.bas.cargospace.domain.BasCargoSpace; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; +import com.ruoyi.bas.id.taskno.service.IBasTaskNoService; +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.common.*; +import com.ruoyi.common.core.domain.AjaxResult; + +import com.ruoyi.in.job.domain.MydoJob; +import com.ruoyi.in.job.service.IMydoJobService; +import com.ruoyi.log.domain.RequestLog; +import com.ruoyi.log.service.IRequestLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +import static com.ruoyi.common.RequestTitle.SEND_WCS_STOCKOUT_EMPTY_TRAY_MYDOJOB; +import static com.ruoyi.common.TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY; +import static com.ruoyi.common.WcsUrl.CANCEL_MYDOJOB; +import static com.ruoyi.common.WcsUrl.OUT_MYDOJOB_MS; + +/** + * 作业统计 Service 实现 + */ +@Slf4j +@Service +public class ToWcsServiceImpl implements IToWcsService { + + + @Autowired + private IRequestLogService requestLogService; + @Autowired + private IMydoJobService mydoJobService; +// @Autowired +// private IAgvContainerTaskService agvContainerTaskService; + @Autowired + private IBasStockService basStockService; + @Autowired + private IBasJobIdService basJobIdService; + @Autowired + private IBasTaskNoService basTaskNoService; + @Autowired + IBasCargoSpaceService basCargoSpaceService; + + + + + /** + * 人工呼叫空托盘出库 + */ + public AjaxResult callEmptyPalletOut(int type){ + + log.info("【呼叫空托】人工呼叫空托盘出库,托盘类型:{}", type); + + //呼叫空托出库 + List basStocks = basStockService.selectBasStockList( + new BasStock().builder() + .productId(ProductType.EMPTY_TRAY) + .trayType(type) + .stockStatus(StockStatusEnum.NORMAL.getCode()) + .build() + ); + + + if (CollUtil.isEmpty(basStocks)){ + log.warn("【呼叫空托-警告】呼叫空托盘出库失败,托盘类型:{},查不到该类型的空托盘库存,请咨询管理员", type); + return AjaxResult.error("呼叫空托盘出库失败,托盘类型:" + type +",查不到该类型的空托盘库存,请咨询管理员"); + } + + //获取指定出库空托盘的库存信息 + BasStock stock = basStocks.get(0); + String cargo = basStocks.get(0).getCargoSpaceId(); + + MydoJob mydoJob = new MydoJob().builder() + .jobId(basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT_EMPTY_PALLET)) + .taskNo(basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKOUT_EMPTY_PALLET)) + .status(TaskStatusEnum.READY.getCode()) + .inOrOut(TASKTYPE_STOCKOUT_EMPTY_TRAY) + .trayCode(stock.getTrayCode()) + .cargoSpaceId(cargo) + .build(); + + //更新库存状态【占用】 + stock.setStockStatus(StockStatusEnum.OCCUPIED.getCode()); + basStockService.updateBasStock(stock); + + //更新货位状态【出库预分配】 + BasCargoSpace cs =basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargo); + cs.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT); + basCargoSpaceService.updateBasCargoSpace(cs); + + //推送wcs出库 + RequestLog requestLog = requestLogService.getRequestLog(WcsUrl.PUSH_EMPTY_TRAY_OUT_MYDO_JOB, JSONUtil.toJsonStr(mydoJob), SEND_WCS_STOCKOUT_EMPTY_TRAY_MYDOJOB); + if ("1".equals(requestLog.getIsSuccessful())){ + mydoJobService.insertMydoJob(mydoJob); + + //更新库存状态 + stock.setStockStatus(StockStatusEnum.OCCUPIED.getCode()); + basStockService.updateBasStock(stock); + } + + //todo 是否需要生成子作业? + + log.info("【呼叫空托】呼叫成功,下发空托盘出库任务,wms作业号:{},任务号:{},源货位:{}", mydoJob.getJobId(), mydoJob.getTaskNo(), mydoJob.getCargoSpaceId()); + + return AjaxResult.success("呼叫空托盘出库任务,wms作业号:" + mydoJob.getJobId()); + + } + + + @Override + public AjaxResult callEmptyPalletOut(String PalletType) { + return null; + } + + @Override + //@Scheduled(fixedDelay=1500) + public void pushOutMydoJob() { + //查询所有未推送的出库作业 +// MydoJob mydoJobParam = new MydoJob(); +// mydoJobParam.setStatus("1"); +// List list = new ArrayList<>(); +// list.add("21"); +// list.add("26"); +// mydoJobParam.setInOutIds(list); +// List outMydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam); +// for (MydoJob outMydoJob : outMydoJobs) { +// RequestLog requestLog = requestLogService.getRequestLog(PUSH_OUT_MYDO_JOB, JSONUtil.toJsonStr(outMydoJob), SEND_WCS_STOCKOUT_MYDOJOB); +// if ("1".equals(requestLog.getIsSuccessful())){ +// outMydoJob.setStatus("3"); +// outMydoJob.setExecutionPhase("1"); +// outMydoJob.setStartTime(DateUtil.formatDateTime(new Date())); +// mydoJobService.updateMydoJob(outMydoJob); +// } +// } + } + +// @Override +// public AjaxResult pushAgvMoveJob(AgvMoveParam agvMoveParam) { +// agvMoveParam.setTaskNo(IdUtil.fastSimpleUUID()); +// RequestLog requestLog = requestLogService.getRequestLog(PUSH_AGV_MOVE_JOB, JSONUtil.toJsonStr(agvMoveParam), "推送搬运任务"); +// if ("1".equals(requestLog.getIsSuccessful())){ +// AgvContainerTask agvContainerTask = new AgvContainerTask(); +// agvContainerTask.setContainer(agvMoveParam.getContainerCode()); +// agvContainerTask.setStartPoint(agvMoveParam.getStartPoint()); +// agvContainerTask.setEndPoint(agvMoveParam.getEndPoint()); +// agvContainerTask.setStatus("0"); +// agvContainerTask.setTaskNo(agvMoveParam.getTaskNo()); +// agvContainerTask.setCreateTime(new Date()); +// agvContainerTaskService.insertAgvContainerTask(agvContainerTask); +// return AjaxResult.success(); +// } +// return AjaxResult.error(requestLog.getErrorDetails()); +// } + + @Override + public void pushInMydoJob() { +// MydoJob mydoJobParam = new MydoJob(); +// mydoJobParam.setInOrOut("1"); +// mydoJobParam.setStatus("1"); +// List mydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam); +// if (CollUtil.isNotEmpty(mydoJobs)){ +// for (MydoJob mydoJob : mydoJobs) { +// RequestLog requestLog = requestLogService.getRequestLog(PUSH_IN_MYDO_JOB, JSONUtil.toJsonStr(mydoJob), "推送出库任务"); +// if ("1".equals(requestLog.getIsSuccessful())){ +// mydoJob.setStatus("2"); +// mydoJobService.updateMydoJob(mydoJob); +// } +// } +// } +// mydoJobParam.setEntranceId("fluent"); +// mydoJobs = mydoJobService.selectMydoJobListApi(mydoJobParam); +// if (CollUtil.isNotEmpty(mydoJobs)){ +// for (MydoJob mydoJob : mydoJobs) { +// RequestLog requestLog = requestLogService.getRequestLog(PUSH_IN_MYDO_JOB, JSONUtil.toJsonStr(mydoJob), "推送出库任务"); +// if ("1".equals(requestLog.getIsSuccessful())){ +// mydoJob.setStatus("2"); +// mydoJobService.updateMydoJob(mydoJob); +// } +// } +// } + } + + @Override + public AjaxResult outMydojobMakeSure(HashMap outMydojobMakeSureParam) { + RequestLog requestLog = requestLogService.getRequestLog(OUT_MYDOJOB_MS, JSONUtil.toJsonStr(outMydojobMakeSureParam), "推送出库任务"); + if ("1".equals(requestLog.getIsSuccessful())){ + return AjaxResult.success(); + } + return AjaxResult.error(requestLog.getDuration()); + } + + @Override + public AjaxResult cancelTaskByTaskNo(String taskNo) { + Map map = new HashMap<>(); + map.put("taskNo", taskNo); + RequestLog requestLog = requestLogService.getRequestLog(CANCEL_MYDOJOB, JSONUtil.toJsonStr(map), "取消任务"); + if ("1".equals(requestLog.getIsSuccessful())){ + return AjaxResult.success(); + } + return AjaxResult.error(requestLog.getErrorDetails()); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToWmsServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToWmsServiceImpl.java new file mode 100644 index 0000000..daba092 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/apiService/service/impl/ToWmsServiceImpl.java @@ -0,0 +1,639 @@ +package com.ruoyi.apiService.service.impl; + +import com.ruoyi.apiService.service.IToErpService; +import com.ruoyi.apiService.service.IToWmsService; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; +import com.ruoyi.bas.id.taskno.service.IBasTaskNoService; +import com.ruoyi.bas.product.service.IBasProductService; +import com.ruoyi.bas.roadway.service.IBasRoadwayService; + +import com.ruoyi.bas.stock.service.IBasStockService; + +import com.ruoyi.in.bind.service.IInTrayMsgService; +import com.ruoyi.in.job.service.IMydoJobService; +import com.ruoyi.in.jobdetail.service.IMydoJobDetailService; +import com.ruoyi.in.stockindetail.service.IInStockinDetailService; +import com.ruoyi.in.stockin.service.IInStockinService; + +import com.ruoyi.log.service.IRequestLogService; +import com.ruoyi.out.stockout.service.IOutStockoutService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 作业统计 Service 实现 + */ +@Service +@Slf4j +public class ToWmsServiceImpl implements IToWmsService { + @Autowired + private IMydoJobService mydoJobService; + + @Autowired + private IMydoJobDetailService mydoJobDetailService; + + @Autowired + private IBasTaskNoService basTaskNoService; + + @Autowired + private IBasCargoSpaceService basCargoSpaceService; + + @Autowired + private IOutStockoutService outStockoutService; + + @Autowired + private IBasProductService basProductService; + @Autowired + private IBasJobIdService basJobIdService; + @Autowired + private IToErpService toErpService; + + @Autowired + private IInStockinService inStockinService; + @Autowired + private IInStockinDetailService inStockinDetailService; + + @Autowired + private IBasRoadwayService basRoadwayService; + + //条码绑定 + @Autowired + private IInTrayMsgService inTrayMsgService; + + //库存 + @Autowired + private IBasStockService basStockService; + + @Autowired + IRequestLogService requestLogService; + + +// /** +// * 响应wcs请求-下发入库任务 +// * @param wcsStockinReiceive +// * @return +// */ +// @Override +// @Transactional(rollbackFor = Exception.class) +// public AjaxResult requestMydoJobByTrayCode(WcsStockinReiceive wcsStockinReiceive) { +// +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wcsStockinReiceive), "wcs请求入库作业"); +// requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); +// requestLog.setResponseStatus("0"); +// requestLog.setIsSuccessful("1"); +// requestLogService.insertRequestLog(requestLog); +// +// String type = mydoJobService.getTrayTypeByTrayCode(wcsStockinReiceive.getTrayCode()); +// +// // -------------------------检查推送的任务参数------------------------- +// log.info( +// "【wcs请求入库】托盘号:{},托盘类型:{},巷道口:{}",wcsStockinReiceive.getTrayCode(), type, wcsStockinReiceive.getRoadwayId() +// ); +// +// //校验 - 条码空 +// if (StrUtil.isEmpty(wcsStockinReiceive.getTrayCode())) { +// log.warn("【wcs请求入库】请求条码异常,参数为空,请重试"); +// return AjaxResult.error("请求条码异常,参数为空"); +// } +// +// //获取请求条码对应的绑定信息 +// List trayMsgs = inTrayMsgService.selectInTrayMsgList( +// new InTrayMsg().builder().trayCode(wcsStockinReiceive.getTrayCode()).build() +// ); +// +// //-------------------通过绑定信息的物料编码确认入库类型 -空托入库------------------- +// if (trayMsgs.get(0).getProductId() == ProductType.EMPTY_TRAY) { +// +// //todo 货位分配查询 +// BasCargoSpace cargoSpace = getCargoSpaceForStockin(type, wcsStockinReiceive.getRoadwayId()); +// +// if (cargoSpace == null) { +// log.warn("【货位分配】该类型托盘立库中无可用货位"); +// return AjaxResult.error("【货位分配失败】该类型托盘立库中无可用货位"); +// } +// +// String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN_EMPTY_PALLET); +// String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_EMPTY_PALLET); +// +// //生成wms的入库作业 +// MydoJob mydoJob = new MydoJob().builder() +// .jobId(jobId) +// .taskNo(taskNo) +// .status(TaskStatusEnum.READY.getCode()) +// .executionPhase("0") +// .inOrOut(TaskType.TASKTYPE_STOCKIN_EMPTY_PALLET) +// .trayCode(wcsStockinReiceive.getTrayCode()) +// .entranceId(wcsStockinReiceive.getEntranceId()) +// .roadwayId(wcsStockinReiceive.getRoadwayId()) +// .cargoSpaceId(cargoSpace.getCargoSpaceId()) +// .cargoSpaceName(cargoSpace.getCargoSpaceName()) +// .trayType(wcsStockinReiceive.getTrayType()) +// .build(); +// +// if (mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode()) == null){ +// mydoJobService.insertMydoJob(mydoJob); +// log.info("【wms生成入库】<空托入库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), mydoJob.getCargoSpaceId()); +// }else{ +// log.info("【提示】<空托入库>wms已存在该条码作业,托盘号:{}",mydoJob.getTrayCode()); +// } +// +// //循环生成子作业 +// int sum = 1; +// for (InTrayMsg trayMsg : trayMsgs){ +// +// if (mydoJobDetailService.selectMydoJobDetailList( +// new MydoJobDetail().builder().stockinDetailId(trayMsg.getStockinDetailId()).build() +// ).isEmpty()){ +// +// String instockinId = trayMsg.getStockinId(); +// String instockinDetailId = trayMsg.getStockinDetailId() + sum; +// +// MydoJobDetail detail = new MydoJobDetail().builder() +// .jobId(jobId) +// .jobDetailId(jobId + "-" + sum) +// .inQuantity(1) +// .productId(trayMsg.getProductId()) +// .inDate(mydoJob.getCreateTime()) +// .inOrOutId(instockinId) +// .inOrOutDId(instockinDetailId) +// .stockinId(instockinId) +// .stockinDetailId(instockinDetailId) +// .status("1") +// .build(); +// sum++; +// mydoJobDetailService.insertMydoJobDetail(detail); +// } +// +// } +// +// //返回wcs的响应信息 +// WcsStockinResponse response = new WcsStockinResponse() +// .builder() +// .reqCode(wcsStockinReiceive.getTrayCode()) +// .jobId(jobId) +// .taskNo(taskNo) +// .taskType(TaskType.TASKTYPE_STOCKIN_EMPTY_PALLET) +// .trayCode(wcsStockinReiceive.getTrayCode()) +// .cargoSpaceId(cargoSpace.getCargoSpaceId()) +// .build(); +// +// log.info("【wms请求响应】<空托入库>响应信息,作业号:{},任务号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo(), mydoJob.getCargoSpaceId()); +// +// return AjaxResult.success(response); +// +// } +// else//-------------------常规物料入库------------------- +// { +// //生成主作业 +// //获取货位表中可用货位 +// BasCargoSpace cargoSpace = getCargoSpaceForStockin(wcsStockinReiceive.getTrayType(), wcsStockinReiceive.getRoadwayId()); +// +// String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN_EMPTY_PALLET); +// String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_EMPTY_PALLET); +// +// //生成wms的入库作业 +// MydoJob mydoJob = new MydoJob().builder() +// .jobId(jobId) +// .taskNo(taskNo) +// .status(TaskStatusEnum.READY.getCode()) +// .executionPhase("0") +// .inOrOut(TaskType.TASKTYPE_STOCKIN) +// .trayCode(wcsStockinReiceive.getTrayCode()) +// .entranceId(wcsStockinReiceive.getEntranceId()) +// .roadwayId(wcsStockinReiceive.getRoadwayId()) +// .cargoSpaceId(cargoSpace.getCargoSpaceId()) +// .cargoSpaceName(cargoSpace.getCargoSpaceName()) +// .trayType(wcsStockinReiceive.getTrayType()) +// .build(); +// +// if (mydoJobService.selectMydoJobByTrayCode(wcsStockinReiceive.getTrayCode()) == null){ +// mydoJobService.insertMydoJob(mydoJob); +// log.info("【wms生成入库】<物料入库>作业,作业号:{},任务号:{},托盘号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo() ,mydoJob.getTrayCode(), mydoJob.getCargoSpaceId()); +// }else{ +// log.info("【提示】<物料入库>wms已存在该条码作业,托盘号:{}",mydoJob.getTrayCode()); +// } +// +// //循环生成子作业 +// int sum = 1; +// for (InTrayMsg trayMsg : trayMsgs){ +// +// if (mydoJobDetailService.selectMydoJobDetailList( +// new MydoJobDetail().builder().stockinDetailId(trayMsg.getStockinDetailId()).build() +// ).isEmpty()){ +// +// String instockinId = trayMsg.getStockinId(); +// String instockinDetailId = trayMsg.getStockinDetailId() + sum; +// +// MydoJobDetail detail = new MydoJobDetail().builder() +// .jobId(jobId) +// .jobDetailId(mydoJob.getJobId() + "-" + sum) +// .inQuantity(1) +// .productId(trayMsg.getProductId()) +// .inDate(mydoJob.getCreateTime()) +// .inOrOutId(instockinId) +// .inOrOutDId(instockinDetailId) +// .stockinId(instockinId) +// .stockinDetailId(instockinDetailId) +// .status("1") +// .build(); +// sum++; +// mydoJobDetailService.insertMydoJobDetail(detail); +// } +// +// } +// +// //返回wcs响应信息 +// WcsStockinResponse response = new WcsStockinResponse().builder() +// .reqCode(wcsStockinReiceive.getTrayCode()) +// .jobId(jobId) +// .taskNo(taskNo) +// .taskType(TaskType.TASKTYPE_STOCKIN) +// .trayCode(wcsStockinReiceive.getTrayCode()) +// .cargoSpaceId(cargoSpace.getCargoSpaceId()) +// .build(); +// +// log.info("【wms请求响应】<物料入库>响应信息,作业号:{},任务号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo(), mydoJob.getCargoSpaceId()); +// +// return AjaxResult.success(response); +// } +// +// +// } +// +// +// /** +// * requestEnterByTrayCode -> 入库货位分配 +// * 入库任务请求根据托盘码 -> 向子单明细分配入库货位 +// * 获取库存物料号 -> 货位id -> 存储区组group -> 状态:未占用 -> 按规则获取货位 +// * +// * @param productId 物料号 +// * @return +// */ +// public String getCargoSpaceByProductInfo(String productId) { +////>>>>>>>>>>>>>>获取物料库存信息 -> 有库存 -> 货位(cargospace) -> 存储区组(groupCodingNo) -> 根据groupCoding(由高到低) -> 获取状态1的货位分配 +////>>>>>>>>>>>>>>获取物料库存信息 -> 无库存 -> 遍历存储区组(groupCodingNo) -> 查找全部货位空的区组 -> 根据groupCoding(由高到低) -> 获取状态1的货位分配 +//// try { +//// //获取物料的货位集合 - 首先查找已经存放该物料的存储区 +//// List stocks = basStockService.selectBasStockListByProductId(productId); +//// +//// //如果集合空 - 寻找未被占用的存储区组放货 +//// if (stocks.size() == 0) { +//// for (int i = 1; i <= 45; i++) { +//// BasCargoSpace cargospace = new BasCargoSpace(); +//// +//// //存储区 +//// String groupCodingNo = String.format("%03d", i); +//// cargospace.setGroupCodingNo(groupCodingNo); +//// +//// //获取【groupCodingNo】所有货位 +//// List cargoSpaces = basCargoSpaceService.selectBasCargoSpaceList(cargospace); +//// +//// //判断是否全部未占用,即某存储区全部为空位 - 避免物料混放 +//// boolean isAllEmpty = cargoSpaces.stream().allMatch(c -> "1".equals(c.getStatus())); +//// +//// //区域未占用 - 则分配最内侧货位 +//// if (isAllEmpty && cargoSpaces.size() > 0) { +//// cargoSpaces.sort(Comparator.comparing(BasCargoSpace::getGroupCoding).reversed()); +//// return cargoSpaces.get(0).getCargoSpaceId(); +//// } +//// } +//// +//// } +//// +//// //如果物料已经存放在多个货位(区域) - 去重 +//// List stocksNew = stocks.stream().distinct().collect(Collectors.toList()); +//// +//// //查询对应货位的区域在【BasCargoSpace】是否有空位 - 在groupCodingNo的分组中是否仍然有状态【1】的货位 +//// for (BasStock stock : stocksNew) { +//// //获取每种物料的存放货位信息 +//// BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(stock.getCargoSpaceId()); +//// +//// //获取每种物料的存放货位信息 - 存储区 +//// String group = cargoSpace.getGroupCodingNo(); +//// +//// //获取该存储区组的所有货位 +//// List cargoSpaces = basCargoSpaceService.selectBasCargoSpaceListByGroupCodingNo(group); +//// +//// //在集合中获取状态为【1】的货位 +//// for (BasCargoSpace cs : cargoSpaces) { +//// //货位状态:1(未占用) -> 返回该货位结果 +//// if ("1".equals(cs.getStatus())) { +//// return cs.getCargoSpaceId(); +//// } +//// } +//// +//// } +//// } catch (Exception e) { +//// log.error("入库子单获取目标货位失败,异常信息:" + e.getMessage()); +//// } +// return null; +// } +// +// +// /** +// * 入库分配货位 +// * 查询规则:层 → 排 → 列 → 先左后右 → 先双伸后单伸 +// * @param trayType +// * @param roadwayId +// * @return +// */ +// public BasCargoSpace getCargoSpaceForStockin(String trayType, String roadwayId) { +// List cargos = basCargoSpaceService.selectBasCargoSpaceList( +// new BasCargoSpace().builder() +// .theType(trayType) +// .roadwayId(roadwayId) +// .locked(CargoSpaceCode.CARGOSPACE_UNLOCKED) +// .status(CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE) +// .build() +// ); +// +// //查询规则:层 → 排 → 列 → 先左后右 → 先双伸后单伸 +// BasCargoSpace cargoSpace = cargos.stream() +// .sorted(Comparator +// .comparing(BasCargoSpace::getGroupCoding) +// .thenComparing(BasCargoSpace::getTheFloor) +// .thenComparing(BasCargoSpace::getThePlatoon) +// .thenComparing(BasCargoSpace::getTheColumn) +// .thenComparing(BasCargoSpace::getIssDouble, Comparator.reverseOrder())) +// .collect(Collectors.toList()).get(0); +// +// +// return cargoSpace; +// } +// +// +// /** +// * 请求补码作业 +// * @param wcsStockinReiceive +// * @return +// */ +// @Override +// public AjaxResult requestMydoJobManual(WcsStockinReiceive wcsStockinReiceive) { +// +// RequestLog requestLog = requestLogService.getRequestLog(JSONUtil.toJsonStr(wcsStockinReiceive), "补码请求入库作业"); +// requestLog.setResponseBody(JSONUtil.toJsonStr(AjaxResult.success())); +// requestLog.setResponseStatus("0"); +// requestLog.setIsSuccessful("1"); +// requestLogService.insertRequestLog(requestLog); +// +// //查绑定信息 +// List trayMsgs = inTrayMsgService.selectInTrayMsgList( +// new InTrayMsg().builder().trayCode(wcsStockinReiceive.getTrayCode()).build() +// ); +// +// if (trayMsgs.size() == 0){ +// log.warn("【补码请求】未找到该托盘的绑定信息,请确认绑定后进行补码操作,托盘条码:{}", wcsStockinReiceive.getTrayCode()); +// return AjaxResult.error("未找到该托盘的绑定信息,请确认绑定后进行补码操作"); +// } +// +// //通过绑定信息的物料编码获取任务类型 +// int taskType = trayMsgs.get(0).getProductId() == ProductType.EMPTY_TRAY ? TaskType.TASKTYPE_STOCKIN_EMPTY_PALLET : TaskType.TASKTYPE_STOCKIN; +// +// //校验是否已经有该条码的入库作业 +// List jobs = mydoJobService.selectMydoJobList( +// new MydoJob().builder() +// .trayCode(wcsStockinReiceive.getTrayCode()) +// .build() +// ); +// +// if (!jobs.isEmpty()){ +// log.warn("【补码请求】已经存在该条码的入库任务,,托盘条码:{}", wcsStockinReiceive.getTrayCode()); +// return AjaxResult.error("未找到该托盘的绑定信息,请确认绑定后进行补码操作"); +// } +// +// //分配货位 +// BasCargoSpace cargoSpace = getCargoSpaceForStockin(wcsStockinReiceive.getTrayType(), wcsStockinReiceive.getRoadwayId()); +// +// //生成wms的入库主作业 +// MydoJob mydoJob = new MydoJob().builder() +// .jobId(basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN)) +// .taskNo(basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN)) +// .status(TaskStatusEnum.READY.getCode()) +// .executionPhase("0") +// .inOrOut(taskType) +// .trayCode(wcsStockinReiceive.getTrayCode()) +// .entranceId(wcsStockinReiceive.getEntranceId()) +// .roadwayId(wcsStockinReiceive.getRoadwayId()) +// .cargoSpaceId(cargoSpace.getCargoSpaceId()) +// .cargoSpaceName(cargoSpace.getCargoSpaceName()) +// .trayType(wcsStockinReiceive.getTrayType()) +// .build(); +// +// //循环生成子作业 +// int sum = 1; +// for (InTrayMsg trayMsg : trayMsgs){ +// +// if (mydoJobDetailService.selectMydoJobDetailList( +// new MydoJobDetail().builder().stockinDetailId(trayMsg.getStockinDetailId()).build() +// ).isEmpty()){ +// MydoJobDetail detail = new MydoJobDetail().builder() +// .jobId(mydoJob.getJobId()) +// .jobDetailId(mydoJob.getJobId() + "-" + sum) +// .inQuantity(1) +// .productId(trayMsg.getProductId()) +// .inDate(mydoJob.getCreateTime()) +// .inOrOutId(trayMsg.getStockinId()) +// .inOrOutDId(trayMsg.getStockinDetailId() + sum) +// .stockinId(trayMsg.getStockinId()) +// .stockinDetailId(trayMsg.getStockinDetailId() + sum) +// .status("1") +// .build(); +// sum++; +// mydoJobDetailService.insertMydoJobDetail(detail); +// } +// +// } +// +// //返回wcs响应信息 +// WcsStockinResponse response = new WcsStockinResponse().builder() +// .reqCode(wcsStockinReiceive.getTrayCode()) +// .jobId(basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN)) +// .taskNo(basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN)) +// .taskType(TaskType.TASKTYPE_STOCKIN) +// .trayCode(wcsStockinReiceive.getTrayCode()) +// .cargoSpaceId(cargoSpace.getCargoSpaceId()) +// .build(); +// log.info("【补码请求】<补码入库>响应信息,作业号:{},任务号:{},分配货位:{}",mydoJob.getJobId() ,mydoJob.getTaskNo(), mydoJob.getCargoSpaceId()); +// return AjaxResult.success(response); +// +//// HashMap result = new HashMap<>(); +//// result.put("jobId", mydoJob.getJobId()); +//// result.put("taskNo", mydoJob.getTaskNo()); +//// result.put("cargoSpaceId", mydoJob.getCargoSpaceId()); +//// result.put("roadwayId", mydoJob.getRoadwayId()); +//// result.put("entranceId", mydoJob.getEntranceId()); +//// return AjaxResult.success(result); +// } +// +// @Override +// public AjaxResult jobFinish(WmsJobRequest wmsJobRequest) { +// +// if (StrUtil.isEmpty(wmsJobRequest.getTaskNo())) { +// return AjaxResult.error("任务号不能为空"); +// } +// if (StrUtil.isEmpty(wmsJobRequest.getJobId())) { +// return AjaxResult.error("作业号不能为空"); +// } +// +// MydoJob mydoJobParam = new MydoJob(); +// +// switch (wmsJobRequest.getWmsType()) { +// //入库 +// case "1": +// mydoJobParam.setTaskNo(wmsJobRequest.getTaskNo()); +// mydoJobParam.setJobId(wmsJobRequest.getJobId()); +// List inMydoJobs = mydoJobService.selectMydoJobList(mydoJobParam); +// if (inMydoJobs.isEmpty()) { +// return AjaxResult.error("找不到该任务,请核对任务状态"); +// } +// +// MydoJob inMydoJob = inMydoJobs.get(0); +//// mydoJobService.manualCompleteJob(inMydoJob, 1); +// mydoJobService.autoCompleteJob(wmsJobRequest.getJobId(), wmsJobRequest.getWmsType()); +// break; +// //出库 +// case "2": +// mydoJobParam.setTaskNo(wmsJobRequest.getTaskNo()); +// List outMydoJobs = mydoJobService.selectMydoJobList(mydoJobParam); +// if (outMydoJobs.isEmpty()) { +// return AjaxResult.error("找不到该任务,请核对任务状态"); +// } +// MydoJob outJob = outMydoJobs.get(0); +// outJob.setExecutionPhase("2"); +// mydoJobService.updateMydoJob(outJob); +// break; +// +// default: +// log.error("作业类型错误"); +// return AjaxResult.error(MessageUtils.message("error.message12")); +// } +// return AjaxResult.success(); +// } +// +// +// /** +// * 放货有货 - 入库重分 +// * @param reMaterialParam +// * @return +// */ +// @Override +// public AjaxResult reAssign(ReMaterialParam reMaterialParam) { +// +// BasCargoSpace basCargoSpaceParam = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(reMaterialParam.getCargoSpaceId()); +// +// if (basCargoSpaceParam == null) { +// log.warn("【请求重分】请求货位异常,找不到该货位数据,作业号:{},异常货位:{}", reMaterialParam.getJobId(), reMaterialParam.getCargoSpaceId()); +// return AjaxResult.error("【请求重分】请求货位异常,找不到该货位数据"); +// } +// +// //货位状态标记为【异常】 +// basCargoSpaceParam.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_EXCEPTION); +// basCargoSpaceService.updateBasCargoSpace(basCargoSpaceParam); +// +// //重新分配货位 +// MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(reMaterialParam.getJobId()); +// +// //重新查找可用货位 +// BasCargoSpace newCargoSpace = basCargoSpaceService.selectBasCargoSpaceForStockin(mydoJob.getRoadwayId()); +// +// if (newCargoSpace == null) { +// log.warn("【重分失败】没有可分配的空货位,作业号:{},异常货位:{}", reMaterialParam.getJobId(), reMaterialParam.getCargoSpaceId()); +// return AjaxResult.error("【重分失败】没有可分配的空货位"); +// } else { +// //更新任务 +// mydoJob.setCargoSpaceId(newCargoSpace.getCargoSpaceId()); +// mydoJob.setFaultFlag("1"); +// mydoJobService.updateMydoJob(mydoJob); +// +// //更新货位状态 +// newCargoSpace.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN); +// basCargoSpaceService.updateBasCargoSpace(newCargoSpace); +// +// return AjaxResult.success( +// new RequestEnterResponse().builder() +// .cargoSpaceId(newCargoSpace.getCargoSpaceId()) +// .trayCode(mydoJob.getTrayCode()) +// .JobId(reMaterialParam.getJobId()) +// .reqCode(reMaterialParam.getReqCode()) +// .build() +// ); +// } +// } +// +// /** +// * 取货无货 - 重分物料 +// * @param reMaterialParam +// * @return +// */ +// @Override +// public AjaxResult reMaterial(ReMaterialParam reMaterialParam) { +// +// //获取上报的异常任务和子任务 +// MydoJob mydoJob = mydoJobService.selectMydoJobByJobId(reMaterialParam.getJobId()); +// MydoJobDetail mydoJobDetailParam = new MydoJobDetail(); +// mydoJobDetailParam.setJobId(mydoJob.getJobId()); +// List mydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(mydoJobDetailParam); +// +// //获取出库单据号 +// String stockOutId = mydoJobDetails.get(0).getInOrOutId(); +// +// //作废作业 +// mydoJobService.cancelJob(reMaterialParam.getJobId()); +// +// //调用自动分配 +// return outStockoutService.autoAssignOutStockout(stockOutId); +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public AjaxResult requestEnterByTrayCodeAndEntranceId(RequestEnter requestEnter) { +// HashMap result = new HashMap<>(); +// if (StrUtil.isEmpty(requestEnter.getTrayCode())) { +// return AjaxResult.error("托盘条码不能为空"); +// } +// log.info("扫码内容{}", requestEnter.getTrayCode()); +// +// MydoJob param = new MydoJob(); +// param.setStatus("1"); +// param.setTrayCode(requestEnter.getTrayCode()); +// param.setWarehouseId(requestEnter.getWarehouseId()); +// List mydoJobs = mydoJobService.selectMydoJobList(param); +// if (CollUtil.isEmpty(mydoJobs)) { +// return AjaxResult.error("没有该托盘任务", requestEnter.getTrayCode()); +// } +// MydoJob mydoJob = mydoJobs.get(0); +// if (StrUtil.isEmpty(mydoJob.getCargoSpaceId())) { +// BasCargoSpace basCargoSpaceParam = new BasCargoSpace(); +// basCargoSpaceParam.setWarehouseId(mydoJob.getWarehouseId()); +// basCargoSpaceParam.setRoadwayId(mydoJob.getRoadwayId()); +// BasCargoSpace basCargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(basCargoSpaceParam.getCargoSpaceId()); +// if (ObjUtil.isNull(basCargoSpace)) { +// return AjaxResult.error("没有空货位"); +// } +// +// //修改作业状态为正执行 +// mydoJob.setCargoSpaceId(basCargoSpace.getCargoSpaceId()); +// mydoJob.setStatus("3"); +// mydoJob.setStartTime(DateUtil.formatDateTime(new Date())); +// mydoJob.setRoadwayId(requestEnter.getRoadwayId()); +// mydoJobService.updateMydoJob(mydoJob); +// +// //修改货位状态为已分配 +// basCargoSpace.setStatus("3"); +// basCargoSpaceService.updateBasCargoSpace(basCargoSpace); +// } +// +// //返回结果 +// result.put("jobId", mydoJob.getJobId()); +// result.put("taskNo", mydoJob.getTaskNo()); +// result.put("cargoSpaceId", mydoJob.getCargoSpaceId()); +// result.put("roadwayId", mydoJob.getRoadwayId()); +// result.put("entranceId", mydoJob.getEntranceId()); +// result.put("inOrOut", String.valueOf(mydoJob.getInOrOut())); +// return AjaxResult.success(result); +// } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/domain/BasCargoSpace.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/domain/BasCargoSpace.java index 413f7d4..fef1c01 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/domain/BasCargoSpace.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/domain/BasCargoSpace.java @@ -1,5 +1,9 @@ package com.ruoyi.bas.cargospace.domain; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -11,11 +15,16 @@ import com.ruoyi.common.core.domain.BaseEntity; * @author ruoyi * @date 2026-05-11 */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class BasCargoSpace extends BaseEntity { private static final long serialVersionUID = 1L; /** 货位id */ + @Excel(name = "货位id") private String cargoSpaceId; /** 仓库id */ @@ -32,7 +41,7 @@ public class BasCargoSpace extends BaseEntity /** 货位类型 */ @Excel(name = "货位类型") - private String theType; + private int theType; /** 货位类型名称 */ @Excel(name = "货位类型名称") @@ -103,251 +112,5 @@ public class BasCargoSpace extends BaseEntity @Excel(name = "高度") private Long theHeight; - public void setCargoSpaceId(String cargoSpaceId) - { - this.cargoSpaceId = cargoSpaceId; - } - public String getCargoSpaceId() - { - return cargoSpaceId; - } - - public void setWarehouseId(String warehouseId) - { - this.warehouseId = warehouseId; - } - - public String getWarehouseId() - { - return warehouseId; - } - - public void setRoadwayId(String roadwayId) - { - this.roadwayId = roadwayId; - } - - public String getRoadwayId() - { - return roadwayId; - } - - public void setCargoAreaId(String cargoAreaId) - { - this.cargoAreaId = cargoAreaId; - } - - public String getCargoAreaId() - { - return cargoAreaId; - } - - public void setTheType(String theType) - { - this.theType = theType; - } - - public String getTheType() - { - return theType; - } - - public void setTheTypeName(String theTypeName) - { - this.theTypeName = theTypeName; - } - - public String getTheTypeName() - { - return theTypeName; - } - - public void setCargoSpaceName(String cargoSpaceName) - { - this.cargoSpaceName = cargoSpaceName; - } - - public String getCargoSpaceName() - { - return cargoSpaceName; - } - - public void setThePlatoon(Long thePlatoon) - { - this.thePlatoon = thePlatoon; - } - - public Long getThePlatoon() - { - return thePlatoon; - } - - public void setTheColumn(Long theColumn) - { - this.theColumn = theColumn; - } - - public Long getTheColumn() - { - return theColumn; - } - - public void setTheFloor(Long theFloor) - { - this.theFloor = theFloor; - } - - public Long getTheFloor() - { - return theFloor; - } - - public void setStatus(String status) - { - this.status = status; - } - - public String getStatus() - { - return status; - } - - public void setLocked(String locked) - { - this.locked = locked; - } - - public String getLocked() - { - return locked; - } - - public void setTrayCode(String trayCode) - { - this.trayCode = trayCode; - } - - public String getTrayCode() - { - return trayCode; - } - - public void setIssDouble(String issDouble) - { - this.issDouble = issDouble; - } - - public String getIssDouble() - { - return issDouble; - } - - public void setGroupCodingNo(String groupCodingNo) - { - this.groupCodingNo = groupCodingNo; - } - - public String getGroupCodingNo() - { - return groupCodingNo; - } - - public void setGroupCoding(String groupCoding) - { - this.groupCoding = groupCoding; - } - - public String getGroupCoding() - { - return groupCoding; - } - - public void setCargoSpaceLogo(String cargoSpaceLogo) - { - this.cargoSpaceLogo = cargoSpaceLogo; - } - - public String getCargoSpaceLogo() - { - return cargoSpaceLogo; - } - - public void setThisCargoArea(String thisCargoArea) - { - this.thisCargoArea = thisCargoArea; - } - - public String getThisCargoArea() - { - return thisCargoArea; - } - - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - public Long getDeptId() - { - return deptId; - } - - public void setDeptName(String deptName) - { - this.deptName = deptName; - } - - public String getDeptName() - { - return deptName; - } - - public void setTheWeight(Long theWeight) - { - this.theWeight = theWeight; - } - - public Long getTheWeight() - { - return theWeight; - } - - public void setTheHeight(Long theHeight) - { - this.theHeight = theHeight; - } - - public Long getTheHeight() - { - return theHeight; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("cargoSpaceId", getCargoSpaceId()) - .append("warehouseId", getWarehouseId()) - .append("roadwayId", getRoadwayId()) - .append("cargoAreaId", getCargoAreaId()) - .append("theType", getTheType()) - .append("theTypeName", getTheTypeName()) - .append("cargoSpaceName", getCargoSpaceName()) - .append("thePlatoon", getThePlatoon()) - .append("theColumn", getTheColumn()) - .append("theFloor", getTheFloor()) - .append("status", getStatus()) - .append("locked", getLocked()) - .append("trayCode", getTrayCode()) - .append("issDouble", getIssDouble()) - .append("groupCodingNo", getGroupCodingNo()) - .append("groupCoding", getGroupCoding()) - .append("cargoSpaceLogo", getCargoSpaceLogo()) - .append("thisCargoArea", getThisCargoArea()) - .append("deptId", getDeptId()) - .append("deptName", getDeptName()) - .append("theWeight", getTheWeight()) - .append("theHeight", getTheHeight()) - .toString(); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java index eb47b0e..a601c71 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/mapper/BasCargoSpaceMapper.java @@ -3,6 +3,7 @@ package com.ruoyi.bas.cargospace.mapper; import java.util.List; import com.ruoyi.bas.cargospace.domain.BasCargoSpace; import com.ruoyi.kpi.domain.BasCargoSpaceStatus; +import io.lettuce.core.dynamic.annotation.Param; /** * 货位信息Mapper接口 @@ -78,4 +79,12 @@ public interface BasCargoSpaceMapper * @return */ BasCargoSpace selectByCoordinates(BasCargoSpace basCargoSpace); + + + BasCargoSpace selectBasCargoSpaceForStockin(BasCargoSpace basCargoSpace); + + + BasCargoSpace selectBasCargoSpaceForStockout(BasCargoSpace basCargoSpace); + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/IBasCargoSpaceService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/IBasCargoSpaceService.java index 74e3e27..c1e2dc8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/IBasCargoSpaceService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/IBasCargoSpaceService.java @@ -19,6 +19,7 @@ public interface IBasCargoSpaceService */ public BasCargoSpace selectBasCargoSpaceByCargoSpaceId(String cargoSpaceId); + /** * 查询货位信息列表 * @@ -27,6 +28,7 @@ public interface IBasCargoSpaceService */ public List selectBasCargoSpaceList(BasCargoSpace basCargoSpace); + /** * 新增货位信息 * @@ -35,6 +37,7 @@ public interface IBasCargoSpaceService */ public int insertBasCargoSpace(BasCargoSpace basCargoSpace); + /** * 修改货位信息 * @@ -43,6 +46,7 @@ public interface IBasCargoSpaceService */ public int updateBasCargoSpace(BasCargoSpace basCargoSpace); + /** * 批量删除货位信息 * @@ -51,6 +55,7 @@ public interface IBasCargoSpaceService */ public int deleteBasCargoSpaceByCargoSpaceIds(String[] cargoSpaceIds); + /** * 删除货位信息信息 * @@ -58,10 +63,36 @@ public interface IBasCargoSpaceService * @return 结果 */ public int deleteBasCargoSpaceByCargoSpaceId(String cargoSpaceId); + /** * 查询排列表 * @param basCargoSpace * @return */ List selectPlatListByPlatoon(BasCargoSpace basCargoSpace); + + + /** + * 查询可分配的入库货位(需要【托盘类型】和【巷道】两个参数) + * @return + */ + BasCargoSpace selectBasCargoSpaceForStockin(BasCargoSpace basCargoSpace); + + + /** + * 查询可分配出库的货位 + * @return + */ + BasCargoSpace selectBasCargoSpaceForStockout(BasCargoSpace basCargoSpace); + + + /** + * 根据单/双伸货位获取对应的双/单伸货位信息 + * @return + */ + BasCargoSpace selectAnotherBasCargoSpaceBySameGroup(BasCargoSpace basCargoSpace); + + + int updateBasCargoSpaceStatus(String cargoSpaceId, String trayCode, String status); + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/impl/BasCargoSpaceServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/impl/BasCargoSpaceServiceImpl.java index fe033bb..cc2ff21 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/impl/BasCargoSpaceServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/cargospace/service/impl/BasCargoSpaceServiceImpl.java @@ -1,6 +1,9 @@ package com.ruoyi.bas.cargospace.service.impl; import java.util.List; + +import cn.hutool.core.util.ObjUtil; +import com.ruoyi.common.CargoSpaceCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.bas.cargospace.mapper.BasCargoSpaceMapper; @@ -95,4 +98,61 @@ public class BasCargoSpaceServiceImpl implements IBasCargoSpaceService public List selectPlatListByPlatoon(BasCargoSpace basCargoSpace) { return basCargoSpaceMapper.selectPlatListByPlatoon(basCargoSpace); } + + /** + * 获取入库分配货位 + * @param basCargoSpace (需要【托盘类型】和【巷道】两个参数) + * @return + */ + @Override + public BasCargoSpace selectBasCargoSpaceForStockin(BasCargoSpace basCargoSpace){ + return basCargoSpaceMapper.selectBasCargoSpaceForStockin(basCargoSpace); + } + + + /** + * 获取出库分配货位 + * @param basCargoSpace + * @return + */ + @Override + public BasCargoSpace selectBasCargoSpaceForStockout(BasCargoSpace basCargoSpace){ + return basCargoSpaceMapper.selectBasCargoSpaceForStockout(basCargoSpace); + } + + + @Override + public BasCargoSpace selectAnotherBasCargoSpaceBySameGroup(BasCargoSpace basCargoSpace){ + + BasCargoSpace cargoSingle = selectBasCargoSpaceForStockin(basCargoSpace); + + if (basCargoSpace.getIssDouble().equals(CargoSpaceCode.CARGOSPACE_ISDOUBLE_N)){ + + cargoSingle.setIssDouble(CargoSpaceCode.CARGOSPACE_ISDOUBLE_Y); + + }else{ + //todo 此处可考虑优化:单伸有货优先出库 + cargoSingle.setIssDouble(CargoSpaceCode.CARGOSPACE_ISDOUBLE_N); + } + + return ObjUtil.isNull(cargoSingle) || selectBasCargoSpaceList(basCargoSpace).isEmpty() ? null : cargoSingle; + + } + + + /** + * 更新货位状态 + * @param cargoSpaceId + * @param trayCode + * @param status + * @return + */ + @Override + public int updateBasCargoSpaceStatus(String cargoSpaceId, String trayCode, String status){ + BasCargoSpace cargo = selectBasCargoSpaceByCargoSpaceId(cargoSpaceId); + cargo.setStatus(status); + cargo.setTrayCode(trayCode); + return updateBasCargoSpace(cargo); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/JobIdService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/IBasJobIdService.java similarity index 66% rename from ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/JobIdService.java rename to ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/IBasJobIdService.java index 7743513..938e582 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/JobIdService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/IBasJobIdService.java @@ -1,6 +1,6 @@ package com.ruoyi.bas.id.job.service; -public interface JobIdService { +public interface IBasJobIdService { String getId(String type); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/impl/JobIdServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/impl/JobIdServiceImpl.java index 9781e4e..93ca1af 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/impl/JobIdServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/id/job/service/impl/JobIdServiceImpl.java @@ -1,17 +1,18 @@ package com.ruoyi.bas.id.job.service.impl; import com.ruoyi.bas.id.job.mapper.BasJobIdMapper; -import com.ruoyi.bas.id.job.service.JobIdService; -import com.ruoyi.bas.id.taskno.mapper.BasTaskNoMapper; +import com.ruoyi.bas.id.job.service.IBasJobIdService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; @Service -public class JobIdServiceImpl implements JobIdService { +public class JobIdServiceImpl implements IBasJobIdService { + @Autowired private BasJobIdMapper basJobIdMapper; + @Override public String getId(String type) { HashMap map = new HashMap<>(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/TaskNoService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/IBasTaskNoService.java similarity index 68% rename from ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/TaskNoService.java rename to ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/IBasTaskNoService.java index de78caf..ba0a167 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/TaskNoService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/IBasTaskNoService.java @@ -1,6 +1,6 @@ package com.ruoyi.bas.id.taskno.service; -public interface TaskNoService { +public interface IBasTaskNoService { String getTaskNo(String type); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/impl/TaskNoServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/impl/TaskNoServiceImpl.java index 4ad59d5..19a5acc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/impl/TaskNoServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/id/taskno/service/impl/TaskNoServiceImpl.java @@ -1,15 +1,14 @@ package com.ruoyi.bas.id.taskno.service.impl; import com.ruoyi.bas.id.taskno.mapper.BasTaskNoMapper; -import com.ruoyi.bas.id.taskno.service.TaskNoService; -import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.bas.id.taskno.service.IBasTaskNoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; @Service -public class TaskNoServiceImpl implements TaskNoService { +public class TaskNoServiceImpl implements IBasTaskNoService { @Autowired private BasTaskNoMapper basTaskNoMapper; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/product/domain/BasProduct.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/product/domain/BasProduct.java index ad83471..8210951 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/product/domain/BasProduct.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/product/domain/BasProduct.java @@ -1,5 +1,6 @@ package com.ruoyi.bas.product.domain; +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -11,6 +12,7 @@ import com.ruoyi.common.core.domain.BaseEntity; * @author ruoyi * @date 2026-05-11 */ +@Data public class BasProduct extends BaseEntity { private static final long serialVersionUID = 1L; @@ -42,87 +44,6 @@ public class BasProduct extends BaseEntity @Excel(name = "规格") private String spec; - public void setProductId(String productId) - { - this.productId = productId; - } - public String getProductId() - { - return productId; - } - public void setProductName(String productName) - { - this.productName = productName; - } - - public String getProductName() - { - return productName; - } - - public void setParentId(String parentId) - { - this.parentId = parentId; - } - - public String getParentId() - { - return parentId; - } - - public void setPrice(String price) - { - this.price = price; - } - - public String getPrice() - { - return price; - } - - public void setCargoNo(String cargoNo) - { - this.cargoNo = cargoNo; - } - - public String getCargoNo() - { - return cargoNo; - } - - public void setUnit(String unit) - { - this.unit = unit; - } - - public String getUnit() - { - return unit; - } - - public void setSpec(String spec) - { - this.spec = spec; - } - - public String getSpec() - { - return spec; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("productId", getProductId()) - .append("productName", getProductName()) - .append("parentId", getParentId()) - .append("price", getPrice()) - .append("cargoNo", getCargoNo()) - .append("unit", getUnit()) - .append("spec", getSpec()) - .append("remark", getRemark()) - .toString(); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/controller/BasStockInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/controller/BasStockInfoController.java new file mode 100644 index 0000000..edffee5 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/controller/BasStockInfoController.java @@ -0,0 +1,100 @@ +package com.ruoyi.bas.stock.controller; + +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.domain.BasStockInfo; +import com.ruoyi.bas.stock.service.IBasStockInfoService; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 库存信息Controller + * + * @author ruoyi + * @date 2026-05-12 + */ +@RestController +@RequestMapping("/bas/stockInfo") +public class BasStockInfoController extends BaseController +{ + @Autowired + private IBasStockInfoService basStockInfoService; + + /** + * 查询库存信息列表 + */ + @PreAuthorize("@ss.hasPermi('bas:stockInfo:list')") + @GetMapping("/list") + public TableDataInfo list(BasStockInfo basStockInfo) + { + startPage(); + List list = basStockInfoService.selectBasStockInfoList(basStockInfo); + return getDataTable(list); + } + + /** + * 导出库存信息列表 + */ + @PreAuthorize("@ss.hasPermi('bas:stockInfo:export')") + @Log(title = "库存信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BasStockInfo basStockInfo) + { + List list = basStockInfoService.selectBasStockInfoList(basStockInfo); + ExcelUtil util = new ExcelUtil(BasStockInfo.class); + util.exportExcel(response, list, "库存信息数据"); + } + + /** + * 获取库存信息详细信息 + */ + @PreAuthorize("@ss.hasPermi('bas:stockInfo:query')") + @GetMapping(value = "/{stockId}") + public AjaxResult getInfo(@PathVariable("stockId") String stockId) + { + return success(basStockInfoService.selectBasStockInfoByStockId(stockId)); + } + + /** + * 新增库存信息 + */ + @PreAuthorize("@ss.hasPermi('bas:stockInfo:add')") + @Log(title = "库存信息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BasStockInfo basStockInfo) + { + return toAjax(basStockInfoService.insertBasStockInfo(basStockInfo)); + } + + /** + * 修改库存信息 + */ + @PreAuthorize("@ss.hasPermi('bas:stockInfo:edit')") + @Log(title = "库存信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BasStockInfo basStockInfo) + { + return toAjax(basStockInfoService.updateBasStockInfo(basStockInfo)); + } + + /** + * 删除库存信息 + */ + @PreAuthorize("@ss.hasPermi('bas:stockInfo:remove')") + @Log(title = "库存信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{stockIds}") + public AjaxResult remove(@PathVariable String[] stockIds) + { + return toAjax(basStockInfoService.deleteBasStockInfoByStockIds(stockIds)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/domain/BasStock.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/domain/BasStock.java index 2e33afe..be30fc2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/domain/BasStock.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/domain/BasStock.java @@ -3,17 +3,23 @@ package com.ruoyi.bas.stock.domain; import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; /** - * 库存信息对象 bas_stock + * 库存信息明细表对象 bas_stock_detail * * @author ruoyi * @date 2026-05-12 */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class BasStock extends BaseEntity { private static final long serialVersionUID = 1L; @@ -21,6 +27,9 @@ public class BasStock extends BaseEntity /** 库存id */ private String stockId; + /** 库存明细id */ + private String stockDetailId; + /** 货位id */ @Excel(name = "货位id") private String cargoSpaceId; @@ -55,6 +64,10 @@ public class BasStock extends BaseEntity @Excel(name = "物料名称") private String productName; + /** 辊号 */ + @Excel(name = "辊号") + private String rollerNumber; + /** 库存数量 */ @Excel(name = "库存数量") private BigDecimal quantity; @@ -64,7 +77,7 @@ public class BasStock extends BaseEntity private String jobId; /** 子作业id */ - @Excel(name = "子作业id") + @Excel(name = "子作业ID") private String jobDetailId; /** 托盘条码 */ @@ -75,14 +88,14 @@ public class BasStock extends BaseEntity @Excel(name = "出库数量") private BigDecimal outQuantity; + /** 入库主单 */ + @Excel(name = "入库主单编号") + private String stockinId; + /** 入库子单id */ @Excel(name = "入库子单id") private String stockinDetailId; - /** 入库主单 */ - @Excel(name = "入库主单") - private String stockinId; - /** 入库类型 */ @Excel(name = "入库类型") private String inType; @@ -95,304 +108,33 @@ public class BasStock extends BaseEntity private String warehouseName; /** 用户id */ - private Long userId; + private String userId; /** 用户名称 */ @Excel(name = "用户名称") private String userName; /** 部门id */ - private Long deptId; + private String deptId; /** 部门名称 */ @Excel(name = "部门名称") private String deptName; /** 供应商id */ - private String suplierId; + private String supplierId; /** 供应商名称 */ @Excel(name = "供应商名称") - private String suplierName; + private String supplierName; - public void setStockId(String stockId) - { - this.stockId = stockId; - } + /** 托盘类型 */ + @Excel(name = "托盘类型") + private int trayType; - public String getStockId() - { - return stockId; - } + /** 托盘可用位置 */ + @Excel(name = "可用位置") + private int availablePlace; - public void setCargoSpaceId(String cargoSpaceId) - { - this.cargoSpaceId = cargoSpaceId; - } - public String getCargoSpaceId() - { - return cargoSpaceId; - } - - public void setStockStatus(String stockStatus) - { - this.stockStatus = stockStatus; - } - - public String getStockStatus() - { - return stockStatus; - } - - public void setProductStatus(String productStatus) - { - this.productStatus = productStatus; - } - - public String getProductStatus() - { - return productStatus; - } - - public void setLotNo(String lotNo) - { - this.lotNo = lotNo; - } - - public String getLotNo() - { - return lotNo; - } - - public void setInDate(Date inDate) - { - this.inDate = inDate; - } - - public Date getInDate() - { - return inDate; - } - - public void setBackDate(Date backDate) - { - this.backDate = backDate; - } - - public Date getBackDate() - { - return backDate; - } - - public void setProductId(String productId) - { - this.productId = productId; - } - - public String getProductId() - { - return productId; - } - - public void setProductName(String productName) - { - this.productName = productName; - } - - public String getProductName() - { - return productName; - } - - public void setQuantity(BigDecimal quantity) - { - this.quantity = quantity; - } - - public BigDecimal getQuantity() - { - return quantity; - } - - public void setJobId(String jobId) - { - this.jobId = jobId; - } - - public String getJobId() - { - return jobId; - } - - public void setJobDetailId(String jobDetailId) - { - this.jobDetailId = jobDetailId; - } - - public String getJobDetailId() - { - return jobDetailId; - } - - public void setTrayCode(String trayCode) - { - this.trayCode = trayCode; - } - - public String getTrayCode() - { - return trayCode; - } - - public void setOutQuantity(BigDecimal outQuantity) - { - this.outQuantity = outQuantity; - } - - public BigDecimal getOutQuantity() - { - return outQuantity; - } - - public void setStockinDetailId(String stockinDetailId) - { - this.stockinDetailId = stockinDetailId; - } - - public String getStockinDetailId() - { - return stockinDetailId; - } - - public void setStockinId(String stockinId) - { - this.stockinId = stockinId; - } - - public String getStockinId() - { - return stockinId; - } - - public void setInType(String inType) - { - this.inType = inType; - } - - public String getInType() - { - return inType; - } - - public void setWarehouseId(String warehouseId) - { - this.warehouseId = warehouseId; - } - - public String getWarehouseId() - { - return warehouseId; - } - - public void setWarehouseName(String warehouseName) - { - this.warehouseName = warehouseName; - } - - public String getWarehouseName() - { - return warehouseName; - } - - public void setUserId(Long userId) - { - this.userId = userId; - } - - public Long getUserId() - { - return userId; - } - - public void setUserName(String userName) - { - this.userName = userName; - } - - public String getUserName() - { - return userName; - } - - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - public Long getDeptId() - { - return deptId; - } - - public void setDeptName(String deptName) - { - this.deptName = deptName; - } - - public String getDeptName() - { - return deptName; - } - - public void setSuplierId(String suplierId) - { - this.suplierId = suplierId; - } - - public String getSuplierId() - { - return suplierId; - } - - public void setSuplierName(String suplierName) - { - this.suplierName = suplierName; - } - - public String getSuplierName() - { - return suplierName; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("stockId", getStockId()) - .append("cargoSpaceId", getCargoSpaceId()) - .append("stockStatus", getStockStatus()) - .append("productStatus", getProductStatus()) - .append("lotNo", getLotNo()) - .append("inDate", getInDate()) - .append("backDate", getBackDate()) - .append("productId", getProductId()) - .append("productName", getProductName()) - .append("quantity", getQuantity()) - .append("jobId", getJobId()) - .append("jobDetailId", getJobDetailId()) - .append("trayCode", getTrayCode()) - .append("outQuantity", getOutQuantity()) - .append("stockinDetailId", getStockinDetailId()) - .append("stockinId", getStockinId()) - .append("inType", getInType()) - .append("warehouseId", getWarehouseId()) - .append("warehouseName", getWarehouseName()) - .append("userId", getUserId()) - .append("userName", getUserName()) - .append("deptId", getDeptId()) - .append("deptName", getDeptName()) - .append("suplierId", getSuplierId()) - .append("suplierName", getSuplierName()) - .toString(); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/domain/BasStockInfo.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/domain/BasStockInfo.java new file mode 100644 index 0000000..a97bc4d --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/domain/BasStockInfo.java @@ -0,0 +1,71 @@ +package com.ruoyi.bas.stock.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 库存信息主表对象 bas_stock + * + * @author ruoyi + * @date 2026-05-12 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class BasStockInfo extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 库存id */ + private String stockId; + + /** 货位id */ + @Excel(name = "货位id") + private String cargoSpaceId; + + /** 托盘条码 */ + @Excel(name = "托盘条码") + private String trayCode; + + /** 仓库id */ + private String warehouseId; + + /** 用户id */ + private String userId; + + /** 用户名称 */ + @Excel(name = "用户名称") + private String userName; + + /** 部门id */ + private String deptId; + + /** 部门名称 */ + @Excel(name = "部门名称") + private String deptName; + + /** 供应商id */ + private String supplierId; + + /** 供应商名称 */ + @Excel(name = "供应商名称") + private String supplierName; + + /** 托盘类型 */ + @Excel(name = "托盘类型") + private int trayType; + + /** 托盘状态 0满 1未满 2空 */ + @Excel(name = "托盘状态") + private int emptyStatus; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/mapper/BasStockInfoMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/mapper/BasStockInfoMapper.java new file mode 100644 index 0000000..07251d0 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/mapper/BasStockInfoMapper.java @@ -0,0 +1,86 @@ +package com.ruoyi.bas.stock.mapper; + +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.domain.BasStockInfo; + +import java.util.List; + +/** + * 库存信息Mapper接口 + * + * @author ruoyi + * @date 2026-05-12 + */ +public interface BasStockInfoMapper +{ + /** + * 查询库存信息 + * + * @param stockId 库存信息主键 + * @return 库存信息 + */ + public BasStockInfo selectBasStockInfoByStockId(String stockId); + + + /** + * 查询库存信息 + * + * @param trayCode 托盘号 + * @return 库存信息 + */ + public BasStockInfo selectBasStockInfoByTrayCode(String trayCode); + + + /** + * 查询库存信息列表 + * + * @param basStockInfo 库存信息 + * @return 库存信息集合 + */ + public List selectBasStockInfoList(BasStockInfo basStockInfo); + + + /** + * 新增库存信息 + * + * @param basStockInfo 库存信息 + * @return 结果 + */ + public int insertBasStockInfo(BasStockInfo basStockInfo); + + + /** + * 修改库存信息 + * + * @param basStockInfo 库存信息 + * @return 结果 + */ + public int updateBasStockInfo(BasStockInfo basStockInfo); + + + /** + * 删除库存信息 + * + * @param stockId 库存信息主键 + * @return 结果 + */ + public int deleteBasStockInfoByStockId(String stockId); + + /** + * 删除库存信息 + * + * @param trayCode 托盘号 + * @return 结果 + */ + public int deleteBasStockInfoByTrayCode(String trayCode); + + /** + * 批量删除库存信息 + * + * @param stockIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteBasStockInfoByStockIds(String[] stockIds); + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/mapper/BasStockMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/mapper/BasStockMapper.java index 3b05f26..f7dd89e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/mapper/BasStockMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/mapper/BasStockMapper.java @@ -17,7 +17,8 @@ public interface BasStockMapper * @param stockId 库存信息主键 * @return 库存信息 */ - public BasStock selectBasStockByStockId(String stockId); + public List selectBasStockByStockId(String stockId); + /** * 查询库存信息列表 @@ -27,6 +28,31 @@ public interface BasStockMapper */ public List selectBasStockList(BasStock basStock); + + /** + * 查询指定物料的所有库存信息 + * @param productId + * @return + */ + public List selectBasStockListByProductId(String productId); + + + /** + * 查询指定物料的所有库存信息 + * @param trayCode 托盘号 + * @return + */ + public List selectBasStockListByTrayCode(String trayCode); + + + /** + * 查询指定辊号的库存信息 + * @param rollerNumber 辊号 + * @return + */ + public BasStock selectBasStockByRollerNumber(String rollerNumber); + + /** * 新增库存信息 * @@ -35,6 +61,7 @@ public interface BasStockMapper */ public int insertBasStock(BasStock basStock); + /** * 修改库存信息 * @@ -43,6 +70,7 @@ public interface BasStockMapper */ public int updateBasStock(BasStock basStock); + /** * 删除库存信息 * @@ -51,6 +79,16 @@ public interface BasStockMapper */ public int deleteBasStockByStockId(String stockId); + + /** + * 删除库存信息 + * + * @param rollerNumber 库存信息主键 + * @return 结果 + */ + public int deleteBasStockByRollerNumber(String rollerNumber); + + /** * 批量删除库存信息 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/IBasStockInfoService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/IBasStockInfoService.java new file mode 100644 index 0000000..426ae4e --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/IBasStockInfoService.java @@ -0,0 +1,81 @@ +package com.ruoyi.bas.stock.service; + +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.domain.BasStockInfo; + +import java.util.List; + +/** + * 库存信息Service接口 + * + * @author ruoyi + * @date 2026-05-12 + */ +public interface IBasStockInfoService +{ + /** + * 查询库存信息 + * + * @param stockId 库存信息主键 + * @return 库存信息 + */ + public BasStockInfo selectBasStockInfoByStockId(String stockId); + + /** + * 查询库存信息 + * + * @param trayCode 托盘号 + * @return 库存信息 + */ + public BasStockInfo selectBasStockInfoByTrayCode(String trayCode); + + + /** + * 查询库存信息列表 + * + * @param basStockInfo 库存主表信息 + * @return 库存信息集合 + */ + public List selectBasStockInfoList(BasStockInfo basStockInfo); + + /** + * 新增库存信息 + * + * @param basStockInfo 库存主表信息 + * @return 结果 + */ + public int insertBasStockInfo(BasStockInfo basStockInfo); + + /** + * 修改库存信息 + * + * @param basStockInfo 库存主表信息 + * @return 结果 + */ + public int updateBasStockInfo(BasStockInfo basStockInfo); + + /** + * 批量删除库存信息 + * + * @param stockIds 需要删除的库存信息主键集合 + * @return 结果 + */ + public int deleteBasStockInfoByStockIds(String[] stockIds); + + /** + * 删除库存信息 + * + * @param stockId 库存信息主键 + * @return 结果 + */ + public int deleteBasStockInfoByStockId(String stockId); + + /** + * 删除库存信息 + * + * @param trayCode 托盘号 + * @return 结果 + */ + public int deleteBasStockInfoByTrayCode(String trayCode); + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/IBasStockService.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/IBasStockService.java index 615c918..d7c2b36 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/IBasStockService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/IBasStockService.java @@ -17,7 +17,28 @@ public interface IBasStockService * @param stockId 库存信息主键 * @return 库存信息 */ - public BasStock selectBasStockByStockId(String stockId); + public List selectBasStockByStockId(String stockId); + + /** + * 查询某种物料的所有库存条目 + * @param productId + * @return + */ + public List selectBasStockListByProductId(String productId); + + /** + * 查询某种物料的所有库存条目 + * @param trayCode 托盘号 + * @return + */ + public List selectBasStockListByTrayCode(String trayCode); + + /** + * 查询指定辊号的库存 + * @param rollerNumber 辊号 + * @return + */ + public BasStock selectBasStockByRollerNumber(String rollerNumber); /** * 查询库存信息列表 @@ -46,6 +67,14 @@ public interface IBasStockService /** * 批量删除库存信息 * + * @param rollerNumber 辊号 + * @return 结果 + */ + public int deleteBasStockByRollerNumber(String rollerNumber); + + /** + * 批量删除库存信息 + * * @param stockIds 需要删除的库存信息主键集合 * @return 结果 */ @@ -58,4 +87,14 @@ public interface IBasStockService * @return 结果 */ public int deleteBasStockByStockId(String stockId); + + + /** + * 通过托盘号获取容器内的物料数量 + * @param trayCode + * @return + */ + public int getQuantityByTrayCode(String trayCode); + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/impl/BasStockInfoServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/impl/BasStockInfoServiceImpl.java new file mode 100644 index 0000000..fc0abbc --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/impl/BasStockInfoServiceImpl.java @@ -0,0 +1,146 @@ +package com.ruoyi.bas.stock.service.impl; + +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.domain.BasStockInfo; +import com.ruoyi.bas.stock.mapper.BasStockInfoMapper; +import com.ruoyi.bas.stock.mapper.BasStockMapper; +import com.ruoyi.bas.stock.service.IBasStockInfoService; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.bas.stockoper.domain.BasStockOperRecord; +import com.ruoyi.bas.stockoper.mapper.BasStockOperRecordMapper; +import com.ruoyi.common.annotation.WarehouseScope; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.system.mapper.SysDeptMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 库存信息Service业务层处理 + * + * @author ruoyi + * @date 2026-05-12 + */ +@Service +public class BasStockInfoServiceImpl implements IBasStockInfoService +{ + @Autowired + private BasStockInfoMapper basStockInfoMapper; + @Autowired + private BasStockOperRecordMapper basStockOperRecordMapper; + @Autowired + private SysDeptMapper sysDeptMapper; + + /** + * 查询库存信息 + * + * @param stockId 库存信息主键 + * @return 库存信息 + */ + @Override + public BasStockInfo selectBasStockInfoByStockId(String stockId) + { + return basStockInfoMapper.selectBasStockInfoByStockId(stockId); + } + + + /** + * 查询库存信息 + * + * @param trayCode 托盘号 + * @return 库存信息 + */ + @Override + public BasStockInfo selectBasStockInfoByTrayCode(String trayCode){ + return basStockInfoMapper.selectBasStockInfoByTrayCode(trayCode); + } + + /** + * 查询库存信息列表 + * + * @param basStockInfo 库存信息 + * @return 库存信息 + */ + @Override + @WarehouseScope(warehouseField = "bs.warehouse_id") + public List selectBasStockInfoList(BasStockInfo basStockInfo) + { + return basStockInfoMapper.selectBasStockInfoList(basStockInfo); + } + + /** + * 新增库存信息 + * + * @param basStockInfo 库存信息 + * @return 结果 + */ + @Override + public int insertBasStockInfo(BasStockInfo basStockInfo) + { + return basStockInfoMapper.insertBasStockInfo(basStockInfo); + } + + /** + * 修改库存信息 + * + * @param basStockInfo 库存信息 + * @return 结果 + */ + @Override + public int updateBasStockInfo(BasStockInfo basStockInfo) + { + BasStockInfo oldBasStockInfo = basStockInfoMapper.selectBasStockInfoByStockId(basStockInfo.getStockId()); + int i = basStockInfoMapper.updateBasStockInfo(basStockInfo); + if (i>0 && oldBasStockInfo != null){ + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysDept sysDept = sysDeptMapper.selectDeptById(loginUser.getDeptId()); + BasStockOperRecord basStockOperRecord = new BasStockOperRecord(); + basStockOperRecord.setStockId(basStockInfo.getStockId()); + basStockOperRecord.setCargoSpaceId(basStockInfo.getCargoSpaceId()); + basStockOperRecord.setUserId(loginUser.getUserId()); + basStockOperRecord.setUserName(loginUser.getUsername()); + basStockOperRecord.setDeptId(loginUser.getDeptId()); + basStockOperRecord.setDeptName(sysDept.getDeptName()); + basStockOperRecord.setCreateTime(DateUtils.getNowDate()); + //basStockOperRecord.setCargoSpaceName(oldBasStock.getCargoSpaceName()); + basStockOperRecordMapper.insertBasStockOperRecord(basStockOperRecord); + } + return i; + } + + /** + * 批量删除库存信息 + * + * @param stockIds 需要删除的库存信息主键 + * @return 结果 + */ + @Override + public int deleteBasStockInfoByStockIds(String[] stockIds) + { + return basStockInfoMapper.deleteBasStockInfoByStockIds(stockIds); + } + + /** + * 删除库存信息信息 + * + * @param stockId 库存信息主键 + * @return 结果 + */ + @Override + public int deleteBasStockInfoByStockId(String stockId) + { + return basStockInfoMapper.deleteBasStockInfoByStockId(stockId); + } + + + @Override + public int deleteBasStockInfoByTrayCode(String trayCode){ + return basStockInfoMapper.deleteBasStockInfoByTrayCode(trayCode); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/impl/BasStockServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/impl/BasStockServiceImpl.java index 53fcfa8..f1be752 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/impl/BasStockServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/stock/service/impl/BasStockServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.bas.stock.service.impl; +import java.math.BigDecimal; import java.util.List; import com.ruoyi.bas.stockoper.domain.BasStockOperRecord; @@ -7,6 +8,7 @@ import com.ruoyi.bas.stockoper.mapper.BasStockOperRecordMapper; import com.ruoyi.common.annotation.WarehouseScope; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.mapper.SysDeptMapper; @@ -39,11 +41,23 @@ public class BasStockServiceImpl implements IBasStockService * @return 库存信息 */ @Override - public BasStock selectBasStockByStockId(String stockId) + public List selectBasStockByStockId(String stockId) { return basStockMapper.selectBasStockByStockId(stockId); } + public List selectBasStockListByProductId(String productId){ + return basStockMapper.selectBasStockListByProductId(productId); + } + + public List selectBasStockListByTrayCode(String trayCode){ + return basStockMapper.selectBasStockListByTrayCode(trayCode); + } + + public BasStock selectBasStockByRollerNumber(String rollerNumber){ + return basStockMapper.selectBasStockByRollerNumber(rollerNumber); + } + /** * 查询库存信息列表 * @@ -78,30 +92,31 @@ public class BasStockServiceImpl implements IBasStockService @Override public int updateBasStock(BasStock basStock) { - BasStock oldBasStock = basStockMapper.selectBasStockByStockId(basStock.getStockId()); - int i = basStockMapper.updateBasStock(basStock); - if (i>0 && oldBasStock != null){ - LoginUser loginUser = SecurityUtils.getLoginUser(); - SysDept sysDept = sysDeptMapper.selectDeptById(loginUser.getDeptId()); - BasStockOperRecord basStockOperRecord = new BasStockOperRecord(); - basStockOperRecord.setStockId(basStock.getStockId()); - basStockOperRecord.setCargoSpaceId(basStock.getCargoSpaceId()); - basStockOperRecord.setSrcStatus(oldBasStock.getStockStatus()); - basStockOperRecord.setTarStatus(basStock.getStockStatus()); - basStockOperRecord.setUserId(loginUser.getUserId()); - basStockOperRecord.setUserName(loginUser.getUsername()); - basStockOperRecord.setDeptId(loginUser.getDeptId()); - basStockOperRecord.setDeptName(sysDept.getDeptName()); - basStockOperRecord.setCreateTime(DateUtils.getNowDate()); - basStockOperRecord.setSrcQuantity(oldBasStock.getQuantity()); - basStockOperRecord.setTarQuantity(basStock.getQuantity()); - basStockOperRecord.setWarehouseId(basStock.getWarehouseId()); - basStockOperRecord.setWarehouseName(basStock.getWarehouseName()); - basStockOperRecord.setCargoSpaceId(oldBasStock.getCargoSpaceId()); - //basStockOperRecord.setCargoSpaceName(oldBasStock.getCargoSpaceName()); - basStockOperRecordMapper.insertBasStockOperRecord(basStockOperRecord); - } - return i; + return basStockMapper.updateBasStock(basStock); +// BasStock oldBasStock = basStockMapper.selectBasStockByStockId(basStock.getStockId()); +// int i = basStockMapper.updateBasStock(basStock); +// if (i>0 && oldBasStock != null){ +// LoginUser loginUser = SecurityUtils.getLoginUser(); +// SysDept sysDept = sysDeptMapper.selectDeptById(loginUser.getDeptId()); +// BasStockOperRecord basStockOperRecord = new BasStockOperRecord(); +// basStockOperRecord.setStockId(basStock.getStockId()); +// basStockOperRecord.setCargoSpaceId(basStock.getCargoSpaceId()); +// basStockOperRecord.setSrcStatus(oldBasStock.getStockStatus()); +// basStockOperRecord.setTarStatus(basStock.getStockStatus()); +// basStockOperRecord.setUserId(loginUser.getUserId()); +// basStockOperRecord.setUserName(loginUser.getUsername()); +// basStockOperRecord.setDeptId(loginUser.getDeptId()); +// basStockOperRecord.setDeptName(sysDept.getDeptName()); +// basStockOperRecord.setCreateTime(DateUtils.getNowDate()); +// basStockOperRecord.setSrcQuantity(oldBasStock.getQuantity()); +// basStockOperRecord.setTarQuantity(basStock.getQuantity()); +// basStockOperRecord.setWarehouseId(basStock.getWarehouseId()); +// basStockOperRecord.setWarehouseName(basStock.getWarehouseName()); +// basStockOperRecord.setCargoSpaceId(oldBasStock.getCargoSpaceId()); +// //basStockOperRecord.setCargoSpaceName(oldBasStock.getCargoSpaceName()); +// basStockOperRecordMapper.insertBasStockOperRecord(basStockOperRecord); +// } +// return i; } /** @@ -127,4 +142,32 @@ public class BasStockServiceImpl implements IBasStockService { return basStockMapper.deleteBasStockByStockId(stockId); } + + /** + * 删除库存信息信息 + * + * @param rollerNumber 库存信息主键 + * @return 结果 + */ + @Override + public int deleteBasStockByRollerNumber(String rollerNumber) + { + return basStockMapper.deleteBasStockByRollerNumber(rollerNumber); + } + + @Override + public int getQuantityByTrayCode(String trayCode){ + + List stocks = selectBasStockList( + new BasStock().builder().trayCode(trayCode).build() + ); + int sum = 0; + for (BasStock stock : stocks){ + sum = Convert.toInt(stock.getQuantity()); + } + + return sum; + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/CargoSpaceCode.java b/ruoyi-admin/src/main/java/com/ruoyi/common/CargoSpaceCode.java new file mode 100644 index 0000000..a851db0 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/CargoSpaceCode.java @@ -0,0 +1,45 @@ +package com.ruoyi.common; + +public class CargoSpaceCode { + + /** 货位状态 - 可用 */ + public static final String CARGOSPACE_STATUS_AVAILABLE = "1"; + + /** 货位状态 - 占用 */ + public static final String CARGOSPACE_STATUS_OCCUPIED = "2"; + + /** 货位状态 - 入库分配 */ + public static final String CARGOSPACE_STATUS_PRE_STOCKIN = "3"; + + /** 货位状态 - 出库分配 */ + public static final String CARGOSPACE_STATUS_PRE_STOCKOUT = "4"; + + /** 货位状态 - 需盘点 */ + public static final String CARGOSPACE_STATUS_EXCEPTION = "5"; + + + /** 货位锁定状态 - 锁定 */ + public static final String CARGOSPACE_LOCKED = "Y"; + + /** 货位锁定状态 - 未锁定 */ + public static final String CARGOSPACE_UNLOCKED = "N"; + + + /** 货位对应托盘类型 - 类型1 */ + public static final String CARGOSPACE_TYPE_4 = "4"; + public static final int CARGOSPACE_HEIGHT_4_INT = 4; + + /** 货位对应托盘类型 - 类型2 */ + public static final String CARGOSPACE_TYPE_6 = "6"; + public static final int CARGOSPACE_TYPE_6_INT = 6; + + + + /** 货位是否双伸 - 单伸 */ + public static final String CARGOSPACE_ISDOUBLE_N = "N"; + + /** 货位是否双伸 - 双伸 */ + public static final String CARGOSPACE_ISDOUBLE_Y = "Y"; + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/InTrayMsgCode.java b/ruoyi-admin/src/main/java/com/ruoyi/common/InTrayMsgCode.java new file mode 100644 index 0000000..20f1551 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/InTrayMsgCode.java @@ -0,0 +1,12 @@ +package com.ruoyi.common; + +public class InTrayMsgCode { + + /** 绑定状态 - 新建 */ + public static final String STATUS_NEW = "1"; + + /** 绑定状态 - 已有库存 */ + public static final String STATUS_EXIST = "2"; + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/JobIdType.java b/ruoyi-admin/src/main/java/com/ruoyi/common/JobIdType.java new file mode 100644 index 0000000..f2db9c0 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/JobIdType.java @@ -0,0 +1,67 @@ +package com.ruoyi.common; + +/** + * 单据类型 + */ +public class JobIdType { + + /** + * 接收入库单据 + */ + public static final String JOB_RECEIVE_LIST_STOCKIN = "RKD"; + + /** + * 接收入库单据 + */ + public static final String JOB_RECEIVE_LIST_STOCKOUT = "CKD"; + + /** + * 手动入库单据 + */ + public static final String JOB_MANUAL_LIST_STOCKIN = "RKDM"; + + /** + * 手动入库单据 + */ + public static final String JOB_MANUAL_LIST_STOCKOUT = "CKDM"; + + + + + /** + * 常规入库任务 + */ + public static final String MYDOJOB_STOCKIN = "RK"; + + /** + * 常规出库任务 + */ + public static final String MYDOJOB_STOCKOUT = "CK"; + + /** + * 移库任务 + */ + public static final String MYDOJOB_MOVE = "MOVE"; + + /** + * 拣选回流任务 + */ + public static final String MYDOJOB_PICK_RETURN = "HL"; + + /** + * 空托入库任务 + */ + public static final String MYDOJOB_STOCKIN_EMPTY_PALLET = "KTRK"; + + /** + * 空托出库任务 + */ + public static final String MYDOJOB_STOCKOUT_EMPTY_PALLET = "KTCK"; + + + + /** 库存 */ + public static final String STOCK = "KC"; + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/ProductType.java b/ruoyi-admin/src/main/java/com/ruoyi/common/ProductType.java new file mode 100644 index 0000000..b053917 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/ProductType.java @@ -0,0 +1,8 @@ +package com.ruoyi.common; + +public class ProductType { + + public static final String EMPTY_TRAY = "KTP0001"; + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/RequestTitle.java b/ruoyi-admin/src/main/java/com/ruoyi/common/RequestTitle.java new file mode 100644 index 0000000..04369ed --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/RequestTitle.java @@ -0,0 +1,20 @@ +package com.ruoyi.common; + + +public class RequestTitle { + + public static final String REICEIVE_ERP_STOCKIN_LIST = "接收入库单据信息"; + + public static final String REICEIVE_ERP_STOCKOUT_LIST = "接收出库单据信息"; + + + public static final String SEND_WCS_STOCKIN_MYDOJOB = "推送wcs入库任务"; + + public static final String SEND_WCS_STOCKOUT_MYDOJOB = "推送wcs常规出库任务"; + + public static final String SEND_WCS_STOCKOUT_EMPTY_TRAY_MYDOJOB = "推送wcs空容器出库任务"; + + public static final String SEND_WCS_TASK_CANCEL = "取消作业"; + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/StockCode.java b/ruoyi-admin/src/main/java/com/ruoyi/common/StockCode.java new file mode 100644 index 0000000..8f02d1a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/StockCode.java @@ -0,0 +1,15 @@ +package com.ruoyi.common; + +public class StockCode { + + /** 库存状态 - 可用 */ + public static final String STOCK_STATUS_AVAILABLE = "1"; + + /** 库存状态 - 冻结 */ + public static final String STOCK_STATUS_OCCUPIED = "2"; + + + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/StockStatusEnum.java b/ruoyi-admin/src/main/java/com/ruoyi/common/StockStatusEnum.java new file mode 100644 index 0000000..d26c164 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/StockStatusEnum.java @@ -0,0 +1,26 @@ +package com.ruoyi.common; + +public enum StockStatusEnum { + + NORMAL("1", "正常"), + OCCUPIED("2", "占用"); + + + private final String code; + private final String desc; + + StockStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/TaskIdType.java b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskIdType.java new file mode 100644 index 0000000..ade8a3f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskIdType.java @@ -0,0 +1,35 @@ +package com.ruoyi.common; + +/** + * 单据类型 + */ +public class TaskIdType { + + /** + * 入库任务 + */ + public static final String TASK_STOCKIN = "1"; + + /** + * 盘点入库任务 + */ + public static final String TASK_STOCKIN_INVENTORY = "2"; + + /** + * 回流入库 + */ + public static final String TASK_STOCKIN_BACK = "5"; + + /** + * 空托入库 + */ + public static final String TASK_STOCKIN_EMPTY_PALLET = "6"; + + /** + * 空托出库 + */ + public static final String TASK_STOCKOUT_EMPTY_PALLET = "7"; + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/TaskStatusEnum.java b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskStatusEnum.java new file mode 100644 index 0000000..55545ee --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskStatusEnum.java @@ -0,0 +1,28 @@ +package com.ruoyi.common; + +public enum TaskStatusEnum { + + READY("1", "待执行"), + RUNNING("2", "执行中"), + AUTO_FINISHED("3", "自动完成"), + MANUAL_FINISHED("4", "手动完成"), + CANCEL("5", "作废"); + + private final String code; + private final String desc; + + TaskStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/TaskType.java b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskType.java new file mode 100644 index 0000000..78c500b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/TaskType.java @@ -0,0 +1,66 @@ +package com.ruoyi.common; + +public class TaskType { + + /** + * 常规入库 + */ + public static final int TASKTYPE_STOCKIN = 1; + public static final String TASKTYPE_STOCKIN_STR = "1"; + + /** + * 空托入库 + */ + public static final int TASKTYPE_STOCKIN_EMPTY_TRAY = 2; + public static final String TASKTYPE_STOCKIN_EMPTY_TRAY_STR = "2"; + + /** + * 拣选回流 + */ + public static final int TASKTYPE_PICK_RETURN = 3; + public static final String TASKTYPE_PICK_RETURN_STR = "3"; + + /** + * 移库 + */ + public static final int TASKTYPE_STOCK_MOVE = 4; + public static final String TASKTYPE_PICK_STOCK_MOVE_STR = "4"; + + /** + * 常规出库 + */ + public static final int TASKTYPE_STOCKOUT = 20; + public static final String TASKTYPE_STOCKOUT_STR = "20"; + + /** + * 拣选出库 + */ + public static final int TASKTYPE_STOCKOUT_PICKING = 21; + public static final String TASKTYPE_STOCKOUT_PICKING_STR = "21"; + + /** + * 空容器出库 + */ + public static final int TASKTYPE_STOCKOUT_EMPTY_TRAY = 22; + public static final String TASKTYPE_STOCKOUT_EMPTY_TRAY_STR = "22"; + + /** + * 有托盘余位的容器出库 + */ + public static final int TASKTYPE_STOCKOUT_CONTAINER = 27; + public static final String TASKTYPE_STOCKOUT_CONTAINER_STR = "27"; + + /** + * 指定货位出库 + */ + public static final int TASKTYPE_STOCKOUT_MANUAL = 23; + public static final String TASKTYPE_STOCKOUT_MANUAL_STR = "23"; + + /** + * 盘点 + */ + public static final int TASKTYPE_INVENTORY = 26; + public static final String TASKTYPE_INVENTORY_STR = "26"; + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/Utils/DecimalUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/common/Utils/DecimalUtil.java new file mode 100644 index 0000000..9de5f33 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/Utils/DecimalUtil.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.Utils; + +import java.math.BigDecimal; + +public class DecimalUtil { + + public static boolean eq(BigDecimal a, BigDecimal b) { + return a == null ? b == null : b != null && a.compareTo(b) == 0; + } + + public static boolean gt(BigDecimal a, BigDecimal b) { + return a != null && b != null && a.compareTo(b) > 0; + } + + public static boolean ge(BigDecimal a, BigDecimal b) { + return a != null && b != null && a.compareTo(b) >= 0; + } + + public static boolean lt(BigDecimal a, BigDecimal b) { + return a != null && b != null && a.compareTo(b) < 0; + } + + public static boolean le(BigDecimal a, BigDecimal b) { + return a != null && b != null && a.compareTo(b) <= 0; + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/common/WcsUrl.java b/ruoyi-admin/src/main/java/com/ruoyi/common/WcsUrl.java new file mode 100644 index 0000000..f73dac1 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/common/WcsUrl.java @@ -0,0 +1,30 @@ +package com.ruoyi.common; + +public class WcsUrl { + + /** 推送出库作业 */ + public static final String PUSH_OUT_MYDO_JOB = "http://localhost:8081/wcs2Wms/api/receiveOutMydoJob"; + + /** 推送容器出库作业 */ + public static final String PUSH_EMPTY_TRAY_OUT_MYDO_JOB = "http://localhost:8081/wcs2Wms/api/receiveOutMydoJob"; + + /** 推送入库作业 */ + public static final String PUSH_IN_MYDO_JOB = "http://localhost:8081/wcs2Wms/api/receiveInMydoJob"; + + /** 推送移库作业 */ + public static final String PUSH_MOVE_MYDO_JOB = "http://localhost:8081/wcs2Wms/api/receiveMoveMydoJob"; + + /** 推送回流作业 */ + public static final String PUSH_RETURN_MYDO_JOB = "http://localhost:8081/wcs2Wms/api/receiveReturnMydoJob"; + + /** */ + public static final String PUSH_AGV_MOVE_JOB = "http://localhost:8081/agv/api/receiveAgvMoveJob"; + + /** */ + public static final String OUT_MYDOJOB_MS = "http://localhost:8081/wcs2Wms/api/outMydojobMakesure"; + + /** */ + public static final String CANCEL_MYDOJOB = "http://localhost:8081/wcs2Wms/api/cancelMydoJob"; + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/bind/domain/InTrayMsg.java b/ruoyi-admin/src/main/java/com/ruoyi/in/bind/domain/InTrayMsg.java index 868c29c..15120f2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/bind/domain/InTrayMsg.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/bind/domain/InTrayMsg.java @@ -1,5 +1,10 @@ package com.ruoyi.in.bind.domain; +import cn.hutool.core.date.DateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -13,7 +18,11 @@ import java.math.BigDecimal; * @author ruoyi * @date 2026-05-14 */ -public class InTrayMsg extends BaseEntity +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InTrayMsg { private static final long serialVersionUID = 1L; @@ -24,6 +33,10 @@ public class InTrayMsg extends BaseEntity @Excel(name = "托盘码") private String trayCode; + /** 入库主单码 */ + @Excel(name = "入库主单码") + private String stockinId; + /** 入库子单码 */ @Excel(name = "入库子单码") private String stockinDetailId; @@ -48,98 +61,26 @@ public class InTrayMsg extends BaseEntity @Excel(name = "部门编码") private Long deptId; - public void setId(Long id) - { - this.id = id; + /** 托盘类型 */ + @Excel(name = "托盘类型") + private int trayType; + + /** 生成时间 */ + @Excel(name = "生成时间") + private DateTime createTime; + + /** 辊号 */ + @Excel(name = "辊号") + private String rollerNumber; + + /** 绑定状态 0-新建绑定 1-原有库存 */ + @Excel(name = "绑定状态") + private String status; + + + public DateTime getCreateTime() { + return DateTime.now(); } - public Long getId() - { - return id; - } - public void setTrayCode(String trayCode) - { - this.trayCode = trayCode; - } - - public String getTrayCode() - { - return trayCode; - } - - public void setStockinDetailId(String stockinDetailId) - { - this.stockinDetailId = stockinDetailId; - } - - public String getStockinDetailId() - { - return stockinDetailId; - } - - public void setProductId(String productId) - { - this.productId = productId; - } - - public String getProductId() - { - return productId; - } - - public void setQuantity(BigDecimal quantity) - { - this.quantity = quantity; - } - - public BigDecimal getQuantity() - { - return quantity; - } - - public void setWarehouseId(String warehouseId) - { - this.warehouseId = warehouseId; - } - - public String getWarehouseId() - { - return warehouseId; - } - - public void setUserId(Long userId) - { - this.userId = userId; - } - - public Long getUserId() - { - return userId; - } - - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - public Long getDeptId() - { - return deptId; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("trayCode", getTrayCode()) - .append("stockinDetailId", getStockinDetailId()) - .append("productId", getProductId()) - .append("quantity", getQuantity()) - .append("warehouseId", getWarehouseId()) - .append("userId", getUserId()) - .append("deptId", getDeptId()) - .append("createTime", getCreateTime()) - .toString(); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/bind/mapper/InTrayMsgMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/in/bind/mapper/InTrayMsgMapper.java index 82641b0..a4ff5eb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/bind/mapper/InTrayMsgMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/bind/mapper/InTrayMsgMapper.java @@ -60,5 +60,8 @@ public interface InTrayMsgMapper */ public int deleteInTrayMsgByIds(Long[] ids); + + public int deleteInTrayMsgByTrayCode(String trayCode); + int selectInTrayMsgCountByTrayCodeAndWarehouseId(@Param("trayCode") String trayCode,@Param("warehouseId") String warehouseId); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/bind/service/IInTrayMsgService.java b/ruoyi-admin/src/main/java/com/ruoyi/in/bind/service/IInTrayMsgService.java index a08ee21..65eedc5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/bind/service/IInTrayMsgService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/bind/service/IInTrayMsgService.java @@ -58,4 +58,15 @@ public interface IInTrayMsgService * @return 结果 */ public int deleteInTrayMsgById(Long id); + + + /** + * 删除入库信息信息 + * + * @param trayCode 托盘条码 + * @return 结果 + */ + public int deleteInTrayMsgByTrayCode(String trayCode); + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/bind/service/impl/InTrayMsgServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/bind/service/impl/InTrayMsgServiceImpl.java index 8299397..54ef0e6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/bind/service/impl/InTrayMsgServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/bind/service/impl/InTrayMsgServiceImpl.java @@ -53,7 +53,6 @@ public class InTrayMsgServiceImpl implements IInTrayMsgService @Override public int insertInTrayMsg(InTrayMsg inTrayMsg) { - inTrayMsg.setCreateTime(DateUtils.getNowDate()); return inTrayMsgMapper.insertInTrayMsg(inTrayMsg); } @@ -92,4 +91,14 @@ public class InTrayMsgServiceImpl implements IInTrayMsgService { return inTrayMsgMapper.deleteInTrayMsgById(id); } + + + @Override + public int deleteInTrayMsgByTrayCode(String trayCode){ + return inTrayMsgMapper.deleteInTrayMsgByTrayCode(trayCode); + } + + + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/job/controller/InMydoJobController.java b/ruoyi-admin/src/main/java/com/ruoyi/in/job/controller/InMydoJobController.java index 11ce25d..870dfe2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/job/controller/InMydoJobController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/job/controller/InMydoJobController.java @@ -105,7 +105,8 @@ public class InMydoJobController extends BaseController @PutMapping("/cancel/{jobId}") public AjaxResult cancel(@PathVariable("jobId") String jobId) { - return mydoJobService.cancelJob(jobId,"1"); +// return mydoJobService.cancelJob(jobId,"1"); + return mydoJobService.cancelJob(jobId); } /** @@ -116,6 +117,6 @@ public class InMydoJobController extends BaseController @PutMapping("/complete/{jobId}") public AjaxResult complete(@PathVariable("jobId") String jobId) { - return mydoJobService.completeJob(jobId,"1"); + return mydoJobService.manualCompleteJob(jobId,"1"); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/job/domain/MydoJob.java b/ruoyi-admin/src/main/java/com/ruoyi/in/job/domain/MydoJob.java index bfb06de..1b1bce6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/job/domain/MydoJob.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/job/domain/MydoJob.java @@ -1,6 +1,14 @@ package com.ruoyi.in.job.domain; import java.math.BigDecimal; +import java.util.Date; + +import cn.hutool.core.date.DateUtil; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -12,7 +20,11 @@ import com.ruoyi.common.core.domain.BaseEntity; * @author ruoyi * @date 2026-05-11 */ -public class MydoJob extends BaseEntity +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MydoJob { private static final long serialVersionUID = 1L; @@ -29,7 +41,7 @@ public class MydoJob extends BaseEntity /** 任务类型 */ @Excel(name = "任务类型") - private Long inOrOut; + private int inOrOut; /** 执行阶段 */ @Excel(name = "执行阶段") @@ -73,7 +85,7 @@ public class MydoJob extends BaseEntity /** 优先级 */ @Excel(name = "优先级") - private Long priority; + private int priority; /** 高度 */ @Excel(name = "高度") @@ -83,6 +95,10 @@ public class MydoJob extends BaseEntity @Excel(name = "重量") private BigDecimal weight; + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String createTime; + /** 开始时间 */ private String startTime; @@ -97,368 +113,27 @@ public class MydoJob extends BaseEntity @Excel(name = "出口ID") private String exitId; - /** 部门ID */ - private Long deptId; + /** 重分标志 */ + @Excel(name = "重分标志") + private String faultFlag; - /** 部门名称 */ - @Excel(name = "部门名称") - private String deptName; + /** + * 托盘类型(托盘尺寸) + */ + @Excel(name = "托盘类型") + int trayType; - /** 用户id */ - private Long userId; - /** 用户名称 */ - @Excel(name = "用户名称") - private String userName; - /** 供应商ID */ - private String supplierId; - - /** 供应商名称 */ - @Excel(name = "供应商名称") - private String supplierName; - - /** 客户ID */ - private String customerId; - - /** 客户名称 */ - @Excel(name = "客户名称") - private String customerName; - - public void setJobId(String jobId) + public void setCreateTime(String createTime) { - this.jobId = jobId; + this.createTime = createTime; } - public String getJobId() + public String getCreateTime() { - return jobId; + return DateUtil.formatDateTime(new Date()); } - public void setStatus(String status) - { - this.status = status; - } - public String getStatus() - { - return status; - } - - public void setTaskNo(String taskNo) - { - this.taskNo = taskNo; - } - - public String getTaskNo() - { - return taskNo; - } - - public void setInOrOut(Long inOrOut) - { - this.inOrOut = inOrOut; - } - - public Long getInOrOut() - { - return inOrOut; - } - - public void setExecutionPhase(String executionPhase) - { - this.executionPhase = executionPhase; - } - - public String getExecutionPhase() - { - return executionPhase; - } - - public void setTrayCode(String trayCode) - { - this.trayCode = trayCode; - } - - public String getTrayCode() - { - return trayCode; - } - - public void setWarehouseId(String warehouseId) - { - this.warehouseId = warehouseId; - } - - public String getWarehouseId() - { - return warehouseId; - } - - public void setWarehouseName(String warehouseName) - { - this.warehouseName = warehouseName; - } - - public String getWarehouseName() - { - return warehouseName; - } - - public void setRoadwayId(String roadwayId) - { - this.roadwayId = roadwayId; - } - - public String getRoadwayId() - { - return roadwayId; - } - - public void setCargoSpaceId(String cargoSpaceId) - { - this.cargoSpaceId = cargoSpaceId; - } - - public String getCargoSpaceId() - { - return cargoSpaceId; - } - - public void setCargoSpaceName(String cargoSpaceName) - { - this.cargoSpaceName = cargoSpaceName; - } - - public String getCargoSpaceName() - { - return cargoSpaceName; - } - - public void setTargetRoadwayId(String targetRoadwayId) - { - this.targetRoadwayId = targetRoadwayId; - } - - public String getTargetRoadwayId() - { - return targetRoadwayId; - } - - public void setTargetCargoSpaceId(String targetCargoSpaceId) - { - this.targetCargoSpaceId = targetCargoSpaceId; - } - - public String getTargetCargoSpaceId() - { - return targetCargoSpaceId; - } - - public void setTargetCargoSpaceName(String targetCargoSpaceName) - { - this.targetCargoSpaceName = targetCargoSpaceName; - } - - public String getTargetCargoSpaceName() - { - return targetCargoSpaceName; - } - - public void setLineType(String lineType) - { - this.lineType = lineType; - } - - public String getLineType() - { - return lineType; - } - - public void setPriority(Long priority) - { - this.priority = priority; - } - - public Long getPriority() - { - return priority; - } - - public void setHeight(BigDecimal height) - { - this.height = height; - } - - public BigDecimal getHeight() - { - return height; - } - - public void setWeight(BigDecimal weight) - { - this.weight = weight; - } - - public BigDecimal getWeight() - { - return weight; - } - - public void setStartTime(String startTime) - { - this.startTime = startTime; - } - - public String getStartTime() - { - return startTime; - } - - public void setFinishTime(String finishTime) - { - this.finishTime = finishTime; - } - - public String getFinishTime() - { - return finishTime; - } - - public void setEntranceId(String entranceId) - { - this.entranceId = entranceId; - } - - public String getEntranceId() - { - return entranceId; - } - - public void setExitId(String exitId) - { - this.exitId = exitId; - } - - public String getExitId() - { - return exitId; - } - - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - public Long getDeptId() - { - return deptId; - } - - public void setDeptName(String deptName) - { - this.deptName = deptName; - } - - public String getDeptName() - { - return deptName; - } - - public void setUserId(Long userId) - { - this.userId = userId; - } - - public Long getUserId() - { - return userId; - } - - public void setUserName(String userName) - { - this.userName = userName; - } - - public String getUserName() - { - return userName; - } - - public void setSupplierId(String supplierId) - { - this.supplierId = supplierId; - } - - public String getSupplierId() - { - return supplierId; - } - - public void setSupplierName(String supplierName) - { - this.supplierName = supplierName; - } - - public String getSupplierName() - { - return supplierName; - } - - public void setCustomerId(String customerId) - { - this.customerId = customerId; - } - - public String getCustomerId() - { - return customerId; - } - - public void setCustomerName(String customerName) - { - this.customerName = customerName; - } - - public String getCustomerName() - { - return customerName; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("jobId", getJobId()) - .append("status", getStatus()) - .append("taskNo", getTaskNo()) - .append("inOrOut", getInOrOut()) - .append("executionPhase", getExecutionPhase()) - .append("trayCode", getTrayCode()) - .append("warehouseId", getWarehouseId()) - .append("warehouseName", getWarehouseName()) - .append("roadwayId", getRoadwayId()) - .append("cargoSpaceId", getCargoSpaceId()) - .append("cargoSpaceName", getCargoSpaceName()) - .append("targetRoadwayId", getTargetRoadwayId()) - .append("targetCargoSpaceId", getTargetCargoSpaceId()) - .append("targetCargoSpaceName", getTargetCargoSpaceName()) - .append("lineType", getLineType()) - .append("priority", getPriority()) - .append("height", getHeight()) - .append("weight", getWeight()) - .append("createTime", getCreateTime()) - .append("startTime", getStartTime()) - .append("finishTime", getFinishTime()) - .append("entranceId", getEntranceId()) - .append("exitId", getExitId()) - .append("deptId", getDeptId()) - .append("deptName", getDeptName()) - .append("userId", getUserId()) - .append("userName", getUserName()) - .append("supplierId", getSupplierId()) - .append("supplierName", getSupplierName()) - .append("customerId", getCustomerId()) - .append("customerName", getCustomerName()) - .toString(); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/job/mapper/MydoJobMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/in/job/mapper/MydoJobMapper.java index 390d13d..ab8b759 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/job/mapper/MydoJobMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/job/mapper/MydoJobMapper.java @@ -30,6 +30,14 @@ public interface MydoJobMapper */ public List selectMydoJobList(MydoJob mydoJob); + /** + * 查询作业信息列表 + * + * @param trayCode 托盘号 + * @return 作业信息集合 + */ + public MydoJob selectMydoJobByTrayCode(String trayCode); + /** * 新增作业信息 * @@ -68,12 +76,6 @@ public interface MydoJobMapper */ void completeJob(HashMap map); - /** - * 完成出库任务 - * @param map - */ - void makeSure(HashMap map); - /** * 作废入库作业 * @param map @@ -85,6 +87,14 @@ public interface MydoJobMapper * @param map */ void cancelOutJob(HashMap map); + + /** + * 完成出库任务 + * @param map + */ + void makeSure(HashMap map); + + /** * 查询入库作业信息列表 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/IMydoJobService.java b/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/IMydoJobService.java index ba9cec4..4fa100b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/IMydoJobService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/IMydoJobService.java @@ -18,7 +18,15 @@ public interface IMydoJobService * @param jobId 作业信息主键 * @return 作业信息 */ - public MydoJob selectMydoJobByJobId(String jobId); + MydoJob selectMydoJobByJobId(String jobId); + + /** + * 查询作业信息 + * + * @param mydoJob 作业信息 + * @return 作业信息 + */ + List selectMydoJobList(MydoJob mydoJob); /** * 查询作业信息列表 @@ -26,64 +34,7 @@ public interface IMydoJobService * @param mydoJob 作业信息 * @return 作业信息集合 */ - public List selectInMydoJobList(MydoJob mydoJob); - - /** - * 新增作业信息 - * - * @param mydoJob 作业信息 - * @return 结果 - */ - public int insertMydoJob(MydoJob mydoJob); - - /** - * 修改作业信息 - * - * @param mydoJob 作业信息 - * @return 结果 - */ - public int updateMydoJob(MydoJob mydoJob); - - /** - * 批量删除作业信息 - * - * @param jobIds 需要删除的作业信息主键集合 - * @return 结果 - */ - public int deleteMydoJobByJobIds(String[] jobIds); - - /** - * 删除作业信息信息 - * - * @param jobId 作业信息主键 - * @return 结果 - */ - public int deleteMydoJobByJobId(String jobId); - - /** - * 手动作废作业 - * - * @param jobId 作业ID - * @param type 作业类型 1-入库 2-出库 - * @return 结果 - */ - public AjaxResult cancelJob(String jobId,String type); - - /** - * 手动完成作业 - * - * @param jobId 作业ID - * @param type 作业类型 1-入库 2-出库 - * @return 结果 - */ - public AjaxResult completeJob(String jobId,String type); - /** - * 查询已完成的作业信息列表 - * - * @param mydoJob 作业信息 - * @return 作业信息集合 - */ - List selectInMydoJobFinishList(MydoJob mydoJob); + List selectInMydoJobList(MydoJob mydoJob); /** * 查询出库作业信息列表 @@ -92,10 +43,96 @@ public interface IMydoJobService */ List selectOutMydoJobList(MydoJob mydoJob); + /** + * 查询作业信息 + * + * @param trayCode 托盘号 + * @return 作业信息 + */ + MydoJob selectMydoJobByTrayCode(String trayCode); + + /** + * 新增作业信息 + * + * @param mydoJob 作业信息 + * @return 结果 + */ + int insertMydoJob(MydoJob mydoJob); + + /** + * 修改作业信息 + * + * @param mydoJob 作业信息 + * @return 结果 + */ + int updateMydoJob(MydoJob mydoJob); + + /** + * 批量删除作业信息 + * + * @param jobIds 需要删除的作业信息主键集合 + * @return 结果 + */ + int deleteMydoJobByJobIds(String[] jobIds); + + /** + * 删除作业信息信息 + * + * @param jobId 作业信息主键 + * @return 结果 + */ + int deleteMydoJobByJobId(String jobId); + + /** 自动完成作业 */ + AjaxResult autoCompleteJob(String jobId, String type); + + /** + * 手动作废作业 + * + * @param jobId 作业ID + * @param type 作业类型 1-入库 2-出库 + * @return 结果 + */ + AjaxResult cancelJob(String jobId,String type); + + /** + * 手动作废作业 + * + * @param jobId 作业ID + * @return 结果 + */ + AjaxResult cancelJob(String jobId); + + /** + * 手动完成作业 + * + * @param jobId 作业ID + * @param type 作业类型 1-入库 2-出库 + * @return 结果 + */ + AjaxResult manualCompleteJob(String jobId, String type); + + /** + * 查询已完成的作业信息列表 + * + * @param mydoJob 作业信息 + * @return 作业信息集合 + */ + List selectInMydoJobFinishList(MydoJob mydoJob); + /** * 查询已完成的出库作业信息列表 * @param mydoJob * @return */ List selectOutMydoJobFinishList(MydoJob mydoJob); + + /** + * 根据托盘号获取托盘类型 + * @param TrayCode + * @return + */ + int getTrayTypeByTrayCode(String TrayCode); + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java index ef9f343..551966c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/job/service/impl/MydoJobServiceImpl.java @@ -1,18 +1,52 @@ package com.ruoyi.in.job.service.impl; +import java.math.BigDecimal; import java.util.HashMap; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson2.JSON; +import com.ruoyi.api.service.ApiWcsService; +import com.ruoyi.bas.cargospace.domain.BasCargoSpace; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; +import com.ruoyi.bas.id.taskno.service.IBasTaskNoService; +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.domain.BasStockInfo; +import com.ruoyi.bas.stock.service.IBasStockInfoService; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.common.*; import com.ruoyi.common.annotation.WarehouseScope; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.in.bind.domain.InTrayMsg; +import com.ruoyi.in.bind.service.IInTrayMsgService; +import com.ruoyi.in.jobdetail.domain.MydoJobDetail; +import com.ruoyi.in.jobdetail.service.IMydoJobDetailService; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.service.IInStockinDetailService; +import com.ruoyi.in.stockin.service.IInStockinService; +import com.ruoyi.log.domain.RequestLog; +import com.ruoyi.log.service.IRequestLogService; +import com.ruoyi.out.stockout.domain.OutStockout; +import com.ruoyi.out.stockout.service.IOutStockoutService; +import com.ruoyi.out.stockoutdetail.domain.OutStockoutDetail; +import com.ruoyi.out.stockoutdetail.service.IOutStockoutDetailService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.in.job.mapper.MydoJobMapper; import com.ruoyi.in.job.domain.MydoJob; import com.ruoyi.in.job.service.IMydoJobService; +import org.springframework.transaction.annotation.Transactional; /** * 作业信息Service业务层处理 @@ -20,11 +54,42 @@ import com.ruoyi.in.job.service.IMydoJobService; * @author ruoyi * @date 2026-05-11 */ +@Slf4j @Service public class MydoJobServiceImpl implements IMydoJobService { @Autowired private MydoJobMapper mydoJobMapper; + @Autowired + IMydoJobDetailService mydoJobDetailService; + @Autowired + IBasStockService basStockService; + @Autowired + IBasStockInfoService basStockInfoService; + @Autowired + IBasCargoSpaceService cargoSpaceService; + @Autowired + IBasJobIdService basJobIdService; + @Autowired + IBasCargoSpaceService basCargoSpaceService; + @Autowired + IInTrayMsgService inTrayMsgService; + @Autowired + IInStockinService instockinService; + @Autowired + IInStockinDetailService instockinDetailService; + @Autowired + IOutStockoutService outStockoutService; + @Autowired + IOutStockoutDetailService outStockoutDetailService; + @Autowired + IRequestLogService requestLogService; + @Autowired + IBasTaskNoService basTaskNoService; + @Autowired + ApiWcsService apiWcsService; + + /** * 查询作业信息 @@ -38,6 +103,11 @@ public class MydoJobServiceImpl implements IMydoJobService return mydoJobMapper.selectMydoJobByJobId(jobId); } + @Override + public List selectMydoJobList(MydoJob mydoJob) { + return mydoJobMapper.selectMydoJobList(mydoJob); + } + /** * 查询作业信息列表 * @@ -51,6 +121,22 @@ public class MydoJobServiceImpl implements IMydoJobService return mydoJobMapper.selectInMydoJobList(mydoJob); } + @Override + public List selectOutMydoJobList(MydoJob mydoJob) { + return mydoJobMapper.selectOutMydoJobList(mydoJob); + } + + /** + * 查询作业信息 + * + * @param trayCode 托盘号 + * @return 作业信息 + */ + public MydoJob selectMydoJobByTrayCode(String trayCode){ + return mydoJobMapper.selectMydoJobByTrayCode(trayCode); + } + + /** * 新增作业信息 * @@ -60,7 +146,7 @@ public class MydoJobServiceImpl implements IMydoJobService @Override public int insertMydoJob(MydoJob mydoJob) { - mydoJob.setCreateTime(DateUtils.getNowDate()); + mydoJob.setCreateTime(DateUtils.getNowDate().toString()); return mydoJobMapper.insertMydoJob(mydoJob); } @@ -100,6 +186,7 @@ public class MydoJobServiceImpl implements IMydoJobService return mydoJobMapper.deleteMydoJobByJobId(jobId); } + /** * 手动作废作业 * @@ -132,6 +219,66 @@ public class MydoJobServiceImpl implements IMydoJobService return AjaxResult.error(); } + + /** + * 手动作废作业 + * + * @param jobId 作业ID + * @return 结果 + */ + @Override + public AjaxResult cancelJob(String jobId) + { + //任务主表 + List jobs = mydoJobMapper.selectMydoJobList( + new MydoJob().builder().jobId(jobId).build() + ); + + if (jobs.isEmpty()){ + log.warn("【操作异常】找不到该作业信息,作业号:{}", jobId); + return AjaxResult.error("找不到该作业信息"); + } + + //任务子表 + List details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId); + + if (details.isEmpty()){ + log.warn("【操作异常】找不到该作业明细信息,作业号:{}", jobId); + return AjaxResult.error("找不到该作业明细信息"); + } + + for (MydoJob mydoJob : jobs){ + //移除任务主表 + mydoJob.setStatus(TaskStatusEnum.CANCEL.getCode()); + updateMydoJob(mydoJob); + deleteMydoJobByJobId(mydoJob.getJobId()); + + //移除任务子表 + mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId); + + //todo 还原子单明细的物料数量 +// int quantity = mydoJobDetailService.getQuantityByJobId(jobId); + + //恢复货位状态 + //入库 + if (mydoJob.getInOrOut() == TaskType.TASKTYPE_STOCKIN){ + basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), null, CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE); + } + + //出库 + if (mydoJob.getInOrOut() == TaskType.TASKTYPE_STOCKOUT){ + basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED); + } + + + } + + log.warn("【手动操作】已作废当前作业,作业号:{}", jobId); + + return AjaxResult.success(); + } + + /** * 手动完成作业 * @@ -140,13 +287,14 @@ public class MydoJobServiceImpl implements IMydoJobService * @return 结果 */ @Override - public AjaxResult completeJob(String jobId,String type) + public AjaxResult manualCompleteJob(String jobId, String type) { if ("1".equals(type)){ HashMap map = new HashMap<>(); map.put("job_id", jobId); map.put("dept_id", SecurityUtils.getDeptId()); map.put("user_id", SecurityUtils.getUserId()); + //todo 处理回传完成的作业和单据 mydoJobMapper.completeJob(map); if (Convert.toStr(map.get("v_result")).equals("10")){ return AjaxResult.success(); @@ -168,19 +316,337 @@ public class MydoJobServiceImpl implements IMydoJobService return AjaxResult.error(); } + + /** + * 自动完成任务 + * @param jobId + * @param type + * @return + */ + @Override + @Transactional + public AjaxResult autoCompleteJob(String jobId, String type){ + + //>>>获取任务数据 + MydoJob mydoJob = selectMydoJobByJobId(jobId);//获取主任务 + + List details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId);//对应的所有子任务 + if (details.isEmpty()){ + log.warn("【任务完成上报】查不到该作业对应的子单明细,请检查子单状态,任务号:" + jobId); + return AjaxResult.error("查不到该作业对应的子单明细,请检查子单状态"); + } + + List inTrayMsgs = inTrayMsgService.selectInTrayMsgList( + new InTrayMsg().builder().trayCode(mydoJob.getTrayCode()).build() + );//获取当前托盘绑定信息 + if (inTrayMsgs.isEmpty()){ + log.warn("【任务完成上报】查不到该作业对应的托盘绑定信息,请检查绑定状态,任务号:" + jobId); + return AjaxResult.error("查不到该作业对应的托盘绑定信息,请检查绑定状态"); + } + + +//todo --------------------处理库存信息-------------------- + //todo 可能需要处理多种物料 + //>>>>>>>>>>>>>>>>>>>>>>>常规入库<<<<<<<<<<<<<<<<<<<<<<<< + if (type == TaskType.TASKTYPE_STOCKIN_STR){ + //获取非重复的物料种类 +// List products = details.stream() +// .map(MydoJobDetail::getProductId) +// .filter(Objects::nonNull) +// .distinct() +// .collect(Collectors.toList()); +// + + //库存编号 + String stockId = basJobIdService.getId(JobIdType.STOCK); + + //插入库存主表 + //查库存主表是否有该托盘号:判断空容器或非空容器 + BasStockInfo info = basStockInfoService.selectBasStockInfoByTrayCode(mydoJob.getTrayCode()); + if (ObjUtil.isNull(info)){ + basStockInfoService.insertBasStockInfo( + new BasStockInfo().builder() + .stockId(stockId) + .cargoSpaceId(mydoJob.getCargoSpaceId()) + .trayCode(mydoJob.getTrayCode()) + .warehouseId(mydoJob.getWarehouseId()) + .trayType(mydoJob.getTrayType()) + .emptyStatus(mydoJob.getTrayType() - details.size())//计算托盘具体余位数量 + .build() + ); + + log.info("【账务处理】新增库存主信息,库存编号:{},货位:{},托盘号:{},入库数量:{}", stockId, mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), details.size()); + }else{ + //更新托盘空位数量:加上子任务的条数(物料数量) + info.setEmptyStatus(info.getEmptyStatus() + details.size()); + basStockInfoService.updateBasStockInfo(info); + + log.info("【账务处理】更新库存主信息,库存编号:{},货位:{},托盘号:{},入库/原数量:{}/{}", stockId, mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), details.size(), info.getEmptyStatus()); + } + + int num = 1; + + //每条子任务生成一条库存信息 + for (MydoJobDetail detail : details){ + //物料数量固定为1,辊号唯一 + //插入库存明细信息 + basStockService.insertBasStock( + new BasStock().builder() + .stockId(stockId) + .stockDetailId(stockId + "-" + num) + .stockStatus(StockCode.STOCK_STATUS_AVAILABLE) + .jobId(jobId) + .jobDetailId(jobId + "-" + num) + .trayType(mydoJob.getTrayType()) + .stockinId(inTrayMsgs.get(0).getStockinId())//获取单据号需要从托盘绑定信息表获取 + .stockinDetailId(inTrayMsgs.get(0).getStockinDetailId()) + .rollerNumber(detail.getRollerNumber()) + .quantity(BigDecimal.valueOf(detail.getInQuantity())) + .cargoSpaceId(mydoJob.getCargoSpaceId()) + .productId(detail.getProductId()) + .inDate(DateUtil.date().now()) + .build() + ); + + num++; + + log.info("【账务处理】生成库存明细,作业号:{},库存编号:{},辊号:{},物料号:{}", jobId, stockId, detail.getRollerNumber(), detail.getProductId()); + + //增加单据明细(子单)分配数量 + InStockinDetail inStockinDetail = instockinDetailService.selectInStockinDetailByStockinDetailId(detail.getStockinDetailId()); + //更新分配数量 = 当前入库数量 + inStockinDetail.setAssignNum(inStockinDetail.getAssignNum().add(BigDecimal.valueOf(detail.getInQuantity()))); + instockinDetailService.updateInStockinDetail(inStockinDetail); + +//todo -------------------------处理单据状态------------------------- + //todo 核对单据数量 - 必须所有物料全部分配完成才能结束单据 + boolean isCompeleted = instockinDetailService.checkInStockinDetailListIsCompeleted(detail.getStockinId()); + if (isCompeleted){ + //更主单据账务处理 + instockinService.instockinHandler(detail.getStockinId()); + //子单明细账务处理 + instockinDetailService.instockinDetailHandler(detail.getStockinId()); + + log.info("【账务处理】<入库>单据完成,单据号:{}", detail.getStockinId()); + } + + } + +//todo --------------------更新货位状态-------------------- + BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId()); + basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED); + + log.info("【账务处理】更新<入库完成>货位状态,作业号:{},货位:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode()); + +//todo --------------------处理任务表和子任务表-------------------- + //1.更新任务主表状态并移除作业 + mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode()); + mydoJobMapper.updateMydoJob(mydoJob); + deleteMydoJobByJobId(jobId); + + //2.并移除所有子作业 + mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId); + + //3.移除当前托盘的绑定信息 + inTrayMsgService.deleteInTrayMsgByTrayCode(mydoJob.getTrayCode()); + + log.info("【账务处理】移除任务数据,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode()); + + return AjaxResult.success(); + } + + + //>>>>>>>>>>>>>>>>>>>>>>>常规(整托)出库\拣选出库\指定出库<<<<<<<<<<<<<<<<<<<<<<<< + if (type == TaskType.TASKTYPE_STOCKOUT_STR || type == TaskType.TASKTYPE_STOCKOUT_PICKING_STR || type == TaskType.TASKTYPE_STOCKOUT_MANUAL_STR){ + +//todo --------------------处理库存信息-------------------- + //移除指定辊号的库存信息 + for (MydoJobDetail detail : details){ + + //todo 可能需要与出库子单明细校验 + + //移除指定辊号的库存明细 + basStockService.deleteBasStockByRollerNumber(detail.getRollerNumber()); + //如果条码没有库存明细,则移除主表信息 + if (basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode()).size() == 0){ + basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode()); + } + + //增加出库子单物料分配数量 + List outStockoutDetails = outStockoutDetailService.selectOutStockoutDetailList( + new OutStockoutDetail().builder().rollerNumber(detail.getRollerNumber()).assignNum(new BigDecimal(0)).build() + ); + + if (outStockoutDetails.size() == 0) { + log.warn("【账务处理提示】物料已完成出库分配,辊号:{}", detail.getRollerNumber()); + continue; + } + + OutStockoutDetail outStockoutDetail = outStockoutDetails.get(0); + outStockoutDetail.setAssignNum(outStockoutDetail.getAssignNum().add(BigDecimal.valueOf(detail.getOutQuantity()))); + outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail); + + log.info("【账务处理】移除库存信息,更新单据出库分配数量,作业号:{},库存编号:{},辊号:{}", jobId, detail.getStockinDetailId(), detail.getRollerNumber()); + + +//todo -------------------------处理单据状态------------------------- + //todo 核对单据数量 - 必须所有物料全部分配完成才能结束单据 + boolean isCompeleted = instockinDetailService.checkInStockinDetailListIsCompeleted(detail.getStockinId()); + if (isCompeleted){ + + //更主单据账务处理 + instockinService.instockinHandler(detail.getStockinId()); + + //子单明细账务处理 + instockinDetailService.instockinDetailHandler(detail.getStockinId()); + + log.info("【账务处理】<出库>单据完成,单据号:{}", detail.getStockinId()); + } + + } + + +//todo --------------------更新货位状态-------------------- + BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId()); + basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE); + + log.info("【账务处理】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode()); + + +//todo --------------------处理任务表和子任务表-------------------- + //1.更新任务主表状态并移除作业 + mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode()); + mydoJobMapper.updateMydoJob(mydoJob); + deleteMydoJobByJobId(jobId); + + //2.并移除所有子作业 + mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId); + + //3.移除当前托盘的绑定信息 + inTrayMsgService.deleteInTrayMsgByTrayCode(mydoJob.getTrayCode()); + + //todo 4.可能产生拣选回流任务? + if (type == TaskType.TASKTYPE_STOCKOUT_PICKING_STR){ + + String jobIdHL = basJobIdService.getId(JobIdType.MYDOJOB_PICK_RETURN); +// String taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_BACK); +// BasCargoSpace cargo = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId()); + BasCargoSpace cargo = basCargoSpaceService.selectBasCargoSpaceForStockin( + new BasCargoSpace().builder().theType(mydoJob.getTrayType()).roadwayId(mydoJob.getRoadwayId()).build() + ); + + mydoJob.setJobId(jobIdHL); +// mydoJob.setTaskNo(taskNo); + mydoJob.setStatus(TaskStatusEnum.READY.getCode()); + mydoJob.setCargoSpaceId(cargo.getCargoSpaceId()); + mydoJob.setTrayCode(mydoJob.getTrayCode()); + mydoJob.setInOrOut(TaskType.TASKTYPE_PICK_RETURN); + mydoJob.setExecutionPhase("0"); + mydoJob.setCreateTime(DateUtil.now()); + + AjaxResult ajaxResult; + /*-----------------推送wcs任务----------------- */ + HashMap paramMap = new HashMap<>(); + paramMap.put("reqCode", UUID.randomUUID().toString());//请求码 + paramMap.put("jobId", jobIdHL);//容器编号 + paramMap.put("trayCode", mydoJob.getTrayCode().trim());//容器编号 + paramMap.put("cargoSpaceId", mydoJob.getCargoSpaceId());//高度 +// paramMap.put("remark", errorMessage); + + ajaxResult = apiWcsService.sendReturnMydoJob(paramMap); + if (ajaxResult.isSuccess()) { + log.info("【推送wcs回流任务】推送wcs作业成功,作业号:{},托盘条码:{},分配货位:{}", jobIdHL, mydoJob.getTrayCode(), mydoJob.getCargoSpaceId()); + //如果还没有wcs任务 - 生成一条任务 + if (selectMydoJobList(new MydoJob().builder().trayCode(mydoJob.getTrayCode()).build()).isEmpty()) { + //生成作业 + insertMydoJob(mydoJob); + //更新货位状态 + basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN); + + log.info("【账务处理】拣选任务完成,生成回流作业,拣选出库作业号:{},回流作业号:{},托盘号:{}", jobId, jobIdHL, mydoJob.getTrayCode()); + }else{ + log.warn("【提示】已经存在指定托盘号的作业,托盘号:{}", mydoJob.getTrayCode()); + } + + }else{ + // 接口调用失败处理 + log.info("【推送wcs回流任务】推送失败,请检查网络或请求参数,请求内容:{}", JSON.toJSONString(paramMap)); + log.info("【错误信息】{}", requestLogService.selectRequestLogByLatestTask().getErrorDetails()); + } + + + } + + log.info("【账务处理】任务完成,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode()); + + return AjaxResult.success(); + + } + +//移库任务 + if (type.equals(TaskType.TASKTYPE_PICK_STOCK_MOVE_STR)){ + //todo --------------------更新库存状态-------------------- + List stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode()); + + //todo --------------------更新货位状态-------------------- + BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(mydoJob.getCargoSpaceId()); + basCargoSpaceService.updateBasCargoSpaceStatus(cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED); + + log.info("【账务处理】更新<入库完成>货位状态,作业号:{},货位:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode()); + +//todo --------------------处理任务表和子任务表-------------------- + //1.更新任务主表状态并移除作业 + mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode()); + mydoJobMapper.updateMydoJob(mydoJob); + deleteMydoJobByJobId(jobId); + + //2.并移除所有子作业 + mydoJobDetailService.deleteMydoJobDetailsByJobId(jobId); + + //3.移除当前托盘的绑定信息 + inTrayMsgService.deleteInTrayMsgByTrayCode(mydoJob.getTrayCode()); + + log.info("【账务处理】移除任务数据,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode()); + + return AjaxResult.success(); + } + + return AjaxResult.error(); + } + @Override @WarehouseScope public List selectInMydoJobFinishList(MydoJob mydoJob) { return mydoJobMapper.selectInMydoJobFinishList(mydoJob); } - @Override - public List selectOutMydoJobList(MydoJob mydoJob) { - return mydoJobMapper.selectOutMydoJobList(mydoJob); - } + @Override public List selectOutMydoJobFinishList(MydoJob mydoJob) { return mydoJobMapper.selectOutMydoJobFinishList(mydoJob); } + + + @Override + public int getTrayTypeByTrayCode(String TrayCode){ + return TrayCode.startsWith("TP") ? 4 : 6; + } + + //mydojob任务处理 + public void JobHandler(String jobId){ + MydoJob mydoJob = selectMydoJobByJobId(jobId);//获取主任务 + List details = mydoJobDetailService.selectMydoJobDetailByJobId(jobId);//对应的所有子任务 + List inTrayMsgs = inTrayMsgService.selectInTrayMsgList( + new InTrayMsg().builder().trayCode(mydoJob.getTrayCode()).build() + );//当前托盘的绑定信息 + + //1.更新任务主表状态并移除作业 + mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode()); + mydoJobMapper.updateMydoJob(mydoJob); + deleteMydoJobByJobId(jobId); + } + + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/domain/MydoJobDetail.java b/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/domain/MydoJobDetail.java index 5e6c4af..155e737 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/domain/MydoJobDetail.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/domain/MydoJobDetail.java @@ -1,5 +1,6 @@ package com.ruoyi.in.jobdetail.domain; +import lombok.*; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -13,6 +14,11 @@ import java.math.BigDecimal; * @author ruoyi * @date 2026-05-11 */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ToString public class MydoJobDetail extends BaseEntity { private static final long serialVersionUID = 1L; @@ -52,17 +58,21 @@ public class MydoJobDetail extends BaseEntity @Excel(name = "物料名称") private String productName; + /** 辊号 */ + @Excel(name = "辊号") + private String rollerNumber; + /** 入库数量 */ @Excel(name = "入库数量") - private BigDecimal inQuantity; + private int inQuantity; /** 库存数量 */ @Excel(name = "库存数量") - private BigDecimal stockQuantity; + private int stockQuantity; /** 出库数量 */ @Excel(name = "出库数量") - private BigDecimal outQuantity; + private int outQuantity; /** 追溯入库单ID */ private String stockinId; @@ -85,217 +95,9 @@ public class MydoJobDetail extends BaseEntity @Excel(name = "供应商名称") private String supplierName; + private int trayType; + private String status; - public String getStatus() { - return status; - } - public void setStatus(String status) { - this.status = status; - } - - public void setJobDetailId(String jobDetailId) - { - this.jobDetailId = jobDetailId; - } - - public String getJobDetailId() - { - return jobDetailId; - } - - public void setJobId(String jobId) - { - this.jobId = jobId; - } - - public String getJobId() - { - return jobId; - } - - public void setStockId(String stockId) - { - this.stockId = stockId; - } - - public String getStockId() - { - return stockId; - } - - public void setLotNo(String lotNo) - { - this.lotNo = lotNo; - } - - public String getLotNo() - { - return lotNo; - } - - public void setInDate(String inDate) - { - this.inDate = inDate; - } - - public String getInDate() - { - return inDate; - } - - public void setInOrOutId(String inOrOutId) - { - this.inOrOutId = inOrOutId; - } - - public String getInOrOutId() - { - return inOrOutId; - } - - public void setInOrOutDId(String inOrOutDId) - { - this.inOrOutDId = inOrOutDId; - } - - public String getInOrOutDId() - { - return inOrOutDId; - } - - public void setProductId(String productId) - { - this.productId = productId; - } - - public String getProductId() - { - return productId; - } - - public void setProductName(String productName) - { - this.productName = productName; - } - - public String getProductName() - { - return productName; - } - - public void setInQuantity(BigDecimal inQuantity) - { - this.inQuantity = inQuantity; - } - - public BigDecimal getInQuantity() - { - return inQuantity; - } - - public void setStockQuantity(BigDecimal stockQuantity) - { - this.stockQuantity = stockQuantity; - } - - public BigDecimal getStockQuantity() - { - return stockQuantity; - } - - public void setOutQuantity(BigDecimal outQuantity) - { - this.outQuantity = outQuantity; - } - - public BigDecimal getOutQuantity() - { - return outQuantity; - } - - public void setStockinId(String stockinId) - { - this.stockinId = stockinId; - } - - public String getStockinId() - { - return stockinId; - } - - public void setStockinDetailId(String stockinDetailId) - { - this.stockinDetailId = stockinDetailId; - } - - public String getStockinDetailId() - { - return stockinDetailId; - } - - public void setCustomerId(String customerId) - { - this.customerId = customerId; - } - - public String getCustomerId() - { - return customerId; - } - - public void setCustomerName(String customerName) - { - this.customerName = customerName; - } - - public String getCustomerName() - { - return customerName; - } - - public void setSupplierId(String supplierId) - { - this.supplierId = supplierId; - } - - public String getSupplierId() - { - return supplierId; - } - - public void setSupplierName(String supplierName) - { - this.supplierName = supplierName; - } - - public String getSupplierName() - { - return supplierName; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("jobDetailId", getJobDetailId()) - .append("jobId", getJobId()) - .append("stockId", getStockId()) - .append("lotNo", getLotNo()) - .append("inDate", getInDate()) - .append("inOrOutId", getInOrOutId()) - .append("inOrOutDId", getInOrOutDId()) - .append("productId", getProductId()) - .append("productName", getProductName()) - .append("inQuantity", getInQuantity()) - .append("stockQuantity", getStockQuantity()) - .append("outQuantity", getOutQuantity()) - .append("stockinId", getStockinId()) - .append("stockinDetailId", getStockinDetailId()) - .append("customerId", getCustomerId()) - .append("customerName", getCustomerName()) - .append("supplierId", getSupplierId()) - .append("supplierName", getSupplierName()) - .toString(); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/mapper/MydoJobDetailMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/mapper/MydoJobDetailMapper.java index f865a6c..3328bfe 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/mapper/MydoJobDetailMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/mapper/MydoJobDetailMapper.java @@ -19,6 +19,14 @@ public interface MydoJobDetailMapper */ public MydoJobDetail selectMydoJobDetailByJobDetailId(String jobDetailId); + + /** + * 根据作业号查询所有子作业信息 + * @param jobId + * @return + */ + public List selectMydoJobDetailByJobId(String jobId); + /** * 查询作业子信息列表 * @@ -59,5 +67,13 @@ public interface MydoJobDetailMapper */ public int deleteMydoJobDetailByJobDetailIds(String[] jobDetailIds); + /** + * 批量删除作业子信息 + * + * @param jobId 需要删除的数据主键集合 + * @return 结果 + */ + int deleteMydoJobDetailsByJobId(String jobId); + List selectMydoJobDetailFinishList(MydoJobDetail mydoJobDetail); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/service/IMydoJobDetailService.java b/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/service/IMydoJobDetailService.java index 3ad104a..a7464bc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/service/IMydoJobDetailService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/service/IMydoJobDetailService.java @@ -19,6 +19,8 @@ public interface IMydoJobDetailService */ public MydoJobDetail selectMydoJobDetailByJobDetailId(String jobDetailId); + public List selectMydoJobDetailByJobId(String jobId); + /** * 查询作业子信息列表 * @@ -51,6 +53,14 @@ public interface IMydoJobDetailService */ public int deleteMydoJobDetailByJobDetailIds(String[] jobDetailIds); + /** + * 根据主作业号删除作业子信息 + * + * @param jobId 需要删除的子作业号信息主键集合 + * @return 结果 + */ + int deleteMydoJobDetailsByJobId(String jobId); + /** * 删除作业子信息信息 * @@ -58,6 +68,7 @@ public interface IMydoJobDetailService * @return 结果 */ public int deleteMydoJobDetailByJobDetailId(String jobDetailId); + /** * 查询作业子信息列表 * @@ -65,4 +76,8 @@ public interface IMydoJobDetailService * @return 作业子信息集合 */ List selectMydoJobDetailFinishList(MydoJobDetail mydoJobDetail); + + int getQuantityByJobId(String jobId, String productId); + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/service/impl/MydoJobDetailServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/service/impl/MydoJobDetailServiceImpl.java index 5d92534..945d0e5 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/service/impl/MydoJobDetailServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/jobdetail/service/impl/MydoJobDetailServiceImpl.java @@ -1,6 +1,9 @@ package com.ruoyi.in.jobdetail.service.impl; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.in.jobdetail.mapper.MydoJobDetailMapper; @@ -31,6 +34,18 @@ public class MydoJobDetailServiceImpl implements IMydoJobDetailService return mydoJobDetailMapper.selectMydoJobDetailByJobDetailId(jobDetailId); } + /** + * 根据作业号查询所有作业子信息 + * + * @param jobId 作业号 + * @return 作业子信息 + */ + @Override + public List selectMydoJobDetailByJobId(String jobId) + { + return mydoJobDetailMapper.selectMydoJobDetailByJobId(jobId); + } + /** * 查询作业子信息列表 * @@ -79,6 +94,10 @@ public class MydoJobDetailServiceImpl implements IMydoJobDetailService return mydoJobDetailMapper.deleteMydoJobDetailByJobDetailIds(jobDetailIds); } + public int deleteMydoJobDetailsByJobId(String jobId){ + return mydoJobDetailMapper.deleteMydoJobDetailsByJobId(jobId); + } + /** * 删除作业子信息信息 * @@ -95,4 +114,36 @@ public class MydoJobDetailServiceImpl implements IMydoJobDetailService public List selectMydoJobDetailFinishList(MydoJobDetail mydoJobDetail) { return mydoJobDetailMapper.selectMydoJobDetailFinishList(mydoJobDetail); } + + + /** + * 获取托盘任务所有子任务物料数量(单物料类型) + * @param jobId + * @return + */ + @Override + public int getQuantityByJobId(String jobId, String productId){ + + //根据作业号获取子任务所有任务明细 + List details = selectMydoJobDetailByJobId(jobId); + + //获取指定物料编号的所有明细记录 + List detailProducts = details.stream() + .filter(p -> p.getProductId().equals(productId)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + int sum = 0; + + //获取指定指定物料编号的物料总数量 + for(MydoJobDetail detail : detailProducts){ + sum += detail.getInQuantity(); + } + + return sum; + } + + + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/domain/InStockinDetail.java b/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/domain/InStockinDetail.java deleted file mode 100644 index 1b8dcb9..0000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/domain/InStockinDetail.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.ruoyi.in.sotckindetail.domain; - -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.annotation.Excel; -import com.ruoyi.common.core.domain.BaseEntity; - -import java.math.BigDecimal; - -/** - * 入库单据子信息对象 in_stockin_detail - * - * @author ruoyi - * @date 2026-05-11 - */ -public class InStockinDetail extends BaseEntity -{ - private static final long serialVersionUID = 1L; - - /** 子单ID */ - private String stockinDetailId; - - /** 主单ID */ - @Excel(name = "主单ID") - private String stockinId; - - /** 批次 */ - @Excel(name = "批次") - private String lotNo; - - /** 物料编码 */ - @Excel(name = "物料编码") - private String productId; - - /** 物料名称 */ - @Excel(name = "物料名称") - private String productName; - - /** 计划数量 */ - @Excel(name = "计划数量") - private BigDecimal quantity; - - /** 扫码数量 */ - @Excel(name = "扫码数量") - private BigDecimal scanNum; - - /** 实际数量 */ - @Excel(name = "实际数量") - private BigDecimal assignNum; - - private String status; - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public void setStockinDetailId(String stockinDetailId) - { - this.stockinDetailId = stockinDetailId; - } - - public String getStockinDetailId() - { - return stockinDetailId; - } - - public void setStockinId(String stockinId) - { - this.stockinId = stockinId; - } - - public String getStockinId() - { - return stockinId; - } - - public void setLotNo(String lotNo) - { - this.lotNo = lotNo; - } - - public String getLotNo() - { - return lotNo; - } - - public void setProductId(String productId) - { - this.productId = productId; - } - - public String getProductId() - { - return productId; - } - - public void setProductName(String productName) - { - this.productName = productName; - } - - public String getProductName() - { - return productName; - } - - public void setQuantity(BigDecimal quantity) - { - this.quantity = quantity; - } - - public BigDecimal getQuantity() - { - return quantity; - } - - public void setScanNum(BigDecimal scanNum) - { - this.scanNum = scanNum; - } - - public BigDecimal getScanNum() - { - return scanNum; - } - - public void setAssignNum(BigDecimal assignNum) - { - this.assignNum = assignNum; - } - - public BigDecimal getAssignNum() - { - return assignNum; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("stockinDetailId", getStockinDetailId()) - .append("stockinId", getStockinId()) - .append("lotNo", getLotNo()) - .append("productId", getProductId()) - .append("productName", getProductName()) - .append("quantity", getQuantity()) - .append("scanNum", getScanNum()) - .append("assignNum", getAssignNum()) - .append("remark", getRemark()) - .toString(); - } -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/service/impl/InStockinDetailServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/service/impl/InStockinDetailServiceImpl.java deleted file mode 100644 index 8c01894..0000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/service/impl/InStockinDetailServiceImpl.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.ruoyi.in.sotckindetail.service.impl; - -import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.ruoyi.in.sotckindetail.mapper.InStockinDetailMapper; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; -import com.ruoyi.in.sotckindetail.service.IInStockinDetailService; - -/** - * 入库单据子信息Service业务层处理 - * - * @author ruoyi - * @date 2026-05-11 - */ -@Service -public class InStockinDetailServiceImpl implements IInStockinDetailService -{ - @Autowired - private InStockinDetailMapper inStockinDetailMapper; - - /** - * 查询入库单据子信息 - * - * @param stockinDetailId 入库单据子信息主键 - * @return 入库单据子信息 - */ - @Override - public InStockinDetail selectInStockinDetailByStockinDetailId(String stockinDetailId) - { - return inStockinDetailMapper.selectInStockinDetailByStockinDetailId(stockinDetailId); - } - - /** - * 查询入库单据子信息列表 - * - * @param inStockinDetail 入库单据子信息 - * @return 入库单据子信息 - */ - @Override - public List selectInStockinDetailList(InStockinDetail inStockinDetail) - { - return inStockinDetailMapper.selectInStockinDetailList(inStockinDetail); - } - - /** - * 新增入库单据子信息 - * - * @param inStockinDetail 入库单据子信息 - * @return 结果 - */ - @Override - public int insertInStockinDetail(InStockinDetail inStockinDetail) - { - return inStockinDetailMapper.insertInStockinDetail(inStockinDetail); - } - - /** - * 修改入库单据子信息 - * - * @param inStockinDetail 入库单据子信息 - * @return 结果 - */ - @Override - public int updateInStockinDetail(InStockinDetail inStockinDetail) - { - return inStockinDetailMapper.updateInStockinDetail(inStockinDetail); - } - - /** - * 批量删除入库单据子信息 - * - * @param stockinDetailIds 需要删除的入库单据子信息主键 - * @return 结果 - */ - @Override - public int deleteInStockinDetailByStockinDetailIds(String[] stockinDetailIds) - { - return inStockinDetailMapper.deleteInStockinDetailByStockinDetailIds(stockinDetailIds); - } - - /** - * 删除入库单据子信息信息 - * - * @param stockinDetailId 入库单据子信息主键 - * @return 结果 - */ - @Override - public int deleteInStockinDetailByStockinDetailId(String stockinDetailId) - { - return inStockinDetailMapper.deleteInStockinDetailByStockinDetailId(stockinDetailId); - } - - /** - * 入库单据子信息列表 - * @param inStockinDetail - * @return - */ - @Override - public List selectInStockinDetailFinishList(InStockinDetail inStockinDetail) { - return inStockinDetailMapper.selectInStockinDetailFinishList(inStockinDetail); - } -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/domain/InStockin.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/domain/InStockin.java index 3e0ffc8..e8407b3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/domain/InStockin.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/domain/InStockin.java @@ -2,6 +2,10 @@ package com.ruoyi.in.stockin.domain; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -13,6 +17,10 @@ import com.ruoyi.common.core.domain.BaseEntity; * @author ruoyi * @date 2026-05-11 */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class InStockin extends BaseEntity { private static final long serialVersionUID = 1L; @@ -79,185 +87,5 @@ public class InStockin extends BaseEntity @Excel(name = "供应商名称") private String supplierName; - public void setStockinId(String stockinId) - { - this.stockinId = stockinId; - } - public String getStockinId() - { - return stockinId; - } - - public void setInType(String inType) - { - this.inType = inType; - } - - public String getInType() - { - return inType; - } - - public void setStockSource(String stockSource) - { - this.stockSource = stockSource; - } - - public String getStockSource() - { - return stockSource; - } - - public void setStatus(String status) - { - this.status = status; - } - - public String getStatus() - { - return status; - } - - public void setCreateDate(Date createDate) - { - this.createDate = createDate; - } - - public Date getCreateDate() - { - return createDate; - } - - public void setStartDate(Date startDate) - { - this.startDate = startDate; - } - - public Date getStartDate() - { - return startDate; - } - - public void setFinishDate(Date finishDate) - { - this.finishDate = finishDate; - } - - public Date getFinishDate() - { - return finishDate; - } - - public void setErpBill(String erpBill) - { - this.erpBill = erpBill; - } - - public String getErpBill() - { - return erpBill; - } - - public void setWarehouseId(String warehouseId) - { - this.warehouseId = warehouseId; - } - - public String getWarehouseId() - { - return warehouseId; - } - - public void setWarehouseName(String warehouseName) - { - this.warehouseName = warehouseName; - } - - public String getWarehouseName() - { - return warehouseName; - } - - public void setUserId(Long userId) - { - this.userId = userId; - } - - public Long getUserId() - { - return userId; - } - - public void setUserName(String userName) - { - this.userName = userName; - } - - public String getUserName() - { - return userName; - } - - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - public Long getDeptId() - { - return deptId; - } - - public void setDeptName(String deptName) - { - this.deptName = deptName; - } - - public String getDeptName() - { - return deptName; - } - - public void setSupplierId(String supplierId) - { - this.supplierId = supplierId; - } - - public String getSupplierId() - { - return supplierId; - } - - public void setSupplierName(String supplierName) - { - this.supplierName = supplierName; - } - - public String getSupplierName() - { - return supplierName; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("stockinId", getStockinId()) - .append("inType", getInType()) - .append("stockSource", getStockSource()) - .append("status", getStatus()) - .append("createDate", getCreateDate()) - .append("startDate", getStartDate()) - .append("finishDate", getFinishDate()) - .append("erpBill", getErpBill()) - .append("warehouseId", getWarehouseId()) - .append("warehouseName", getWarehouseName()) - .append("userId", getUserId()) - .append("userName", getUserName()) - .append("deptId", getDeptId()) - .append("deptName", getDeptName()) - .append("supplierId", getSupplierId()) - .append("supplierName", getSupplierName()) - .toString(); - } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/domain/InStockinSaveDTO.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/domain/InStockinSaveDTO.java index cd58724..e03580d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/domain/InStockinSaveDTO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/domain/InStockinSaveDTO.java @@ -1,7 +1,7 @@ package com.ruoyi.in.stockin.domain; import java.util.List; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; /** * 入库单据保存DTO(主单+明细) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/mapper/InStockinMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/mapper/InStockinMapper.java index 0bb074b..fb89537 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/mapper/InStockinMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/mapper/InStockinMapper.java @@ -36,6 +36,14 @@ public interface InStockinMapper */ public int insertInStockin(InStockin inStockin); + /** + * 新增入库单据主信息 + * + * @param inStockin 入库单据主信息 + * @return 结果 + */ + public int insertInStockinFinish(InStockin inStockin); + /** * 修改入库单据主信息 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/service/IInStockinService.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/service/IInStockinService.java index 5616f86..8701930 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/service/IInStockinService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/service/IInStockinService.java @@ -37,6 +37,14 @@ public interface IInStockinService */ public int insertInStockin(InStockin inStockin); + /** + * 新增入库单据主信息 + * + * @param inStockin 入库单据主信息 + * @return 结果 + */ + public int insertInStockinFinish(InStockin inStockin); + /** * 修改入库单据主信息 * @@ -92,6 +100,7 @@ public interface IInStockinService * @return 操作结果 */ public AjaxResult finishStockin(String stockinId); + /** * 查询入库单据完成列表 * @@ -99,4 +108,17 @@ public interface IInStockinService * @return 入库单据集合 */ List selectInStockinFinishList(InStockin inStockin); + + + /** + * 处理主单账务 + * @param inStockinId 主单号 + */ + void instockinHandler(String inStockinId); + + + + + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/service/impl/InStockinServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/service/impl/InStockinServiceImpl.java index 363ffa3..2048d2c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/service/impl/InStockinServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockin/service/impl/InStockinServiceImpl.java @@ -3,10 +3,8 @@ package com.ruoyi.in.stockin.service.impl; import java.util.Date; import java.util.HashMap; import java.util.List; -import java.util.UUID; -import com.ruoyi.bas.id.job.mapper.BasJobIdMapper; -import com.ruoyi.bas.id.job.service.JobIdService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; import com.ruoyi.common.InStockInStatusEnum; import com.ruoyi.common.annotation.WarehouseScope; import com.ruoyi.common.core.domain.AjaxResult; @@ -20,8 +18,8 @@ import com.ruoyi.in.stockin.mapper.InStockinMapper; import com.ruoyi.in.stockin.domain.InStockin; import com.ruoyi.in.stockin.domain.InStockinSaveDTO; import com.ruoyi.in.stockin.service.IInStockinService; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; -import com.ruoyi.in.sotckindetail.mapper.InStockinDetailMapper; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.mapper.InStockinDetailMapper; /** * 入库单据主信息Service业务层处理 @@ -42,7 +40,7 @@ public class InStockinServiceImpl implements IInStockinService private SysDeptMapper sysDeptMapper; @Autowired - private JobIdService jobIdService; + private IBasJobIdService IBasJobIdService; /** * 查询入库单据主信息 @@ -81,6 +79,18 @@ public class InStockinServiceImpl implements IInStockinService return inStockinMapper.insertInStockin(inStockin); } + /** + * 新增入库单据主信息 + * + * @param inStockin 入库单据主信息 + * @return 结果 + */ + @Override + public int insertInStockinFinish(InStockin inStockin) + { + return inStockinMapper.insertInStockinFinish(inStockin); + } + /** * 修改入库单据主信息 * @@ -129,7 +139,7 @@ public class InStockinServiceImpl implements IInStockinService { // 1. 生成主单ID if (saveDTO.getStockinId() == null || saveDTO.getStockinId().isEmpty()) { - saveDTO.setStockinId(jobIdService.getId("RKD")); + saveDTO.setStockinId(IBasJobIdService.getId("RKD")); } // 2. 保存主单 saveDTO.setCreateDate(new Date()); @@ -218,4 +228,27 @@ public class InStockinServiceImpl implements IInStockinService public List selectInStockinFinishList(InStockin inStockin) { return inStockinMapper.selectInStockinFinishList(inStockin); } + + + /** + * 处理单据账务 插入历史表、移除明细 + * @param inStockinId + */ + @Override + public void instockinHandler(String inStockinId){ + + //更新主单状态 + InStockin inStockin = selectInStockinByStockinId(inStockinId); + inStockin.setStatus(InStockInStatusEnum.FINISHED.getCode()); + updateInStockin(inStockin); + + //插入历史表 + insertInStockinFinish(inStockin); + + //移除主单明细 + deleteInStockinByStockinId(inStockinId); + + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/controller/InStockinDetailController.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/controller/InStockinDetailController.java similarity index 93% rename from ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/controller/InStockinDetailController.java rename to ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/controller/InStockinDetailController.java index 27d0d47..5ad5390 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/controller/InStockinDetailController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/controller/InStockinDetailController.java @@ -1,4 +1,4 @@ -package com.ruoyi.in.sotckindetail.controller; +package com.ruoyi.in.stockindetail.controller; import java.util.List; import java.util.UUID; @@ -20,8 +20,8 @@ import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; -import com.ruoyi.in.sotckindetail.service.IInStockinDetailService; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.service.IInStockinDetailService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; @@ -47,7 +47,7 @@ public class InStockinDetailController extends BaseController { startPage(); List list; - if (StringUtils.isEmpty(inStockinDetail.getStatus()) || Convert.toInt(inStockinDetail.getStatus())< 4){ + if (inStockinDetail.getStatus() == 0 || inStockinDetail.getStatus() == 1){ list = inStockinDetailService.selectInStockinDetailList(inStockinDetail); }else { list = inStockinDetailService.selectInStockinDetailFinishList(inStockinDetail); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/domain/InStockinDetail.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/domain/InStockinDetail.java new file mode 100644 index 0000000..a5f681b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/domain/InStockinDetail.java @@ -0,0 +1,68 @@ +package com.ruoyi.in.stockindetail.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.math.BigDecimal; + +/** + * 入库单据子信息对象 in_stockin_detail + * + * @author ruoyi + * @date 2026-05-11 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class InStockinDetail extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 子单ID */ + private String stockinDetailId; + + /** 主单ID */ + @Excel(name = "主单ID") + private String stockinId; + + /** 批次 */ + @Excel(name = "批次") + private String lotNo; + + /** 物料编码 */ + @Excel(name = "物料编码") + private String productId; + + /** 物料名称 */ + @Excel(name = "物料名称") + private String productName; + + /** 计划数量 */ + @Excel(name = "计划数量") + private BigDecimal quantity; + + /** 扫码数量 */ + @Excel(name = "扫码数量") + private BigDecimal scanNum; + + /** 实际数量 */ + @Excel(name = "实际数量") + private BigDecimal assignNum; + + /** 分配状态 0-未分配完成 1-分配完成 */ + private int status; + + /** + * 辊号 + */ + @Excel(name = "辊号") + private String rollerNumber; + + private String remark; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/mapper/InStockinDetailMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/mapper/InStockinDetailMapper.java similarity index 57% rename from ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/mapper/InStockinDetailMapper.java rename to ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/mapper/InStockinDetailMapper.java index 7d85761..1381232 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/mapper/InStockinDetailMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/mapper/InStockinDetailMapper.java @@ -1,7 +1,7 @@ -package com.ruoyi.in.sotckindetail.mapper; +package com.ruoyi.in.stockindetail.mapper; import java.util.List; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; /** * 入库单据子信息Mapper接口 @@ -19,6 +19,38 @@ public interface InStockinDetailMapper */ public InStockinDetail selectInStockinDetailByStockinDetailId(String stockinDetailId); + /** + * 查询入库单据子信息 + * + * @param stockinId 入库单据子信息主键 + * @return 入库单据子信息 + */ + public List selectInStockinDetailByStockinId(String stockinId); + + /** + * 查询入库单据子信息 + * + * @param rollerNumber 辊号 + * @return 入库单据子信息 + */ + public InStockinDetail selectInStockinDetailByRollerNumber(String rollerNumber); + + /** + * 查询入库单据子信息 + * + * @param productId 料号 + * @return 入库单据子信息 + */ + public InStockinDetail selectInStockinDetailByProductId(String productId); + + /** + * 查询入库单据子信息 + * + * @param status 分配状态 + * @return 入库单据子信息 + */ + public List selectInStockinDetailByStatus(int status); + /** * 查询入库单据子信息列表 * @@ -35,6 +67,14 @@ public interface InStockinDetailMapper */ public int insertInStockinDetail(InStockinDetail inStockinDetail); + /** + * 新增入库单据子信息历史记录 + * + * @param inStockinDetail 入库单据子信息 + * @return 结果 + */ + public int insertInStockinDetailFinish(InStockinDetail inStockinDetail); + /** * 修改入库单据子信息 * @@ -58,6 +98,15 @@ public interface InStockinDetailMapper * @return 结果 */ public int deleteInStockinDetailByStockinDetailIds(String[] stockinDetailIds); + + /** + * 批量删除入库单据子信息 + * + * @param stockinId 主单号 + * @return 结果 + */ + public int deleteInStockinDetailByStockinId(String stockinId); + /** * 入库单据子信息列表 * @param inStockinDetail diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/service/IInStockinDetailService.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/IInStockinDetailService.java similarity index 57% rename from ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/service/IInStockinDetailService.java rename to ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/IInStockinDetailService.java index 90766de..61fb104 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/in/sotckindetail/service/IInStockinDetailService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/IInStockinDetailService.java @@ -1,7 +1,7 @@ -package com.ruoyi.in.sotckindetail.service; +package com.ruoyi.in.stockindetail.service; import java.util.List; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; /** * 入库单据子信息Service接口 @@ -19,6 +19,14 @@ public interface IInStockinDetailService */ public InStockinDetail selectInStockinDetailByStockinDetailId(String stockinDetailId); + /** + * 查询入库单据子信息 + * + * @param stockinId 入库主单号 + * @return 入库单据子信息 + */ + public List selectInStockinDetailByStockinId(String stockinId); + /** * 查询入库单据子信息列表 * @@ -27,6 +35,22 @@ public interface IInStockinDetailService */ public List selectInStockinDetailList(InStockinDetail inStockinDetail); + + /** + * 查询入库子单据子信息列表 + * + * @param productId 物料编号 + * @return 入库单据子信息集合 + */ + public InStockinDetail selectInStockinDetailByProductId(String productId); + + /** + * 查询入库子单据子信息列表 + * @param status 分配状态 + * @return + */ + public List selectInStockinDetailByStatus(int status); + /** * 新增入库单据子信息 * @@ -35,6 +59,14 @@ public interface IInStockinDetailService */ public int insertInStockinDetail(InStockinDetail inStockinDetail); + /** + * 新增入库单据子信息 + * + * @param inStockinDetail 入库单据子信息 + * @return 结果 + */ + public int insertInStockinDetailFinish(InStockinDetail inStockinDetail); + /** * 修改入库单据子信息 * @@ -59,10 +91,26 @@ public interface IInStockinDetailService */ public int deleteInStockinDetailByStockinDetailId(String stockinDetailId); + /** + * 删除入库单据子信息信息 + * + * @param stockinId 主单号 + * @return 结果 + */ + public int deleteInStockinDetailByStockinId(String stockinId); + /** * 查询入库单据子信息列表 * @param inStockinDetail * @return */ List selectInStockinDetailFinishList(InStockinDetail inStockinDetail); + + + boolean checkInStockinDetailListIsCompeleted(String inStockinId); + + + void instockinDetailHandler(String inStockinId); + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/impl/InStockinDetailServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/impl/InStockinDetailServiceImpl.java new file mode 100644 index 0000000..aa590bb --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/in/stockindetail/service/impl/InStockinDetailServiceImpl.java @@ -0,0 +1,200 @@ +package com.ruoyi.in.stockindetail.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.in.stockindetail.mapper.InStockinDetailMapper; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.service.IInStockinDetailService; + +/** + * 入库单据子信息Service业务层处理 + * + * @author ruoyi + * @date 2026-05-11 + */ +@Service +public class InStockinDetailServiceImpl implements IInStockinDetailService +{ + @Autowired + private InStockinDetailMapper inStockinDetailMapper; + + /** + * 查询入库单据子信息 + * + * @param stockinDetailId 入库单据子信息主键 + * @return 入库单据子信息 + */ + @Override + public InStockinDetail selectInStockinDetailByStockinDetailId(String stockinDetailId) + { + return inStockinDetailMapper.selectInStockinDetailByStockinDetailId(stockinDetailId); + } + + /** + * 查询入库单据子信息 + * + * @param stockinId 入库主单号 + * @return 入库单据子信息 + */ + @Override + public List selectInStockinDetailByStockinId(String stockinId) + { + return inStockinDetailMapper.selectInStockinDetailByStockinId(stockinId); + } + + /** + * 查询入库单据子信息列表 + * + * @param inStockinDetail 入库单据子信息 + * @return 入库单据子信息 + */ + @Override + public List selectInStockinDetailList(InStockinDetail inStockinDetail) + { + return inStockinDetailMapper.selectInStockinDetailList(inStockinDetail); + } + + @Override + public InStockinDetail selectInStockinDetailByProductId(String productId){ + return inStockinDetailMapper.selectInStockinDetailByProductId(productId); + } + + @Override + public List selectInStockinDetailByStatus(int status){ + return inStockinDetailMapper.selectInStockinDetailByStatus(status); + } + + /** + * 新增入库单据子信息 + * + * @param inStockinDetail 入库单据子信息 + * @return 结果 + */ + @Override + public int insertInStockinDetail(InStockinDetail inStockinDetail) + { + return inStockinDetailMapper.insertInStockinDetail(inStockinDetail); + } + + /** + * 新增入库单据子信息 + * + * @param inStockinDetail 入库单据子信息 + * @return 结果 + */ + @Override + public int insertInStockinDetailFinish(InStockinDetail inStockinDetail) + { + return inStockinDetailMapper.insertInStockinDetailFinish(inStockinDetail); + } + + /** + * 修改入库单据子信息 + * + * @param inStockinDetail 入库单据子信息 + * @return 结果 + */ + @Override + public int updateInStockinDetail(InStockinDetail inStockinDetail) + { + return inStockinDetailMapper.updateInStockinDetail(inStockinDetail); + } + + /** + * 批量删除入库单据子信息 + * + * @param stockinDetailIds 需要删除的入库单据子信息主键 + * @return 结果 + */ + @Override + public int deleteInStockinDetailByStockinDetailIds(String[] stockinDetailIds) + { + return inStockinDetailMapper.deleteInStockinDetailByStockinDetailIds(stockinDetailIds); + } + + /** + * 删除入库单据子信息信息 + * + * @param stockinDetailId 入库单据子信息主键 + * @return 结果 + */ + @Override + public int deleteInStockinDetailByStockinDetailId(String stockinDetailId) + { + return inStockinDetailMapper.deleteInStockinDetailByStockinDetailId(stockinDetailId); + } + + /** + * 删除入库单据子信息信息 + * + * @param stockinId 主单号 + * @return 结果 + */ + @Override + public int deleteInStockinDetailByStockinId(String stockinId) + { + return inStockinDetailMapper.deleteInStockinDetailByStockinId(stockinId); + } + + /** + * 入库单据子信息列表 + * @param inStockinDetail + * @return + */ + @Override + public List selectInStockinDetailFinishList(InStockinDetail inStockinDetail) { + return inStockinDetailMapper.selectInStockinDetailFinishList(inStockinDetail); + } + + /** + * 查询指定单据明细是否全部分配完成 + * 分配完成-true 未分配完成-false + * @param inStockinId 主单号 + * @return + */ + @Override + public boolean checkInStockinDetailListIsCompeleted(String inStockinId){ + + //获取指定单据所有子单 + List details = inStockinDetailMapper.selectInStockinDetailByStockinId(inStockinId); + + //核对每条明细的计划数量和分配数量 - 更新分配状态 + for(InStockinDetail detail : details){ + if(detail.getQuantity().equals(detail.getAssignNum())){ + detail.setStatus(1); + updateInStockinDetail(detail); + }else{ + detail.setStatus(0); + } + } + + //检查单据是否分配完成 + if (selectInStockinDetailByStatus(0).size() > 0){ + return false; + } + + return true; + } + + /** + * 处理单据账务 插入历史表,移除明细表 + * @param inStockinId + */ + @Override + public void instockinDetailHandler(String inStockinId){ + + //插入子单明细历史表 + List details = inStockinDetailMapper.selectInStockinDetailByStockinId(inStockinId); + for(InStockinDetail detail : details){ + insertInStockinDetailFinish(detail); + } + + //移除子单明细 + deleteInStockinDetailByStockinId(inStockinId); + + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/kpi/service/impl/KpiServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/kpi/service/impl/KpiServiceImpl.java index d53a134..2b046d7 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/kpi/service/impl/KpiServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/kpi/service/impl/KpiServiceImpl.java @@ -8,7 +8,6 @@ import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; -import com.ruoyi.in.job.domain.MydoJob; import com.ruoyi.in.job.domain.RoadwayAnalysisData; import com.ruoyi.in.job.mapper.MydoJobMapper; import com.ruoyi.kpi.domain.*; @@ -17,8 +16,6 @@ import com.ruoyi.kpi.service.KpiService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/log/controller/RequestLogController.java b/ruoyi-admin/src/main/java/com/ruoyi/log/controller/RequestLogController.java new file mode 100644 index 0000000..226575a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/log/controller/RequestLogController.java @@ -0,0 +1,98 @@ +package com.ruoyi.log.controller; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.log.domain.RequestLog; +import com.ruoyi.log.service.IRequestLogService; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 接口记录Controller + * + * @author ruoyi + * @date 2025-07-02 + */ +@RestController +@RequestMapping("/requestInterface/log") +public class RequestLogController extends BaseController +{ + @Autowired + private IRequestLogService requestLogService; + + /** + * 查询接口记录列表 + */ + @PreAuthorize("@ss.hasPermi('requestInterface:log:list')") + @GetMapping("/list") + public TableDataInfo list(RequestLog requestLog) + { + startPage(); + List list = requestLogService.selectRequestLogList(requestLog); + return getDataTable(list); + } + + /** + * 导出接口记录列表 + */ + @PreAuthorize("@ss.hasPermi('requestInterface:log:export')") + @Log(title = "接口记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, RequestLog requestLog) + { + List list = requestLogService.selectRequestLogList(requestLog); + ExcelUtil util = new ExcelUtil(RequestLog.class); + util.exportExcel(response, list, "接口记录数据"); + } + + /** + * 获取接口记录详细信息 + */ + @PreAuthorize("@ss.hasPermi('requestInterface:log:query')") + @GetMapping(value = "/{requestId}") + public AjaxResult getInfo(@PathVariable("requestId") Long requestId) + { + return success(requestLogService.selectRequestLogByRequestId(requestId)); + } + + /** + * 新增接口记录 + */ + @PreAuthorize("@ss.hasPermi('requestInterface:log:add')") + @Log(title = "接口记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody RequestLog requestLog) + { + return toAjax(requestLogService.insertRequestLog(requestLog)); + } + + /** + * 修改接口记录 + */ + @PreAuthorize("@ss.hasPermi('requestInterface:log:edit')") + @Log(title = "接口记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody RequestLog requestLog) + { + return toAjax(requestLogService.updateRequestLog(requestLog)); + } + + /** + * 删除接口记录 + */ + @PreAuthorize("@ss.hasPermi('requestInterface:log:remove')") + @Log(title = "接口记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{requestIds}") + public AjaxResult remove(@PathVariable Long[] requestIds) + { + return toAjax(requestLogService.deleteRequestLogByRequestIds(requestIds)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/log/domain/RequestLog.java b/ruoyi-admin/src/main/java/com/ruoyi/log/domain/RequestLog.java new file mode 100644 index 0000000..f617f48 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/log/domain/RequestLog.java @@ -0,0 +1,249 @@ +package com.ruoyi.log.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 接口记录对象 request_log + * + * @author ruoyi + * @date 2025-07-02 + */ +@Data +public class RequestLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 请求id */ + private Long requestId; + + /** 请求时间 */ + @Excel(name = "请求时间") + private String requestTime; + + /** 来源系统 */ + @Excel(name = "来源系统") + private String sourceSystem; + + /** 目标系统 */ + @Excel(name = "目标系统") + private String targetSystem; + + /** 接口名称 */ + @Excel(name = "接口名称") + private String endpoint; + + /** 请求URL */ + @Excel(name = "请求URL") + private String requestUrl; + + /** 请求方式 */ + @Excel(name = "请求方式") + private String requestMethod; + + /** 请求头信息 */ + @Excel(name = "请求头信息") + private String requestHeaders; + + /** 请求参数 */ + @Excel(name = "请求参数") + private String requestBody; + + /** 响应时间 */ + @Excel(name = "响应时间") + private String responseTime; + + /** 响应主体 */ + @Excel(name = "响应主体") + private String responseBody; + + /** 响应状态 */ + @Excel(name = "响应状态") + private String responseStatus; + + /** 错误信息 */ + @Excel(name = "错误信息") + private String errorDetails; + + /** 耗时 */ + @Excel(name = "耗时") + private String duration; + + /** 是否成功 */ + @Excel(name = "是否成功") + private String isSuccessful; + + public void setRequestId(Long requestId) + { + this.requestId = requestId; + } + + public Long getRequestId() + { + return requestId; + } + + public void setRequestTime(String requestTime) + { + this.requestTime = requestTime; + } + + public String getRequestTime() + { + return requestTime; + } + + public void setSourceSystem(String sourceSystem) + { + this.sourceSystem = sourceSystem; + } + + public String getSourceSystem() + { + return sourceSystem; + } + + public void setTargetSystem(String targetSystem) + { + this.targetSystem = targetSystem; + } + + public String getTargetSystem() + { + return targetSystem; + } + + public void setEndpoint(String endpoint) + { + this.endpoint = endpoint; + } + + public String getEndpoint() + { + return endpoint; + } + + public void setRequestUrl(String requestUrl) + { + this.requestUrl = requestUrl; + } + + public String getRequestUrl() + { + return requestUrl; + } + + public void setRequestMethod(String requestMethod) + { + this.requestMethod = requestMethod; + } + + public String getRequestMethod() + { + return requestMethod; + } + + public void setRequestHeaders(String requestHeaders) + { + this.requestHeaders = requestHeaders; + } + + public String getRequestHeaders() + { + return requestHeaders; + } + + public void setRequestBody(String requestBody) + { + this.requestBody = requestBody; + } + + public String getRequestBody() + { + return requestBody; + } + + public void setResponseTime(String responseTime) + { + this.responseTime = responseTime; + } + + public String getResponseTime() + { + return responseTime; + } + + public void setResponseBody(String responseBody) + { + this.responseBody = responseBody; + } + + public String getResponseBody() + { + return responseBody; + } + + public void setResponseStatus(String responseStatus) + { + this.responseStatus = responseStatus; + } + + public String getResponseStatus() + { + return responseStatus; + } + + public void setErrorDetails(String errorDetails) + { + this.errorDetails = errorDetails; + } + + public String getErrorDetails() + { + return errorDetails; + } + + public void setDuration(String duration) + { + this.duration = duration; + } + + public String getDuration() + { + return duration; + } + + public void setIsSuccessful(String isSuccessful) + { + this.isSuccessful = isSuccessful; + } + + public String getIsSuccessful() + { + return isSuccessful; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("requestId", getRequestId()) + .append("requestTime", getRequestTime()) + .append("sourceSystem", getSourceSystem()) + .append("targetSystem", getTargetSystem()) + .append("endpoint", getEndpoint()) + .append("requestUrl", getRequestUrl()) + .append("requestMethod", getRequestMethod()) + .append("requestHeaders", getRequestHeaders()) + .append("requestBody", getRequestBody()) + .append("responseTime", getResponseTime()) + .append("responseBody", getResponseBody()) + .append("responseStatus", getResponseStatus()) + .append("errorDetails", getErrorDetails()) + .append("duration", getDuration()) + .append("isSuccessful", getIsSuccessful()) + .toString(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/log/mapper/RequestLogMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/log/mapper/RequestLogMapper.java new file mode 100644 index 0000000..fd1582b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/log/mapper/RequestLogMapper.java @@ -0,0 +1,69 @@ +package com.ruoyi.log.mapper; + +import com.ruoyi.log.domain.RequestLog; + +import java.util.List; + +/** + * 接口记录Mapper接口 + * + * @author ruoyi + * @date 2025-07-02 + */ +public interface RequestLogMapper +{ + /** + * 查询接口记录 + * + * @param requestId 接口记录主键 + * @return 接口记录 + */ + public RequestLog selectRequestLogByRequestId(Long requestId); + + /** + * 查询接口记录 + * + * @return 接口记录 + */ + public RequestLog selectRequestLogByLatestTask(); + + /** + * 查询接口记录列表 + * + * @param requestLog 接口记录 + * @return 接口记录集合 + */ + public List selectRequestLogList(RequestLog requestLog); + + /** + * 新增接口记录 + * + * @param requestLog 接口记录 + * @return 结果 + */ + public int insertRequestLog(RequestLog requestLog); + + /** + * 修改接口记录 + * + * @param requestLog 接口记录 + * @return 结果 + */ + public int updateRequestLog(RequestLog requestLog); + + /** + * 删除接口记录 + * + * @param requestId 接口记录主键 + * @return 结果 + */ + public int deleteRequestLogByRequestId(Long requestId); + + /** + * 批量删除接口记录 + * + * @param requestIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteRequestLogByRequestIds(Long[] requestIds); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/log/service/IRequestLogService.java b/ruoyi-admin/src/main/java/com/ruoyi/log/service/IRequestLogService.java new file mode 100644 index 0000000..c24b3ef --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/log/service/IRequestLogService.java @@ -0,0 +1,92 @@ +package com.ruoyi.log.service; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.log.domain.RequestLog; + +import java.util.List; + +/** + * 接口记录Service接口 + * + * @author ruoyi + * @date 2025-07-02 + */ +public interface IRequestLogService +{ + /** + * 查询接口记录 + * + * @param requestId 接口记录主键 + * @return 接口记录 + */ + public RequestLog selectRequestLogByRequestId(Long requestId); + + + public RequestLog selectRequestLogByLatestTask(); + + /** + * 查询接口记录列表 + * + * @param requestLog 接口记录 + * @return 接口记录集合 + */ + public List selectRequestLogList(RequestLog requestLog); + + /** + * 新增接口记录 + * + * @param requestLog 接口记录 + * @return 结果 + */ + public int insertRequestLog(RequestLog requestLog); + + /** + * 修改接口记录 + * + * @param requestLog 接口记录 + * @return 结果 + */ + public int updateRequestLog(RequestLog requestLog); + + /** + * 批量删除接口记录 + * + * @param requestIds 需要删除的接口记录主键集合 + * @return 结果 + */ + public int deleteRequestLogByRequestIds(Long[] requestIds); + + /** + * 删除接口记录信息 + * + * @param requestId 接口记录主键 + * @return 结果 + */ + public int deleteRequestLogByRequestId(Long requestId); + + /** + * 请求接口记录(接收请求记录) + * @param param 请求参数 + * @param endPoint 请求类型 + * @return + */ + public RequestLog getRequestLog(String param, String endPoint); + + /** + * 请求接口记录 + * @param url + * @param param + * @param remark + * @return + */ + public RequestLog getRequestLog(String url, String param, String remark); + + /** + * 接收接口记录 + * + * @param param + * @param remark + * @return + */ + public RequestLog getRequestLog(String param, String remark, AjaxResult ajaxResult); +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/log/service/impl/RequestLogServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/log/service/impl/RequestLogServiceImpl.java new file mode 100644 index 0000000..c3de130 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/log/service/impl/RequestLogServiceImpl.java @@ -0,0 +1,205 @@ +package com.ruoyi.log.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.log.domain.RequestLog; +import com.ruoyi.log.mapper.RequestLogMapper; +import com.ruoyi.log.service.IRequestLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 接口记录Service业务层处理 + * + * @author ruoyi + * @date 2025-07-02 + */ +@Service +@Slf4j +public class RequestLogServiceImpl implements IRequestLogService +{ + @Autowired + private RequestLogMapper requestLogMapper; + + /** + * 查询接口记录 + * + * @param requestId 接口记录主键 + * @return 接口记录 + */ + @Override + public RequestLog selectRequestLogByRequestId(Long requestId) + { + return requestLogMapper.selectRequestLogByRequestId(requestId); + } + + + @Override + public RequestLog selectRequestLogByLatestTask() + { + return requestLogMapper.selectRequestLogByLatestTask(); + } + + /** + * 查询接口记录列表 + * + * @param requestLog 接口记录 + * @return 接口记录 + */ + @Override + public List selectRequestLogList(RequestLog requestLog) + { + return requestLogMapper.selectRequestLogList(requestLog); + } + + /** + * 新增接口记录 + * + * @param requestLog 接口记录 + * @return 结果 + */ + @Override + public int insertRequestLog(RequestLog requestLog) + { + if (requestLog.getIsSuccessful().equals("1")){ + return requestLogMapper.insertRequestLog(requestLog); + }else { + return 0; + } + } + + /** + * 修改接口记录 + * + * @param requestLog 接口记录 + * @return 结果 + */ + @Override + public int updateRequestLog(RequestLog requestLog) + { + return requestLogMapper.updateRequestLog(requestLog); + } + + /** + * 批量删除接口记录 + * + * @param requestIds 需要删除的接口记录主键 + * @return 结果 + */ + @Override + public int deleteRequestLogByRequestIds(Long[] requestIds) + { + return requestLogMapper.deleteRequestLogByRequestIds(requestIds); + } + + /** + * 删除接口记录信息 + * + * @param requestId 接口记录主键 + * @return 结果 + */ + @Override + public int deleteRequestLogByRequestId(Long requestId) + { + return requestLogMapper.deleteRequestLogByRequestId(requestId); + } + + + /** + * 插入请求日志(接收请求) + * + * @return requestLog + */ + @Override + public RequestLog getRequestLog(String param, String endPoint) { + RequestLog requestLog = new RequestLog(); + Date requestTime = new Date(); + requestLog.setRequestTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss")); + requestLog.setRequestBody(param); + requestLog.setSourceSystem("wms"); + requestLog.setTargetSystem("wcs"); + requestLog.setEndpoint(endPoint); + requestLog.setRequestMethod("post"); + requestLog.setResponseTime(DateUtil.format(requestTime, "yyyy-MM-dd HH:mm:ss")); + requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, requestTime, DateUnit.MS))); + return requestLog; + } + + + /** + * 插入请求日志 + * + * @param url 请求url + * @param param 参数 + * @return requestLog + */ + @Override + public RequestLog getRequestLog(String url, String param, String remark) { + RequestLog requestLog = new RequestLog(); + requestLog.setRequestTime(DateUtil.formatDateTime(new Date())); + requestLog.setSourceSystem("wcs"); + requestLog.setTargetSystem("wms"); + requestLog.setEndpoint(remark); + requestLog.setRequestMethod("post"); + requestLog.setRequestHeaders(null); + requestLog.setRequestBody(param); + requestLog.setRequestUrl(url); + try { + String resStr = HttpUtil.post(url, param); + requestLog.setResponseBody(resStr); + AjaxResult bean = JSONUtil.toBean(resStr, AjaxResult.class); + if (Convert.toInt(bean.get("code")) == 200) { + requestLog.setResponseTime(DateUtil.formatDateTime(new Date())); + requestLog.setResponseStatus("1"); + requestLog.setDuration(Convert.toStr(DateUtil.between(Convert.toDate(requestLog.getRequestTime()), Convert.toDate(requestLog.getResponseTime()), DateUnit.MS))); + requestLog.setIsSuccessful("1"); + }else { + requestLog.setResponseStatus("0"); + requestLog.setErrorDetails(Convert.toStr(bean.get("msg"))); + requestLog.setIsSuccessful("0"); + } + + } catch (Exception e) { + requestLog.setErrorDetails(e.getMessage()); + requestLog.setIsSuccessful("0"); + requestLog.setResponseStatus("0"); + } finally { + insertRequestLog(requestLog); + } + return requestLog; + } + + /** + * 插入请求日志 + * + * @return requestLog + */ + @Override + public RequestLog getRequestLog(String param, String remark,AjaxResult ajaxResult) { + RequestLog requestLog = new RequestLog(); + requestLog.setRequestTime(DateUtil.formatDateTime(new Date())); + requestLog.setRequestBody(param); + requestLog.setSourceSystem("wms"); + requestLog.setTargetSystem("wcs"); + requestLog.setEndpoint(remark); + requestLog.setRequestMethod("post"); + requestLog.setResponseTime(DateUtil.formatDateTime(new Date())); + requestLog.setDuration(Convert.toStr(DateUtil.between(Convert.toDate(requestLog.getRequestTime()), Convert.toDate(requestLog.getResponseTime()), DateUnit.MS))); + requestLog.setResponseStatus("1"); + if (ajaxResult.isSuccess()){ + requestLog.setIsSuccessful("1"); + }else { + requestLog.setIsSuccessful("0"); + } + requestLog.setResponseBody(Convert.toStr(ajaxResult.get("msg"))); + return requestLog; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/job/controller/OutMydoJobController.java b/ruoyi-admin/src/main/java/com/ruoyi/out/job/controller/OutMydoJobController.java index 7c25114..4b86883 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/job/controller/OutMydoJobController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/job/controller/OutMydoJobController.java @@ -103,7 +103,8 @@ public class OutMydoJobController extends BaseController @PutMapping("/cancel/{jobId}") public AjaxResult cancel(@PathVariable("jobId") String jobId) { - return mydoJobService.cancelJob(jobId,"2"); +// return mydoJobService.cancelJob(jobId,"2"); + return mydoJobService.cancelJob(jobId); } /** @@ -114,6 +115,6 @@ public class OutMydoJobController extends BaseController @PutMapping("/complete/{jobId}") public AjaxResult complete(@PathVariable("jobId") String jobId) { - return mydoJobService.completeJob(jobId,"2"); + return mydoJobService.manualCompleteJob(jobId,"2"); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/domain/OutStockoutManualAssignDTO.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/domain/OutStockoutManualAssignDTO.java index e3c1d3f..8d605be 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/domain/OutStockoutManualAssignDTO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/domain/OutStockoutManualAssignDTO.java @@ -3,6 +3,7 @@ package com.ruoyi.out.stockout.domain; import java.util.List; public class OutStockoutManualAssignDTO { + private String stockoutDetailId; private List stockIdList; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/impl/OutStockoutServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/impl/OutStockoutServiceImpl.java index d79e165..5b9d28c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/impl/OutStockoutServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockout/service/impl/OutStockoutServiceImpl.java @@ -1,18 +1,34 @@ package com.ruoyi.out.stockout.service.impl; import java.math.BigDecimal; -import java.util.Date; -import java.util.HashMap; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.ObjUtil; +import com.ruoyi.api.service.ApiWcsService; +import com.ruoyi.bas.cargospace.domain.BasCargoSpace; +import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService; +import com.ruoyi.bas.id.job.mapper.BasJobIdMapper; +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.domain.BasStockInfo; +import com.ruoyi.bas.stock.service.IBasStockInfoService; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.common.*; +import com.ruoyi.common.Utils.DecimalUtil; import com.ruoyi.common.annotation.WarehouseScope; import com.ruoyi.common.core.text.Convert; +import com.ruoyi.in.job.domain.MydoJob; +import com.ruoyi.in.job.service.IMydoJobService; +import com.ruoyi.in.jobdetail.domain.MydoJobDetail; +import com.ruoyi.in.jobdetail.service.IMydoJobDetailService; import com.ruoyi.out.stockout.domain.OutStockoutManualAssignDTO; +import com.ruoyi.out.stockoutdetail.service.IOutStockoutDetailService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.ruoyi.bas.id.job.service.JobIdService; -import com.ruoyi.common.OutStockoutStatusEnum; +import com.ruoyi.bas.id.job.service.IBasJobIdService; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.mapper.SysDeptMapper; @@ -29,20 +45,36 @@ import com.ruoyi.out.stockoutdetail.mapper.OutStockoutDetailMapper; * @author ruoyi * @date 2026-05-12 */ +@Slf4j @Service public class OutStockoutServiceImpl implements IOutStockoutService { @Autowired private OutStockoutMapper outStockoutMapper; - @Autowired private OutStockoutDetailMapper outStockoutDetailMapper; - @Autowired private SysDeptMapper sysDeptMapper; - @Autowired - private JobIdService jobIdService; + private IBasJobIdService IBasJobIdService; + @Autowired + IOutStockoutService outStockoutService; + @Autowired + IOutStockoutDetailService outStockoutDetailService; + @Autowired + IBasStockService basStockService; + @Autowired + IBasStockInfoService basStockInfoService; + @Autowired + IBasCargoSpaceService basCargoSpaceService; + @Autowired + IMydoJobService mydoJobService; + @Autowired + IMydoJobDetailService mydoJobDetailService; + @Autowired + IBasJobIdService basJobIdService; + @Autowired + ApiWcsService apiWcsService; /** * 查询出库单据主信息 @@ -171,6 +203,204 @@ public class OutStockoutServiceImpl implements IOutStockoutService return AjaxResult.success(str); } + /** + * 自动分配出库单据 + * 1.找单据明细中【辊号】对应的托盘,获取要出库的托盘集合 + * 2.生成多个出库作业,判断出库类型,推送wcs出库 + * 3.处理库存和货位账务 + * 4.>>>可能会触发出库移库 + */ +// @Override + public AjaxResult autoAssignOutStockout111111111111111111(String stockoutId) + { + //校验>>>出库单据明细 + List details = outStockoutDetailService.selectOutStockoutDetailList( + new OutStockoutDetail().builder().stockoutId(stockoutId).build() + ); + if (details.size() == 0){ + log.warn("【出库单据分配】操作异常,未找到该单据号对应的出库明细,单据号:{}", stockoutId); + return AjaxResult.error("操作异常,未找到该单据号对应的出库明细"); + } + + + int num = 1; + + //>>>>>>>>>>>>>>>>>>>>>>分配物料<<<<<<<<<<<<<<<<<<<<<<<<< + //>>>>>>>>>>>>>>>>>>>>>>分配物料<<<<<<<<<<<<<<<<<<<<<<<<< + //>>>>>>>>>>>>>>>>>>>>>>分配物料<<<<<<<<<<<<<<<<<<<<<<<<< + for (OutStockoutDetail detail : details) { + +//>>>辊号(物料)校验 + if (ObjUtil.isNull(basStockService.selectBasStockByRollerNumber(detail.getRollerNumber()))){ + log.warn("【出库分配异常】找不到该辊号的物料库存,辊号:{}", detail.getRollerNumber()); + continue; + } + + //1.获取子单明细中辊号对应的库存 + BasStock stock = basStockService.selectBasStockByRollerNumber(detail.getRollerNumber()); + +//>>>获取出库货位 + //注意:如果<货位是双伸>且<单伸位有货>的情况则触发【移库作业】 + BasCargoSpace cargoCurrent = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(stock.getCargoSpaceId()); + + //【移库判断】如果双伸位,则需要额外判断其对应的单伸货位状态和库存 + if (cargoCurrent.getIssDouble().equals(CargoSpaceCode.CARGOSPACE_ISDOUBLE_Y)){ + //【移库判断-1】查询对应单/双伸位相对应的双/单伸位(同列同层,堆垛机同侧) - 此处获取双伸对应的单伸货位 + BasCargoSpace cargoSingle = basCargoSpaceService.selectAnotherBasCargoSpaceBySameGroup(cargoCurrent); + //【移库判断-2】如果单伸位有货,触发移库作业 + if (cargoSingle.getStatus().equals(CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED)){ + + String moveJobId = basJobIdService.getId(JobIdType.MYDOJOB_MOVE); + BasCargoSpace targetCargo = basCargoSpaceService.selectBasCargoSpaceForStockin( + new BasCargoSpace().builder().theType(cargoSingle.getTheType()).roadwayId(cargoSingle.getRoadwayId()).build() + ); + + //生成并推送移库 + MydoJob moveJob = new MydoJob().builder() + .jobId(moveJobId) + .status(TaskStatusEnum.READY.getCode()) + .inOrOut(TaskType.TASKTYPE_STOCK_MOVE) + .trayType(cargoSingle.getTheType()) + .roadwayId(cargoSingle.getRoadwayId()) + .cargoSpaceId(cargoSingle.getCargoSpaceId()) + .targetCargoSpaceId(targetCargo.getCargoSpaceId()) + .priority(0) + .build(); + + //推送移库 + AjaxResult ajaxResult; + + /*-----------------推送wcs任务----------------- */ + HashMap paramMap = new HashMap<>(); + paramMap.put("reqCode", UUID.randomUUID().toString());//请求码 + paramMap.put("jobId", moveJob.getJobId());//容器编号 + paramMap.put("trayCode", moveJob.getTrayCode().trim());//容器编号 + paramMap.put("cargoSpaceId", moveJob.getCargoSpaceId());//货位 + paramMap.put("targetCargoSpaceId", moveJob.getTargetCargoSpaceId());//目标货位 + paramMap.put("inOrOut", moveJob.getInOrOut());//任务类型 + + ajaxResult = apiWcsService.sendMoveMydoJob(paramMap); + if (ajaxResult.isSuccess()){ + + //生成托盘主作业 + mydoJobService.insertMydoJob(moveJob); + + //生成主任务后子任务明细重新计数 + num = 1; + + log.info( + "【推送移库】生成并推送wcs作业成功,作业号:{},托盘条码:{},源货位:{},目标货位:{}", moveJob.getJobId(), moveJob.getTrayCode(), moveJob.getCargoSpaceId(), moveJob.getTargetCargoSpaceId() + ); + + //todo 更新库存货位 + stock.setCargoSpaceId(targetCargo.getCargoSpaceId()); + stock.setStockStatus(StockCode.STOCK_STATUS_OCCUPIED); + basStockService.updateBasStock(stock); + + //todo 更新货位 + basCargoSpaceService.updateBasCargoSpaceStatus(cargoSingle.getCargoSpaceId(),cargoSingle.getTrayCode(),CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT); + basCargoSpaceService.updateBasCargoSpaceStatus(targetCargo.getCargoSpaceId(),cargoSingle.getTrayCode(),CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN); + + } + + } + + } + + //2.生成辊号库存对应托盘的出库作业 + MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(stock.getTrayCode()); + if (ObjUtil.isNull(mydoJob)){ + + String jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKOUT); + + //判断出库类型,用于确定完成后是否生成回流任务 + //获取生成出库任务的托盘库存集合 + // 遍历托盘库存的辊号在子单明细中是否全部存在 + // 如果全部匹配,则任务类型为整托出库,否则为拣选出库 + int taskType = TaskType.TASKTYPE_STOCKOUT; + List stocks = basStockService.selectBasStockList( + new BasStock().builder().trayCode(stock.getTrayCode()).build() + ); + + for(BasStock stockByTrayCode : stocks){ + //子单明细中进行库存辊号匹配 + if (details.stream().anyMatch(s -> !s.getRollerNumber().equals(stockByTrayCode.getRollerNumber()))){ + taskType = TaskType.TASKTYPE_STOCKOUT_PICKING; + break; + } + } + + mydoJob = new MydoJob().builder() + .jobId(jobId) + .status(TaskStatusEnum.READY.getCode()) + .inOrOut(taskType) + .trayType(stock.getTrayType()) + .roadwayId(cargoCurrent.getRoadwayId()) + .cargoSpaceId(cargoCurrent.getCargoSpaceId()) + .priority(10) + .build(); + + + //todo 推送出库 + AjaxResult ajaxResult; + /*-----------------推送wcs任务----------------- */ + HashMap paramMap = new HashMap<>(); + paramMap.put("reqCode", UUID.randomUUID().toString());//请求码 + paramMap.put("jobId", mydoJob.getJobId());//容器编号 + paramMap.put("trayCode", mydoJob.getTrayCode().trim());//容器编号 + paramMap.put("cargoSpaceId", mydoJob.getCargoSpaceId());//货位 + paramMap.put("inOrOut", mydoJob.getInOrOut());//任务类型 + + ajaxResult = apiWcsService.sendOutMydoJob(paramMap); + if (ajaxResult.isSuccess()){ + + //生成托盘主作业 + mydoJobService.insertMydoJob(mydoJob); + + //生成主任务后子任务明细重新计数 + num = 1; + + log.info("【推送出库】生成并推送wcs作业成功,作业号:{},托盘条码:{},分配货位:{}", mydoJob.getJobId(), mydoJob.getTrayCode(), mydoJob.getCargoSpaceId()); + + //todo 更新库存明细 + stock.setStockStatus(StockStatusEnum.OCCUPIED.getCode()); + basStockService.updateBasStock(stock); + + //todo 更新货位 + cargoCurrent.setStatus(CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT); + basCargoSpaceService.updateBasCargoSpace(cargoCurrent); + } + + + } + + //若主任务已经存在,则补充一条子作业 + mydoJobDetailService.insertMydoJobDetail( + new MydoJobDetail().builder() + .jobId(mydoJob.getJobId()) + .jobDetailId(mydoJob.getJobId() + num) + .inOrOutId(detail.getStockoutId()) + .inOrOutDId(detail.getStockoutDetailId()) + .stockinId(stock.getStockinId()) + .stockinDetailId(detail.getStockoutDetailId()) + .productId(detail.getProductId()) + .lotNo(detail.getLotNo()) + .stockQuantity(Convert.toInt(stock.getQuantity())) + .outQuantity(Convert.toInt(detail.getQuantity())) + .status("0") + .inDate(stock.getInDate().toString()) + .rollerNumber(stock.getRollerNumber()) + .build() + ); + + num++; + + + } + + return AjaxResult.success(); + } + /** * 手动分配出库单据 */ @@ -201,7 +431,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService { // 1. 生成主单ID if (saveDTO.getStockoutId() == null || saveDTO.getStockoutId().isEmpty()) { - saveDTO.setStockoutId(jobIdService.getId("CKD")); + saveDTO.setStockoutId(IBasJobIdService.getId("CKD")); } // 2. 保存主单 saveDTO.setCreateDate(new Date()); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/domain/OutStockoutDetail.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/domain/OutStockoutDetail.java index adc1d7b..bfaaade 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/domain/OutStockoutDetail.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/domain/OutStockoutDetail.java @@ -1,5 +1,9 @@ package com.ruoyi.out.stockoutdetail.domain; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -13,6 +17,10 @@ import java.math.BigDecimal; * @author ruoyi * @date 2026-05-12 */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor public class OutStockoutDetail extends BaseEntity { private static final long serialVersionUID = 1L; @@ -36,6 +44,10 @@ public class OutStockoutDetail extends BaseEntity @Excel(name = "物料名称546") private String productName; + /** 辊号 */ + @Excel(name = "辊号") + private String rollerNumber; + /** 计划数量 */ @Excel(name = "计划数量") private BigDecimal quantity; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/mapper/OutStockoutDetailMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/mapper/OutStockoutDetailMapper.java index 96b3d3a..b30d124 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/mapper/OutStockoutDetailMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/mapper/OutStockoutDetailMapper.java @@ -19,6 +19,14 @@ public interface OutStockoutDetailMapper */ public OutStockoutDetail selectOutStockoutDetailByStockoutDetailId(String stockoutDetailId); + /** + * 查询出库单据子信息 + * + * @param rollerNumber 辊号 + * @return 出库单据子信息 + */ + public OutStockoutDetail selectOutStockoutDetailByRollerNumber(String rollerNumber); + /** * 查询出库单据子信息列表 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/service/IOutStockoutDetailService.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/service/IOutStockoutDetailService.java index bbb9c96..63cad3f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/service/IOutStockoutDetailService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/service/IOutStockoutDetailService.java @@ -19,6 +19,14 @@ public interface IOutStockoutDetailService */ public OutStockoutDetail selectOutStockoutDetailByStockoutDetailId(String stockoutDetailId); + /** + * 查询出库单据子信息 + * + * @param rollerNumber 辊号 + * @return 出库单据子信息 + */ + public OutStockoutDetail selectOutStockoutDetailByRollerNumber(String rollerNumber); + /** * 查询出库单据子信息列表 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/service/impl/OutStockoutDetailServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/service/impl/OutStockoutDetailServiceImpl.java index 4f11f9d..1004bb9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/service/impl/OutStockoutDetailServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/out/stockoutdetail/service/impl/OutStockoutDetailServiceImpl.java @@ -31,6 +31,11 @@ public class OutStockoutDetailServiceImpl implements IOutStockoutDetailService return outStockoutDetailMapper.selectOutStockoutDetailByStockoutDetailId(stockoutDetailId); } + @Override + public OutStockoutDetail selectOutStockoutDetailByRollerNumber(String rollerNumber){ + return outStockoutDetailMapper.selectOutStockoutDetailByRollerNumber(rollerNumber); + } + /** * 查询出库单据子信息列表 * diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pd/job/controller/PdInMydoJobController.java b/ruoyi-admin/src/main/java/com/ruoyi/pd/job/controller/PdInMydoJobController.java index e8a95dd..e69cc18 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pd/job/controller/PdInMydoJobController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pd/job/controller/PdInMydoJobController.java @@ -96,7 +96,8 @@ public class PdInMydoJobController extends BaseController @PutMapping("/cancel/{jobId}") public AjaxResult cancel(@PathVariable("jobId") String jobId) { - return mydoJobService.cancelJob(jobId,"2"); +// return mydoJobService.cancelJob(jobId,"2"); + return mydoJobService.cancelJob(jobId); } /** @@ -107,6 +108,6 @@ public class PdInMydoJobController extends BaseController @PutMapping("/complete/{jobId}") public AjaxResult complete(@PathVariable("jobId") String jobId) { - return mydoJobService.completeJob(jobId,"2"); + return mydoJobService.manualCompleteJob(jobId,"2"); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pd/job/controller/PdOutMydoJobController.java b/ruoyi-admin/src/main/java/com/ruoyi/pd/job/controller/PdOutMydoJobController.java index 1831511..375d996 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pd/job/controller/PdOutMydoJobController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pd/job/controller/PdOutMydoJobController.java @@ -103,7 +103,8 @@ public class PdOutMydoJobController extends BaseController @PutMapping("/cancel/{jobId}") public AjaxResult cancel(@PathVariable("jobId") String jobId) { - return mydoJobService.cancelJob(jobId,"2"); +// return mydoJobService.cancelJob(jobId,"2"); + return mydoJobService.cancelJob(jobId); } /** @@ -114,6 +115,6 @@ public class PdOutMydoJobController extends BaseController @PutMapping("/complete/{jobId}") public AjaxResult complete(@PathVariable("jobId") String jobId) { - return mydoJobService.completeJob(jobId,"2"); + return mydoJobService.manualCompleteJob(jobId,"2"); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pd/stockpd/service/impl/PdStockpdServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/pd/stockpd/service/impl/PdStockpdServiceImpl.java index 729b1a9..34aa9ac 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pd/stockpd/service/impl/PdStockpdServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pd/stockpd/service/impl/PdStockpdServiceImpl.java @@ -6,7 +6,7 @@ import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.ruoyi.bas.id.job.service.JobIdService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; import com.ruoyi.common.PdStockpdStatusEnum; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.text.Convert; @@ -38,7 +38,7 @@ public class PdStockpdServiceImpl implements IPdStockpdService private SysDeptMapper sysDeptMapper; @Autowired - private JobIdService jobIdService; + private IBasJobIdService IBasJobIdService; /** * 查询盘点单据主信息 @@ -216,7 +216,7 @@ public class PdStockpdServiceImpl implements IPdStockpdService { // 1. 生成主单ID if (saveDTO.getStockpdId() == null || saveDTO.getStockpdId().isEmpty()) { - saveDTO.setStockpdId(jobIdService.getId("PDD")); + saveDTO.setStockpdId(IBasJobIdService.getId("PDD")); } // 2. 保存主单 saveDTO.setCreateDate(new Date()); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/controller/PdaController.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/controller/PdaController.java index a6b2fe8..44cf0f8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/controller/PdaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/controller/PdaController.java @@ -4,11 +4,11 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; import com.ruoyi.pda.domain.AddInJobRequest; +import com.ruoyi.pda.domain.TrayMsgBinding; import com.ruoyi.pda.domain.BindTrayRequest; -import com.ruoyi.pda.service.PdaService; -import io.netty.util.internal.ObjectUtil; +import com.ruoyi.pda.service.IPdaService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -26,7 +26,8 @@ import java.util.List; public class PdaController extends BaseController { @Autowired - private PdaService pdaService; + private IPdaService pdaService; + /** * 入库待处理任务列表 @@ -39,6 +40,7 @@ public class PdaController extends BaseController { return getDataTable(list); } + /** * 入库绑盘(支持一托多料) *

@@ -67,6 +69,27 @@ public class PdaController extends BaseController { } } + + /** + * 入库绑盘 + */ + @PostMapping("/bindTrayMsg") + @PreAuthorize("@ss.hasPermi('in:bound:msg:add')") + public AjaxResult bindTray(@RequestBody TrayMsgBinding bindTray) { + try { + if (bindTray == null) { + return AjaxResult.error(); + } + + return pdaService.bindingTrayMsg(bindTray); + + } catch (RuntimeException e) { + return AjaxResult.error(e.getMessage()); + } + } + + + /** * 生成入库作业 * @param request @@ -83,14 +106,16 @@ public class PdaController extends BaseController { } } + + /** * 入库绑盘-查询物料信息 - * @param detailId + * @param detailId 子单号 * @return */ @GetMapping("/getProductInfoByInDetailId") @PreAuthorize("@ss.hasPermi('in:bound:task:info')") - public AjaxResult getProductInfoByInDetailId(String detailId) { + public AjaxResult getProductInfoByInDetailId(String detailId) { try { InStockinDetail info = pdaService.getProductInfoByInDetailId(detailId); return AjaxResult.success(info); @@ -99,4 +124,33 @@ public class PdaController extends BaseController { } } + + /** + * 入库绑盘-查询物料信息 + * @param rollerNumber 辊号 + * @return + */ + @GetMapping("/getProductInfoByRollerNumber") + @PreAuthorize("@ss.hasPermi('in:bound:task:info')") + public AjaxResult getProductInfoByRollerNumber(String rollerNumber) { + try { + InStockinDetail info = pdaService.getProductInfoByRollerNumber(rollerNumber); + return AjaxResult.success(info); + } catch (RuntimeException e) { + return AjaxResult.error(e.getMessage()); + } + } + + + /** + * 呼叫空托出库 + * @param palletType 托盘类型 + * @return + */ + @GetMapping("/callStockOutForEmptyPallet") + @PreAuthorize("@ss.hasPermi('out:bound:task:info')") + public AjaxResult callStockOutForEmptyPallet(int palletType) { + return pdaService.callContainerStockOut(palletType); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/domain/BindTrayRequest.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/domain/BindTrayRequest.java index 85dc00d..4f516f3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/domain/BindTrayRequest.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/domain/BindTrayRequest.java @@ -2,6 +2,8 @@ package com.ruoyi.pda.domain; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; +import lombok.Builder; +import lombok.Data; import java.math.BigDecimal; import java.util.List; @@ -13,6 +15,8 @@ import java.util.List; * @author ruoyi * @date 2026-05-14 */ +@Data +@Builder public class BindTrayRequest { /** 托盘号 */ @@ -21,35 +25,17 @@ public class BindTrayRequest { @NotNull private String warehouseId; - - /** 绑定物料明细列表(一托多料) */ + /** + * 绑定物料明细列表(一托多料) + */ @Valid private List items; - public String getTrayCode() { - return trayCode; - } - public void setTrayCode(String trayCode) { - this.trayCode = trayCode; - } - public String getWarehouseId() { - return warehouseId; - } - - public void setWarehouseId(String warehouseId) { - this.warehouseId = warehouseId; - } - - public List getItems() { - return items; - } - - public void setItems(List items) { - this.items = items; - } + @Data + @Builder /** * 单条物料绑定信息 */ @@ -67,28 +53,8 @@ public class BindTrayRequest { @NotNull private BigDecimal quantity; - public String getStockinDetailId() { - return stockinDetailId; - } + private String rollerNumber; - public void setStockinDetailId(String stockinDetailId) { - this.stockinDetailId = stockinDetailId; - } - public String getProductId() { - return productId; - } - - public void setProductId(String productId) { - this.productId = productId; - } - - public BigDecimal getQuantity() { - return quantity; - } - - public void setQuantity(BigDecimal quantity) { - this.quantity = quantity; - } } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/domain/TrayMsgBinding.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/domain/TrayMsgBinding.java new file mode 100644 index 0000000..59ed281 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/domain/TrayMsgBinding.java @@ -0,0 +1,48 @@ +package com.ruoyi.pda.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TrayMsgBinding { + + /** + * 托盘号 + */ + private String trayCode; + + /** + * 物料号 + */ + private String productId; + + /** + * 辊号 + */ + private String rollerNumber; + + /** + * 数量 + */ + private BigDecimal quantity; + + /** + * 主单id + */ + private String stockinId; + + /** + * 子单id + */ + private String stockinDetailId; + + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/service/PdaService.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/service/IPdaService.java similarity index 51% rename from ruoyi-admin/src/main/java/com/ruoyi/pda/service/PdaService.java rename to ruoyi-admin/src/main/java/com/ruoyi/pda/service/IPdaService.java index 9843b38..38b04b3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/service/PdaService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/service/IPdaService.java @@ -1,12 +1,15 @@ package com.ruoyi.pda.service; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; +import com.ruoyi.apiService.domain.wcs.WcsStockinReceive; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; import com.ruoyi.pda.domain.AddInJobRequest; +import com.ruoyi.pda.domain.TrayMsgBinding; import com.ruoyi.pda.domain.BindTrayRequest; import java.util.List; -public interface PdaService { +public interface IPdaService { /** * 入库待处理任务列表 @@ -20,6 +23,15 @@ public interface PdaService { * @return 成功插入条数 */ String bindTray(BindTrayRequest request); + + /** + * 入库绑盘 + * + * @param bindTray 绑盘请求体,包含托盘号和物料明细列表 + * @return 成功插入条数 + */ + AjaxResult bindingTrayMsg(TrayMsgBinding bindTray); + /** * 入库绑盘-查询物料信息 * @param detailId 入库子单号 @@ -27,10 +39,26 @@ public interface PdaService { */ InStockinDetail getProductInfoByInDetailId(String detailId); + /** + * 入库绑盘-查询物料信息 + * @param rollerNumber 辊号 + * @return + */ + InStockinDetail getProductInfoByRollerNumber(String rollerNumber); + /** * 生成入库任务 * @param request 生成任务请求体 包含托盘号 * @return */ String addInJob(AddInJobRequest request); + + + /** + * 呼叫空托盘出库 + * @param palletType 托盘类型 + * @return + */ + AjaxResult callContainerStockOut(int palletType); + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/pda/service/impl/PdaServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/pda/service/impl/PdaServiceImpl.java index c972598..5ff50e1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/pda/service/impl/PdaServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/pda/service/impl/PdaServiceImpl.java @@ -1,45 +1,70 @@ package com.ruoyi.pda.service.impl; +import cn.hutool.core.util.ObjUtil; +import com.ruoyi.api.service.ApiWcsService; +import com.ruoyi.bas.id.job.service.IBasJobIdService; +import com.ruoyi.bas.id.taskno.service.IBasTaskNoService; +import com.ruoyi.bas.stock.domain.BasStock; +import com.ruoyi.bas.stock.domain.BasStockInfo; +import com.ruoyi.bas.stock.service.IBasStockInfoService; +import com.ruoyi.bas.stock.service.IBasStockService; +import com.ruoyi.common.*; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.in.bind.domain.InTrayMsg; -import com.ruoyi.in.bind.mapper.InTrayMsgMapper; -import com.ruoyi.in.sotckindetail.domain.InStockinDetail; -import com.ruoyi.in.sotckindetail.mapper.InStockinDetailMapper; -import com.ruoyi.in.stockin.domain.InStockin; -import com.ruoyi.in.stockin.mapper.InStockinMapper; +import com.ruoyi.in.bind.service.IInTrayMsgService; +import com.ruoyi.in.job.service.IMydoJobService; +import com.ruoyi.in.jobdetail.service.IMydoJobDetailService; +import com.ruoyi.in.stockindetail.domain.InStockinDetail; +import com.ruoyi.in.stockindetail.mapper.InStockinDetailMapper; +import com.ruoyi.in.stockindetail.service.IInStockinDetailService; import com.ruoyi.pda.domain.AddInJobRequest; +import com.ruoyi.pda.domain.TrayMsgBinding; import com.ruoyi.pda.domain.BindTrayRequest; import com.ruoyi.pda.mapper.PdaMapper; -import com.ruoyi.pda.service.PdaService; +import com.ruoyi.pda.service.IPdaService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import java.math.BigDecimal; -import java.util.Date; import java.util.HashMap; import java.util.List; -import static com.ruoyi.common.InStockInStatusEnum.RUNNING; - /** * 手持机 Service 实现 * * @author ruoyi * @date 2026-05-14 */ +@Slf4j @Service -public class PdaServiceImpl implements PdaService { +public class PdaServiceImpl implements IPdaService { @Autowired - private PdaMapper pdaMapper; - + PdaMapper pdaMapper; @Autowired - private InStockinDetailMapper inStockinDetailMapper; + InStockinDetailMapper inStockinDetailMapper; + @Autowired + IInStockinDetailService inStockinDetailService; + @Autowired + ApiWcsService apiWcsService; + @Autowired + IInTrayMsgService inTrayMsgService; + @Autowired + IMydoJobService mydoJobService; + @Autowired + IMydoJobDetailService mydoJobDetailService; + @Autowired + IBasJobIdService basJobIdService; + @Autowired + IBasTaskNoService basTaskNoService; + @Autowired + IBasStockInfoService basStockInfoService; + @Autowired + IBasStockService basStockService; + // ───────────────────────────────────────────── @@ -50,9 +75,10 @@ public class PdaServiceImpl implements PdaService { return inStockinDetailMapper.inboundTaskList(inStockinDetail); } - // ───────────────────────────────────────────── - // 入库绑盘(一托多料) - // ───────────────────────────────────────────── + + /** + * 入库绑盘(一托多料) + */ @Override public String bindTray(BindTrayRequest request) { StringBuilder str = new StringBuilder(); @@ -70,11 +96,150 @@ public class PdaServiceImpl implements PdaService { return str.toString(); } + + /** + * 绑定托盘信息 + * @param bindTrayMsg 绑盘请求体,包含托盘号和物料明细列表 + * @return + */ + @Override + public AjaxResult bindingTrayMsg(TrayMsgBinding bindTrayMsg){ + + //todo 需要确认扫描辊号或物料号时能获取到哪些信息?确认后移除不必要的字段 + + + + //======================生成绑定信息====================== + String trayCode = bindTrayMsg.getTrayCode(); + int trayType = mydoJobService.getTrayTypeByTrayCode(trayCode); + String trayMsgStatus = + ObjUtil.isNull(basStockInfoService.selectBasStockInfoByTrayCode(trayCode)) ? InTrayMsgCode.STATUS_NEW :InTrayMsgCode.STATUS_EXIST; + + +//>>>校验1:托盘号是否已经执行过绑定操作 + int trayCodeCount = inTrayMsgService.selectInTrayMsgList( + new InTrayMsg().builder().trayCode(trayCode).build() + ).size(); + if (trayCodeCount != 0){ + log.warn("【空托入库绑定】已存在该托盘条码的入库绑定信息,请勿重复绑定,条码:{}", trayCode); + return AjaxResult.error("【空托入库绑定】已存在该托盘条码的入库绑定信息,请勿重复绑定,条码:" + trayCode); + } + +//>>>校验2:辊号是否已经执行过绑定操作 + int rollerNumberCount = inTrayMsgService.selectInTrayMsgList( + new InTrayMsg().builder().rollerNumber(bindTrayMsg.getRollerNumber()).build() + ).size(); + if (rollerNumberCount != 0){ + log.warn("【空托入库绑定】已存在该辊号的入库绑定信息,请勿重复绑定,条码:{}", trayCode); + return AjaxResult.error("【空托入库绑定】已存在该辊号的入库绑定信息,请勿重复绑定,条码:" + trayCode); + } + +//>>>校验3:物料编号不能为空(不包括空托盘) + if((bindTrayMsg.getProductId().equals("") || bindTrayMsg.getProductId() == null) && !bindTrayMsg.getProductId().equals(ProductType.EMPTY_TRAY)){ + log.warn("【提示】入库绑定信息物料不能为空,请扫码获取物料信息,物料号:{}", bindTrayMsg.getProductId()); + return AjaxResult.error("【提示】入库绑定信息物料不能为空"); + } + + + //todo 此处处理回流继续绑定的托盘 + + + +//----------【空容器入库绑定】---------- + if (bindTrayMsg.getProductId().equals(ProductType.EMPTY_TRAY)){ + +//>>>校验:库存和货位已经有该托盘信息 + BasStockInfo info = basStockInfoService.selectBasStockInfoByTrayCode(trayCode); + if (ObjUtil.isNotNull(info)){ + log.warn("【提示】已有该托盘的库存信息,请确认货位:{},托盘号:{}", info.getCargoSpaceId(), trayCode); + return AjaxResult.error("【提示】已有该托盘的库存信息,请核对货位状态"); + } + + inTrayMsgService.insertInTrayMsg( + new InTrayMsg().builder() + .trayCode(trayCode) + .productId(bindTrayMsg.getProductId()) + .quantity(bindTrayMsg.getQuantity()) + .warehouseId("01") + .rollerNumber(bindTrayMsg.getRollerNumber()) + .trayType(4)//todo 获取托盘类型 + .status(trayMsgStatus) + .build() + ); + + log.info("【绑定信息】<空容器入库>绑定信息,托盘号:{},物料编号:{}", trayCode, bindTrayMsg.getProductId()); + return AjaxResult.success("绑定成功"); + + }else{ +//----------【常规物料入库托盘绑定】---------- + +//>>>校验1:入库子单是否有当前辊号信息 + int rollerCount = inStockinDetailService.selectInStockinDetailList( + new InStockinDetail().builder().rollerNumber(bindTrayMsg.getRollerNumber()).build() + ).size(); + if (rollerCount == 0){ + log.warn("【扫码异常】找不到当前版辊信息对应的单据明细,辊号:{}", bindTrayMsg.getRollerNumber()); + return AjaxResult.error("【扫码异常】找不到当前版辊信息对应的单据明细,辊号:" + bindTrayMsg.getRollerNumber()); + } + +//>>>校验2:容器可用位置和绑定物料数量判断 + //已经进行过绑定容器的物料数量 @@@ FT577 托盘上的每个位置仅能放数量1的物料 + int bindingSpaces = inTrayMsgService.selectInTrayMsgList( + new InTrayMsg().builder().trayCode(trayCode).build() + ).size(); + //指定托盘号对应的库存表的记录条数(表示数量) 由于辊号唯一,所以固定托盘号的库存条数也可以表示库存数量 + int stockSum = basStockService.getQuantityByTrayCode(trayCode); + //如果【绑定数量】超过【托盘余位 = 托盘容量 - 托盘库存】则不能继续绑定 + if(bindingSpaces >= trayType - stockSum){ + log.warn("【提示】该托盘绑定物料数量已达上限,无法继续绑定,托盘号:{}", trayCode); + return AjaxResult.error("【提示】该托盘绑定物料数量已达上限,无法继续绑定"); + } + +//>>>生成绑定信息 + inTrayMsgService.insertInTrayMsg( + new InTrayMsg().builder() + .trayCode(trayCode) + .productId(bindTrayMsg.getProductId()) + .quantity(bindTrayMsg.getQuantity()) + .stockinId(bindTrayMsg.getStockinId()) + .stockinDetailId(bindTrayMsg.getStockinDetailId()) + .warehouseId("01") + .rollerNumber(bindTrayMsg.getRollerNumber()) + .trayType(4) + .status(trayMsgStatus) + .build() + ); + +//>>>扣减子单的【扫码数量】 + InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByProductId(bindTrayMsg.getProductId()); + inStockinDetail.setScanNum(inStockinDetail.getScanNum().subtract(BigDecimal.valueOf(1))); + inStockinDetailService.updateInStockinDetail(inStockinDetail); + + log.info("【绑定信息】<常规入库>绑定信息,辊号:{},托盘号:{}",bindTrayMsg.getRollerNumber(), bindTrayMsg.getTrayCode()); + return AjaxResult.success("绑定成功"); + } + + + } + + @Override public InStockinDetail getProductInfoByInDetailId(String detailId) { return inStockinDetailMapper.selectInStockinDetailByStockinDetailId(detailId); } + + /** + * 可能需要确定扫描辊号时是否带有其他字段信息,可以通过辊号(唯一)获取子单明细信息 + * @param rollerNumber 辊号 + * @return + */ + @Override + public InStockinDetail getProductInfoByRollerNumber(String rollerNumber) { + return inStockinDetailMapper.selectInStockinDetailByRollerNumber(rollerNumber); + } + + @Override public String addInJob(AddInJobRequest request) { HashMap map = new HashMap<>(); @@ -84,4 +249,13 @@ public class PdaServiceImpl implements PdaService { pdaMapper.addInJob(map); return Convert.toStr(map.get("v_resultmsg")); } + + @Override + public AjaxResult callContainerStockOut(int palletType){ + return apiWcsService.callContainerOut(palletType); + } + + + + } diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index fdc9669..4e7604a 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -6,9 +6,12 @@ spring: druid: # 主库数据源 master: - url: jdbc:sqlserver://172.16.4.12:1433;databaseName=flrd-wms;encrypt=false;sendStringParametersAsUnicode=true +# url: jdbc:sqlserver://172.16.4.12:1433;databaseName=flrd-wms;encrypt=false;sendStringParametersAsUnicode=true +# username: sa +# password: Flrd0914. + url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT577-wms;encrypt=false;sendStringParametersAsUnicode=true username: sa - password: Flrd0914. + password: 123456 # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 2d5f209..11a4442 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -72,13 +72,13 @@ spring: # redis 配置 redis: # 地址 - host: 172.16.4.12 + host: 127.0.0.1 # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 - password: 123456 + password: # 连接超时时间 timeout: 10s lettuce: @@ -99,7 +99,7 @@ token: # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) - expireTime: 30 + expireTime: 30000 # MyBatis配置 mybatis: @@ -166,7 +166,7 @@ external: reportMaterialConsume: /material/consume reportQualityCheck: /quality/check WCS: - base-url: http://10.0.3.100:9000 + base-url: http://127.0.0.1:8084 token: wcs-token apis: sendPutawayTask: /task/dispatch diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml index a360583..c5294ce 100644 --- a/ruoyi-admin/src/main/resources/logback.xml +++ b/ruoyi-admin/src/main/resources/logback.xml @@ -20,7 +20,7 @@ ${log.path}/sys-info.%d{yyyy-MM-dd}.log - 60 + 30 ${log.pattern} @@ -34,6 +34,28 @@ DENY + + + ${log.path}/sys-warn.log + + + + ${log.path}/sys-warn.%d{yyyy-MM-dd}.log + + 30 + + + ${log.pattern} + + + + WARN + + ACCEPT + + DENY + + ${log.path}/sys-error.log @@ -42,7 +64,7 @@ ${log.path}/sys-error.%d{yyyy-MM-dd}.log - 60 + 30 ${log.pattern} @@ -83,6 +105,7 @@ + diff --git a/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml index 4af841b..cb0d75c 100644 --- a/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/bas/BasCargoSpaceMapper.xml @@ -33,6 +33,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select cargo_space_id, warehouse_id, roadway_id, cargo_area_id, the_type, the_type_name, cargo_space_name, the_platoon, the_column, the_floor, status, locked, tray_code, iss_double, group_coding_no, group_coding, cargo_space_logo, this_cargo_area, dept_id, dept_name, the_weight, the_height from bas_cargo_space + + select top 1 cargo_space_id, warehouse_id, roadway_id, cargo_area_id, the_type, the_type_name, cargo_space_name, the_platoon, the_column, the_floor, status, locked, tray_code, iss_double, group_coding_no, group_coding, cargo_space_logo, this_cargo_area, dept_id, dept_name, the_weight, the_height from bas_cargo_space + + + + + + + insert into bas_cargo_space diff --git a/ruoyi-admin/src/main/resources/mapper/bas/BasStockInfoMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/BasStockInfoMapper.xml new file mode 100644 index 0000000..0116702 --- /dev/null +++ b/ruoyi-admin/src/main/resources/mapper/bas/BasStockInfoMapper.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + select stock_id, cargo_space_id, tray_code, warehouse_id, user_id, user_name, dept_id, dept_name, supplier_id, supplier_name, tray_type, empty_status from bas_stock + + + + + + + + + + insert into bas_stock + + stock_id, + cargo_space_id, + tray_code, + warehouse_id, + user_id, + user_name, + dept_id, + dept_name, + supplier_id, + supplier_name, + tray_type, + empty_status, + + + #{stockId}, + #{cargoSpaceId}, + #{trayCode}, + #{warehouseId}, + #{userId}, + #{userName}, + #{deptId}, + #{deptName}, + #{supplierId}, + #{supplierName}, + #{trayType}, + #{emptyStatus}, + + + + + update bas_stock + + and cargo_space_id = #{cargoSpaceId} + and stock_id = #{stockId} + and tray_code = #{trayCode} + and warehouse_id like concat('%', #{warehouseId}, '%') + and user_name like concat('%', #{userName}, '%') + and dept_name like concat('%', #{deptName}, '%') + and supplier_name like concat('%', #{supplierName}, '%') + and tray_type = #{trayType} + and empty_status = #{emptyStatus} + + where stock_id = #{stockId} + + + + delete from bas_stock where stock_id = #{stockId} + + + + delete from bas_stock where tray_code = #{trayCode} + + + + delete from bas_stock where stock_id in + + #{stockId} + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/mapper/bas/BasStockMapper.xml b/ruoyi-admin/src/main/resources/mapper/bas/BasStockMapper.xml index 184b492..a98e06d 100644 --- a/ruoyi-admin/src/main/resources/mapper/bas/BasStockMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/bas/BasStockMapper.xml @@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -28,21 +29,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - + + + + - select stock_id, cargo_space_id, stock_status, product_status, lot_no, in_date, back_date, product_id, product_name, quantity, job_id, job_detail_id, tray_code, out_quantity, stockin_detail_id, stockin_id, in_type, warehouse_id, warehouse_name, user_id, user_name, dept_id, dept_name, suplier_id, suplier_name from bas_stock + select stock_id, cargo_space_id, stock_status, product_status, lot_no, in_date, back_date, product_id, product_name, roller_number, + quantity, job_id, job_detail_id, tray_code, out_quantity, stockin_detail_id, stockin_id, in_type, warehouse_id, warehouse_name, + user_id, user_name, dept_id, dept_name, supplier_id, supplier_name, tray_type, availablePlace + from bas_stock @@ -74,8 +83,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where stock_id = #{stockId} + + + + + + - insert into bas_stock + insert into bas_stock_detail stock_id, cargo_space_id, @@ -86,6 +110,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" back_date, product_id, product_name, + roller_number, quantity, job_id, job_detail_id, @@ -100,8 +125,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" user_name, dept_id, dept_name, - suplier_id, - suplier_name, + supplier_id, + supplier_name, + tray_type, + available_place, #{stockId}, @@ -113,6 +140,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{backDate}, #{productId}, #{productName}, + #{rollerNumber}, #{quantity}, #{jobId}, #{jobDetailId}, @@ -127,13 +155,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{userName}, #{deptId}, #{deptName}, - #{suplierId}, - #{suplierName}, + #{supplierId}, + #{supplierName}, + #{tray_type}, + #{available_place}, - update bas_stock + update bas_stock_detail cargo_space_id = #{cargoSpaceId}, stock_status = #{stockStatus}, @@ -143,6 +173,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" back_date = #{backDate}, product_id = #{productId}, product_name = #{productName}, + roller_number = #{rollerNumber}, quantity = #{quantity}, job_id = #{jobId}, job_detail_id = #{jobDetailId}, @@ -157,18 +188,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" user_name = #{userName}, dept_id = #{deptId}, dept_name = #{deptName}, - suplier_id = #{suplierId}, - suplier_name = #{suplierName}, + supplier_id = #{supplierId}, + supplier_name = #{supplierName}, + tray_type = #{trayType}, + available_place = #{availablePlace}, where stock_id = #{stockId} - delete from bas_stock where stock_id = #{stockId} + delete from bas_stock_detail where stock_id = #{stockId} + + + + delete from bas_stock_detail where roller_number = #{rollerNumber} - delete from bas_stock where stock_id in + delete from bas_stock_detail where stock_id in #{stockId} diff --git a/ruoyi-admin/src/main/resources/mapper/in/InStockinDetailMapper.xml b/ruoyi-admin/src/main/resources/mapper/in/InStockinDetailMapper.xml index 6997f1f..1704853 100644 --- a/ruoyi-admin/src/main/resources/mapper/in/InStockinDetailMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/in/InStockinDetailMapper.xml @@ -14,13 +14,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + - select stockin_detail_id, stockin_id, lot_no, product_id, product_name, quantity, scan_num, assign_num, remark from in_stockin_detail + select stockin_detail_id, stockin_id, lot_no, product_id, product_name, quantity, scan_num, assign_num, remark, roller_number, status from in_stockin_detail - select stockin_detail_id, stockin_id, lot_no, product_id, product_name, quantity, scan_num, assign_num, remark from in_stockin_detail_finish + select stockin_detail_id, stockin_id, lot_no, product_id, product_name, quantity, scan_num, assign_num, remark, roller_number, status from in_stockin_detail_finish @@ -40,10 +44,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where stockin_detail_id = #{stockinDetailId} + + + + + + + + + + @@ -68,7 +96,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" quantity, scan_num, assign_num, + and roller_number = #{rollerNumber} remark, + and status = #{status} #{stockinDetailId}, @@ -79,10 +109,42 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{quantity}, #{scanNum}, #{assignNum}, + and roller_number = #{rollerNumber} #{remark}, + and status = #{status} + + insert into in_stockin_detail_finish + + stockin_detail_id, + stockin_id, + lot_no, + product_id, + product_name, + quantity, + scan_num, + assign_num, + and roller_number = #{rollerNumber} + remark, + and status = #{status} + + + #{stockinDetailId}, + #{stockinId}, + #{lotNo}, + #{productId}, + #{productName}, + #{quantity}, + #{scanNum}, + #{assignNum}, + and roller_number = #{rollerNumber} + #{remark}, + and status = #{status} + + + update in_stockin_detail @@ -93,7 +155,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" quantity = #{quantity}, scan_num = #{scanNum}, assign_num = #{assignNum}, + and roller_number = #{rollerNumber} remark = #{remark}, + and status = #{status} where stockin_detail_id = #{stockinDetailId} @@ -108,4 +172,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{stockinDetailId} + + + delete from in_stockin_detail where stockin_id = #{stockinId} + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/mapper/in/InStockinMapper.xml b/ruoyi-admin/src/main/resources/mapper/in/InStockinMapper.xml index 9e51643..c2a8455 100644 --- a/ruoyi-admin/src/main/resources/mapper/in/InStockinMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/in/InStockinMapper.xml @@ -112,6 +112,46 @@ + + insert into in_stockin_finish + + stockin_id, + in_type, + stock_source, + status, + create_date, + start_date, + finish_date, + erp_bill, + warehouse_id, + warehouse_name, + user_id, + user_name, + dept_id, + dept_name, + supplier_id, + supplier_name, + + + #{stockinId}, + #{inType}, + #{stockSource}, + #{status}, + #{createDate}, + #{startDate}, + #{finishDate}, + #{erpBill}, + #{warehouseId}, + #{warehouseName}, + #{userId}, + #{userName}, + #{deptId}, + #{deptName}, + #{supplierId}, + #{supplierName}, + + + update in_stockin @@ -134,7 +174,7 @@ where stockin_id = #{stockinId} - {call proc_update_inbill_status( + {call proc_in_update_bill_status( #{v_stockin_id,mode=IN,jdbcType=VARCHAR}, #{v_status,mode=IN,jdbcType=INTEGER}, #{v_result,mode=OUT,jdbcType=INTEGER}, diff --git a/ruoyi-admin/src/main/resources/mapper/in/InTrayMsgMapper.xml b/ruoyi-admin/src/main/resources/mapper/in/InTrayMsgMapper.xml index ba591e1..3e0369b 100644 --- a/ruoyi-admin/src/main/resources/mapper/in/InTrayMsgMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/in/InTrayMsgMapper.xml @@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -14,22 +15,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + - select id, tray_code, stockin_detail_id, product_Id, quantity, warehouse_id, user_id, dept_id, create_time from in_tray_msg + select id, tray_code, stockin_detail_id, product_Id, quantity, warehouse_id, user_id, dept_id, create_time, trayType, rollerNumber, status from in_tray_msg @@ -47,6 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into in_tray_msg tray_code, + and stockin_id = #{stockinId} stockin_detail_id, product_Id, quantity, @@ -54,9 +63,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" user_id, dept_id, create_time, + tray_type, + roller_number, + status, #{trayCode}, + and stockin_id = #{stockinId} #{stockinDetailId}, #{productId}, #{quantity}, @@ -64,6 +77,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{userId}, #{deptId}, #{createTime}, + #{trayType}, + #{rollerNumber}, + #{status}, @@ -71,6 +87,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update in_tray_msg tray_code = #{trayCode}, + and stockin_id = #{stockinId} stockin_detail_id = #{stockinDetailId}, product_Id = #{productId}, quantity = #{quantity}, @@ -78,6 +95,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" user_id = #{userId}, dept_id = #{deptId}, create_time = #{createTime}, + and tray_type = #{trayType}, + and roller_number = #{rollerNumber}, + and status = #{status}, where id = #{id} @@ -92,4 +112,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + delete from in_tray_msg where tray_code = #{trayCode} + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/mapper/in/MydoJobDetailMapper.xml b/ruoyi-admin/src/main/resources/mapper/in/MydoJobDetailMapper.xml index 67229e3..914871e 100644 --- a/ruoyi-admin/src/main/resources/mapper/in/MydoJobDetailMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/in/MydoJobDetailMapper.xml @@ -23,13 +23,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select job_detail_id, job_id, stock_id, lot_no, in_date, in_or_out_id, in_or_out_d_id, product_id, product_name, in_quantity, stock_quantity, out_quantity, stockin_id, stockin_detail_id, customer_id, customer_name, supplier_id, supplier_name from mydo_job_detail + select job_detail_id, job_id, stock_id, lot_no, in_date, in_or_out_id, in_or_out_d_id, product_id, product_name, in_quantity, stock_quantity, out_quantity, stockin_id, stockin_detail_id, customer_id, customer_name, supplier_id, supplier_name,tray_type from mydo_job_detail - select job_detail_id, job_id, stock_id, lot_no, in_date, in_or_out_id, in_or_out_d_id, product_id, product_name, in_quantity, stock_quantity, out_quantity, stockin_id, stockin_detail_id, customer_id, customer_name, supplier_id, supplier_name from mydo_job_detail_finish + select job_detail_id, job_id, stock_id, lot_no, in_date, in_or_out_id, in_or_out_d_id, product_id, product_name, in_quantity, stock_quantity, out_quantity, stockin_id, stockin_detail_id, customer_id, customer_name, supplier_id, supplier_name,tray_type from mydo_job_detail_finish @@ -56,10 +58,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where job_detail_id = #{jobDetailId} + + + + insert into mydo_job_detail @@ -81,6 +90,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" customer_name, supplier_id, supplier_name, + tray_type #{jobDetailId}, @@ -101,6 +111,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{customerName}, #{supplierId}, #{supplierName}, + #{trayType} @@ -124,6 +135,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" customer_name = #{customerName}, supplier_id = #{supplierId}, supplier_name = #{supplierName}, + and tray_type = #{trayType} where job_detail_id = #{jobDetailId} @@ -132,6 +144,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" delete from mydo_job_detail where job_detail_id = #{jobDetailId} + + delete from mydo_job_detail where job_id = #{jobId} + + delete from mydo_job_detail where job_detail_id in diff --git a/ruoyi-admin/src/main/resources/mapper/in/MydoJobMapper.xml b/ruoyi-admin/src/main/resources/mapper/in/MydoJobMapper.xml index 0eee11d..6d4c8c4 100644 --- a/ruoyi-admin/src/main/resources/mapper/in/MydoJobMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/in/MydoJobMapper.xml @@ -28,21 +28,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - - - - - - + + + + + + + + + + - select job_id, status, task_no, in_or_out, execution_phase, tray_code, warehouse_id, warehouse_name, roadway_id, cargo_space_id, cargo_space_name, target_roadway_id, target_cargo_space_id, target_cargo_space_name, line_type, priority, height, weight, create_time, start_time, finish_time, entrance_id, exit_id, dept_id, dept_name, user_id, user_name, supplier_id, supplier_name, customer_id, customer_name from mydo_job + select job_id, status, task_no, in_or_out, execution_phase, tray_code, warehouse_id, warehouse_name, roadway_id, cargo_space_id, cargo_space_name, target_roadway_id, target_cargo_space_id, target_cargo_space_name, line_type, priority, height, weight, create_time, start_time, finish_time, entrance_id, exit_id, tray_type from mydo_job - select job_id, status, task_no, in_or_out, execution_phase, tray_code, warehouse_id, warehouse_name, roadway_id, cargo_space_id, cargo_space_name, target_roadway_id, target_cargo_space_id, target_cargo_space_name, line_type, priority, height, weight, create_time, start_time, finish_time, entrance_id, exit_id, dept_id, dept_name, user_id, user_name, supplier_id, supplier_name, customer_id, customer_name from mydo_job_finish + select job_id, status, task_no, in_or_out, execution_phase, tray_code, warehouse_id, warehouse_name, roadway_id, cargo_space_id, cargo_space_name, target_roadway_id, target_cargo_space_id, target_cargo_space_name, line_type, priority, height, weight, create_time, start_time, finish_time, entrance_id, exit_id, tray_type from mydo_job_finish + + + + + + + + - {call proc_hand_delete_in_job( - #{v_job_id,mode=IN,jdbcType=VARCHAR}, - #{v_result,mode=OUT,jdbcType=INTEGER}, - #{v_resultmsg,mode=OUT,jdbcType=VARCHAR} - )} - - + @@ -325,10 +344,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and create_time between #{params.beginCreateTime} and #{params.endCreateTime} and entrance_id = #{entranceId} and exit_id = #{exitId} - and dept_name like concat('%', #{deptName}, '%') - and user_name like concat('%', #{userName}, '%') - and supplier_name like concat('%', #{supplierName}, '%') - and customer_name like concat('%', #{customerName}, '%') + + + + + and tray_type = #{trayType} ${params.warehouseScope} diff --git a/ruoyi-admin/src/main/resources/mapper/out/OutStockoutDetailMapper.xml b/ruoyi-admin/src/main/resources/mapper/out/OutStockoutDetailMapper.xml index 1d00e89..4294f6e 100644 --- a/ruoyi-admin/src/main/resources/mapper/out/OutStockoutDetailMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/out/OutStockoutDetailMapper.xml @@ -10,6 +10,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -31,6 +32,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and lot_no = #{lotNo} and product_id = #{productId} and product_name like concat('%', #{productName}, '%') + and roller_number like concat('%', #{rollerNumber}, '%') + and quantity = #{quantity} and quantity = #{quantity} and allot_num = #{allotNum} and assign_num = #{assignNum} @@ -41,10 +44,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where stockout_detail_id = #{stockoutDetailId} + + + + + + + and request_time = #{requestTime} + and source_system = #{sourceSystem} + and target_system = #{targetSystem} + and endpoint = #{endpoint} + and request_url = #{requestUrl} + and request_method = #{requestMethod} + and request_headers = #{requestHeaders} + and request_body = #{requestBody} + and response_time = #{responseTime} + and response_body = #{responseBody} + and response_status = #{responseStatus} + and error_details = #{errorDetails} + and duration = #{duration} + and Is_successful = #{isSuccessful} + + + + + + + + + + insert into request_log + + request_time, + source_system, + target_system, + endpoint, + request_url, + request_method, + request_headers, + request_body, + response_time, + response_body, + response_status, + error_details, + duration, + Is_successful, + + + #{requestTime}, + #{sourceSystem}, + #{targetSystem}, + #{endpoint}, + #{requestUrl}, + #{requestMethod}, + #{requestHeaders}, + #{requestBody}, + #{responseTime}, + #{responseBody}, + #{responseStatus}, + #{errorDetails}, + #{duration}, + #{isSuccessful}, + + + + + update request_log + + request_time = #{requestTime}, + source_system = #{sourceSystem}, + target_system = #{targetSystem}, + endpoint = #{endpoint}, + request_url = #{requestUrl}, + request_method = #{requestMethod}, + request_headers = #{requestHeaders}, + request_body = #{requestBody}, + response_time = #{responseTime}, + response_body = #{responseBody}, + response_status = #{responseStatus}, + error_details = #{errorDetails}, + duration = #{duration}, + Is_successful = #{isSuccessful}, + + where request_id = #{requestId} + + + + delete from request_log where request_id = #{requestId} + + + + delete from request_log where request_id in + + #{requestId} + + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 8cd0a2f..f82d993 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -132,7 +132,7 @@ public class SecurityUtils */ public static boolean isAdmin(Long userId) { - return userId != null && 1L == userId; + return userId != null && !userId.equals(""); } /** diff --git a/ruoyi-ui/src/views/bas/stock/index.vue b/ruoyi-ui/src/views/bas/stock/index.vue index 5ec212b..70f00e8 100644 --- a/ruoyi-ui/src/views/bas/stock/index.vue +++ b/ruoyi-ui/src/views/bas/stock/index.vue @@ -128,9 +128,9 @@ @keyup.enter.native="handleQuery" /> - + - + @@ -501,7 +501,7 @@ export default { warehouseName: null, userName: null, deptName: null, - suplierName: null + supplierName: null }, // 表单参数 form: {}, @@ -563,8 +563,8 @@ export default { userName: null, deptId: null, deptName: null, - suplierId: null, - suplierName: null + supplierId: null, + supplierName: null } this.resetForm("form") }, diff --git a/sql/wms.sql b/sql/wms.sql index bc9f10c..fdc7952 100644 --- a/sql/wms.sql +++ b/sql/wms.sql @@ -1290,8 +1290,8 @@ CREATE TABLE [dbo].[bas_stock] ( [user_name] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, [dept_id] int NULL, [dept_name] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, - [suplier_id] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, - [suplier_name] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL + [supplier_id] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL, + [supplier_name] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL ) GO @@ -1463,14 +1463,14 @@ EXEC sp_addextendedproperty 'MS_Description', N'供应商id', 'SCHEMA', N'dbo', 'TABLE', N'bas_stock', -'COLUMN', N'suplier_id' +'COLUMN', N'supplier_id' GO EXEC sp_addextendedproperty 'MS_Description', N'供应商名称', 'SCHEMA', N'dbo', 'TABLE', N'bas_stock', -'COLUMN', N'suplier_name' +'COLUMN', N'supplier_name' GO EXEC sp_addextendedproperty @@ -2162,7 +2162,7 @@ GO INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'6', N'in_stockin', N'入库单据主信息表', NULL, NULL, N'InStockin', N'crud', N'element-ui', N'com.ruoyi.in.stockin', N'in', N'stockin', N'入库单据主信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:24:01.000', NULL) GO -INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'7', N'in_stockin_detail', N'入库单据子信息表', NULL, NULL, N'InStockinDetail', N'crud', N'element-ui', N'com.ruoyi.in.sotckindetail', N'in', N'sotckindetail', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:29:04.000', NULL) +INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'7', N'in_stockin_detail', N'入库单据子信息表', NULL, NULL, N'InStockinDetail', N'crud', N'element-ui', N'com.ruoyi.in.stockindetail', N'in', N'sotckindetail', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', N'{"genView":"0","parentMenuId":2000}', N'admin', N'2026-05-11 11:08:00.000', N'', N'2026-05-11 11:29:04.000', NULL) GO INSERT INTO [dbo].[gen_table] ([table_id], [table_name], [table_comment], [sub_table_name], [sub_table_fk_name], [class_name], [tpl_category], [tpl_web_type], [package_name], [module_name], [business_name], [function_name], [function_author], [form_col_num], [gen_type], [gen_path], [options], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'8', N'in_stockin_detail_finish', N'入库单据子信息表', NULL, NULL, N'InStockinDetailFinish', N'crud', N'element-ui', N'com.ruoyi.system', N'system', N'finish', N'入库单据子信息', N'ruoyi', N'1', N'0', N'/', NULL, N'admin', N'2026-05-11 11:08:00.000', N'', NULL, NULL)