Commit 46933d8565af152bf83ca0fc1c7814a37816daa4

Authored by YunaiV
1 parent c62f0e67

✨ feat(mes): 添加盘点任务行的请求和响应 VO 及相关控制器

新增 MesWmStockTakingTaskLinePageReqVO 和 MesWmStockTakingTaskLineSaveReqVO 类,支持盘点任务行的分页请求和新增/修改请求。同时,创建 MesWmStockTakingTaskLineController 控制器,提供相应的 API 接口,增强系统的功能性和可维护性。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskController.java
... ... @@ -9,23 +9,10 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
9 9 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
10 10 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
11 11 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.*;
12   -import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineBatchUpdateReqVO;
13   -import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineRespVO;
14   -import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
15   -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
16 12 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO;
17 13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
18   -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
19   -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
20   -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
21   -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
22   -import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
23   -import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
24 14 import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService;
25 15 import cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskService;
26   -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
27   -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
28   -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
29 16 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
30 17 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
31 18 import io.swagger.v3.oas.annotations.Operation;
... ... @@ -39,7 +26,6 @@ import org.springframework.validation.annotation.Validated;
39 26 import org.springframework.web.bind.annotation.*;
40 27  
41 28 import java.io.IOException;
42   -import java.math.BigDecimal;
43 29 import java.util.Collections;
44 30 import java.util.List;
45 31 import java.util.Map;
... ... @@ -59,17 +45,6 @@ public class MesWmStockTakingTaskController {
59 45 @Resource
60 46 private MesWmStockTakingPlanService stockTakingPlanService;
61 47 @Resource
62   - private MesMdItemService itemService;
63   - @Resource
64   - private MesMdUnitMeasureService unitMeasureService;
65   - @Resource
66   - private MesWmWarehouseService warehouseService;
67   - @Resource
68   - private MesWmWarehouseLocationService locationService;
69   - @Resource
70   - private MesWmWarehouseAreaService areaService;
71   -
72   - @Resource
73 48 private AdminUserApi adminUserApi;
74 49  
75 50 @PostMapping("/create")
... ... @@ -153,63 +128,24 @@ public class MesWmStockTakingTaskController {
153 128 return success(true);
154 129 }
155 130  
156   - @PutMapping("/line-batch-update")
157   - @Operation(summary = "批量更新盘点任务行")
158   - @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')")
159   - public CommonResult<Boolean> updateStockTakingTaskLines(@Valid @RequestBody MesWmStockTakingTaskLineBatchUpdateReqVO reqVO) {
160   - stockTakingTaskService.updateStockTakingTaskLines(reqVO);
161   - return success(true);
162   - }
163   -
164   - @GetMapping("/line-list")
165   - @Operation(summary = "获得盘点任务行列表")
166   - @Parameter(name = "taskId", description = "任务编号", required = true)
167   - @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')")
168   - public CommonResult<List<MesWmStockTakingTaskLineRespVO>> getStockTakingTaskLineList(@RequestParam("taskId") Long taskId) {
169   - return success(buildTaskLineRespVOList(stockTakingTaskService.getStockTakingTaskLineList(taskId)));
170   - }
  131 + // ==================== 拼接 VO ====================
171 132  
172 133 private List<MesWmStockTakingTaskRespVO> buildTaskRespVOList(List<MesWmStockTakingTaskDO> list) {
173 134 if (CollUtil.isEmpty(list)) {
174 135 return Collections.emptyList();
175 136 }
176   - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertSet(list, MesWmStockTakingTaskDO::getUserId));
177   - Map<Long, MesWmStockTakingPlanDO> planMap = stockTakingPlanService.getStockTakingPlanMap(convertSet(list, MesWmStockTakingTaskDO::getPlanId));
  137 + // 查询关联数据
  138 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
  139 + convertSet(list, MesWmStockTakingTaskDO::getUserId));
  140 + Map<Long, MesWmStockTakingPlanDO> planMap = stockTakingPlanService.getStockTakingPlanMap(
  141 + convertSet(list, MesWmStockTakingTaskDO::getPlanId));
  142 + // 拼接数据
