From aea84c5981ff3eae3511d4fc3d074850895af54f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 11 Mar 2026 00:53:50 +0800 Subject: [PATCH] ✨ feat(mes): 更新盘点方案参数类型枚举及相关逻辑 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskController.java | 5 +++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java | 16 ++++++++++++++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java | 10 +++++----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineService.java | 28 +++++++++++++++++++++++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineServiceImpl.java | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java | 14 ++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java | 10 ++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------- 9 files changed, 206 insertions(+), 128 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskController.java index 91edb07..5318aa5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskController.java @@ -122,9 +122,10 @@ public class MesWmStockTakingTaskController { @PutMapping("/cancel") @Operation(summary = "取消盘点任务") + @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')") - public CommonResult cancelStockTakingTask(@Valid @RequestBody MesWmStockTakingTaskCancelReqVO reqVO) { - stockTakingTaskService.cancelStockTakingTask(reqVO.getId()); + public CommonResult cancelStockTakingTask(@RequestParam("id") Long id) { + stockTakingTaskService.cancelStockTakingTask(id); return success(true); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java index beaf2b4..44e1cde 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java @@ -55,13 +55,25 @@ public class MesWmStockTakingTaskLineController { @Resource private MesWmWarehouseAreaService areaService; + @GetMapping("/get") + @Operation(summary = "获得盘点任务行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')") + public CommonResult getStockTakingTaskLine(@RequestParam("id") Long id) { + MesWmStockTakingTaskLineDO line = stockTakingTaskLineService.getStockTakingTaskLine(id); + if (line == null) { + return success(null); + } + return success(buildStockTakingTaskLineRespVOList(Collections.singletonList(line)).get(0)); + } + @GetMapping("/page") @Operation(summary = "获得盘点任务行分页") @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')") public CommonResult> getStockTakingTaskLinePage( @Valid MesWmStockTakingTaskLinePageReqVO pageReqVO) { PageResult pageResult = stockTakingTaskLineService.getStockTakingTaskLinePage(pageReqVO); - return success(new PageResult<>(buildTaskLineRespVOList(pageResult.getList()), pageResult.getTotal())); + return success(new PageResult<>(buildStockTakingTaskLineRespVOList(pageResult.getList()), pageResult.getTotal())); } @PostMapping("/create") @@ -90,7 +102,7 @@ public class MesWmStockTakingTaskLineController { // ==================== 拼接 VO ==================== - private List buildTaskLineRespVOList(List list) { + private List buildStockTakingTaskLineRespVOList(List list) { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java index 6715d2c..81d6780 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java @@ -72,7 +72,7 @@ public class MesWmStockTakingTaskResultController { if (result == null) { return success(null); } - return success(buildRespVOList(Collections.singletonList(result)).get(0)); + return success(buildStockTakingTaskResultRespVOList(Collections.singletonList(result)).get(0)); } @GetMapping("/page") @@ -80,7 +80,7 @@ public class MesWmStockTakingTaskResultController { @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')") public CommonResult> getStockTakingTaskResultPage(@Valid MesWmStockTakingTaskResultPageReqVO pageReqVO) { PageResult pageResult = stockTakingTaskResultService.getStockTakingTaskResultPage(pageReqVO); - return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + return success(new PageResult<>(buildStockTakingTaskResultRespVOList(pageResult.getList()), pageResult.getTotal())); } @GetMapping("/list") @@ -88,7 +88,7 @@ public class MesWmStockTakingTaskResultController { @Parameter(name = "taskId", description = "任务编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')") public CommonResult> getStockTakingTaskResultList(@RequestParam("taskId") Long taskId) { - return success(buildRespVOList(stockTakingTaskResultService.getStockTakingTaskResultList(taskId))); + return success(buildStockTakingTaskResultRespVOList(stockTakingTaskResultService.getStockTakingTaskResultList(taskId))); } @GetMapping("/export-excel") @@ -100,10 +100,10 @@ public class MesWmStockTakingTaskResultController { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); PageResult pageResult = stockTakingTaskResultService.getStockTakingTaskResultPage(pageReqVO); ExcelUtils.write(response, "盘点结果.xls", "数据", MesWmStockTakingTaskResultRespVO.class, - buildRespVOList(pageResult.getList())); + buildStockTakingTaskResultRespVOList(pageResult.getList())); } - private List buildRespVOList(List list) { + private List buildStockTakingTaskResultRespVOList(List list) { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineService.java index 694dfb1..44390b5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineService.java @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line. import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO; +import java.util.List; + /** * MES 盘点任务行 Service 接口 * @@ -17,8 +19,9 @@ public interface MesWmStockTakingTaskLineService { * 根据盘点方案生成盘点明细行 * * @param task 盘点任务 + * @param isCreate 是否为创建操作(true-创建,false-更新时需先清理旧数据) */ - void generateStockTakingLines(MesWmStockTakingTaskDO task); + void generateStockTakingLines(MesWmStockTakingTaskDO task, boolean isCreate); /** * 分页查询盘点任务行 @@ -29,6 +32,14 @@ public interface MesWmStockTakingTaskLineService { PageResult getStockTakingTaskLinePage(MesWmStockTakingTaskLinePageReqVO pageReqVO); /** + * 获得盘点任务行 + * + * @param id 编号 + * @return 盘点任务行 + */ + MesWmStockTakingTaskLineDO getStockTakingTaskLine(Long id); + + /** * 创建盘点任务行 * * @param createReqVO 创建信息 @@ -50,4 +61,19 @@ public interface MesWmStockTakingTaskLineService { */ void deleteStockTakingTaskLine(Long id); + /** + * 根据任务编号获取盘点任务行列表 + * + * @param taskId 任务编号 + * @return 盘点任务行列表 + */ + List getStockTakingTaskLineListByTaskId(Long taskId); + + /** + * 根据任务编号删除盘点任务行 + * + * @param taskId 任务编号 + */ + void deleteStockTakingTaskLineByTaskId(Long taskId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineServiceImpl.java index 971c5b1..c883eab 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineServiceImpl.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; @@ -14,10 +13,8 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStock import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan.MesWmStockTakingPlanParamMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskLineMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanParamTypeEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskLineStatusEnum; -import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTypeEnum; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; import jakarta.annotation.Resource; @@ -31,7 +28,8 @@ import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_TASK_NO_STOCK; /** * MES 盘点任务行 Service 实现类 @@ -48,29 +46,31 @@ public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTask private MesWmStockTakingPlanParamMapper stockTakingPlanParamMapper; @Resource private MesWmMaterialStockService materialStockService; - @Resource - private MesWmStockTakingTaskMapper stockTakingTaskMapper; + private MesWmStockTakingTaskService stockTakingTaskService; @Override @Transactional(rollbackFor = Exception.class) - public void generateStockTakingLines(MesWmStockTakingTaskDO task) { - // 1.1 构建查询条件(包含动态盘点时间校验) + public void generateStockTakingLines(MesWmStockTakingTaskDO task, boolean isCreate) { + // 1. 如果非创建操作,先清理旧数据 + if (!isCreate) { + stockTakingTaskLineMapper.deleteByTaskId(task.getId()); + } + + // 2.1 构建查询条件(包含动态盘点时间校验) MesWmMaterialStockListReqVO reqVO = buildStockQueryReqVO(task); - // 1.2 查询物料库存 + // 2.2 查询物料库存 List stocks = materialStockService.getMaterialStockList(reqVO); if (CollUtil.isEmpty(stocks)) { throw exception(WM_STOCK_TAKING_TASK_NO_STOCK); } - // 2. 批量生成明细行 - // TODO DONE @AI:使用 CollectionUtils convertList 方法简化代码 - List lines = convertList(stocks, stock -> - MesWmStockTakingTaskLineDO.builder() - .taskId(task.getId()).materialStockId(stock.getId()).itemId(stock.getItemId()) - .batchId(stock.getBatchId()).quantity(defaultQuantity(stock.getQuantityOnhand())) - .warehouseId(stock.getWarehouseId()).locationId(stock.getLocationId()).areaId(stock.getAreaId()) - .status(MesWmStockTakingTaskLineStatusEnum.LOSS.getStatus()).build()); + // 3. 批量生成明细行 + List lines = convertList(stocks, stock -> MesWmStockTakingTaskLineDO.builder() + .taskId(task.getId()).materialStockId(stock.getId()).itemId(stock.getItemId()) + .batchId(stock.getBatchId()).quantity(stock.getQuantityOnhand()).takingQuantity(BigDecimal.ZERO) + .warehouseId(stock.getWarehouseId()).locationId(stock.getLocationId()).areaId(stock.getAreaId()) + .status(MesWmStockTakingTaskLineStatusEnum.LOSS.getStatus()).build()); stockTakingTaskLineMapper.insertBatch(lines); } @@ -80,10 +80,15 @@ public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTask } @Override + public MesWmStockTakingTaskLineDO getStockTakingTaskLine(Long id) { + return stockTakingTaskLineMapper.selectById(id); + } + + @Override @Transactional(rollbackFor = Exception.class) public Long createStockTakingTaskLine(MesWmStockTakingTaskLineSaveReqVO createReqVO) { // 1. 校验盘点任务存在,并且处于【准备中】状态 - validateTaskExistsAndPrepare(createReqVO.getTaskId()); + stockTakingTaskService.validateStockTakingTaskExistsAndPrepare(createReqVO.getTaskId()); // 2. 创建盘点任务行 MesWmStockTakingTaskLineDO line = BeanUtils.toBean(createReqVO, MesWmStockTakingTaskLineDO.class); @@ -94,15 +99,12 @@ public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTask @Override @Transactional(rollbackFor = Exception.class) public void updateStockTakingTaskLine(MesWmStockTakingTaskLineSaveReqVO updateReqVO) { - // TODO @AI:补全注释 - // TODO @AI:搞个 validate exists 方法,这样 update 和 delete 可以服用; - MesWmStockTakingTaskLineDO line = stockTakingTaskLineMapper.selectById(updateReqVO.getId()); - if (line == null) { - throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS); - } - validateTaskExistsAndPrepare(updateReqVO.getTaskId()); + // 1.1 校验盘点任务行存在 + MesWmStockTakingTaskLineDO line = validateStockTakingTaskLineExists(updateReqVO.getId()); + // 1.2 校验盘点任务存在,并且处于【准备中】状态 + stockTakingTaskService.validateStockTakingTaskExistsAndPrepare(updateReqVO.getTaskId()); - // 更新 + // 2. 更新盘点任务行 MesWmStockTakingTaskLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmStockTakingTaskLineDO.class); stockTakingTaskLineMapper.updateById(updateObj); } @@ -110,27 +112,27 @@ public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTask @Override @Transactional(rollbackFor = Exception.class) public void deleteStockTakingTaskLine(Long id) { - // TODO @AI:补全注释 - MesWmStockTakingTaskLineDO line = stockTakingTaskLineMapper.selectById(id); - if (line == null) { - throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS); - } - validateTaskExistsAndPrepare(line.getTaskId()); + // 1.1 校验盘点任务行存在 + MesWmStockTakingTaskLineDO line = validateStockTakingTaskLineExists(id); + // 1.2 校验盘点任务存在,并且处于【准备中】状态 + stockTakingTaskService.validateStockTakingTaskExistsAndPrepare(line.getTaskId()); - // 2. 删除 + // 2. 删除盘点任务行 stockTakingTaskLineMapper.deleteById(id); } - // TODO @AI:应该在对方的 service 里提供; - private MesWmStockTakingTaskDO validateTaskExistsAndPrepare(Long id) { - MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id); - if (task == null) { - throw exception(WM_STOCK_TAKING_TASK_NOT_EXISTS); - } - if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus(), task.getStatus())) { - throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE); + /** + * 校验盘点任务行是否存在 + * + * @param id 盘点任务行编号 + * @return 盘点任务行 + */ + private MesWmStockTakingTaskLineDO validateStockTakingTaskLineExists(Long id) { + MesWmStockTakingTaskLineDO line = stockTakingTaskLineMapper.selectById(id); + if (line == null) { + throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS); } - return task; + return line; } /** @@ -160,6 +162,16 @@ public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTask return reqVO; } + @Override + public List getStockTakingTaskLineListByTaskId(Long taskId) { + return stockTakingTaskLineMapper.selectListByTaskId(taskId); + } + + @Override + public void deleteStockTakingTaskLineByTaskId(Long taskId) { + stockTakingTaskLineMapper.deleteByTaskId(taskId); + } + /** * 从参数列表中提取第一个匹配类型的参数 ID * @@ -173,9 +185,4 @@ public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTask return param != null ? param.getValueId() : null; } - // TODO @芋艿:在确认下这个逻辑; - private BigDecimal defaultQuantity(BigDecimal quantity) { - return quantity == null ? BigDecimal.ZERO : quantity; - } - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java index 99399eb..210abb1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java @@ -37,4 +37,18 @@ public interface MesWmStockTakingTaskResultService { */ List getStockTakingTaskResultList(Long taskId); + /** + * 创建盘点结果 + * + * @param result 盘点结果 + */ + void createStockTakingTaskResult(MesWmStockTakingTaskResultDO result); + + /** + * 根据任务编号删除盘点结果 + * + * @param taskId 任务编号 + */ + void deleteStockTakingTaskResultByTaskId(Long taskId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java index c9e93f6..c9a9193 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java @@ -38,4 +38,14 @@ public class MesWmStockTakingTaskResultServiceImpl implements MesWmStockTakingTa return stockTakingTaskResultMapper.selectListByTaskId(taskId); } + @Override + public void createStockTakingTaskResult(MesWmStockTakingTaskResultDO result) { + stockTakingTaskResultMapper.insert(result); + } + + @Override + public void deleteStockTakingTaskResultByTaskId(Long taskId) { + stockTakingTaskResultMapper.deleteByTaskId(taskId); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java index b7ea934..a29a6c4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java @@ -73,6 +73,14 @@ public interface MesWmStockTakingTaskService { MesWmStockTakingTaskDO validateStockTakingTaskExists(Long id); /** + * 校验盘点任务存在,并且处于【准备中】状态 + * + * @param id 盘点任务编号 + * @return 盘点任务 + */ + MesWmStockTakingTaskDO validateStockTakingTaskExistsAndPrepare(Long id); + + /** * 分页查询盘点任务 * * @param pageReqVO 分页查询条件 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java index db15d5d..a290b42 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java @@ -10,15 +10,14 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWm import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskResultMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskLineStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskStatusEnum; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -26,7 +25,6 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; -import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -42,41 +40,42 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @Resource private MesWmStockTakingTaskMapper stockTakingTaskMapper; - // TODO @芋艿:看看怎么清理掉,这块的依赖;应该调用对方的 service - @Resource - private MesWmStockTakingTaskLineMapper stockTakingTaskLineMapper; - // TODO @芋艿:看看怎么清理掉,这块的依赖;应该调用对方的 service - @Resource - private MesWmStockTakingTaskResultMapper stockTakingTaskResultMapper; @Resource private MesWmMaterialStockService materialStockService; @Resource - private AdminUserApi adminUserApi; - @Resource private MesWmStockTakingPlanService stockTakingPlanService; + @Lazy @Resource private MesWmStockTakingTaskLineService stockTakingTaskLineService; + @Lazy + @Resource + private MesWmStockTakingTaskResultService stockTakingTaskResultService; + + @Resource + private AdminUserApi adminUserApi; @Override @Transactional(rollbackFor = Exception.class) public Long createStockTakingTask(MesWmStockTakingTaskSaveReqVO createReqVO) { // 1.1 校验 code 唯一 - validateTaskCodeUnique(null, createReqVO.getCode()); + validateStockTakingTaskCodeUnique(null, createReqVO.getCode()); // 1.2 校验方案存在 adminUserApi.validateUser(createReqVO.getUserId()); - // 1.3 校验方案可用 - // TODO @芋艿:貌似可以 planId 不填写;无 plan 就手动维护; - stockTakingPlanService.validateStockTakingPlanEnabled(createReqVO.getPlanId()); + // 1.3 校验方案可用(如果有 planId) + if (createReqVO.getPlanId() != null) { + stockTakingPlanService.validateStockTakingPlanEnabled(createReqVO.getPlanId()); + } // 2. 插入任务 MesWmStockTakingTaskDO task = BeanUtils.toBean(createReqVO, MesWmStockTakingTaskDO.class) .setStatus(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus()); stockTakingTaskMapper.insert(task); - // 3. 根据方案生成盘点明细行 - // TODO @AI:有 plan 的情况下,才类似操作; - stockTakingTaskLineService.generateStockTakingLines(task); + // 3. 根据方案生成盘点明细行(仅当有 plan 时) + if (task.getPlanId() != null) { + stockTakingTaskLineService.generateStockTakingLines(task, true); + } return task.getId(); } @@ -84,34 +83,35 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @Transactional(rollbackFor = Exception.class) public void updateStockTakingTask(MesWmStockTakingTaskSaveReqVO updateReqVO) { // 1.1 校验任务存在且为草稿状态 - validateTaskExistsAndPrepare(updateReqVO.getId()); + validateStockTakingTaskExistsAndPrepare(updateReqVO.getId()); // 1.2 校验 code 唯一 - validateTaskCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + validateStockTakingTaskCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); // 1.3 校验方案存在 adminUserApi.validateUser(updateReqVO.getUserId()); - // 1.4 校验方案可用 - // TODO @芋艿:貌似可以 planId 不填写;无 plan 就手动维护; - stockTakingPlanService.validateStockTakingPlanEnabled(updateReqVO.getPlanId()); + // 1.4 校验方案可用(如果有 planId) + if (updateReqVO.getPlanId() != null) { + stockTakingPlanService.validateStockTakingPlanEnabled(updateReqVO.getPlanId()); + } // 2. 更新任务 MesWmStockTakingTaskDO updateObj = BeanUtils.toBean(updateReqVO, MesWmStockTakingTaskDO.class); stockTakingTaskMapper.updateById(updateObj); - // 3. 删除老的明细,重新生成新的 - // TODO @AI:有 plan 的情况下,才类似操作; - stockTakingTaskLineMapper.deleteByTaskId(updateReqVO.getId()); - stockTakingTaskLineService.generateStockTakingLines(updateObj); + // 3. 重新生成盘点明细行(仅当有 plan 时) + if (updateObj.getPlanId() != null) { + stockTakingTaskLineService.generateStockTakingLines(updateObj, false); + } } @Override @Transactional(rollbackFor = Exception.class) public void deleteStockTakingTask(Long id) { // 1. 校验任务存在且为草稿状态 - validateTaskExistsAndPrepare(id); + validateStockTakingTaskExistsAndPrepare(id); // 2. 删除任务和明细 - stockTakingTaskResultMapper.deleteByTaskId(id); - stockTakingTaskLineMapper.deleteByTaskId(id); + stockTakingTaskResultService.deleteStockTakingTaskResultByTaskId(id); + stockTakingTaskLineService.deleteStockTakingTaskLineByTaskId(id); stockTakingTaskMapper.deleteById(id); } @@ -119,9 +119,9 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @Transactional(rollbackFor = Exception.class) public void submitStockTakingTask(Long id) { // 1.1 校验任务存在且为草稿状态 - MesWmStockTakingTaskDO task = validateTaskExistsAndPrepare(id); + MesWmStockTakingTaskDO task = validateStockTakingTaskExistsAndPrepare(id); // 1.2 检查要盘点的内容 - List lines = stockTakingTaskLineMapper.selectListByTaskId(id); + List lines = stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id); if (CollUtil.isEmpty(lines)) { throw exception(WM_STOCK_TAKING_TASK_NO_LINE); } @@ -135,7 +135,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ if (Boolean.TRUE.equals(task.getFrozenFlag())) { for (MesWmStockTakingTaskLineDO line : lines) { if (line.getMaterialStockId() != null) { - updateFrozen(line.getMaterialStockId(), true); + updateMaterialStockFrozen(line.getMaterialStockId(), true); } } } @@ -145,23 +145,25 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @Override @Transactional(rollbackFor = Exception.class) public void finishStockTakingTask(Long id) { - // TODO @AI:补全下注释; - // TODO @AI:notEquals; - MesWmStockTakingTaskDO task = validateTaskExists(id); - if (!MesWmStockTakingTaskStatusEnum.APPROVING.getStatus().equals(task.getStatus())) { + // 1.1 校验任务存在且为审批中状态 + MesWmStockTakingTaskDO task = validateStockTakingTaskExistsInternal(id); + // 1.2 校验任务状态 + if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.APPROVING.getStatus(), task.getStatus())) { throw exception(WM_STOCK_TAKING_TASK_NOT_APPROVING); } - List lines = stockTakingTaskLineMapper.selectListByTaskId(id); + // 1.3 获取盘点任务行 + List lines = stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id); if (CollUtil.isEmpty(lines)) { throw exception(WM_STOCK_TAKING_TASK_NO_LINE); } - stockTakingTaskResultMapper.deleteByTaskId(id); + // 2. 生成盘点结果(仅保存差异数据) + stockTakingTaskResultService.deleteStockTakingTaskResultByTaskId(id); for (MesWmStockTakingTaskLineDO line : lines) { if (MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus().equals(line.getStatus())) { continue; } - stockTakingTaskResultMapper.insert(MesWmStockTakingTaskResultDO.builder() + stockTakingTaskResultService.createStockTakingTaskResult(MesWmStockTakingTaskResultDO.builder() .taskId(id) .lineId(line.getId()) .materialStockId(line.getMaterialStockId()) @@ -171,23 +173,26 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ .warehouseId(line.getWarehouseId()) .locationId(line.getLocationId()) .areaId(line.getAreaId()) - .quantity(differenceQuantity(line)) + .quantity(calculateStockTakingDifferenceQuantity(line)) .remark(line.getRemark()) .build()); } + // 3. 更新任务状态为已完成 task.setEndTime(LocalDateTime.now()); task.setStatus(MesWmStockTakingTaskStatusEnum.FINISHED.getStatus()); stockTakingTaskMapper.updateById(task); + + // 4. 解冻库存 if (Boolean.TRUE.equals(task.getFrozenFlag())) { - unfreezeTaskStocks(lines); + unfreezeStockTakingTaskStocks(lines); } } @Override @Transactional(rollbackFor = Exception.class) public void cancelStockTakingTask(Long id) { - MesWmStockTakingTaskDO task = validateTaskExists(id); + MesWmStockTakingTaskDO task = validateStockTakingTaskExistsInternal(id); if (MesWmStockTakingTaskStatusEnum.FINISHED.getStatus().equals(task.getStatus()) || MesWmStockTakingTaskStatusEnum.CANCELED.getStatus().equals(task.getStatus())) { throw exception(WM_STOCK_TAKING_TASK_CANNOT_CANCEL); @@ -195,7 +200,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ task.setStatus(MesWmStockTakingTaskStatusEnum.CANCELED.getStatus()); stockTakingTaskMapper.updateById(task); if (Boolean.TRUE.equals(task.getFrozenFlag())) { - unfreezeTaskStocks(stockTakingTaskLineMapper.selectListByTaskId(id)); + unfreezeStockTakingTaskStocks(stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id)); } } @@ -206,7 +211,19 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @Override public MesWmStockTakingTaskDO validateStockTakingTaskExists(Long id) { - return validateTaskExists(id); + return validateStockTakingTaskExistsInternal(id); + } + + @Override + public MesWmStockTakingTaskDO validateStockTakingTaskExistsAndPrepare(Long id) { + MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id); + if (task == null) { + throw exception(WM_STOCK_TAKING_TASK_NOT_EXISTS); + } + if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus(), task.getStatus())) { + throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE); + } + return task; } @Override @@ -214,52 +231,43 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ return stockTakingTaskMapper.selectPage(pageReqVO); } - private void updateFrozen(Long materialStockId, boolean frozen) { + private void updateMaterialStockFrozen(Long materialStockId, boolean frozen) { MesWmMaterialStockFreezeReqVO reqVO = new MesWmMaterialStockFreezeReqVO(); reqVO.setId(materialStockId); reqVO.setFrozen(frozen); materialStockService.updateMaterialStockFrozen(reqVO); } - private void unfreezeTaskStocks(List lines) { + private void unfreezeStockTakingTaskStocks(List lines) { if (CollUtil.isEmpty(lines)) { return; } for (MesWmStockTakingTaskLineDO line : lines) { if (line.getMaterialStockId() != null) { - updateFrozen(line.getMaterialStockId(), false); + updateMaterialStockFrozen(line.getMaterialStockId(), false); } } } - private Integer resolveLineStatus(BigDecimal quantity, BigDecimal takingQuantity) { - int compare = takingQuantity.compareTo(defaultQuantity(quantity)); - if (compare == 0) { - return MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus(); - } - return compare > 0 ? MesWmStockTakingTaskLineStatusEnum.GAIN.getStatus() - : MesWmStockTakingTaskLineStatusEnum.LOSS.getStatus(); - } - - private BigDecimal differenceQuantity(MesWmStockTakingTaskLineDO line) { - return defaultQuantity(line.getTakingQuantity()).subtract(defaultQuantity(line.getQuantity())); + private BigDecimal calculateStockTakingDifferenceQuantity(MesWmStockTakingTaskLineDO line) { + return getDefaultQuantity(line.getTakingQuantity()).subtract(getDefaultQuantity(line.getQuantity())); } - private BigDecimal defaultQuantity(BigDecimal quantity) { + private BigDecimal getDefaultQuantity(BigDecimal quantity) { return quantity == null ? BigDecimal.ZERO : quantity; } - private void validateTaskCodeUnique(Long id, String code) { + private void validateStockTakingTaskCodeUnique(Long id, String code) { MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectByCode(code); if (task == null) { return; } - if (id == null || !Objects.equals(task.getId(), id)) { + if (ObjUtil.notEqual(task.getId(), id)) { throw exception(WM_STOCK_TAKING_TASK_CODE_DUPLICATE); } } - private MesWmStockTakingTaskDO validateTaskExists(Long id) { + private MesWmStockTakingTaskDO validateStockTakingTaskExistsInternal(Long id) { MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id); if (task == null) { throw exception(WM_STOCK_TAKING_TASK_NOT_EXISTS); @@ -267,12 +275,4 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ return task; } - private MesWmStockTakingTaskDO validateTaskExistsAndPrepare(Long id) { - MesWmStockTakingTaskDO task = validateTaskExists(id); - if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus(), task.getStatus())) { - throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE); - } - return task; - } - } -- libgit2 0.21.4