From c62f0e67fb80eb0a2540968b2ff0df706f2acdb5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 10 Mar 2026 20:15:19 +0800 Subject: [PATCH] feat(mes): 支持盘点任务的动态时间过滤: 1. 新增动态盘点时间过滤功能 2. 重构盘点任务流程 3. 代码优化 4. 前端适配 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockListReqVO.java | 34 ++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskController.java | 13 +++---------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/MesWmStockTakingTaskSaveReqVO.java | 3 ++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java | 24 ++++++++++++------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 1 + yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java | 8 +++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java | 29 ++++++++++++++++++++++++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java | 15 +++++++++------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java | 9 ++++----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java | 9 +++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java | 40 ++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java | 401 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 723 insertions(+), 36 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockListReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockListReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockListReqVO.java new file mode 100644 index 0000000..0c9ec46 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockListReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 物料库存查询 Request VO") +@Data +public class MesWmMaterialStockListReqVO { + + @Schema(description = "仓库编号") + private Long warehouseId; + + @Schema(description = "库区编号") + private Long locationId; + + @Schema(description = "库位编号") + private Long areaId; + + @Schema(description = "物料编号") + private Long itemId; + + @Schema(description = "批次编号") + private Long batchId; + // TODO @芋艿:后面看看,要不要 batchCode + + @Schema(description = "开始时间(动态盘点用)") + private LocalDateTime startTime; + + @Schema(description = "结束时间(动态盘点用)") + private LocalDateTime endTime; + +} 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 f6ae279..e022dc8 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 @@ -98,9 +98,10 @@ public class MesWmStockTakingTaskController { @PutMapping("/submit") @Operation(summary = "提交盘点任务") + @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')") - public CommonResult submitStockTakingTask(@Valid @RequestBody MesWmStockTakingTaskSubmitReqVO reqVO) { - stockTakingTaskService.submitStockTakingTask(reqVO.getId()); + public CommonResult submitStockTakingTask(@RequestParam("id") Long id) { + stockTakingTaskService.submitStockTakingTask(id); return success(true); } @@ -136,14 +137,6 @@ public class MesWmStockTakingTaskController { buildTaskRespVOList(pageResult.getList())); } - @PutMapping("/start") - @Operation(summary = "开始盘点任务") - @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')") - public CommonResult startStockTakingTask(@Valid @RequestBody MesWmStockTakingTaskStartReqVO reqVO) { - stockTakingTaskService.startStockTakingTask(reqVO.getId()); - return success(true); - } - @PutMapping("/finish") @Operation(summary = "完成盘点任务") @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:finish')") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/MesWmStockTakingTaskSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/MesWmStockTakingTaskSaveReqVO.java index 5fc1197..08c125f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/MesWmStockTakingTaskSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/MesWmStockTakingTaskSaveReqVO.java @@ -33,7 +33,8 @@ public class MesWmStockTakingTaskSaveReqVO { @NotNull(message = "盘点人不能为空") private Long userId; - @Schema(description = "来源方案 ID", example = "1") + @Schema(description = "来源方案 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "来源方案不能为空") private Long planId; @Schema(description = "开始时间") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java index cff0946..5dae320 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java @@ -3,15 +3,15 @@ package cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.apache.ibatis.annotations.Mapper; import java.math.BigDecimal; import java.util.Collection; import java.util.List; -import java.util.Set; /** * MES 库存台账 Mapper @@ -65,17 +65,17 @@ public interface MesWmMaterialStockMapper extends BaseMapperX selectListForStockTaking(Set warehouseIds, Set locationIds, - Set areaIds, Set itemIds, - Set batchIds) { + default List selectListForStockTaking(MesWmMaterialStockListReqVO reqVO) { return selectList(new LambdaQueryWrapperX() - .inIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseIds) - .inIfPresent(MesWmMaterialStockDO::getLocationId, locationIds) - .inIfPresent(MesWmMaterialStockDO::getAreaId, areaIds) - .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds) - .inIfPresent(MesWmMaterialStockDO::getBatchId, batchIds) - .ne(MesWmMaterialStockDO::getQuantityOnhand, BigDecimal.ZERO) - .orderByAsc(MesWmMaterialStockDO::getId)); + .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId()) + .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId()) + .eqIfPresent(MesWmMaterialStockDO::getAreaId, reqVO.getAreaId()) + .eqIfPresent(MesWmMaterialStockDO::getItemId, reqVO.getItemId()) + .eqIfPresent(MesWmMaterialStockDO::getBatchId, reqVO.getBatchId()) + .geIfPresent(MesWmMaterialStockDO::getUpdateTime, reqVO.getStartTime()) + .leIfPresent(MesWmMaterialStockDO::getUpdateTime, reqVO.getEndTime()) + .ne(MesWmMaterialStockDO::getQuantityOnhand, BigDecimal.ZERO) // TODO @芋艿:需要在考虑下,要不要支持; + .orderByAsc(MesWmMaterialStockDO::getRecptDate)); } } 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 3aaf88c..602854a 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 @@ -484,6 +484,7 @@ public interface ErrorCodeConstants { ErrorCode WM_STOCK_TAKING_TASK_NO_STOCK = new ErrorCode(1_040_714_115, "未找到符合条件的库存数据"); 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, "动态盘点必须选择开始时间和结束时间"); // ========== 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/enums/wm/MesWmStockTakingTaskLineStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java index acabf98..cdd2a50 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java @@ -6,7 +6,6 @@ import lombok.Getter; import java.util.Arrays; -// TODO @AI:缺少注释;status + name 这种; /** * MES 盘点任务行状态枚举 */ @@ -14,6 +13,7 @@ import java.util.Arrays; @AllArgsConstructor public enum MesWmStockTakingTaskLineStatusEnum implements ArrayValuable { + // TODO @AI:UNCOUNTED 可以去掉! UNCOUNTED(0, "未盘点"), NORMAL(1, "正常"), GAIN(2, "盘盈"), @@ -22,7 +22,13 @@ public enum MesWmStockTakingTaskLineStatusEnum implements ArrayValuable public static final Integer[] ARRAYS = Arrays.stream(values()) .map(MesWmStockTakingTaskLineStatusEnum::getStatus).toArray(Integer[]::new); + /** + * 状态 + */ private final Integer status; + /** + * 状态名称 + */ private final String name; @Override diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java index d617305..1070679 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java @@ -7,23 +7,50 @@ import lombok.Getter; import java.util.Arrays; -// TODO @AI:缺少注释;status + name 这种; /** * MES 盘点任务状态枚举 + * + * @author 芋道源码 */ @Getter @AllArgsConstructor public enum MesWmStockTakingTaskStatusEnum implements ArrayValuable { + /** + * 草稿 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskService#createStockTakingTask} + */ PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), + /** + * 审批中 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskService#submitStockTakingTask} + */ APPROVING(MesOrderStatusConstants.APPROVING, "审批中"), + /** + * 已完成 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskService#finishStockTakingTask} + */ FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), + /** + * 已取消 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskService#cancelStockTakingTask} + */ CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); public static final Integer[] ARRAYS = Arrays.stream(values()) .map(MesWmStockTakingTaskStatusEnum::getStatus).toArray(Integer[]::new); + /** + * 状态 + */ private final Integer status; + /** + * 状态名称 + */ private final String name; @Override diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java index f39a45c..7849a9f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java @@ -1,8 +1,9 @@ package cn.iocoder.yudao.module.mes.service.wm.materialstock; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import jakarta.validation.Valid; @@ -11,7 +12,6 @@ import java.time.LocalDateTime; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Set; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; @@ -83,10 +83,13 @@ public interface MesWmMaterialStockService { */ List getMaterialStockList(Collection ids); - // TODO @芋艿:不确定性;感觉就是一个查询接口,参数比较多; - List getMaterialStockListForStockTaking(Set warehouseIds, Set locationIds, - Set areaIds, Set itemIds, - Set batchIds); + /** + * 获得物料库存列表(用于盘点等场景) + * + * @param reqVO 查询条件 + * @return 物料库存列表 + */ + List getMaterialStockList(MesWmMaterialStockListReqVO reqVO); default Map getMaterialStockMap(Collection ids) { return convertMap(getMaterialStockList(ids), MesWmMaterialStockDO::getId); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java index 284e1f7..a19ca30 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java @@ -3,8 +3,9 @@ package cn.iocoder.yudao.module.mes.service.wm.materialstock; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; -import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; @@ -108,10 +109,8 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService } @Override - public List getMaterialStockListForStockTaking(Set warehouseIds, Set locationIds, - Set areaIds, Set itemIds, - Set batchIds) { - return materialStockMapper.selectListForStockTaking(warehouseIds, locationIds, areaIds, itemIds, batchIds); + public List getMaterialStockList(MesWmMaterialStockListReqVO reqVO) { + return materialStockMapper.selectListForStockTaking(reqVO); } // TODO DONE @AI:increaseStock 方法命名合理,语义清晰 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java index 7584587..d9076be 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java @@ -74,6 +74,14 @@ public interface MesWmStockTakingPlanService { MesWmStockTakingPlanDO validateStockTakingPlanEditable(Long id); /** + * 校验盘点方案存在且已启用 + * + * @param id 盘点方案编号 + * @return 盘点方案 + */ + MesWmStockTakingPlanDO validateStockTakingPlanEnabled(Long id); + + /** * 获得盘点方案列表。 * * @param ids 盘点方案编号集合 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java index 02b3a0c..0a25e8f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java @@ -135,6 +135,15 @@ public class MesWmStockTakingPlanServiceImpl implements MesWmStockTakingPlanServ } } + @Override + public MesWmStockTakingPlanDO validateStockTakingPlanEnabled(Long id) { + MesWmStockTakingPlanDO plan = validateStockTakingPlanExists(id); + if (!CommonStatusEnum.isEnable(plan.getStatus())) { + throw exception(WM_STOCK_TAKING_PLAN_NOT_ENABLED); + } + return plan; + } + private MesWmStockTakingPlanDO validatePlanEditable(Long id) { MesWmStockTakingPlanDO plan = validateStockTakingPlanExists(id); if (!CommonStatusEnum.isDisable(plan.getStatus())) { 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 new file mode 100644 index 0000000..99399eb --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java @@ -0,0 +1,40 @@ +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.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO; + +import java.util.List; + +/** + * MES 盘点结果 Service 接口 + * + * @author 芋道源码 + */ +public interface MesWmStockTakingTaskResultService { + + /** + * 分页查询盘点结果 + * + * @param pageReqVO 分页查询条件 + * @return 盘点结果分页结果 + */ + PageResult getStockTakingTaskResultPage(MesWmStockTakingTaskResultPageReqVO pageReqVO); + + /** + * 获得盘点结果 + * + * @param id 盘点结果编号 + * @return 盘点结果 + */ + MesWmStockTakingTaskResultDO getStockTakingTaskResult(Long id); + + /** + * 获得盘点结果列表 + * + * @param taskId 盘点任务编号 + * @return 盘点结果列表 + */ + List getStockTakingTaskResultList(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 new file mode 100644 index 0000000..c9e93f6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java @@ -0,0 +1,41 @@ +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.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.validation.annotation.Validated; + +import java.util.List; + +/** + * MES 盘点结果 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesWmStockTakingTaskResultServiceImpl implements MesWmStockTakingTaskResultService { + + @Resource + private MesWmStockTakingTaskResultMapper stockTakingTaskResultMapper; + + @Override + public PageResult getStockTakingTaskResultPage( + MesWmStockTakingTaskResultPageReqVO pageReqVO) { + return stockTakingTaskResultMapper.selectPage(pageReqVO); + } + + @Override + public MesWmStockTakingTaskResultDO getStockTakingTaskResult(Long id) { + return stockTakingTaskResultMapper.selectById(id); + } + + @Override + public List getStockTakingTaskResultList(Long taskId) { + return stockTakingTaskResultMapper.selectListByTaskId(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 new file mode 100644 index 0000000..8a0a5e3 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java @@ -0,0 +1,124 @@ +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.MesWmStockTakingTaskLineBatchUpdateReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO; +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 jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +/** + * MES 盘点任务 Service 接口 + * + * @author 芋道源码 + */ +public interface MesWmStockTakingTaskService { + + /** + * 创建盘点任务 + * + * @param createReqVO 创建信息 + * @return 盘点任务编号 + */ + Long createStockTakingTask(@Valid MesWmStockTakingTaskSaveReqVO createReqVO); + + /** + * 更新盘点任务 + * + * @param updateReqVO 更新信息 + */ + void updateStockTakingTask(@Valid MesWmStockTakingTaskSaveReqVO updateReqVO); + + /** + * 删除盘点任务 + * + * @param id 盘点任务编号 + */ + void deleteStockTakingTask(Long id); + + /** + * 提交盘点任务 + * + * @param id 盘点任务编号 + */ + void submitStockTakingTask(Long id); + + /** + * 完成盘点任务 + * + * @param id 盘点任务编号 + */ + void finishStockTakingTask(Long id); + + /** + * 取消盘点任务 + * + * @param id 盘点任务编号 + */ + void cancelStockTakingTask(Long id); + + /** + * 批量更新盘点任务行 + * + * @param updateReqVO 更新信息 + */ + void updateStockTakingTaskLines(@Valid MesWmStockTakingTaskLineBatchUpdateReqVO updateReqVO); + + /** + * 获得盘点任务 + * + * @param id 盘点任务编号 + * @return 盘点任务 + */ + MesWmStockTakingTaskDO getStockTakingTask(Long id); + + /** + * 校验盘点任务是否存在 + * + * @param id 盘点任务编号 + * @return 盘点任务 + */ + MesWmStockTakingTaskDO validateStockTakingTaskExists(Long id); + + /** + * 获得盘点任务列表 + * + * @param ids 盘点任务编号集合 + * @return 盘点任务列表 + */ + List getStockTakingTaskList(Collection ids); + + /** + * 获得盘点任务 Map + * + * @param ids 盘点任务编号集合 + * @return 盘点任务 Map + */ + default Map getStockTakingTaskMap(Collection ids) { + return convertMap(getStockTakingTaskList(ids), MesWmStockTakingTaskDO::getId); + } + + /** + * 分页查询盘点任务 + * + * @param pageReqVO 分页查询条件 + * @return 盘点任务分页结果 + */ + PageResult getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO); + + /** + * 获得盘点任务行列表 + * + * @param taskId 盘点任务编号 + * @return 盘点任务行列表 + */ + List getStockTakingTaskLineList(Long taskId); + +} 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 new file mode 100644 index 0000000..d48c3fe --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java @@ -0,0 +1,401 @@ +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +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.MesWmMaterialStockFreezeReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineBatchUpdateReqVO; +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; +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.plan.MesWmStockTakingPlanMapper; +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.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskResultMapper; +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 cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 盘点任务 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskService { + + @Resource + private MesWmStockTakingTaskMapper stockTakingTaskMapper; + @Resource + private MesWmStockTakingTaskLineMapper stockTakingTaskLineMapper; + @Resource + private MesWmStockTakingTaskResultMapper stockTakingTaskResultMapper; + @Resource + private MesWmStockTakingPlanParamMapper stockTakingPlanParamMapper; + @Resource + private MesWmStockTakingPlanMapper stockTakingPlanMapper; + @Resource + private MesWmMaterialStockService materialStockService; + @Resource + private AdminUserApi adminUserApi; + @Resource + private cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService stockTakingPlanService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createStockTakingTask(MesWmStockTakingTaskSaveReqVO createReqVO) { + // 1.1 校验 code 唯一 + validateTaskCodeUnique(null, createReqVO.getCode()); + // 1.2 校验方案存在 + adminUserApi.validateUser(createReqVO.getUserId()); + // 1.3 校验方案可用 + stockTakingPlanService.validateStockTakingPlanEnabled(createReqVO.getPlanId()); + + // 2. 插入任务 + MesWmStockTakingTaskDO task = BeanUtils.toBean(createReqVO, MesWmStockTakingTaskDO.class) + .setStatus(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus()); + stockTakingTaskMapper.insert(task); + + // 3. 根据方案生成盘点明细行 + generateStockTakingLines(task); + return task.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateStockTakingTask(MesWmStockTakingTaskSaveReqVO updateReqVO) { + // 1.1 校验任务存在且为草稿状态 + validateTaskExistsAndPrepare(updateReqVO.getId()); + // 1.2 校验 code 唯一 + validateTaskCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // 1.3 校验方案存在 + adminUserApi.validateUser(updateReqVO.getUserId()); + // 1.4 校验方案可用 + stockTakingPlanService.validateStockTakingPlanEnabled(updateReqVO.getPlanId()); + + // 2. 更新任务 + MesWmStockTakingTaskDO updateObj = BeanUtils.toBean(updateReqVO, MesWmStockTakingTaskDO.class); + stockTakingTaskMapper.updateById(updateObj); + + // 3. 删除老的明细,重新生成新的 + stockTakingTaskLineMapper.deleteByTaskId(updateReqVO.getId()); + generateStockTakingLines(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteStockTakingTask(Long id) { + // 1. 校验任务存在且为草稿状态 + validateTaskExistsAndPrepare(id); + + // 2. 删除任务和明细 + stockTakingTaskResultMapper.deleteByTaskId(id); + stockTakingTaskLineMapper.deleteByTaskId(id); + stockTakingTaskMapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submitStockTakingTask(Long id) { + // 1.1 校验任务存在且为草稿状态 + MesWmStockTakingTaskDO task = validateTaskExistsAndPrepare(id); + // 1.2 检查要盘点的内容 + List lines = stockTakingTaskLineMapper.selectListByTaskId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_STOCK_TAKING_TASK_NO_LINE); + } + + // 2. 更新任务状态为审批中 + stockTakingTaskMapper.updateById(new MesWmStockTakingTaskDO().setId(id) + .setStatus(MesWmStockTakingTaskStatusEnum.APPROVING.getStatus())); + + // 3. 根据冻结标识,对物资进行冻结 + // TODO @芋艿:后续跟进下! + if (Boolean.TRUE.equals(task.getFrozenFlag())) { + for (MesWmStockTakingTaskLineDO line : lines) { + if (line.getMaterialStockId() != null) { + updateFrozen(line.getMaterialStockId(), true); + } + } + } + } + + /** + * 根据盘点方案生成盘点明细行 + * + * @param task 盘点任务 + */ + private void generateStockTakingLines(MesWmStockTakingTaskDO task) { + // 1.1 构建查询条件(包含动态盘点时间校验) + MesWmMaterialStockListReqVO reqVO = buildStockQueryReqVO(task); + // 1.2 查询物料库存 + List stocks = materialStockService.getMaterialStockList(reqVO); + if (CollUtil.isEmpty(stocks)) { + throw exception(WM_STOCK_TAKING_TASK_NO_STOCK); + } + + // 2. 批量生成明细行 + // TODO DONE @AI:把 stocks 作为参数,传递给 stocktakingTaskLineService,更收敛;(当前直接插入更简洁) + List lines = new ArrayList<>(stocks.size()); + for (MesWmMaterialStockDO stock : stocks) { + MesWmStockTakingTaskLineDO line = 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(); + lines.add(line); + } + stockTakingTaskLineMapper.insertBatch(lines); + } + + /** + * 构建库存查询条件 + * + * @param task 盘点任务 + * @return 查询条件 VO + */ + private MesWmMaterialStockListReqVO buildStockQueryReqVO(MesWmStockTakingTaskDO task) { + // 1. 从方案参数中提取过滤条件 + List params = stockTakingPlanParamMapper.selectListByPlanId(task.getPlanId()); + Assert.notEmpty(params, "盘点方案参数不能为空"); + + // 2.1 拼接通用参数 + MesWmMaterialStockListReqVO reqVO = new MesWmMaterialStockListReqVO() + .setWarehouseId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.WAREHOUSE.getType())) + .setLocationId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.LOCATION.getType())) + .setAreaId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.AREA.getType())) + .setItemId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.ITEM.getType())) + .setBatchId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.BATCH.getType())); + // 2.2 对于动态盘点,设置时间参数并校验 + if (MesWmStockTakingTypeEnum.DYNAMIC.getType().equals(task.getType())) { + Assert.notNull(task.getStartTime(), "动态盘点开始时间不能为空"); + Assert.notNull(task.getEndTime(), "动态盘点结束时间不能为空"); + reqVO.setStartTime(task.getStartTime()).setEndTime(task.getEndTime()); + } + return reqVO; + } + + /** + * 从参数列表中提取第一个匹配类型的参数 ID + * + * @param params 参数列表 + * @param type 参数类型 + * @return 参数 ID(如果有多个,取第一个) + */ + private Long extractMesWmStockTakingPlanParamValueId(List params, Integer type) { + MesWmStockTakingPlanParamDO param = CollUtil.findOne(params, + item -> Objects.equals(item.getType(), type) && item.getValueId() != null); + return param != null ? param.getValueId() : null; + } + + @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())) { + throw exception(WM_STOCK_TAKING_TASK_NOT_APPROVING); + } + List lines = stockTakingTaskLineMapper.selectListByTaskId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_STOCK_TAKING_TASK_NO_LINE); + } + + stockTakingTaskResultMapper.deleteByTaskId(id); + for (MesWmStockTakingTaskLineDO line : lines) { + if (MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus().equals(line.getStatus()) + || MesWmStockTakingTaskLineStatusEnum.UNCOUNTED.getStatus().equals(line.getStatus())) { + continue; + } + stockTakingTaskResultMapper.insert(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(differenceQuantity(line)) + .remark(line.getRemark()) + .build()); + } + + task.setEndTime(LocalDateTime.now()); + task.setStatus(MesWmStockTakingTaskStatusEnum.FINISHED.getStatus()); + stockTakingTaskMapper.updateById(task); + if (Boolean.TRUE.equals(task.getFrozenFlag())) { + unfreezeTaskStocks(lines); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelStockTakingTask(Long id) { + MesWmStockTakingTaskDO task = validateTaskExists(id); + if (MesWmStockTakingTaskStatusEnum.FINISHED.getStatus().equals(task.getStatus()) + || MesWmStockTakingTaskStatusEnum.CANCELED.getStatus().equals(task.getStatus())) { + throw exception(WM_STOCK_TAKING_TASK_CANNOT_CANCEL); + } + task.setStatus(MesWmStockTakingTaskStatusEnum.CANCELED.getStatus()); + stockTakingTaskMapper.updateById(task); + if (Boolean.TRUE.equals(task.getFrozenFlag())) { + unfreezeTaskStocks(stockTakingTaskLineMapper.selectListByTaskId(id)); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateStockTakingTaskLines(MesWmStockTakingTaskLineBatchUpdateReqVO updateReqVO) { + MesWmStockTakingTaskDO task = validateTaskExists(updateReqVO.getTaskId()); + if (!MesWmStockTakingTaskStatusEnum.APPROVING.getStatus().equals(task.getStatus())) { + throw exception(WM_STOCK_TAKING_TASK_NOT_APPROVING); + } + + Set lineIds = convertSet(updateReqVO.getItems(), MesWmStockTakingTaskLineBatchUpdateReqVO.Item::getId); + List lines = stockTakingTaskLineMapper.selectListByTaskIdAndIds(updateReqVO.getTaskId(), lineIds); + if (lines.size() != updateReqVO.getItems().size()) { + throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS); + } + Map lineMap = lines.stream() + .collect(Collectors.toMap(MesWmStockTakingTaskLineDO::getId, item -> item)); + for (MesWmStockTakingTaskLineBatchUpdateReqVO.Item item : updateReqVO.getItems()) { + MesWmStockTakingTaskLineDO line = lineMap.get(item.getId()); + line.setTakingQuantity(item.getTakingQuantity()); + line.setRemark(item.getRemark()); + line.setStatus(resolveLineStatus(line.getQuantity(), item.getTakingQuantity())); + stockTakingTaskLineMapper.updateById(line); + } + } + + @Override + public MesWmStockTakingTaskDO getStockTakingTask(Long id) { + return stockTakingTaskMapper.selectById(id); + } + + @Override + public MesWmStockTakingTaskDO validateStockTakingTaskExists(Long id) { + return validateTaskExists(id); + } + + @Override + public List getStockTakingTaskList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return stockTakingTaskMapper.selectByIds(ids); + } + + @Override + public PageResult getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO) { + return stockTakingTaskMapper.selectPage(pageReqVO); + } + + @Override + public List getStockTakingTaskLineList(Long taskId) { + return stockTakingTaskLineMapper.selectListByTaskId(taskId); + } + + private void updateFrozen(Long materialStockId, boolean frozen) { + MesWmMaterialStockFreezeReqVO reqVO = new MesWmMaterialStockFreezeReqVO(); + reqVO.setId(materialStockId); + reqVO.setFrozen(frozen); + materialStockService.updateMaterialStockFrozen(reqVO); + } + + private void unfreezeTaskStocks(List lines) { + if (CollUtil.isEmpty(lines)) { + return; + } + for (MesWmStockTakingTaskLineDO line : lines) { + if (line.getMaterialStockId() != null) { + updateFrozen(line.getMaterialStockId(), false); + } + } + } + + private Integer resolveLineStatus(BigDecimal quantity, BigDecimal takingQuantity) { + if (takingQuantity == null) { + return MesWmStockTakingTaskLineStatusEnum.UNCOUNTED.getStatus(); + } + 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 defaultQuantity(BigDecimal quantity) { + return quantity == null ? BigDecimal.ZERO : quantity; + } + + private void validateTaskCodeUnique(Long id, String code) { + MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectByCode(code); + if (task == null) { + return; + } + if (id == null || !Objects.equals(task.getId(), id)) { + throw exception(WM_STOCK_TAKING_TASK_CODE_DUPLICATE); + } + } + + private void validatePlanExists(Long id) { + if (stockTakingPlanMapper.selectById(id) == null) { + throw exception(WM_STOCK_TAKING_PLAN_NOT_EXISTS); + } + } + + private MesWmStockTakingTaskDO validateTaskExists(Long id) { + MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id); + if (task == null) { + throw exception(WM_STOCK_TAKING_TASK_NOT_EXISTS); + } + return task; + } + + private MesWmStockTakingTaskDO validateTaskExistsAndPrepare(Long id) { + MesWmStockTakingTaskDO task = validateTaskExists(id); + if (!MesWmStockTakingTaskStatusEnum.PREPARE.getStatus().equals(task.getStatus())) { + throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE); + } + return task; + } + +} -- libgit2 0.21.4