178 143 return BeanUtils.toBean(list, MesWmStockTakingTaskRespVO.class, vo -> {
179   - MapUtils.findAndThen(userMap, vo.getUserId(), user -> vo.setUserNickname(user.getNickname()));
180   - MapUtils.findAndThen(planMap, vo.getPlanId(), plan -> {
181   - vo.setPlanCode(plan.getCode());
182   - vo.setPlanName(plan.getName());
183   - });
184   - });
185   - }
186   -
187   - private List<MesWmStockTakingTaskLineRespVO> buildTaskLineRespVOList(List<MesWmStockTakingTaskLineDO> list) {
188   - if (CollUtil.isEmpty(list)) {
189   - return Collections.emptyList();
190   - }
191   - Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(convertSet(list, MesWmStockTakingTaskLineDO::getItemId));
192   - Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
193   - convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
194   - Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(convertSet(list, MesWmStockTakingTaskLineDO::getWarehouseId));
195   - Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(convertSet(list, MesWmStockTakingTaskLineDO::getLocationId));
196   - Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(convertSet(list, MesWmStockTakingTaskLineDO::getAreaId));
197   - return BeanUtils.toBean(list, MesWmStockTakingTaskLineRespVO.class, vo -> {
198   - MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
199   - vo.setItemCode(item.getCode());
200   - vo.setItemName(item.getName());
201   - vo.setSpecification(item.getSpecification());
202   - MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unit -> vo.setUnitMeasureName(unit.getName()));
203   - });
204   - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
205   - MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> vo.setLocationName(location.getName()));
206   - MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> vo.setAreaName(area.getName()));
207   - vo.setDifferenceQuantity(defaultQuantity(vo.getTakingQuantity()).subtract(defaultQuantity(vo.getQuantity())));
  144 + MapUtils.findAndThen(userMap, vo.getUserId(),
  145 + user -> vo.setUserNickname(user.getNickname()));
  146 + MapUtils.findAndThen(planMap, vo.getPlanId(),
  147 + plan -> vo.setPlanCode(plan.getCode()).setPlanName(plan.getName()));
