From b1f836abe335401a1bd5dfa6d393c707b9bb19ef Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 12 Mar 2026 01:05:56 +0800 Subject: [PATCH] ✨ feat(mes): 更新盘点结果相关逻辑,添加盘点数量字段 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskResultController.java | 18 ++++-------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/result/MesWmStockTakingTaskResultSaveReqVO.java | 12 +++++++----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskResultDO.java | 6 +++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java | 15 +++++++-------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java | 8 -------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 2 ++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineService.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineServiceImpl.java | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java | 16 ++++------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 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 | 79 ++++++++++++++++++++++++------------------------------------------------------- 13 files changed, 239 insertions(+), 118 deletions(-) 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 4822a59..8ff23ae 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 @@ -71,15 +71,8 @@ public class MesWmStockTakingTaskResultController { @GetMapping("/page") @Operation(summary = "获得盘点结果分页") @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')") - public CommonResult> getStockTakingTaskResultPage(@Valid MesWmStockTakingTaskResultPageReqVO pageReqVO) { - PageResult pageResult = stockTakingTaskResultService.getStockTakingTaskResultPage(pageReqVO); - return success(new PageResult<>(buildStockTakingTaskResultRespVOList(pageResult.getList()), pageResult.getTotal())); - } - - @GetMapping("/list") - @Operation(summary = "获得盘点结果分页列表") - @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')") - public CommonResult> getStockTakingTaskResultList(@Valid MesWmStockTakingTaskResultPageReqVO pageReqVO) { + public CommonResult> getStockTakingTaskResultPage( + @Valid MesWmStockTakingTaskResultPageReqVO pageReqVO) { PageResult pageResult = stockTakingTaskResultService.getStockTakingTaskResultPage(pageReqVO); return success(new PageResult<>(buildStockTakingTaskResultRespVOList(pageResult.getList()), pageResult.getTotal())); } @@ -89,9 +82,7 @@ public class MesWmStockTakingTaskResultController { @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')") @Transactional(rollbackFor = Exception.class) public CommonResult createStockTakingTaskResult(@Valid @RequestBody MesWmStockTakingTaskResultSaveReqVO createReqVO) { - MesWmStockTakingTaskResultDO result = BeanUtils.toBean(createReqVO, MesWmStockTakingTaskResultDO.class); - stockTakingTaskResultService.createStockTakingTaskResult(result); - return success(result.getId()); + return success(stockTakingTaskResultService.createStockTakingTaskResult(createReqVO)); } @PutMapping("/update") @@ -99,8 +90,7 @@ public class MesWmStockTakingTaskResultController { @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')") @Transactional(rollbackFor = Exception.class) public CommonResult updateStockTakingTaskResult(@Valid @RequestBody MesWmStockTakingTaskResultSaveReqVO updateReqVO) { - MesWmStockTakingTaskResultDO result = BeanUtils.toBean(updateReqVO, MesWmStockTakingTaskResultDO.class); - stockTakingTaskResultService.updateStockTakingTaskResult(result); + stockTakingTaskResultService.updateStockTakingTaskResult(updateReqVO); return success(true); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/result/MesWmStockTakingTaskResultSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/result/MesWmStockTakingTaskResultSaveReqVO.java index 368be44..9835883 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/result/MesWmStockTakingTaskResultSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/result/MesWmStockTakingTaskResultSaveReqVO.java @@ -37,15 +37,17 @@ public class MesWmStockTakingTaskResultSaveReqVO { @NotNull(message = "仓库 ID 不能为空") private Long warehouseId; - @Schema(description = "库区 ID", example = "1") + @Schema(description = "库区 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "库区 ID 不能为空") private Long locationId; - @Schema(description = "库位 ID", example = "1") + @Schema(description = "库位 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "库位 ID 不能为空") private Long areaId; - @Schema(description = "差异数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.000000") - @NotNull(message = "差异数量不能为空") - private BigDecimal quantity; + @Schema(description = "盘点数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.000000") + @NotNull(message = "盘点数量不能为空") + private BigDecimal takingQuantity; @Schema(description = "备注", example = "备注") private String remark; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java index 1f39cef..004ddfd 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskLineDO.java @@ -61,7 +61,7 @@ public class MesWmStockTakingTaskLineDO extends BaseDO { private String batchCode; /** - * 账面数量 + * 在库数量 */ private BigDecimal quantity; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskResultDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskResultDO.java index c7c4002..6d68d43 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskResultDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskResultDO.java @@ -85,9 +85,13 @@ public class MesWmStockTakingTaskResultDO extends BaseDO { private Long areaId; /** - * 差异数量 + * 在库数量 */ private BigDecimal quantity; + /** + * 盘点数量 + */ + private BigDecimal takingQuantity; /** * 备注 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java index a4a1850..4c2e3a9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java @@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStock import org.apache.ibatis.annotations.Mapper; import java.util.List; -import java.util.Set; /** * MES 盘点任务行 Mapper @@ -24,13 +23,6 @@ public interface MesWmStockTakingTaskLineMapper extends BaseMapperX selectListByTaskIdAndIds(Long taskId, Set ids) { - return selectList(new LambdaQueryWrapperX() - .eq(MesWmStockTakingTaskLineDO::getTaskId, taskId) - .inIfPresent(MesWmStockTakingTaskLineDO::getId, ids) - .orderByAsc(MesWmStockTakingTaskLineDO::getId)); - } - default void deleteByTaskId(Long taskId) { delete(MesWmStockTakingTaskLineDO::getTaskId, taskId); } @@ -41,4 +33,11 @@ public interface MesWmStockTakingTaskLineMapper extends BaseMapperX() + .eq(MesWmStockTakingTaskLineDO::getTaskId, taskId) + .eq(MesWmStockTakingTaskLineDO::getItemId, itemId) + .eqIfPresent(MesWmStockTakingTaskLineDO::getAreaId, areaId)); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java index 0e16130..e9d03c4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java @@ -7,8 +7,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.resul import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO; import org.apache.ibatis.annotations.Mapper; -import java.util.List; - /** * MES 盘点结果 Mapper * @@ -27,12 +25,6 @@ public interface MesWmStockTakingTaskResultMapper extends BaseMapperX selectListByTaskId(Long taskId) { - return selectList(new LambdaQueryWrapperX() - .eq(MesWmStockTakingTaskResultDO::getTaskId, taskId) - .orderByAsc(MesWmStockTakingTaskResultDO::getId)); - } - default void deleteByTaskId(Long taskId) { delete(MesWmStockTakingTaskResultDO::getTaskId, taskId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 602854a..f3bbb74 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -485,6 +485,8 @@ public interface ErrorCodeConstants { ErrorCode WM_STOCK_TAKING_TASK_NO_LINE = new ErrorCode(1_040_714_116, "盘点任务至少需要一条任务行"); ErrorCode WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS = new ErrorCode(1_040_714_117, "盘点任务行不存在"); ErrorCode WM_STOCK_TAKING_TASK_DYNAMIC_TIME_REQUIRED = new ErrorCode(1_040_714_118, "动态盘点必须选择开始时间和结束时间"); + ErrorCode WM_STOCK_TAKING_TASK_RESULT_NOT_EXISTS = new ErrorCode(1_040_714_119, "盘点结果不存在"); + ErrorCode WM_STOCK_TAKING_TASK_LINE_ALREADY_TAKEN = new ErrorCode(1_040_714_120, "该盘点清单行已有盘点记录,不能重复盘点"); // ========== MES 仓库管理-销售出库单(1-040-714-000) ========== ErrorCode WM_PRODUCT_SALES_NOT_EXISTS = new ErrorCode(1_040_714_000, "销售出库单不存在"); 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 44390b5..353237a 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 @@ -3,9 +3,11 @@ package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultSaveReqVO; 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.math.BigDecimal; import java.util.List; /** @@ -76,4 +78,40 @@ public interface MesWmStockTakingTaskLineService { */ void deleteStockTakingTaskLineByTaskId(Long taskId); + /** + * 从盘点结果创建盘点任务行 + * + * 注意:当盘点结果没有对应的盘点清单行时,会自动创建一个新的盘点任务行 + * + * @param createReqVO 盘点结果创建信息 + * @return 盘点任务行编号 + */ + Long createStockTakingTaskLine(MesWmStockTakingTaskResultSaveReqVO createReqVO); + + /** + * 根据 taskId + itemId + areaId 查询盘点任务行 + * + * @param taskId 盘点任务编号 + * @param itemId 物料编号 + * @param areaId 库位编号 + * @return 盘点任务行 + */ + MesWmStockTakingTaskLineDO getStockTakingTaskLine(Long taskId, Long itemId, Long areaId); + + /** + * 校验盘点任务行存在 + * + * @param id 盘点任务行编号 + * @return 盘点任务行 + */ + MesWmStockTakingTaskLineDO validateStockTakingTaskLineExists(Long id); + + /** + * 更新盘点任务行的盘点数量 + * + * @param id 盘点任务行编号 + * @param takingQuantity 盘点数量(增量) + */ + void updateStockTakingTaskLineTakingQuantity(Long id, BigDecimal takingQuantity); + } 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 c883eab..2a8981a 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 @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO; @@ -121,13 +122,8 @@ public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTask stockTakingTaskLineMapper.deleteById(id); } - /** - * 校验盘点任务行是否存在 - * - * @param id 盘点任务行编号 - * @return 盘点任务行 - */ - private MesWmStockTakingTaskLineDO validateStockTakingTaskLineExists(Long id) { + @Override + public MesWmStockTakingTaskLineDO validateStockTakingTaskLineExists(Long id) { MesWmStockTakingTaskLineDO line = stockTakingTaskLineMapper.selectById(id); if (line == null) { throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS); @@ -172,6 +168,53 @@ public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTask stockTakingTaskLineMapper.deleteByTaskId(taskId); } + @Override + public MesWmStockTakingTaskLineDO getStockTakingTaskLine(Long taskId, Long itemId, Long areaId) { + return stockTakingTaskLineMapper.selectByTaskIdAndItemIdAndAreaId(taskId, itemId, areaId); + } + + @Override + public void updateStockTakingTaskLineTakingQuantity(Long id, BigDecimal takingQuantity) { + // 1. 校验盘点任务行存在 + MesWmStockTakingTaskLineDO line = validateStockTakingTaskLineExists(id); + // 2. 更新盘点数量和状态 + line.setTakingQuantity(takingQuantity) + .setStatus(calculateLineStatus(line.getQuantity(), takingQuantity)); + stockTakingTaskLineMapper.updateById(line); + } + + @Override + public Long createStockTakingTaskLine(MesWmStockTakingTaskResultSaveReqVO createReqVO) { + MesWmStockTakingTaskLineDO line = new MesWmStockTakingTaskLineDO() + .setTaskId(createReqVO.getTaskId()).setItemId(createReqVO.getItemId()).setBatchId(createReqVO.getBatchId()) + .setWarehouseId(createReqVO.getWarehouseId()).setLocationId(createReqVO.getLocationId()).setAreaId(createReqVO.getAreaId()) + .setQuantity(BigDecimal.ZERO) // 账面数量默认为 0 + .setTakingQuantity(createReqVO.getTakingQuantity()) // 盘点数量 + .setStatus(calculateLineStatus(BigDecimal.ZERO, createReqVO.getTakingQuantity())); // 计算盈亏状态 + stockTakingTaskLineMapper.insert(line); + return line.getId(); + } + + /** + * 计算盘点任务行状态 + * + * @param quantity 账面数量 + * @param takingQuantity 盘点数量 + * @return 状态 + */ + private Integer calculateLineStatus(BigDecimal quantity, BigDecimal takingQuantity) { + Assert.notNull(takingQuantity, "盘点数量不能为空"); + Assert.notNull(quantity, "账面数量不能为空"); + int compareResult = takingQuantity.compareTo(quantity); + if (compareResult > 0) { + return MesWmStockTakingTaskLineStatusEnum.GAIN.getStatus(); // 盘盈 + } + if (compareResult < 0) { + return MesWmStockTakingTaskLineStatusEnum.LOSS.getStatus(); // 盘亏 + } + return MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus(); // 正常 + } + /** * 从参数列表中提取第一个匹配类型的参数 ID * 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 131e53e..6c2ebc1 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 @@ -2,10 +2,9 @@ package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO; -import java.util.List; - /** * MES 盘点结果 Service 接口 * @@ -30,26 +29,19 @@ public interface MesWmStockTakingTaskResultService { MesWmStockTakingTaskResultDO getStockTakingTaskResult(Long id); /** - * 获得盘点结果列表 - * - * @param taskId 盘点任务编号 - * @return 盘点结果列表 - */ - List getStockTakingTaskResultList(Long taskId); - - /** * 创建盘点结果 * * @param result 盘点结果 + * @return 盘点结果编号 */ - void createStockTakingTaskResult(MesWmStockTakingTaskResultDO result); + Long createStockTakingTaskResult(MesWmStockTakingTaskResultSaveReqVO result); /** * 更新盘点结果 * * @param result 盘点结果 */ - void updateStockTakingTaskResult(MesWmStockTakingTaskResultDO result); + void updateStockTakingTaskResult(MesWmStockTakingTaskResultSaveReqVO result); /** * 删除盘点结果 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 9c3dbd5..2315426 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 @@ -1,14 +1,23 @@ package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; +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.stocktaking.task.vo.result.MesWmStockTakingTaskResultPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultSaveReqVO; +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.MesWmStockTakingTaskResultMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import java.util.List; +import java.math.BigDecimal; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_TASK_LINE_ALREADY_TAKEN; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_TASK_RESULT_NOT_EXISTS; /** * MES 盘点结果 Service 实现类 @@ -22,6 +31,11 @@ public class MesWmStockTakingTaskResultServiceImpl implements MesWmStockTakingTa @Resource private MesWmStockTakingTaskResultMapper stockTakingTaskResultMapper; + @Resource + private MesWmStockTakingTaskLineService stockTakingTaskLineService; + @Resource + private MesWmStockTakingTaskService stockTakingTaskService; + @Override public PageResult getStockTakingTaskResultPage( MesWmStockTakingTaskResultPageReqVO pageReqVO) { @@ -34,23 +48,77 @@ public class MesWmStockTakingTaskResultServiceImpl implements MesWmStockTakingTa } @Override - public List getStockTakingTaskResultList(Long taskId) { - return stockTakingTaskResultMapper.selectListByTaskId(taskId); - } + @Transactional(rollbackFor = Exception.class) + public Long createStockTakingTaskResult(MesWmStockTakingTaskResultSaveReqVO createReqVO) { + // 1. 校验任务处于盘点中状态 + stockTakingTaskService.validateStockTakingTaskExistsAndApproving(createReqVO.getTaskId()); - @Override - public void createStockTakingTaskResult(MesWmStockTakingTaskResultDO result) { + // 2. 确定 lineId 和账面数量 + Long lineId = createReqVO.getLineId(); + MesWmStockTakingTaskLineDO existingLine = null; + if (lineId == null) { + // 2.1 基于 taskId + itemId + areaId 查询已存在的 line + existingLine = stockTakingTaskLineService.getStockTakingTaskLine( + createReqVO.getTaskId(), createReqVO.getItemId(), createReqVO.getAreaId()); + if (existingLine != null) { + lineId = existingLine.getId(); + } else { + // 2.2 创建新的 line(注意:当盘点结果没有对应的盘点清单行时,会自动创建一个新的盘点任务行) + lineId = stockTakingTaskLineService.createStockTakingTaskLine(createReqVO); + } + } else { + // 2.3 如果传递了 lineId,从 line 中获取 quantity + existingLine = stockTakingTaskLineService.validateStockTakingTaskLineExists(lineId); + } + if (existingLine != null + && existingLine.getTakingQuantity() != null + && existingLine.getTakingQuantity().compareTo(BigDecimal.ZERO) > 0) { + throw exception(WM_STOCK_TAKING_TASK_LINE_ALREADY_TAKEN); + } + BigDecimal quantity = existingLine != null ? existingLine.getQuantity() : BigDecimal.ZERO; // 账面数量 + + // 3. 插入 result 记录 + MesWmStockTakingTaskResultDO result = BeanUtils.toBean(createReqVO, MesWmStockTakingTaskResultDO.class) + .setLineId(lineId).setQuantity(ObjUtil.defaultIfNull(quantity, createReqVO.getTakingQuantity())); stockTakingTaskResultMapper.insert(result); + + // 4. 更新 line 的盘点数量和状态 + stockTakingTaskLineService.updateStockTakingTaskLineTakingQuantity(lineId, createReqVO.getTakingQuantity()); + return result.getId(); } @Override - public void updateStockTakingTaskResult(MesWmStockTakingTaskResultDO result) { + @Transactional(rollbackFor = Exception.class) + public void updateStockTakingTaskResult(MesWmStockTakingTaskResultSaveReqVO updateReqVO) { + updateReqVO.setLineId(null); // lineId 不能修改,避免误操作 + // 1.1 校验记录存在 + MesWmStockTakingTaskResultDO oldResult = validateStockTakingTaskResultExists(updateReqVO.getId()); + // 1.2 校验任务处于盘点中状态 + stockTakingTaskService.validateStockTakingTaskExistsAndApproving(oldResult.getTaskId()); + + // 2. 更新 result 记录 + MesWmStockTakingTaskResultDO result = BeanUtils.toBean(updateReqVO, MesWmStockTakingTaskResultDO.class); stockTakingTaskResultMapper.updateById(result); + + // 3. 关联更新 line 的盘点数量(覆盖式更新) + stockTakingTaskLineService.updateStockTakingTaskLineTakingQuantity( + oldResult.getLineId(), updateReqVO.getTakingQuantity()); } @Override + @Transactional(rollbackFor = Exception.class) public void deleteStockTakingTaskResult(Long id) { + // 1.1 校验 result 是否存在 + MesWmStockTakingTaskResultDO result = validateStockTakingTaskResultExists(id); + // 1.2 校验 task 是否处于 APPROVING 状态 + stockTakingTaskService.validateStockTakingTaskExistsAndApproving(result.getTaskId()); + + // 2. 删除 result 记录 stockTakingTaskResultMapper.deleteById(id); + + // 3. 更新对应 line 的盘点数量和状态 + stockTakingTaskLineService.updateStockTakingTaskLineTakingQuantity( + result.getLineId(), result.getTakingQuantity().negate()); } @Override @@ -58,4 +126,18 @@ public class MesWmStockTakingTaskResultServiceImpl implements MesWmStockTakingTa stockTakingTaskResultMapper.deleteByTaskId(taskId); } + /** + * 校验盘点结果是否存在 + * + * @param id 盘点结果编号 + * @return 盘点结果 + */ + private MesWmStockTakingTaskResultDO validateStockTakingTaskResultExists(Long id) { + MesWmStockTakingTaskResultDO result = stockTakingTaskResultMapper.selectById(id); + if (result == null) { + throw exception(WM_STOCK_TAKING_TASK_RESULT_NOT_EXISTS); + } + return result; + } + } 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 a29a6c4..f5202e4 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 @@ -81,6 +81,14 @@ public interface MesWmStockTakingTaskService { MesWmStockTakingTaskDO validateStockTakingTaskExistsAndPrepare(Long id); /** + * 校验盘点任务存在,并且处于【盘点中】状态 + * + * @param id 盘点任务编号 + * @return 盘点任务 + */ + MesWmStockTakingTaskDO validateStockTakingTaskExistsAndApproving(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 a290b42..3bf9e9b 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 @@ -9,9 +9,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWm import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO; 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.MesWmStockTakingTaskMapper; -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; @@ -23,7 +21,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -141,50 +138,20 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ } } - @Override @Transactional(rollbackFor = Exception.class) public void finishStockTakingTask(Long id) { - // 1.1 校验任务存在且为审批中状态 - MesWmStockTakingTaskDO task = validateStockTakingTaskExistsInternal(id); - // 1.2 校验任务状态 - if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.APPROVING.getStatus(), task.getStatus())) { - throw exception(WM_STOCK_TAKING_TASK_NOT_APPROVING); - } - // 1.3 获取盘点任务行 - List lines = stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id); - if (CollUtil.isEmpty(lines)) { - throw exception(WM_STOCK_TAKING_TASK_NO_LINE); - } - - // 2. 生成盘点结果(仅保存差异数据) - stockTakingTaskResultService.deleteStockTakingTaskResultByTaskId(id); - for (MesWmStockTakingTaskLineDO line : lines) { - if (MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus().equals(line.getStatus())) { - continue; - } - stockTakingTaskResultService.createStockTakingTaskResult(MesWmStockTakingTaskResultDO.builder() - .taskId(id) - .lineId(line.getId()) - .materialStockId(line.getMaterialStockId()) - .itemId(line.getItemId()) - .batchId(line.getBatchId()) - .batchCode(line.getBatchCode()) - .warehouseId(line.getWarehouseId()) - .locationId(line.getLocationId()) - .areaId(line.getAreaId()) - .quantity(calculateStockTakingDifferenceQuantity(line)) - .remark(line.getRemark()) - .build()); - } + // 1. 校验任务存在且为审批中状态 + MesWmStockTakingTaskDO task = validateStockTakingTaskExistsAndApproving(id); - // 3. 更新任务状态为已完成 - task.setEndTime(LocalDateTime.now()); - task.setStatus(MesWmStockTakingTaskStatusEnum.FINISHED.getStatus()); - stockTakingTaskMapper.updateById(task); + // 2. 更新任务状态为已完成 + stockTakingTaskMapper.updateById(new MesWmStockTakingTaskDO().setId(id) + .setStatus(MesWmStockTakingTaskStatusEnum.FINISHED.getStatus())); - // 4. 解冻库存 + // 3. 解冻库存 + // TODO @芋艿:后续跟进下! if (Boolean.TRUE.equals(task.getFrozenFlag())) { + List lines = stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id); unfreezeStockTakingTaskStocks(lines); } } @@ -192,7 +159,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @Override @Transactional(rollbackFor = Exception.class) public void cancelStockTakingTask(Long id) { - MesWmStockTakingTaskDO task = validateStockTakingTaskExistsInternal(id); + MesWmStockTakingTaskDO task = validateStockTakingTaskExists(id); if (MesWmStockTakingTaskStatusEnum.FINISHED.getStatus().equals(task.getStatus()) || MesWmStockTakingTaskStatusEnum.CANCELED.getStatus().equals(task.getStatus())) { throw exception(WM_STOCK_TAKING_TASK_CANNOT_CANCEL); @@ -211,15 +178,16 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @Override public MesWmStockTakingTaskDO validateStockTakingTaskExists(Long 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); } + return task; + } + + @Override + public MesWmStockTakingTaskDO validateStockTakingTaskExistsAndPrepare(Long id) { + MesWmStockTakingTaskDO task = validateStockTakingTaskExists(id); if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus(), task.getStatus())) { throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE); } @@ -227,6 +195,15 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ } @Override + public MesWmStockTakingTaskDO validateStockTakingTaskExistsAndApproving(Long id) { + MesWmStockTakingTaskDO task = validateStockTakingTaskExists(id); + if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.APPROVING.getStatus(), task.getStatus())) { + throw exception(WM_STOCK_TAKING_TASK_NOT_APPROVING); + } + return task; + } + + @Override public PageResult getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO) { return stockTakingTaskMapper.selectPage(pageReqVO); } @@ -267,12 +244,4 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ } } - private MesWmStockTakingTaskDO validateStockTakingTaskExistsInternal(Long id) { - MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id); - if (task == null) { - throw exception(WM_STOCK_TAKING_TASK_NOT_EXISTS); - } - return task; - } - } -- libgit2 0.21.4