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,23 +9,10 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
9 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 9 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
10 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 10 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
11 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.*; 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 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO; 12 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO;
17 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO; 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 import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService; 14 import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService;
25 import cn.iocoder.yudao.module.mes.service.wm.stocktaking.task.MesWmStockTakingTaskService; 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 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 16 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
30 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 17 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
31 import io.swagger.v3.oas.annotations.Operation; 18 import io.swagger.v3.oas.annotations.Operation;
@@ -39,7 +26,6 @@ import org.springframework.validation.annotation.Validated; @@ -39,7 +26,6 @@ import org.springframework.validation.annotation.Validated;
39 import org.springframework.web.bind.annotation.*; 26 import org.springframework.web.bind.annotation.*;
40 27
41 import java.io.IOException; 28 import java.io.IOException;
42 -import java.math.BigDecimal;  
43 import java.util.Collections; 29 import java.util.Collections;
44 import java.util.List; 30 import java.util.List;
45 import java.util.Map; 31 import java.util.Map;
@@ -59,17 +45,6 @@ public class MesWmStockTakingTaskController { @@ -59,17 +45,6 @@ public class MesWmStockTakingTaskController {
59 @Resource 45 @Resource
60 private MesWmStockTakingPlanService stockTakingPlanService; 46 private MesWmStockTakingPlanService stockTakingPlanService;
61 @Resource 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 private AdminUserApi adminUserApi; 48 private AdminUserApi adminUserApi;
74 49
75 @PostMapping("/create") 50 @PostMapping("/create")
@@ -153,63 +128,24 @@ public class MesWmStockTakingTaskController { @@ -153,63 +128,24 @@ public class MesWmStockTakingTaskController {
153 return success(true); 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 private List<MesWmStockTakingTaskRespVO> buildTaskRespVOList(List<MesWmStockTakingTaskDO> list) { 133 private List<MesWmStockTakingTaskRespVO> buildTaskRespVOList(List<MesWmStockTakingTaskDO> list) {
173 if (CollUtil.isEmpty(list)) { 134 if (CollUtil.isEmpty(list)) {
174 return Collections.emptyList(); 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 return BeanUtils.toBean(list, MesWmStockTakingTaskRespVO.class, vo -> { 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 package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task; 1 package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO; 7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
6 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
7 9
@@ -33,4 +35,10 @@ public interface MesWmStockTakingTaskLineMapper extends BaseMapperX&lt;MesWmStockTa @@ -33,4 +35,10 @@ public interface MesWmStockTakingTaskLineMapper extends BaseMapperX&lt;MesWmStockTa
33 delete(MesWmStockTakingTaskLineDO::getTaskId, taskId); 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,8 +13,6 @@ import java.util.Arrays;
13 @AllArgsConstructor 13 @AllArgsConstructor
14 public enum MesWmStockTakingTaskLineStatusEnum implements ArrayValuable<Integer> { 14 public enum MesWmStockTakingTaskLineStatusEnum implements ArrayValuable<Integer> {
15 15
16 - // TODO @AI:UNCOUNTED 可以去掉!  
17 - UNCOUNTED(0, "未盘点"),  
18 NORMAL(1, "正常"), 16 NORMAL(1, "正常"),
19 GAIN(2, "盘盈"), 17 GAIN(2, "盘盈"),
20 LOSS(3, "盘亏"); 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 package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; 1 package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO; 4 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO;
6 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO; 5 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO;
7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO; 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 import jakarta.validation.Valid; 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 * MES 盘点任务 Service 接口 10 * MES 盘点任务 Service 接口
19 * 11 *
@@ -65,13 +57,6 @@ public interface MesWmStockTakingTaskService { @@ -65,13 +57,6 @@ public interface MesWmStockTakingTaskService {
65 void cancelStockTakingTask(Long id); 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 * @param id 盘点任务编号 62 * @param id 盘点任务编号
@@ -88,24 +73,6 @@ public interface MesWmStockTakingTaskService { @@ -88,24 +73,6 @@ public interface MesWmStockTakingTaskService {
88 MesWmStockTakingTaskDO validateStockTakingTaskExists(Long id); 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 * @param pageReqVO 分页查询条件 78 * @param pageReqVO 分页查询条件
@@ -113,12 +80,4 @@ public interface MesWmStockTakingTaskService { @@ -113,12 +80,4 @@ public interface MesWmStockTakingTaskService {
113 */ 80 */
114 PageResult<MesWmStockTakingTaskDO> getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO); 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 package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; 1 package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 -import cn.hutool.core.lang.Assert; 4 +import cn.hutool.core.util.ObjUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; 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 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO; 8 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO;
10 import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO; 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 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO; 10 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
15 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO; 11 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
16 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO; 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 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskLineMapper; 13 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskLineMapper;
20 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskMapper; 14 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskMapper;
21 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskResultMapper; 15 import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskResultMapper;
22 -import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanParamTypeEnum;  
23 import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskLineStatusEnum; 16 import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskLineStatusEnum;
24 import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskStatusEnum; 17 import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskStatusEnum;
25 -import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTypeEnum;  
26 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; 18 import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
  19 +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService;
27 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 20 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
28 import jakarta.annotation.Resource; 21 import jakarta.annotation.Resource;
29 import org.springframework.stereotype.Service; 22 import org.springframework.stereotype.Service;
@@ -32,11 +25,10 @@ import org.springframework.validation.annotation.Validated; @@ -32,11 +25,10 @@ import org.springframework.validation.annotation.Validated;
32 25
33 import java.math.BigDecimal; 26 import java.math.BigDecimal;
34 import java.time.LocalDateTime; 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 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 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 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; 32 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
41 33
42 /** 34 /**
@@ -50,20 +42,21 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -50,20 +42,21 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
50 42
51 @Resource 43 @Resource
52 private MesWmStockTakingTaskMapper stockTakingTaskMapper; 44 private MesWmStockTakingTaskMapper stockTakingTaskMapper;
  45 + // TODO @芋艿:看看怎么清理掉,这块的依赖;应该调用对方的 service
53 @Resource 46 @Resource
54 private MesWmStockTakingTaskLineMapper stockTakingTaskLineMapper; 47 private MesWmStockTakingTaskLineMapper stockTakingTaskLineMapper;
  48 + // TODO @芋艿:看看怎么清理掉,这块的依赖;应该调用对方的 service
55 @Resource 49 @Resource
56 private MesWmStockTakingTaskResultMapper stockTakingTaskResultMapper; 50 private MesWmStockTakingTaskResultMapper stockTakingTaskResultMapper;
57 - @Resource  
58 - private MesWmStockTakingPlanParamMapper stockTakingPlanParamMapper;  
59 - @Resource  
60 - private MesWmStockTakingPlanMapper stockTakingPlanMapper; 51 +
61 @Resource 52 @Resource
62 private MesWmMaterialStockService materialStockService; 53 private MesWmMaterialStockService materialStockService;
63 @Resource 54 @Resource
64 private AdminUserApi adminUserApi; 55 private AdminUserApi adminUserApi;
65 @Resource 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 @Override 61 @Override
69 @Transactional(rollbackFor = Exception.class) 62 @Transactional(rollbackFor = Exception.class)
@@ -73,6 +66,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -73,6 +66,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
73 // 1.2 校验方案存在 66 // 1.2 校验方案存在
74 adminUserApi.validateUser(createReqVO.getUserId()); 67 adminUserApi.validateUser(createReqVO.getUserId());
75 // 1.3 校验方案可用 68 // 1.3 校验方案可用
  69 + // TODO @芋艿:貌似可以 planId 不填写;无 plan 就手动维护;
76 stockTakingPlanService.validateStockTakingPlanEnabled(createReqVO.getPlanId()); 70 stockTakingPlanService.validateStockTakingPlanEnabled(createReqVO.getPlanId());
77 71
78 // 2. 插入任务 72 // 2. 插入任务
@@ -81,7 +75,8 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -81,7 +75,8 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
81 stockTakingTaskMapper.insert(task); 75 stockTakingTaskMapper.insert(task);
82 76
83 // 3. 根据方案生成盘点明细行 77 // 3. 根据方案生成盘点明细行
84 - generateStockTakingLines(task); 78 + // TODO @AI:有 plan 的情况下,才类似操作;
  79 + stockTakingTaskLineService.generateStockTakingLines(task);
85 return task.getId(); 80 return task.getId();
86 } 81 }
87 82
@@ -95,6 +90,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -95,6 +90,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
95 // 1.3 校验方案存在 90 // 1.3 校验方案存在
96 adminUserApi.validateUser(updateReqVO.getUserId()); 91 adminUserApi.validateUser(updateReqVO.getUserId());
97 // 1.4 校验方案可用 92 // 1.4 校验方案可用
  93 + // TODO @芋艿:貌似可以 planId 不填写;无 plan 就手动维护;
98 stockTakingPlanService.validateStockTakingPlanEnabled(updateReqVO.getPlanId()); 94 stockTakingPlanService.validateStockTakingPlanEnabled(updateReqVO.getPlanId());
99 95
100 // 2. 更新任务 96 // 2. 更新任务
@@ -102,8 +98,9 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -102,8 +98,9 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
102 stockTakingTaskMapper.updateById(updateObj); 98 stockTakingTaskMapper.updateById(updateObj);
103 99
104 // 3. 删除老的明细,重新生成新的 100 // 3. 删除老的明细,重新生成新的
  101 + // TODO @AI:有 plan 的情况下,才类似操作;
105 stockTakingTaskLineMapper.deleteByTaskId(updateReqVO.getId()); 102 stockTakingTaskLineMapper.deleteByTaskId(updateReqVO.getId());
106 - generateStockTakingLines(updateObj); 103 + stockTakingTaskLineService.generateStockTakingLines(updateObj);
107 } 104 }
108 105
109 @Override 106 @Override
@@ -144,79 +141,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -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 @Override 145 @Override
222 @Transactional(rollbackFor = Exception.class) 146 @Transactional(rollbackFor = Exception.class)
@@ -234,8 +158,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -234,8 +158,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
234 158
235 stockTakingTaskResultMapper.deleteByTaskId(id); 159 stockTakingTaskResultMapper.deleteByTaskId(id);
236 for (MesWmStockTakingTaskLineDO line : lines) { 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 continue; 162 continue;
240 } 163 }
241 stockTakingTaskResultMapper.insert(MesWmStockTakingTaskResultDO.builder() 164 stockTakingTaskResultMapper.insert(MesWmStockTakingTaskResultDO.builder()
@@ -277,30 +200,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -277,30 +200,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
277 } 200 }
278 201
279 @Override 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 public MesWmStockTakingTaskDO getStockTakingTask(Long id) { 203 public MesWmStockTakingTaskDO getStockTakingTask(Long id) {
305 return stockTakingTaskMapper.selectById(id); 204 return stockTakingTaskMapper.selectById(id);
306 } 205 }
@@ -311,23 +210,10 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -311,23 +210,10 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
311 } 210 }
312 211
313 @Override 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 public PageResult<MesWmStockTakingTaskDO> getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO) { 213 public PageResult<MesWmStockTakingTaskDO> getStockTakingTaskPage(MesWmStockTakingTaskPageReqVO pageReqVO) {
323 return stockTakingTaskMapper.selectPage(pageReqVO); 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 private void updateFrozen(Long materialStockId, boolean frozen) { 217 private void updateFrozen(Long materialStockId, boolean frozen) {
332 MesWmMaterialStockFreezeReqVO reqVO = new MesWmMaterialStockFreezeReqVO(); 218 MesWmMaterialStockFreezeReqVO reqVO = new MesWmMaterialStockFreezeReqVO();
333 reqVO.setId(materialStockId); 219 reqVO.setId(materialStockId);
@@ -347,9 +233,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -347,9 +233,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
347 } 233 }
348 234
349 private Integer resolveLineStatus(BigDecimal quantity, BigDecimal takingQuantity) { 235 private Integer resolveLineStatus(BigDecimal quantity, BigDecimal takingQuantity) {
350 - if (takingQuantity == null) {  
351 - return MesWmStockTakingTaskLineStatusEnum.UNCOUNTED.getStatus();  
352 - }  
353 int compare = takingQuantity.compareTo(defaultQuantity(quantity)); 236 int compare = takingQuantity.compareTo(defaultQuantity(quantity));
354 if (compare == 0) { 237 if (compare == 0) {
355 return MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus(); 238 return MesWmStockTakingTaskLineStatusEnum.NORMAL.getStatus();
@@ -376,12 +259,6 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -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 private MesWmStockTakingTaskDO validateTaskExists(Long id) { 262 private MesWmStockTakingTaskDO validateTaskExists(Long id) {
386 MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id); 263 MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id);
387 if (task == null) { 264 if (task == null) {
@@ -392,7 +269,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -392,7 +269,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
392 269
393 private MesWmStockTakingTaskDO validateTaskExistsAndPrepare(Long id) { 270 private MesWmStockTakingTaskDO validateTaskExistsAndPrepare(Long id) {
394 MesWmStockTakingTaskDO task = validateTaskExists(id); 271 MesWmStockTakingTaskDO task = validateTaskExists(id);
395 - if (!MesWmStockTakingTaskStatusEnum.PREPARE.getStatus().equals(task.getStatus())) { 272 + if (ObjUtil.notEqual(MesWmStockTakingTaskStatusEnum.PREPARE.getStatus(), task.getStatus())) {
396 throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE); 273 throw exception(WM_STOCK_TAKING_TASK_NOT_PREPARE);
397 } 274 }
398 return task; 275 return task;