208 148 });
209 149 }
210 150  
211   - private BigDecimal defaultQuantity(BigDecimal quantity) {
212   - return quantity == null ? BigDecimal.ZERO : quantity;
213   - }
214   -
215 151 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/MesWmStockTakingTaskLineController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  7 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLinePageReqVO;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineRespVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineSaveReqVO;
  10 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  16 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  17 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  18 +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskLineService;
  19 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
  20 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
  21 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
  22 +import io.swagger.v3.oas.annotations.Operation;
  23 +import io.swagger.v3.oas.annotations.Parameter;
  24 +import io.swagger.v3.oas.annotations.tags.Tag;
  25 +import jakarta.annotation.Resource;
  26 +import jakarta.validation.Valid;
  27 +import org.springframework.security.access.prepost.PreAuthorize;
  28 +import org.springframework.validation.annotation.Validated;
  29 +import org.springframework.web.bind.annotation.*;
  30 +
  31 +import java.util.Collections;
  32 +import java.util.List;
  33 +import java.util.Map;
  34 +
  35 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  36 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  37 +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
  38 +
  39 +@Tag(name = "管理后台 - MES 盘点任务行")
  40 +@RestController
  41 +@RequestMapping("/mes/wm/stocktaking-task-line")
  42 +@Validated
  43 +public class MesWmStockTakingTaskLineController {
  44 +
  45 + @Resource
  46 + private MesWmStockTakingTaskLineService stockTakingTaskLineService;
  47 + @Resource
  48 + private MesMdItemService itemService;
  49 + @Resource
  50 + private MesMdUnitMeasureService unitMeasureService;
  51 + @Resource
  52 + private MesWmWarehouseService warehouseService;
  53 + @Resource
  54 + private MesWmWarehouseLocationService locationService;
  55 + @Resource
  56 + private MesWmWarehouseAreaService areaService;
  57 +
  58 + @GetMapping("/page")
  59 + @Operation(summary = "获得盘点任务行分页")
  60 + @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:query')")
  61 + public CommonResult<PageResult<MesWmStockTakingTaskLineRespVO>> getStockTakingTaskLinePage(
  62 + @Valid MesWmStockTakingTaskLinePageReqVO pageReqVO) {
  63 + PageResult<MesWmStockTakingTaskLineDO> pageResult = stockTakingTaskLineService.getStockTakingTaskLinePage(pageReqVO);
  64 + return success(new PageResult<>(buildTaskLineRespVOList(pageResult.getList()), pageResult.getTotal()));
  65 + }
  66 +
  67 + @PostMapping("/create")
  68 + @Operation(summary = "创建盘点任务行")
  69 + @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')")
  70 + public CommonResult<Long> createStockTakingTaskLine(@Valid @RequestBody MesWmStockTakingTaskLineSaveReqVO createReqVO) {
  71 + return success(stockTakingTaskLineService.createStockTakingTaskLine(createReqVO));
  72 + }
  73 +
  74 + @PutMapping("/update")
  75 + @Operation(summary = "更新盘点任务行")
  76 + @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')")
  77 + public CommonResult<Boolean> updateStockTakingTaskLine(@Valid @RequestBody MesWmStockTakingTaskLineSaveReqVO updateReqVO) {
  78 + stockTakingTaskLineService.updateStockTakingTaskLine(updateReqVO);
  79 + return success(true);
  80 + }
  81 +
  82 + @DeleteMapping("/delete")
  83 + @Operation(summary = "删除盘点任务行")
  84 + @Parameter(name = "id", description = "编号", required = true)
  85 + @PreAuthorize("@ss.hasPermission('mes:wm-stock-taking-task:update')")
  86 + public CommonResult<Boolean> deleteStockTakingTaskLine(@RequestParam("id") Long id) {
  87 + stockTakingTaskLineService.deleteStockTakingTaskLine(id);
  88 + return success(true);
  89 + }
  90 +
  91 + // ==================== 拼接 VO ====================
  92 +
  93 + private List<MesWmStockTakingTaskLineRespVO> buildTaskLineRespVOList(List<MesWmStockTakingTaskLineDO> list) {
  94 + if (CollUtil.isEmpty(list)) {
  95 + return Collections.emptyList();
  96 + }
  97 + // 查询关联数据
  98 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(convertSet(list, MesWmStockTakingTaskLineDO::getItemId));
  99 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  100 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  101 + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
  102 + convertSet(list, MesWmStockTakingTaskLineDO::getWarehouseId));
  103 + Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap(
  104 + convertSet(list, MesWmStockTakingTaskLineDO::getLocationId));
  105 + Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap(
  106 + convertSet(list, MesWmStockTakingTaskLineDO::getAreaId));
  107 + // 拼接 VO
  108 + return BeanUtils.toBean(list, MesWmStockTakingTaskLineRespVO.class, vo -> {
  109 + findAndThen(itemMap, vo.getItemId(), item -> {
  110 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
  111 + findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  112 + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
  113 + });
  114 + findAndThen(warehouseMap, vo.getWarehouseId(),
  115 + warehouse -> vo.setWarehouseName(warehouse.getName()));
  116 + findAndThen(locationMap,
  117 + vo.getLocationId(), location -> vo.setLocationName(location.getName()));
  118 + findAndThen(areaMap,
  119 + vo.getAreaId(), area -> vo.setAreaName(area.getName()));
  120 + });
  121 + }
  122 +
  123 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/line/MesWmStockTakingTaskLinePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +@Schema(description = "管理后台 - 盘点任务行分页 Request VO")
  10 +@Data
  11 +@EqualsAndHashCode(callSuper = true)
  12 +@ToString(callSuper = true)
  13 +public class MesWmStockTakingTaskLinePageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "盘点任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  16 + private Long taskId;
  17 +
  18 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/line/MesWmStockTakingTaskLineSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
  5 +import lombok.Data;
  6 +
  7 +import java.math.BigDecimal;
  8 +
  9 +@Schema(description = "管理后台 - 盘点任务行新增/修改 Request VO")
  10 +@Data
  11 +public class MesWmStockTakingTaskLineSaveReqVO {
  12 +
  13 + @Schema(description = "编号", example = "1")
  14 + private Long id;
  15 +
  16 + @Schema(description = "盘点任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  17 + @NotNull(message = "盘点任务编号不能为空")
  18 + private Long taskId;
  19 +
  20 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  21 + @NotNull(message = "物料编号不能为空")
  22 + private Long itemId;
  23 +
  24 + @Schema(description = "批次编号", example = "1")
  25 + private Long batchId;
  26 +
  27 + @Schema(description = "账面数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
  28 + @NotNull(message = "账面数量不能为空")
  29 + private BigDecimal quantity;
  30 +
  31 + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  32 + @NotNull(message = "仓库编号不能为空")
  33 + private Long warehouseId;
  34 +
  35 + @Schema(description = "库区编号", example = "1")
  36 + private Long locationId;
  37 +
  38 + @Schema(description = "库位编号", example = "1")
  39 + private Long areaId;
  40 +
  41 + @Schema(description = "盘点状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  42 + @NotNull(message = "盘点状态不能为空")
  43 + private Integer status;
  44 +
  45 + @Schema(description = "备注", example = "备注")
  46 + private String remark;
  47 +
  48 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java
1 1 package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLinePageReqVO;
5 7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
6 8 import org.apache.ibatis.annotations.Mapper;
7 9  
... ... @@ -33,4 +35,10 @@ public interface MesWmStockTakingTaskLineMapper extends BaseMapperX&lt;MesWmStockTa
33 35 delete(MesWmStockTakingTaskLineDO::getTaskId, taskId);
34 36 }
35 37  
  38 + default PageResult<MesWmStockTakingTaskLineDO> selectPage(MesWmStockTakingTaskLinePageReqVO reqVO) {
  39 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmStockTakingTaskLineDO>()
  40 + .eqIfPresent(MesWmStockTakingTaskLineDO::getTaskId, reqVO.getTaskId())
  41 + .orderByAsc(MesWmStockTakingTaskLineDO::getId));
  42 + }
  43 +
36 44 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java
... ... @@ -13,8 +13,6 @@ import java.util.Arrays;
13 13 @AllArgsConstructor
14 14 public enum MesWmStockTakingTaskLineStatusEnum implements ArrayValuable<Integer> {
15 15  
16   - // TODO @AI:UNCOUNTED 可以去掉!
17   - UNCOUNTED(0, "未盘点"),
18 16 NORMAL(1, "正常"),
19 17 GAIN(2, "盘盈"),
20 18 LOSS(3, "盘亏");
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLinePageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
  8 +
  9 +/**
  10 + * MES 盘点任务行 Service 接口
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +public interface MesWmStockTakingTaskLineService {
  15 +
  16 + /**
  17 + * 根据盘点方案生成盘点明细行
  18 + *
  19 + * @param task 盘点任务
  20 + */
  21 + void generateStockTakingLines(MesWmStockTakingTaskDO task);
  22 +
  23 + /**
  24 + * 分页查询盘点任务行
  25 + *
  26 + * @param pageReqVO 分页查询条件
  27 + * @return 盘点任务行分页结果
  28 + */
  29 + PageResult<MesWmStockTakingTaskLineDO> getStockTakingTaskLinePage(MesWmStockTakingTaskLinePageReqVO pageReqVO);
  30 +
  31 + /**
  32 + * 创建盘点任务行
  33 + *
  34 + * @param createReqVO 创建信息
  35 + * @return 编号
  36 + */
  37 + Long createStockTakingTaskLine(MesWmStockTakingTaskLineSaveReqVO createReqVO);
  38 +
  39 + /**
  40 + * 更新盘点任务行
  41 + *
  42 + * @param updateReqVO 更新信息
  43 + */
  44 + void updateStockTakingTaskLine(MesWmStockTakingTaskLineSaveReqVO updateReqVO);
  45 +
  46 + /**
  47 + * 删除盘点任务行
  48 + *
  49 + * @param id 盘点任务行编号
  50 + */
  51 + void deleteStockTakingTaskLine(Long id);
  52 +
  53 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskLineServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
  5 +import cn.hutool.core.util.ObjUtil;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLinePageReqVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineSaveReqVO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
  15 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan.MesWmStockTakingPlanParamMapper;
  16 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskLineMapper;
  17 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskMapper;
  18 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanParamTypeEnum;
  19 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskLineStatusEnum;
  20 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskStatusEnum;
  21 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTypeEnum;
  22 +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
  23 +import jakarta.annotation.Resource;
  24 +import org.springframework.stereotype.Service;
  25 +import org.springframework.transaction.annotation.Transactional;
  26 +import org.springframework.validation.annotation.Validated;
  27 +
  28 +import java.math.BigDecimal;
  29 +import java.util.List;
  30 +import java.util.Objects;
  31 +
  32 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  33 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  34 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
  35 +
  36 +/**
  37 + * MES 盘点任务行 Service 实现类
  38 + *
  39 + * @author 芋道源码
  40 + */
  41 +@Service
  42 +@Validated
  43 +public class MesWmStockTakingTaskLineServiceImpl implements MesWmStockTakingTaskLineService {
  44 +
  45 + @Resource
  46 + private MesWmStockTakingTaskLineMapper stockTakingTaskLineMapper;
  47 + @Resource
  48 + private MesWmStockTakingPlanParamMapper stockTakingPlanParamMapper;
  49 + @Resource
  50 + private MesWmMaterialStockService materialStockService;
  51 +
  52 + @Resource
  53 + private MesWmStockTakingTaskMapper stockTakingTaskMapper;
  54 +
  55 + @Override
  56 + @Transactional(rollbackFor = Exception.class)
  57 + public void generateStockTakingLines(MesWmStockTakingTaskDO task) {
  58 + // 1.1 构建查询条件(包含动态盘点时间校验)
  59 + MesWmMaterialStockListReqVO reqVO = buildStockQueryReqVO(task);
  60 + // 1.2 查询物料库存
  61 + List<MesWmMaterialStockDO> stocks = materialStockService.getMaterialStockList(reqVO);
  62 + if (CollUtil.isEmpty(stocks)) {
  63 + throw exception(WM_STOCK_TAKING_TASK_NO_STOCK);
  64 + }
  65 +
  66 + // 2. 批量生成明细行
  67 + // TODO DONE @AI:使用 CollectionUtils convertList 方法简化代码
  68 + List<MesWmStockTakingTaskLineDO> lines = convertList(stocks, stock ->
  69 + MesWmStockTakingTaskLineDO.builder()
  70 + .taskId(task.getId()).materialStockId(stock.getId()).itemId(stock.getItemId())
  71 + .batchId(stock.getBatchId()).quantity(defaultQuantity(stock.getQuantityOnhand()))
  72 + .warehouseId(stock.getWarehouseId()).locationId(stock.getLocationId()).areaId(stock.getAreaId())
  73 + .status(MesWmStockTakingTaskLineStatusEnum.LOSS.getStatus()).build());
  74 + stockTakingTaskLineMapper.insertBatch(lines);
  75 + }
  76 +
  77 + @Override
  78 + public PageResult<MesWmStockTakingTaskLineDO> getStockTakingTaskLinePage(MesWmStockTakingTaskLinePageReqVO pageReqVO) {
  79 + return stockTakingTaskLineMapper.selectPage(pageReqVO);
  80 + }
  81 +
  82 + @Override
  83 + @Transactional(rollbackFor = Exception.class)
  84 + public Long createStockTakingTaskLine(MesWmStockTakingTaskLineSaveReqVO createReqVO) {
  85 + // 1. 校验盘点任务存在,并且处于【准备中】状态
  86 + validateTaskExistsAndPrepare(createReqVO.getTaskId());
  87 +
  88 + // 2. 创建盘点任务行
  89 + MesWmStockTakingTaskLineDO line = BeanUtils.toBean(createReqVO, MesWmStockTakingTaskLineDO.class);
  90 + stockTakingTaskLineMapper.insert(line);
  91 + return line.getId();
  92 + }
  93 +
  94 + @Override
  95 + @Transactional(rollbackFor = Exception.class)
  96 + public void updateStockTakingTaskLine(MesWmStockTakingTaskLineSaveReqVO updateReqVO) {
  97 + // TODO @AI:补全注释
  98 + // TODO @AI:搞个 validate exists 方法,这样 update 和 delete 可以服用;
  99 + MesWmStockTakingTaskLineDO line = stockTakingTaskLineMapper.selectById(updateReqVO.getId());
  100 + if (line == null) {
  101 + throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS);
  102 + }
  103 + validateTaskExistsAndPrepare(updateReqVO.getTaskId());
  104 +
  105 + // 更新
  106 + MesWmStockTakingTaskLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmStockTakingTaskLineDO.class);
  107 + stockTakingTaskLineMapper.updateById(updateObj);
  108 + }
  109 +
  110 + @Override
  111 + @Transactional(rollbackFor = Exception.class)
  112 + public void deleteStockTakingTaskLine(Long id) {
  113 + // TODO @AI:补全注释
  114 + MesWmStockTakingTaskLineDO line = stockTakingTaskLineMapper.selectById(id);
  115 + if (line == null) {
  116 + throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS);
  117 + }
  118 + validateTaskExistsAndPrepare(line.getTaskId());
  119 +
  120 + // 2. 删除
  121 + stockTakingTaskLineMapper.deleteById(id);
  122 + }
  123 +
  124 + // TODO @AI:应该在对方的 service 里提供;
  125 + private MesWmStockTakingTaskDO validateTaskExistsAndPrepare(Long id) {
  126 + MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id);
  127 + if (task == null) {
  128 + throw exception(WM_STOCK_TAKING_TASK_NOT_EXISTS);
  129 + }
  130 + if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus(), task.getStatus())) {
  131 + throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE);
  132 + }
  133 + return task;
  134 + }
  135 +
  136 + /**
  137 + * 构建库存查询条件
  138 + *
  139 + * @param task 盘点任务
  140 + * @return 查询条件 VO
  141 + */
  142 + private MesWmMaterialStockListReqVO buildStockQueryReqVO(MesWmStockTakingTaskDO task) {
  143 + // 1. 从方案参数中提取过滤条件
  144 + List<MesWmStockTakingPlanParamDO> params = stockTakingPlanParamMapper.selectListByPlanId(task.getPlanId());
  145 + Assert.notEmpty(params, "盘点方案参数不能为空");
  146 +
  147 + // 2.1 拼接通用参数
  148 + MesWmMaterialStockListReqVO reqVO = new MesWmMaterialStockListReqVO()
  149 + .setWarehouseId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.WAREHOUSE.getType()))
  150 + .setLocationId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.LOCATION.getType()))
  151 + .setAreaId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.AREA.getType()))
  152 + .setItemId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.ITEM.getType()))
  153 + .setBatchId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.BATCH.getType()));
  154 + // 2.2 对于动态盘点,设置时间参数并校验
  155 + if (MesWmStockTakingTypeEnum.DYNAMIC.getType().equals(task.getType())) {
  156 + Assert.notNull(task.getStartTime(), "动态盘点开始时间不能为空");
  157 + Assert.notNull(task.getEndTime(), "动态盘点结束时间不能为空");
  158 + reqVO.setStartTime(task.getStartTime()).setEndTime(task.getEndTime());
  159 + }
  160 + return reqVO;
  161 + }
  162 +
  163 + /**
  164 + * 从参数列表中提取第一个匹配类型的参数 ID
  165 + *
  166 + * @param params 参数列表
  167 + * @param type 参数类型
  168 + * @return 参数 ID(如果有多个,取第一个)
  169 + */
  170 + private Long extractMesWmStockTakingPlanParamValueId(List<MesWmStockTakingPlanParamDO> params, Integer type) {
  171 + MesWmStockTakingPlanParamDO param = CollUtil.findOne(params,
  172 + item -> Objects.equals(item.getType(), type) && item.getValueId() != null);
  173 + return param != null ? param.getValueId() : null;
  174 + }
  175 +
  176 + // TODO @芋艿:在确认下这个逻辑;
  177 + private BigDecimal defaultQuantity(BigDecimal quantity) {
  178 + return quantity == null ? BigDecimal.ZERO : quantity;
  179 + }
  180 +
  181 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java
