From bf74d4a12912b309b4efe199d174a3e6b45304f7 Mon Sep 17 00:00:00 2001 From: youjie <272855983@qq.com> Date: Thu, 15 Jun 2023 15:14:36 +0800 Subject: [PATCH] 把生成任务的锁定容器和库位,集中到一起 --- huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java | 19 ++++++++----------- huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java | 8 ++++++++ huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java | 3 --- huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java | 7 ++++++- huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java | 90 ++++++++++++++++++++++++++++++++++++++---------------------------------------------------- huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java | 24 ++++++++---------------- huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskLockEntity.java | 9 +++++++++ huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java | 31 +++++++++++++++++++++++++++++++ huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java | 406 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------- huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java | 2 -- 10 files changed, 356 insertions(+), 243 deletions(-) create mode 100644 huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskLockEntity.java diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java index 1457086..096921c 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java @@ -5,22 +5,14 @@ import javax.servlet.http.HttpServletRequest; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; -import org.jeecg.modules.wms.api.wcs.entity.ArriveEntity; -import org.jeecg.modules.wms.api.wcs.entity.ManyEmptyDomain; -import org.jeecg.modules.wms.api.wcs.entity.ManyEmptyOutDomain; -import org.jeecg.modules.wms.api.wcs.entity.MaterialInfoEntity; -import org.jeecg.modules.wms.api.wcs.entity.TaskEntity; -import org.jeecg.modules.wms.api.wcs.entity.WarecellDomain; +import org.jeecg.modules.wms.api.wcs.entity.*; import org.jeecg.modules.wms.api.wcs.service.WcsService; import org.jeecg.modules.wms.framework.controller.HuahengBaseController; import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; import org.jeecg.utils.StringUtils; +import org.jeecg.utils.interceptor.AccessLimit; import org.jeecg.utils.support.ApiLogger; -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.ResponseBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -46,6 +38,7 @@ public class WcsController extends HuahengBaseController { @ResponseBody @ApiOperation("仓位分配") @ApiLogger(apiName = "仓位分配", from = "WCS") + @AccessLimit(seconds = 5, maxCount = 5) public Result warecellAllocation(@RequestBody WarecellDomain warecellDomain, HttpServletRequest req) { String warehouseCode = warecellDomain.getWarehouseCode(); String taskNo = warecellDomain.getTaskNo(); @@ -82,6 +75,7 @@ public class WcsController extends HuahengBaseController { @ResponseBody @ApiOperation("申请空托盘组入库") @ApiLogger(apiName = "申请空托盘组入库", from = "WCS") + @AccessLimit(seconds = 5, maxCount = 5) public Result manyEmptyIn(@RequestBody ManyEmptyDomain manyEmptyDomain) { String containerCode = manyEmptyDomain.getContainerCode(); String warehouseCode = manyEmptyDomain.getWarehouseCode(); @@ -117,6 +111,7 @@ public class WcsController extends HuahengBaseController { @ResponseBody @ApiOperation("申请空托盘组出库") @ApiLogger(apiName = "申请空托盘组出库", from = "WCS") + @AccessLimit(seconds = 5, maxCount = 5) public Result manyEmptyOut(@RequestBody ManyEmptyOutDomain manyEmptyOutDomain) { String toPortCode = manyEmptyOutDomain.getPort(); String warehouseCode = manyEmptyOutDomain.getWarehouseCode(); @@ -150,6 +145,7 @@ public class WcsController extends HuahengBaseController { @ResponseBody @ApiOperation("WCS任务完成") @ApiLogger(apiName = "WCS任务完成", from = "WCS") + @AccessLimit(seconds = 5, maxCount = 5) public Result completeTaskByWMS(@RequestBody TaskEntity taskEntity) { String taskNo = taskEntity.getTaskNo(); String lockKey = taskNo; @@ -185,6 +181,7 @@ public class WcsController extends HuahengBaseController { @ResponseBody @ApiOperation("到达拣选台") @ApiLogger(apiName = "到达拣选台", from = "WCS") + @AccessLimit(seconds = 5, maxCount = 5) public Result arrivedNotice(@RequestBody ArriveEntity arriveEntity) { String taskNo = arriveEntity.getTaskNo(); String port = arriveEntity.getPort(); diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java index 1e43e57..a6ac212 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/entity/WcsTask.java @@ -1,5 +1,7 @@ package org.jeecg.modules.wms.api.wcs.entity; +import org.jeecg.utils.constant.QuantityConstant; + import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -92,6 +94,11 @@ public class WcsTask { private String zoneCode; /** + * 平台 + */ + @ApiModelProperty(value = "平台") + private String platform = QuantityConstant.PLATFORM_WMS; + /** * 备注 */ @ApiModelProperty(value = "备注") @@ -114,4 +121,5 @@ public class WcsTask { */ @ApiModelProperty(value = "顺序数量") private int sequenceNumber; + } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java index 1c2a7b2..96a55c2 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java @@ -39,7 +39,6 @@ import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; import org.jeecg.utils.OkHttpUtils; import org.jeecg.utils.StringUtils; import org.jeecg.utils.constant.QuantityConstant; -import org.jeecg.utils.support.ApiLogger; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -262,7 +261,6 @@ public class WcsServiceImpl implements WcsService { @Override @Transactional(rollbackFor = Exception.class) - @ApiLogger(apiName = "任务下发", from = "WCS") @OperationLog(bizId = "#taskHeader.getId()", bizType = "'任务追踪'", tag = "'任务下发'", extra = "''", msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", recordReturnValue = true) @@ -471,7 +469,6 @@ public class WcsServiceImpl implements WcsService { wcsTask.setTaskType(800); break; case QuantityConstant.TASK_TYPE_OVER_STATION: - case QuantityConstant.TASK_TYPE_MANY_OVER_STATION: wcsTask.setTaskType(1000); break; default: diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java index b700566..139267c 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java @@ -30,7 +30,7 @@ public interface IReceiptContainerHeaderService extends IService<ReceiptContaine ReceiptContainerHeader getUnCompleteReceiptContainerByCode(String containerCode, String warehouseCode); - public Result<TaskHeader> createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode); + Result<TaskHeader> createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode); boolean updateStatusById(int status, int id); @@ -65,4 +65,9 @@ public interface IReceiptContainerHeaderService extends IService<ReceiptContaine * 更新去向toPort */ boolean updateToPortById(String toPort, int id); + + /** + * 更新去向toPort和状态status + */ + boolean updateToPortAndStatus(String toPort, int status, int id); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java index ae4e579..a33eaf6 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java @@ -11,9 +11,7 @@ import javax.annotation.Resource; import org.jeecg.common.api.vo.Result; import org.jeecg.common.exception.JeecgBootException; -import org.jeecg.modules.wms.config.container.entity.Container; import org.jeecg.modules.wms.config.container.service.IContainerService; -import org.jeecg.modules.wms.config.location.entity.Location; import org.jeecg.modules.wms.config.location.service.ILocationService; import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService; import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService; @@ -28,6 +26,7 @@ import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptDetailService import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptHeaderService; import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskLockEntity; import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService; import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; import org.jeecg.utils.StringUtils; @@ -115,63 +114,40 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai public Result<TaskHeader> createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode) { log.info("开始创建入库任务"); if (!receiptContainerHeader.getWarehouseCode().equals(warehouseCode)) { - return Result.error("id:" + receiptContainerHeader.getId() + "的入库组盘不能在" + warehouseCode + "仓库操作"); + return Result.error("创建入库任务, id:" + receiptContainerHeader.getId() + "的入库组盘不能在" + warehouseCode + "仓库操作"); } String containerCode = receiptContainerHeader.getContainerCode(); - Container container = containerService.getContainerByCode(containerCode, warehouseCode); - if (container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) { - return Result.error("托盘已经锁定,不能生成任务"); - } + String fromLocationCode = receiptContainerHeader.getFromLocationCode(); + String toLocationCode = receiptContainerHeader.getToLocationCode(); + int taskType = receiptContainerHeader.getTaskType(); + boolean success = false; List<ReceiptContainerDetail> receiptContainerDetailList = receiptContainerDetailService.getReceiptContainerDetailListByHeaderId(receiptContainerHeader.getId()); if (receiptContainerDetailList.size() == 0) { - return Result.error("id:" + receiptContainerHeader.getId() + "的入库组盘,没有组盘明细,请先组盘!"); - } - boolean success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("更新容器状态失败"); - } - String fromLocationCode = receiptContainerHeader.getFromLocationCode(); - String toLocaitonCode = receiptContainerHeader.getToLocationCode(); - if (StringUtils.isNotEmpty(fromLocationCode)) { - success = locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("更新起始库位状态失败"); - } - } - String zoneCode = null; - if (StringUtils.isNotEmpty(toLocaitonCode)) { - if (!toLocaitonCode.equals(fromLocationCode)) { - success = locationService.updateStatus(toLocaitonCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("更新目标库位状态失败"); - } - } - Location toLocation = locationService.getLocationByCode(toLocaitonCode, warehouseCode); - if (!toLocation.getWarehouseCode().equals(warehouseCode)) { - throw new JeecgBootException("库位对应的仓库不匹配"); - } - zoneCode = toLocation.getZoneCode(); - // 旁边库位有任务 - if (taskHeaderService.haveUncompleteTaskInNear(toLocation)) { - throw new JeecgBootException("旁边库位任务数大于0"); - } + return Result.error("创建入库任务, id:" + receiptContainerHeader.getId() + "的入库组盘,没有组盘明细,请先组盘!"); } int receiptContainerStatus = receiptContainerHeader.getStatus(); if (receiptContainerStatus != QuantityConstant.RECEIPT_CONTAINER_BUILD) { - throw new JeecgBootException("入库组盘状态不是创建状态"); + return Result.error("创建入库任务, 入库组盘状态不是创建状态"); } String containerFillStatus = QuantityConstant.STATUS_CONTAINER_FILL_SOME; if (!StringUtils.isEmpty(receiptContainerHeader.getContainerFillStatus())) { containerFillStatus = receiptContainerHeader.getContainerFillStatus(); } + // 锁定容器和库位 + Result result = taskHeaderService.createTaskLockContainerAndLocation(taskType, containerCode, fromLocationCode, toLocationCode, warehouseCode); + if (!result.isSuccess()) { + return result; + } + TaskLockEntity taskLockEntity = (TaskLockEntity)result.getResult(); + String zoneCode = taskLockEntity.getZoneCode(); TaskHeader taskHeader = new TaskHeader(); taskHeader.setContainerCode(containerCode); taskHeader.setContainerFillStatus(containerFillStatus); taskHeader.setTaskType(receiptContainerHeader.getTaskType()); taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT); taskHeader.setFromLocationCode(fromLocationCode); - taskHeader.setToLocationCode(toLocaitonCode); + taskHeader.setToLocationCode(toLocationCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); taskHeader.setCompanyCode(receiptContainerHeader.getCompanyCode()); taskHeader.setReceiptContainerHeaderId(receiptContainerHeader.getId()); @@ -180,7 +156,7 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai taskHeader.setToPortCode(receiptContainerHeader.getToPort()); success = taskHeaderService.save(taskHeader); if (!success) { - throw new JeecgBootException("任务生成失败"); + throw new JeecgBootException("创建入库任务, 任务生成失败"); } int taskHeaderId = taskHeader.getId(); List<TaskDetail> taskDetailList = new ArrayList<>(); @@ -206,7 +182,7 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai taskDetailList.add(taskDetail); ReceiptDetail receiptDetail = receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId()); if (receiptDetail == null) { - throw new JeecgBootException("根据id:" + receiptContainerDetail.getReceiptDetailId() + ",没有找到入库单详情"); + throw new JeecgBootException("创建入库任务, 根据id:" + receiptContainerDetail.getReceiptDetailId() + ",没有找到入库单详情"); } Integer receiptId = receiptDetail.getReceiptId(); receiptDetail = new ReceiptDetail(); @@ -215,33 +191,33 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_WAIT_SHELF); receiptDetailList.add(receiptDetail); } + if (taskDetailList.size() == 0) { + throw new JeecgBootException("创建入库任务, 任务详情为空"); + } success = taskDetailService.saveBatch(taskDetailList); if (!success) { - throw new JeecgBootException("任务详情生成失败"); + throw new JeecgBootException("创建入库任务, 任务详情生成失败"); } if (receiptContainerHeader.getTaskType() == QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT) { success = inventoryHeaderService.updateInventoryContainerStatusByContainerCode(containerCode, warehouseCode); if (!success) { - throw new JeecgBootException("生成任务时, 更新库存头失败"); + throw new JeecgBootException("创建入库任务, 更新库存头失败"); } } - ReceiptContainerHeader receiptContainerHeader1 = new ReceiptContainerHeader(); - receiptContainerHeader1.setId(receiptContainerHeader.getId()); - receiptContainerHeader1.setToPort(receiptContainerHeader.getToPort()); - receiptContainerHeader1.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK); - success = this.updateById(receiptContainerHeader1); + success = receiptContainerHeaderService.updateToPortAndStatus(receiptContainerHeader.getToPort(), QuantityConstant.RECEIPT_CONTAINER_TASK, + receiptContainerHeader.getId()); if (!success) { - throw new JeecgBootException("生成任务时,更新入库组盘头失败"); + throw new JeecgBootException("创建入库任务,更新入库组盘头失败"); } success = receiptDetailService.updateBatchById(receiptDetailList); if (!success) { - throw new JeecgBootException("更新入库单明细失败"); + throw new JeecgBootException("创建入库任务,更新入库单明细失败"); } List<Integer> receiptIdList = receiptDetailList.stream().map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList()); for (Integer receiptId : receiptIdList) { success = receiptHeaderService.updateReceiptHeaderStatus(receiptId); if (!success) { - throw new JeecgBootException("更新入库单明细失败"); + throw new JeecgBootException("创建入库任务, 更新入库单明细失败"); } } LogRecordContext.putVariable("taskHeader", taskHeader);// 操作日志收集 @@ -447,4 +423,14 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai return success; } + @Override + public boolean updateToPortAndStatus(String toPort, int status, int id) { + ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader(); + receiptContainerHeader.setToPort(toPort); + receiptContainerHeader.setStatus(status); + receiptContainerHeader.setId(id); + boolean success = updateById(receiptContainerHeader); + return success; + } + } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java index bb7d478..54ce4b0 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java @@ -470,6 +470,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi if (StringUtils.isEmpty(fromLocationCode)) { return Result.error("生成出库任务时, 出库组盘头没有起始库位号"); } + // 出库时,外侧库位的任务,如果对应的内侧有任务,那么内侧任务执行完成以后,再执行出库任务。 Location location = locationService.getLocationByCode(fromLocationCode, warehouseCode); if (location == null) { return Result.error("生成出库任务时, 库位号" + fromLocationCode + "没有找到库位"); @@ -484,21 +485,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi } } } - Container container = containerService.getContainerByCode(containerCode, warehouseCode); - if (container == null) { - return Result.error("生成出库任务时, 托盘不存在" + containerCode); - } - if (container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) { - return Result.error("生成出库任务时, 托盘已经锁定" + containerCode); - } - boolean success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("生成出库任务时, 更新容器失败" + containerCode); - } - success = locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("生成出库任务时, 更新库位失败" + fromLocationCode); - } + // 根据出库数量,判断任务类型 List<InventoryDetail> inventoryDetailList = inventoryDetailService.getInventoryDetailListByContainerCode(containerCode, warehouseCode); BigDecimal inventoryTotal = BigDecimal.ZERO; for (InventoryDetail inventoryDetail : inventoryDetailList) { @@ -521,6 +508,11 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi if (shipmentTaskRule == QuantityConstant.RULE_TASK_PICK_SHIPMENT) { taskType = QuantityConstant.TASK_TYPE_SORTINGSHIPMENT; } + // 锁定容器、库位 + Result result = taskHeaderService.createTaskLockContainerAndLocation(taskType, containerCode, fromLocationCode, toLocationCode, warehouseCode); + if (!result.isSuccess()) { + return result; + } String zoneCode = location.getZoneCode(); TaskHeader taskHeader = new TaskHeader(); taskHeader.setPreTaskNo(preTaskNo); @@ -539,7 +531,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi taskHeader.setToLocationCode(toLocationCode); } taskHeader.setShipmentContainerHeaderId(shipmentContainerHeader.getId()); - success = taskHeaderService.save(taskHeader); + boolean success = taskHeaderService.save(taskHeader); if (!success) { throw new JeecgBootException("生成出库任务时, 创建任务失败"); } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskLockEntity.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskLockEntity.java new file mode 100644 index 0000000..c1e2f1e --- /dev/null +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskLockEntity.java @@ -0,0 +1,9 @@ +package org.jeecg.modules.wms.task.taskHeader.entity; + +import lombok.Data; + +@Data +public class TaskLockEntity { + + private String zoneCode; +} diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java index 8cf5abf..a88114b 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java @@ -318,4 +318,35 @@ public interface ITaskHeaderService extends IService<TaskHeader> { * @return */ boolean combineInventoryDetail(TaskHeader taskHeader); + + /** + * 根据任务区分,在生产任务的时候,锁定容器和库位 + * @param + */ + Result createTaskLockContainerAndLocation(int taskType, String containerCode, String fromLocationCode, String toLocationCode, String warehouseCode); + + /** + * 入库任务,在生产任务的时候,锁定容器和库位 + * @param + */ + Result createReceiptTaskLockContainerAndLocation(String containerCode, String toLocationCode, String warehouseCode); + + /** + * 出库任务,在生产任务的时候,锁定容器和库位 + * @param + */ + Result createShipmentTaskLockContainerAndLocation(String containerCode, String warehouseCode); + + /** + * 分拣任务,在生产任务的时候,锁定容器和库位 + * @param + */ + Result createSortTaskLockContainerAndLocation(String containerCode, String fromLocationCode, String toLocationCode, String warehouseCode); + + /** + * 跨站任务,在生产任务的时候,锁定容器和库位 + * @param + */ + Result createOverStationTaskLockContainer(String containerCode, String warehouseCode); + } diff --git a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java index e6299ab..01bd362 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java @@ -53,6 +53,7 @@ import org.jeecg.modules.wms.stocktaking.cycleCountDetail.service.impl.CycleCoun import org.jeecg.modules.wms.stocktaking.cycleCountHeader.service.impl.CycleCountHeaderServiceImpl; import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; +import org.jeecg.modules.wms.task.taskHeader.entity.TaskLockEntity; import org.jeecg.modules.wms.task.taskHeader.mapper.TaskDetailMapper; import org.jeecg.modules.wms.task.taskHeader.mapper.TaskHeaderMapper; import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService; @@ -183,6 +184,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea @Transactional(rollbackFor = Exception.class) public Result<TaskHeader> createTransferTask(String fromLocationCode, String toLocationCode, String warehouseCode) { log.info("开始创建移库任务,起始库位" + fromLocationCode + ",目标库位" + toLocationCode); + int preTaskNo = 0; if (StringUtils.isEmpty(fromLocationCode)) { return Result.error("创建移库任务时,起始库位为空"); } @@ -190,18 +192,14 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea return Result.error("创建移库任务时,目标库位为空"); } Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); - Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); - Integer preTaskNo = 0; - // 1. 判断起点库位和终点库位是否满足移库条件 if (fromLocation == null) { return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "未找到"); } - if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(fromLocation.getStatus())) { - return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "状态非空闲"); - } - if (StringUtils.isEmpty(fromLocation.getContainerCode())) { - return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "不存在托盘"); + Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); + if (fromLocation == null) { + return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "未找到"); } + String containerCode = fromLocation.getContainerCode(); // 这里增加组盘校验,如果此托盘存在未完成的组盘数据,则不能移库 // 校验入库组盘 if (receiptContainerHeaderService.havaUnCompleteCombineByLocationCode(fromLocationCode, warehouseCode)) { @@ -212,15 +210,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "存在出库组盘,不能移库"); } - if (toLocation == null) { - return Result.error("创建移库任务时,目标库位:" + toLocationCode + "未找到"); - } - if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(toLocation.getStatus())) { - return Result.error("创建移库任务时,目标库位:" + toLocationCode + "状态非空闲"); - } - if (StringUtils.isNotEmpty(toLocation.getContainerCode())) { - return Result.error("创建移库任务时,目标库位:" + toLocationCode + "存在托盘"); - } // 校验入库组盘 if (receiptContainerHeaderService.havaUnCompleteCombineByLocationCode(toLocationCode, warehouseCode)) { return Result.error("创建移库任务时,目标库位:" + toLocationCode + "存在入库组盘,不能移库"); @@ -232,7 +221,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (taskHeaderService.haveUncompleteTaskInNear(toLocation)) { return Result.error("创建移库任务时,目标库位:" + toLocationCode + "旁边存在任务,请完成任务以后再分配"); } - if (!fromLocation.getRoadWay().equals(toLocation.getRoadWay())) { return Result.error("创建移库任务时,目标库位和源库位不在同一个巷道"); } @@ -266,6 +254,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea } } + Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_TRANSFER, containerCode, fromLocationCode, toLocationCode, + warehouseCode); + if (!result.isSuccess()) { + return result; + } // 4. 判断源库位旁边有托盘但是没有任务,那么不允许移库 TaskHeader taskHeader = new TaskHeader(); taskHeader.setWarehouseCode(warehouseCode); @@ -281,21 +274,9 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (!success) { throw new JeecgBootException("创建移库任务时,创建任务失败"); } - - success = locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建移库任务时, 起始库位" + fromLocationCode + "更新失败"); - } - success = locationService.updateStatus(toLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建移库任务时, 终点库位" + toLocationCode + "更新失败"); - } - success = containerService.updateStatus(fromLocation.getContainerCode(), QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); log.info("完成创建移库任务,起始库位" + fromLocationCode + ",目的库位" + toLocationCode); - if (!success) { - throw new JeecgBootException("创建移库任务时,容器" + fromLocation.getContainerCode() + "更新失败"); - } return Result.OK("创建移库任务成功", taskHeader); + } @Override @@ -315,10 +296,13 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (container == null) { return Result.error("创建出库查看任务时,容器为空"); } - if (container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) { - return Result.error("创建出库查看任务时,容器是锁定状态"); - } String fromLocationCode = container.getLocationCode(); + String toLocationCode = QuantityConstant.EMPTY_STRING; + String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_TASK_LOCATION); + int taskLocationRule = Integer.parseInt(value); + if (taskLocationRule == QuantityConstant.RULE_TASK_SET_LOCATION) { + toLocationCode = fromLocationCode; + } if (StringUtils.isEmpty(fromLocationCode)) { return Result.error("创建出库查看任务时,容器不在库位上"); } @@ -331,6 +315,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (port == null) { return Result.error("创建出库查看任务时,没有找到出库口:" + toPortCode); } + Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_CHECK_OUT, containerCode, fromLocationCode, toLocationCode, + warehouseCode); + if (!result.isSuccess()) { + return result; + } boolean success = false; LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode).eq(InventoryDetail::getWarehouseCode, warehouseCode) @@ -350,14 +339,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea throw new JeecgBootException("创建出库查看任务时,更新库存详情失败"); } } - success = locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建出库查看任务时,更新库位状态失败"); - } - success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建出库查看任务时,更新容器状态失败"); - } TaskHeader taskHeader = new TaskHeader(); taskHeader.setWarehouseCode(warehouseCode); taskHeader.setTaskType(QuantityConstant.TASK_TYPE_CHECK_OUT); @@ -366,11 +347,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea taskHeader.setZoneCode(zoneCode); taskHeader.setFromLocationCode(fromLocationCode); taskHeader.setToPortCode(toPortCode); - String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_TASK_LOCATION); - int taskLocationRule = Integer.parseInt(value); - if (taskLocationRule == QuantityConstant.RULE_TASK_SET_LOCATION) { - taskHeader.setToLocationCode(fromLocationCode); - } + taskHeader.setToLocationCode(toLocationCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); success = taskHeaderService.save(taskHeader); log.info("完成创建出库查看任务,容器编码" + containerCode + "目标站台号" + toPortCode); @@ -396,16 +373,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (StringUtils.isEmpty(warehouseCode)) { return Result.error("创建跨站任务时,仓库编码为空"); } - Container container = containerService.getContainerByCode(containerCode, warehouseCode); - if (container == null) { - return Result.error("创建跨站任务时,容器为空"); - } - if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { - return Result.error("创建跨站任务时, 容器状态不为空闲状态"); - } - if (!container.getFillStatus().equals(QuantityConstant.STATUS_CONTAINER_FILL_EMPTY)) { - return Result.error("创建跨站任务时,容器状态不为空托盘"); - } Port fromPort = portService.getPortByCode(fromPortCode, warehouseCode); if (fromPort == null) { return Result.error("创建跨站任务时,起始站台为空"); @@ -414,7 +381,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (toPort == null) { return Result.error("创建跨站任务时,目标站台为空"); } - + Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_OVER_STATION, containerCode, QuantityConstant.EMPTY_STRING, + QuantityConstant.EMPTY_STRING, warehouseCode); + if (!result.isSuccess()) { + return result; + } TaskHeader taskHeader = new TaskHeader(); taskHeader.setWarehouseCode(warehouseCode); taskHeader.setContainerCode(containerCode); @@ -427,11 +398,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (!success) { return Result.error("创建跨站任务时, 创建任务失败"); } - success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); log.info("完成创建跨站任务,容器号" + containerCode + ",起始站台号" + fromPortCode + ",目标站台号" + toPortCode); - if (!success) { - return Result.error("创建跨站任务时, 更新容器状态失败"); - } return Result.ok("创建跨站任务成功"); } @@ -511,35 +478,13 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea } log.info("开始创建空托盘组入库任务,容器编码" + containerCode + ",库位编码" + toLocationCode); String zoneCode = null; - Container container = containerService.getContainerByCode(containerCode, warehouseCode); - if (container == null) { - return Result.error("创建空托盘组入库任务时,没有找到容器"); - } - if (StringUtils.isNotEmpty(container.getLocationCode())) { - return Result.error("创建空托盘组入库任务时, 容器已在库位" + container.getLocationCode() + "上"); - } - if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { - return Result.error("创建空托盘组入库任务时,容器状态不为空闲状态"); - } - if (!container.getFillStatus().equals(QuantityConstant.STATUS_CONTAINER_FILL_EMPTY)) { - return Result.error("创建空托盘组入库任务时,容器状态不为空托盘"); - } - boolean success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建空托盘组入库任务时, 更新容器状态失败"); + Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_MANY_EMPTYRECEIPT, containerCode, + QuantityConstant.EMPTY_STRING, toLocationCode, warehouseCode); + if (!result.isSuccess()) { + return result; } if (StringUtils.isNotEmpty(toLocationCode)) { Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); - if (toLocation == null) { - return Result.error("创建空托盘组入库任务时,没有找到目标库位"); - } - if (!toLocation.getStatus().equals(QuantityConstant.STATUS_LOCATION_EMPTY)) { - return Result.error("创建空托盘组入库任务时,目标库位状态不是空闲"); - } - success = locationService.updateStatus(toLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建空托盘组入库任务时, 更新库位状态失败"); - } zoneCode = toLocation.getZoneCode(); } TaskHeader taskHeader = new TaskHeader(); @@ -550,7 +495,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea taskHeader.setToLocationCode(toLocationCode); taskHeader.setZoneCode(zoneCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); - success = taskHeaderService.save(taskHeader); + boolean success = taskHeaderService.save(taskHeader); log.info("完成创建空托盘组入库任务,容器编码" + containerCode + ",库位编码" + toLocationCode); if (!success) { throw new JeecgBootException("创建空托盘组入库任务时, 创建任务失败"); @@ -571,20 +516,13 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (StringUtils.isEmpty(warehouseCode)) { return Result.error("创建空托盘组出库任务时,仓库编码为空"); } - Container container = containerService.getContainerByCode(containerCode, warehouseCode); - if (container == null) { - return Result.error("创建空托盘组出库任务时, 没有找到容器:" + containerCode); - } - if (!QuantityConstant.STATUS_CONTAINER_EMPTY.equals(container.getStatus())) { - return Result.error("创建空托盘组出库任务时, 容器状态不为空闲状态"); - } - if (!QuantityConstant.STATUS_CONTAINER_FILL_MANY.equals(container.getFillStatus())) { - return Result.error("创建空托盘组出库任务时, 容器填充状态不为空托盘组状态"); + Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_MANY_EMPTYSHIPMENT, containerCode, + QuantityConstant.EMPTY_STRING, QuantityConstant.EMPTY_STRING, warehouseCode); + if (!result.isSuccess()) { + return result; } + Container container = containerService.getContainerByCode(containerCode, warehouseCode); String fromLocationCode = container.getLocationCode(); - if (StringUtils.isEmpty(fromLocationCode)) { - return Result.error("创建空托盘组出库任务时, 该容器不在库位上"); - } Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); if (fromLocation == null) { return Result.error("创建空托盘组出库任务时, 没有找到库位:" + fromLocationCode); @@ -593,14 +531,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (StringUtils.isEmpty(zoneCode)) { return Result.error("创建空托盘组出库任务时, 库区为空"); } - boolean success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建空托盘组出库任务时, 更新容器状态失败"); - } - success = locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建空托盘组出库任务时, 更新库位状态失败"); - } TaskHeader taskHeader = new TaskHeader(); taskHeader.setWarehouseCode(warehouseCode); taskHeader.setZoneCode(zoneCode); @@ -610,7 +540,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea taskHeader.setFromLocationCode(fromLocationCode); taskHeader.setToPortCode(toPortCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); - success = taskHeaderService.save(taskHeader); + boolean success = taskHeaderService.save(taskHeader); log.info("完成创建空托盘组出库任务,容器编码" + containerCode + ",去向位置编码" + toPortCode); if (!success) { throw new JeecgBootException("创建空托盘组出库任务时,生成任务失败"); @@ -982,36 +912,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (StringUtils.isEmpty(warehouseCode)) { return Result.error("创建空托盘入库时, 仓库编码为空"); } - Container container = containerService.getContainerByCode(containerCode, warehouseCode); - if (container == null) { - return Result.error("创建空托盘入库时, 没有找到托盘" + containerCode); - } - if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { - return Result.error("创建空托盘入库时, 托盘状态并非空托盘状态"); - } - if (StringUtils.isNotEmpty(container.getLocationCode())) { - return Result.error("创建空托盘入库时, 容器已在库位" + container.getLocationCode() + "上"); - } - if (StringUtils.isNotEmpty(toLocationCode)) { - Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); - if (toLocation == null) { - return Result.error("创建空托盘入库时," + toLocationCode + "目标库位不存在"); - } - if (StringUtils.isNotEmpty(toLocation.getContainerCode())) { - return Result.error("创建空托盘入库时," + toLocationCode + "上已存在容器" + toLocation.getContainerCode()); - } - if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(toLocation.getStatus())) { - return Result.error("创建空托盘入库时, 目标库位非空闲"); - } - boolean success = locationService.updateStatus(toLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建空托盘入库时,更新库位状态失败"); - } - } - boolean success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建空托盘入库时,更新容器状态失败"); + Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_EMPTYRECEIPT, containerCode, QuantityConstant.EMPTY_STRING, + toLocationCode, warehouseCode); + if (!result.isSuccess()) { + return result; } TaskHeader taskHeader = new TaskHeader(); taskHeader.setWarehouseCode(warehouseCode); @@ -1020,7 +925,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT); taskHeader.setToLocationCode(toLocationCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); - success = taskHeaderService.save(taskHeader); + boolean success = taskHeaderService.save(taskHeader); log.info("完成创建空托入库任务"); if (!success) { throw new JeecgBootException("创建空托盘入库时,保存任务失败"); @@ -1049,15 +954,11 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea return Result.error("创建空托盘出库时, 仓库编码为空"); } Container container = containerService.getContainerByCode(containerCode, warehouseCode); - if (container == null) { - return Result.error("创建空托盘出库时, 没有找到托盘" + containerCode); - } - if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { - return Result.error("创建空托盘出库时, 托盘状态并非空托盘状态"); - } String fromLocationCode = container.getLocationCode(); - if (StringUtils.isEmpty(fromLocationCode)) { - return Result.error("创建空托盘出库时, 容器不在库位上"); + Result result = taskHeaderService.createTaskLockContainerAndLocation(QuantityConstant.TASK_TYPE_EMPTYSHIPMENT, containerCode, QuantityConstant.EMPTY_STRING, + QuantityConstant.EMPTY_STRING, warehouseCode); + if (!result.isSuccess()) { + return result; } Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); if (fromLocation == null) { @@ -1071,14 +972,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (port == null) { return Result.error("创建空托盘出库时, 没有找到出库口" + toPortCode); } - boolean success = locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建空托盘出库时,更新库位状态失败"); - } - success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); - if (!success) { - throw new JeecgBootException("创建空托盘出库时,更新容器状态失败"); - } TaskHeader taskHeader = new TaskHeader(); taskHeader.setWarehouseCode(warehouseCode); taskHeader.setZoneCode(zoneCode); @@ -1088,7 +981,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea taskHeader.setFromLocationCode(fromLocationCode); taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); taskHeader.setToPortCode(toPortCode); - success = taskHeaderService.save(taskHeader); + boolean success = taskHeaderService.save(taskHeader); log.info("完成创建空托出库任务" + containerCode); if (!success) { throw new JeecgBootException("创建空托盘出库时,保存任务失败"); @@ -1238,7 +1131,6 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea if (!success) { throw new JeecgBootException("完成入库任务时,更新入库组盘头表状态失败"); } - success = inventoryDetailService.saveBatch(inventoryDetailList); if (!success) { throw new JeecgBootException("完成入库任务时,保存库存详情失败"); @@ -1578,6 +1470,204 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea } /** + * 锁定容器和库位分4种情况,入库任务、出库任务、分拣任务、换站任务 + * @param + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Result createTaskLockContainerAndLocation(int taskType, String containerCode, String fromLocationCode, String toLocationCode, String warehouseCode) { + Result result = null; + switch (taskType) { + case QuantityConstant.TASK_TYPE_WHOLERECEIPT: + case QuantityConstant.TASK_TYPE_EMPTYRECEIPT: + case QuantityConstant.TASK_TYPE_MANY_EMPTYRECEIPT: + result = taskHeaderService.createReceiptTaskLockContainerAndLocation(containerCode, toLocationCode, warehouseCode); + break; + case QuantityConstant.TASK_TYPE_WHOLESHIPMENT: + case QuantityConstant.TASK_TYPE_EMPTYSHIPMENT: + case QuantityConstant.TASK_TYPE_MANY_EMPTYSHIPMENT: + result = taskHeaderService.createShipmentTaskLockContainerAndLocation(containerCode, warehouseCode); + break; + case QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT: + case QuantityConstant.TASK_TYPE_SORTINGSHIPMENT: + case QuantityConstant.TASK_TYPE_CYCLECOUNT: + case QuantityConstant.TASK_TYPE_TRANSFER: + case QuantityConstant.TASK_TYPE_CHECK_OUT: + result = taskHeaderService.createSortTaskLockContainerAndLocation(containerCode, fromLocationCode, toLocationCode, warehouseCode); + break; + case QuantityConstant.TASK_TYPE_OVER_STATION: + result = taskHeaderService.createOverStationTaskLockContainer(containerCode, warehouseCode); + break; + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createReceiptTaskLockContainerAndLocation(String containerCode, String toLocationCode, String warehouseCode) { + boolean success = false; + TaskLockEntity taskLockEntity = new TaskLockEntity(); + String zoneCode = null; + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("创建入库任务时, 没有找到托盘" + containerCode); + } + if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { + return Result.error("创建入库任务时, 托盘状态并非空闲状态"); + } + if (StringUtils.isNotEmpty(container.getLocationCode())) { + return Result.error("创建入库任务时, 容器已在库位" + container.getLocationCode() + "上"); + } + if (StringUtils.isNotEmpty(toLocationCode)) { + String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_ALLOCATION); + if (StringUtils.isEmpty(value)) { + return Result.error("创建入库任务时, 未绑定定位规则"); + } + int allocationRule = Integer.parseInt(value); + if (allocationRule == QuantityConstant.DOUBLE_FORK) { + return Result.error("创建入库任务时, 双伸位库位不能手动指定库位"); + } + Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); + if (toLocation == null) { + return Result.error("创建入库任务时," + toLocationCode + "目标库位不存在"); + } + if (StringUtils.isNotEmpty(toLocation.getContainerCode())) { + return Result.error("创建入库任务时," + toLocationCode + "上已存在容器" + toLocation.getContainerCode()); + } + if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(toLocation.getStatus())) { + return Result.error("创建入库任务时, 目标库位非空闲"); + } + zoneCode = toLocation.getZoneCode(); + } + taskLockEntity.setZoneCode(zoneCode); + success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); + if (!success) { + throw new JeecgBootException("创建入库任务时,更新容器状态失败"); + } + if (StringUtils.isNotEmpty(toLocationCode)) { + success = locationService.updateStatus(toLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); + if (!success) { + throw new JeecgBootException("创建入库任务时,更新库位状态失败"); + } + } + return Result.OK("创建入库任务成功", taskLockEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createShipmentTaskLockContainerAndLocation(String containerCode, String warehouseCode) { + boolean success = false; + TaskLockEntity taskLockEntity = new TaskLockEntity(); + String zoneCode = null; + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("创建出库任务时, 没有找到托盘" + containerCode); + } + if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { + return Result.error("创建出库任务时, 托盘状态并非空闲状态"); + } + if (StringUtils.isEmpty(container.getLocationCode())) { + return Result.error("创建出库任务时, 容器不在库位" + container.getLocationCode() + "上"); + } + String fromLocationCode = container.getLocationCode(); + Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); + if (fromLocation == null) { + return Result.error("创建出库任务时, 起始库位为空"); + } + if (StringUtils.isEmpty(fromLocation.getContainerCode())) { + return Result.error("创建出库任务时," + fromLocationCode + "上已存在容器" + fromLocation.getContainerCode()); + } + if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(fromLocation.getStatus())) { + return Result.error("创建出库任务时, 起始库位非空闲"); + } + zoneCode = fromLocation.getZoneCode(); + taskLockEntity.setZoneCode(zoneCode); + success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); + if (!success) { + throw new JeecgBootException("创建出库任务时,更新容器状态失败"); + } + success = locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); + if (!success) { + throw new JeecgBootException("创建出库任务时,更新库位状态失败"); + } + return Result.OK("创建出库任务成功", taskLockEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createSortTaskLockContainerAndLocation(String containerCode, String fromLocationCode, String toLocationCode, String warehouseCode) { + boolean success = false; + TaskLockEntity taskLockEntity = new TaskLockEntity(); + String zoneCode = null; + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("创建分拣任务时, 没有找到托盘" + containerCode); + } + if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { + return Result.error("创建分拣任务时, 托盘状态并非空闲状态"); + } + if (StringUtils.isEmpty(container.getLocationCode())) { + return Result.error("创建分拣任务时, 容器不在库位" + container.getLocationCode() + "上"); + } + Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); + if (fromLocation == null) { + return Result.error("创建分拣任务时, 起始库位为空"); + } + if (StringUtils.isEmpty(fromLocation.getContainerCode())) { + return Result.error("创建分拣任务时," + fromLocationCode + "上已存在容器" + fromLocation.getContainerCode()); + } + if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(fromLocation.getStatus())) { + return Result.error("创建分拣任务时, 起始库位非空闲"); + } + zoneCode = fromLocation.getZoneCode(); + taskLockEntity.setZoneCode(zoneCode); + if (StringUtils.isNotEmpty(toLocationCode)) { + Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); + if (toLocation == null) { + return Result.error("创建分拣任务时," + toLocationCode + "目标库位不存在"); + } + if (StringUtils.isNotEmpty(toLocation.getContainerCode())) { + return Result.error("创建分拣任务时," + toLocationCode + "上已存在容器" + toLocation.getContainerCode()); + } + if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(toLocation.getStatus())) { + return Result.error("创建分拣任务时, 目标库位非空闲"); + } + } + success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); + if (!success) { + throw new JeecgBootException("创建分拣任务时,更新容器状态失败"); + } + success = locationService.updateStatus(fromLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); + if (!success) { + throw new JeecgBootException("创建分拣任务时,更新库位状态失败"); + } + if (StringUtils.isNotEmpty(toLocationCode)) { + success = locationService.updateStatus(toLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); + if (!success) { + throw new JeecgBootException("创建分拣任务时,更新库位状态失败"); + } + } + return Result.OK("创建分拣任务成功", taskLockEntity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createOverStationTaskLockContainer(String containerCode, String warehouseCode) { + Container container = containerService.getContainerByCode(containerCode, warehouseCode); + if (container == null) { + return Result.error("创建跨站任务时,容器为空"); + } + if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { + return Result.error("创建跨站任务时, 容器状态不为空闲状态"); + } + boolean success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); + if (!success) { + throw new JeecgBootException("创建跨站任务时,更新容器状态失败"); + } + return Result.ok("创建跨站任务成功"); + } + + /** * 完成空托盘入库任务 * @param taskHeader 任务 * @return Result 完成入库任务结果 diff --git a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java index 699e298..afd9c1d 100644 --- a/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java +++ b/huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java @@ -185,8 +185,6 @@ public class QuantityConstant { /** 空托盘组出库 */ public static final int TASK_TYPE_MANY_EMPTYSHIPMENT = 1200; - /** 空托盘组换站 */ - public static final int TASK_TYPE_MANY_OVER_STATION = 1300; // 7、任务状态 -- libgit2 0.22.2