1 1 package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineBatchUpdateReqVO;
5 4 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO;
6 5 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO;
7 6 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
8   -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
9 7 import jakarta.validation.Valid;
10 8  
11   -import java.util.Collection;
12   -import java.util.List;
13   -import java.util.Map;
14   -
15   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
16   -
17 9 /**
18 10 * MES 盘点任务 Service 接口
19 11 *
... ... @@ -65,13 +57,6 @@ public interface MesWmStockTakingTaskService {
65 57 void cancelStockTakingTask(Long id);
66 58  
67 59 /**
68   - * 批量更新盘点任务行
69   - *
70   - * @param updateReqVO 更新信息
71   - */
72   - void updateStockTakingTaskLines(@Valid MesWmStockTakingTaskLineBatchUpdateReqVO updateReqVO);
73   -
74   - /**
75 60 * 获得盘点任务
76 61 *
77 62 * @param id 盘点任务编号
... ... @@ -88,24 +73,6 @@ public interface MesWmStockTakingTaskService {
88 73 MesWmStockTakingTaskDO validateStockTakingTaskExists(Long id);
89 74  
90 75 /**
91   - * 获得盘点任务列表
92   - *
93   - * @param ids 盘点任务编号集合
94   - * @return 盘点任务列表
95   - */
96   - List<MesWmStockTakingTaskDO> getStockTakingTaskList(Collection<Long> ids);
97   -
98   - /**
99   - * 获得盘点任务 Map
100   - *
101   - * @param ids 盘点任务编号集合
102   - * @return 盘点任务 Map
103   - */
104   - default Map<Long, MesWmStockTakingTaskDO> getStockTakingTaskMap(Collection<Long> ids) {
105   - return convertMap(getStockTakingTaskList(ids), MesWmStockTakingTaskDO::getId);
106   - }
107   -
108   - /**
109 76 * 分页查询盘点任务
110 77 *
111 78 * @param pageReqVO 分页查询条件
... ... @@ -113,12 +80,4 @@ public interface MesWmStockTakingTaskService {
113 80 */
114 81 PageResult<MesWmStockTakingTaskDO> getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO);
115 82  
116   - /**
117   - * 获得盘点任务行列表
118   - *
119   - * @param taskId 盘点任务编号
120   - * @return 盘点任务行列表
121   - */
122   - List<MesWmStockTakingTaskLineDO> getStockTakingTaskLineList(Long taskId);
123   -
124 83 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
1 1 package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.lang.Assert;
  4 +import cn.hutool.core.util.ObjUtil;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 7 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO;
8   -import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO;
9 8 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO;
10 9 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO;
11   -import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.line.MesWmStockTakingTaskLineBatchUpdateReqVO;
12   -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
13   -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO;
14 10 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
15 11 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
16 12 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO;
17   -import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan.MesWmStockTakingPlanMapper;
18   -import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan.MesWmStockTakingPlanParamMapper;
19 13 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskLineMapper;
20 14 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskMapper;
21 15 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskResultMapper;
22   -import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanParamTypeEnum;
23 16 import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskLineStatusEnum;
24 17 import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskStatusEnum;
25   -import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTypeEnum;
26 18 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
  19 +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService;
27 20 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
28 21 import jakarta.annotation.Resource;
29 22 import org.springframework.stereotype.Service;
... ... @@ -32,11 +25,10 @@ import org.springframework.validation.annotation.Validated;
32 25  
33 26 import java.math.BigDecimal;
34 27 import java.time.LocalDateTime;
35   -import java.util.*;
36   -import java.util.stream.Collectors;
  28 +import java.util.List;
  29 +import java.util.Objects;
37 30  
38 31 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
39   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
40 32 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
41 33  
42 34 /**
... ... @@ -50,20 +42,21 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
50 42  
51 43 @Resource
52 44 private MesWmStockTakingTaskMapper stockTakingTaskMapper;
  45 + // TODO @芋艿:看看怎么清理掉,这块的依赖;应该调用对方的 service
53 46 @Resource
54 47 private MesWmStockTakingTaskLineMapper stockTakingTaskLineMapper;
  48 + // TODO @芋艿:看看怎么清理掉,这块的依赖;应该调用对方的 service
55 49 @Resource
56 50 private MesWmStockTakingTaskResultMapper stockTakingTaskResultMapper;
57   - @Resource
58   - private MesWmStockTakingPlanParamMapper stockTakingPlanParamMapper;
59   - @Resource
60   - private MesWmStockTakingPlanMapper stockTakingPlanMapper;
  51 +
61 52 @Resource
62 53 private MesWmMaterialStockService materialStockService;
63 54 @Resource
64 55 private AdminUserApi adminUserApi;
65 56 @Resource
66   - private cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService stockTakingPlanService;
  57 + private MesWmStockTakingPlanService stockTakingPlanService;
  58 + @Resource
  59 + private MesWmStockTakingTaskLineService stockTakingTaskLineService;
67 60  
68 61 @Override
69 62 @Transactional(rollbackFor = Exception.class)
... ... @@ -73,6 +66,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
73 66 // 1.2 校验方案存在
74 67 adminUserApi.validateUser(createReqVO.getUserId());
75 68 // 1.3 校验方案可用
  69 + // TODO @芋艿:貌似可以 planId 不填写;无 plan 就手动维护;
76 70 stockTakingPlanService.validateStockTakingPlanEnabled(createReqVO.getPlanId());
77 71  
78 72 // 2. 插入任务
... ... @@ -81,7 +75,8 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
81 75 stockTakingTaskMapper.insert(task);
82 76  
83 77 // 3. 根据方案生成盘点明细行
84   - generateStockTakingLines(task);
  78 + // TODO @AI:有 plan 的情况下,才类似操作;
  79 + stockTakingTaskLineService.generateStockTakingLines(task);
85 80 return task.getId();
86 81 }
87 82  
... ... @@ -95,6 +90,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
95 90 // 1.3 校验方案存在
96 91 adminUserApi.validateUser(updateReqVO.getUserId());
97 92 // 1.4 校验方案可用
  93 + // TODO @芋艿:貌似可以 planId 不填写;无 plan 就手动维护;
98 94 stockTakingPlanService.validateStockTakingPlanEnabled(updateReqVO.getPlanId());
99 95  
100 96 // 2. 更新任务
... ... @@ -102,8 +98,9 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
102 98 stockTakingTaskMapper.updateById(updateObj);
103 99  
104 100 // 3. 删除老的明细,重新生成新的
  101 + // TODO @AI:有 plan 的情况下,才类似操作;
105 102 stockTakingTaskLineMapper.deleteByTaskId(updateReqVO.getId());
106   - generateStockTakingLines(updateObj);
  103 + stockTakingTaskLineService.generateStockTakingLines(updateObj);
107 104 }
108 105  
109 106 @Override
... ... @@ -144,79 +141,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
144 141 }
145 142 }
146 143  
147   - /**
148   - * 根据盘点方案生成盘点明细行
149   - *
150   - * @param task 盘点任务
151   - */
152   - private void generateStockTakingLines(MesWmStockTakingTaskDO task) {
153   - // 1.1 构建查询条件(包含动态盘点时间校验)
154   - MesWmMaterialStockListReqVO reqVO = buildStockQueryReqVO(task);
155   - // 1.2 查询物料库存
156   - List<MesWmMaterialStockDO> stocks = materialStockService.getMaterialStockList(reqVO);
157   - if (CollUtil.isEmpty(stocks)) {
158   - throw exception(WM_STOCK_TAKING_TASK_NO_STOCK);
159   - }
160   -
161   - // 2. 批量生成明细行
162   - // TODO DONE @AI:把 stocks 作为参数,传递给 stocktakingTaskLineService,更收敛;(当前直接插入更简洁)
163   - List<MesWmStockTakingTaskLineDO> lines = new ArrayList<>(stocks.size());
164   - for (MesWmMaterialStockDO stock : stocks) {
165   - MesWmStockTakingTaskLineDO line = MesWmStockTakingTaskLineDO.builder()
166   - .taskId(task.getId())
167   - .materialStockId(stock.getId())
168   - .itemId(stock.getItemId())
169   - .batchId(stock.getBatchId())
170   - .quantity(defaultQuantity(stock.getQuantityOnhand()))
171   - .warehouseId(stock.getWarehouseId())
172   - .locationId(stock.getLocationId())
173   - .areaId(stock.getAreaId())
174   - .status(MesWmStockTakingTaskLineStatusEnum.LOSS.getStatus())
175   - .build();
176   - lines.add(line);
177   - }
178   - stockTakingTaskLineMapper.insertBatch(lines);
179   - }
180   -
181   - /**
182   - * 构建库存查询条件
183   - *
184   - * @param task 盘点任务
185   - * @return 查询条件 VO
186   - */
187   - private MesWmMaterialStockListReqVO buildStockQueryReqVO(MesWmStockTakingTaskDO task) {
188   - // 1. 从方案参数中提取过滤条件
189   - List<MesWmStockTakingPlanParamDO> params = stockTakingPlanParamMapper.selectListByPlanId(task.getPlanId());
190   - Assert.notEmpty(params, "盘点方案参数不能为空");
191   -
192   - // 2.1 拼接通用参数
193   - MesWmMaterialStockListReqVO reqVO = new MesWmMaterialStockListReqVO()
194   - .setWarehouseId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.WAREHOUSE.getType()))
195   - .setLocationId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.LOCATION.getType()))
196   - .setAreaId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.AREA.getType()))
197   - .setItemId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.ITEM.getType()))
198   - .setBatchId(extractMesWmStockTakingPlanParamValueId(params, MesWmStockTakingPlanParamTypeEnum.BATCH.getType()));
199   - // 2.2 对于动态盘点,设置时间参数并校验
200   - if (MesWmStockTakingTypeEnum.DYNAMIC.getType().equals(task.getType())) {
201   - Assert.notNull(task.getStartTime(), "动态盘点开始时间不能为空");
202   - Assert.notNull(task.getEndTime(), "动态盘点结束时间不能为空");
203   - reqVO.setStartTime(task.getStartTime()).setEndTime(task.getEndTime());
204   - }
205   - return reqVO;
206   - }
207   -
208   - /**
209   - * 从参数列表中提取第一个匹配类型的参数 ID
210   - *
211   - * @param params 参数列表
212   - * @param type 参数类型
213   - * @return 参数 ID(如果有多个,取第一个)
214   - */
215   - private Long extractMesWmStockTakingPlanParamValueId(List<MesWmStockTakingPlanParamDO> params, Integer type) {
216   - MesWmStockTakingPlanParamDO param = CollUtil.findOne(params,
217   - item -> Objects.equals(item.getType(), type) && item.getValueId() != null);
218   - return param != null ? param.getValueId() : null;
219   - }
220 144  
221 145 @Override
222 146 @Transactional(rollbackFor = Exception.class)
... ... @@ -234,8 +158,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
234 158  
235 159 stockTakingTaskResultMapper.deleteByTaskId(id);
236 160 for (MesWmStockTakingTaskLineDO line : lines) {
237   - if (MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus().equals(line.getStatus())
238   - || MesWmStockTakingTaskLineStatusEnum.UNCOUNTED.getStatus().equals(line.getStatus())) {
  161 + if (MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus().equals(line.getStatus())) {
239 162 continue;
240 163 }
241 164 stockTakingTaskResultMapper.insert(MesWmStockTakingTaskResultDO.builder()
... ... @@ -277,30 +200,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
277 200 }
278 201  
279 202 @Override
280   - @Transactional(rollbackFor = Exception.class)
281   - public void updateStockTakingTaskLines(MesWmStockTakingTaskLineBatchUpdateReqVO updateReqVO) {
282   - MesWmStockTakingTaskDO task = validateTaskExists(updateReqVO.getTaskId());
283   - if (!MesWmStockTakingTaskStatusEnum.APPROVING.getStatus().equals(task.getStatus())) {
284   - throw exception(WM_STOCK_TAKING_TASK_NOT_APPROVING);
285   - }
286   -
287   - Set<Long> lineIds = convertSet(updateReqVO.getItems(), MesWmStockTakingTaskLineBatchUpdateReqVO.Item::getId);
288   - List<MesWmStockTakingTaskLineDO> lines = stockTakingTaskLineMapper.selectListByTaskIdAndIds(updateReqVO.getTaskId(), lineIds);
289   - if (lines.size() != updateReqVO.getItems().size()) {
290   - throw exception(WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS);
291   - }
292   - Map<Long, MesWmStockTakingTaskLineDO> lineMap = lines.stream()
293   - .collect(Collectors.toMap(MesWmStockTakingTaskLineDO::getId, item -> item));
294   - for (MesWmStockTakingTaskLineBatchUpdateReqVO.Item item : updateReqVO.getItems()) {
295   - MesWmStockTakingTaskLineDO line = lineMap.get(item.getId());
296   - line.setTakingQuantity(item.getTakingQuantity());
297   - line.setRemark(item.getRemark());
298   - line.setStatus(resolveLineStatus(line.getQuantity(), item.getTakingQuantity()));
299   - stockTakingTaskLineMapper.updateById(line);
300   - }
301   - }
302   -
303   - @Override
304 203 public MesWmStockTakingTaskDO getStockTakingTask(Long id) {
305 204 return stockTakingTaskMapper.selectById(id);
306 205 }
... ... @@ -311,23 +210,10 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
311 210 }
312 211  
313 212 @Override
314   - public List<MesWmStockTakingTaskDO> getStockTakingTaskList(Collection<Long> ids) {
315   - if (CollUtil.isEmpty(ids)) {
316   - return Collections.emptyList();
317   - }
318   - return stockTakingTaskMapper.selectByIds(ids);
319   - }
320   -
321   - @Override
322 213 public PageResult<MesWmStockTakingTaskDO> getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO) {
323 214 return stockTakingTaskMapper.selectPage(pageReqVO);
324 215 }
325 216  
326   - @Override
327   - public List<MesWmStockTakingTaskLineDO> getStockTakingTaskLineList(Long taskId) {
328   - return stockTakingTaskLineMapper.selectListByTaskId(taskId);
329   - }
330   -
331 217 private void updateFrozen(Long materialStockId, boolean frozen) {
332 218 MesWmMaterialStockFreezeReqVO reqVO = new MesWmMaterialStockFreezeReqVO();
333 219 reqVO.setId(materialStockId);
... ... @@ -347,9 +233,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
347 233 }
348 234  
349 235 private Integer resolveLineStatus(BigDecimal quantity, BigDecimal takingQuantity) {
350   - if (takingQuantity == null) {
351   - return MesWmStockTakingTaskLineStatusEnum.UNCOUNTED.getStatus();
352   - }
353 236 int compare = takingQuantity.compareTo(defaultQuantity(quantity));
354 237 if (compare == 0) {
355 238 return MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus();
... ... @@ -376,12 +259,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
376 259 }
377 260 }
378 261  
379   - private void validatePlanExists(Long id) {
380   - if (stockTakingPlanMapper.selectById(id) == null) {
381   - throw exception(WM_STOCK_TAKING_PLAN_NOT_EXISTS);
382   - }
383   - }
384   -
385 262 private MesWmStockTakingTaskDO validateTaskExists(Long id) {
386 263 MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id);
387 264 if (task == null) {
... ... @@ -392,7 +269,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
392 269  
393 270 private MesWmStockTakingTaskDO validateTaskExistsAndPrepare(Long id) {
394 271 MesWmStockTakingTaskDO task = validateTaskExists(id);
395   - if (!MesWmStockTakingTaskStatusEnum.PREPARE.getStatus().equals(task.getStatus())) {
  272 + if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus(), task.getStatus())) {
396 273 throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE);
397 274 }
398 275 return task;
... ...