Commit c96bd6335cb5d19f8f1035372d2275a156608203

Authored by YunaiV
1 parent b486001c

✨ feat(mes): 添加盘点方案参数相关功能和数据结构

新增盘点方案参数的 CRUD 接口及相关枚举,支持在管理后台进行参数的创建、更新和删除操作。同时,更新了前端组件以支持参数的动态选择和展示,提升用户体验。
Showing 28 changed files with 1327 additions and 0 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
  5 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  9 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.*;
  11 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamRespVO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO;
  13 +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanParamService;
  14 +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService;
  15 +import io.swagger.v3.oas.annotations.Operation;
  16 +import io.swagger.v3.oas.annotations.Parameter;
  17 +import io.swagger.v3.oas.annotations.tags.Tag;
  18 +import jakarta.annotation.Resource;
  19 +import jakarta.servlet.http.HttpServletResponse;
  20 +import jakarta.validation.Valid;
  21 +import org.springframework.security.access.prepost.PreAuthorize;
  22 +import org.springframework.validation.annotation.Validated;
  23 +import org.springframework.web.bind.annotation.*;
  24 +
  25 +import java.io.IOException;
  26 +import java.util.Collection;
  27 +import java.util.Collections;
  28 +import java.util.List;
  29 +import java.util.Map;
  30 +
  31 +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  32 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  33 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  34 +
  35 +@Tag(name = "管理后台 - MES 盘点方案")
  36 +@RestController
  37 +@RequestMapping("/mes/wm/stocktaking-plan")
  38 +@Validated
  39 +public class MesWmStockTakingPlanController {
  40 +
  41 + @Resource
  42 + private MesWmStockTakingPlanService stockTakingPlanService;
  43 + @Resource
  44 + private MesWmStockTakingPlanParamService stockTakingPlanParamService;
  45 +
  46 + @PostMapping("/create")
  47 + @Operation(summary = "创建盘点方案")
  48 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:create')")
  49 + public CommonResult<Long> createStockTakingPlan(@Valid @RequestBody MesWmStockTakingPlanSaveReqVO createReqVO) {
  50 + return success(stockTakingPlanService.createStockTakingPlan(createReqVO));
  51 + }
  52 +
  53 + @PutMapping("/update")
  54 + @Operation(summary = "修改盘点方案")
  55 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')")
  56 + public CommonResult<Boolean> updateStockTakingPlan(@Valid @RequestBody MesWmStockTakingPlanSaveReqVO updateReqVO) {
  57 + stockTakingPlanService.updateStockTakingPlan(updateReqVO);
  58 + return success(true);
  59 + }
  60 +
  61 + @DeleteMapping("/delete")
  62 + @Operation(summary = "删除盘点方案")
  63 + @Parameter(name = "id", description = "编号", required = true)
  64 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:delete')")
  65 + public CommonResult<Boolean> deleteStockTakingPlan(@RequestParam("id") Long id) {
  66 + stockTakingPlanService.deleteStockTakingPlan(id);
  67 + return success(true);
  68 + }
  69 +
  70 + @GetMapping("/get")
  71 + @Operation(summary = "获得盘点方案")
  72 + @Parameter(name = "id", description = "编号", required = true)
  73 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:query')")
  74 + public CommonResult<MesWmStockTakingPlanRespVO> getStockTakingPlan(@RequestParam("id") Long id) {
  75 + MesWmStockTakingPlanDO plan = stockTakingPlanService.getStockTakingPlan(id);
  76 + if (plan == null) {
  77 + return success(null);
  78 + }
  79 + return success(buildRespVOList(Collections.singletonList(plan), true).get(0));
  80 + }
  81 +
  82 + @GetMapping("/page")
  83 + @Operation(summary = "获得盘点方案分页")
  84 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:query')")
  85 + public CommonResult<PageResult<MesWmStockTakingPlanRespVO>> getStockTakingPlanPage(@Valid MesWmStockTakingPlanPageReqVO pageReqVO) {
  86 + PageResult<MesWmStockTakingPlanDO> pageResult = stockTakingPlanService.getStockTakingPlanPage(pageReqVO);
  87 + return success(new PageResult<>(buildRespVOList(pageResult.getList(), false), pageResult.getTotal()));
  88 + }
  89 +
  90 + @GetMapping("/export-excel")
  91 + @Operation(summary = "导出盘点方案 Excel")
  92 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:export')")
  93 + @ApiAccessLog(operateType = EXPORT)
  94 + public void exportStockTakingPlanExcel(@Valid MesWmStockTakingPlanPageReqVO pageReqVO,
  95 + HttpServletResponse response) throws IOException {
  96 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  97 + PageResult<MesWmStockTakingPlanDO> pageResult = stockTakingPlanService.getStockTakingPlanPage(pageReqVO);
  98 + ExcelUtils.write(response, "盘点方案.xls", "数据", MesWmStockTakingPlanRespVO.class,
  99 + buildRespVOList(pageResult.getList(), false));
  100 + }
  101 +
  102 + // TODO @AI:去掉 confirmStockTakingPlan 方法;改成 updateStatus 这种接口;
  103 + @PutMapping("/confirm")
  104 + @Operation(summary = "确认盘点方案")
  105 + @Parameter(name = "id", description = "编号", required = true)
  106 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')")
  107 + public CommonResult<Boolean> confirmStockTakingPlan(@RequestParam("id") Long id) {
  108 + stockTakingPlanService.confirmStockTakingPlan(id);
  109 + return success(true);
  110 + }
  111 +
  112 + // TODO @AI:去掉 generateStockTakingTask 方法
  113 + @PostMapping("/generate-task")
  114 + @Operation(summary = "根据盘点方案生成盘点任务")
  115 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-task:create')")
  116 + public CommonResult<Long> generateStockTakingTask(@Valid @RequestBody MesWmStockTakingPlanGenerateReqVO reqVO) {
  117 + return success(stockTakingPlanService.generateStockTakingTask(reqVO));
  118 + }
  119 +
  120 + private List<MesWmStockTakingPlanRespVO> buildRespVOList(List<MesWmStockTakingPlanDO> list, boolean includeParams) {
  121 + if (CollUtil.isEmpty(list)) {
  122 + return Collections.emptyList();
  123 + }
  124 + final Map<Long, List<MesWmStockTakingPlanParamRespVO>> finalParamMap;
  125 + if (includeParams) {
  126 + Collection<Long> planIds = convertSet(list, MesWmStockTakingPlanDO::getId);
  127 + Map<Long, List<MesWmStockTakingPlanParamRespVO>> paramMap = new java.util.HashMap<>();
  128 + stockTakingPlanParamService.getStockTakingPlanParamMap(planIds)
  129 + .forEach((planId, params) -> paramMap.put(planId,
  130 + BeanUtils.toBean(params, MesWmStockTakingPlanParamRespVO.class)));
  131 + finalParamMap = paramMap;
  132 + } else {
  133 + finalParamMap = Collections.emptyMap();
  134 + }
  135 + return BeanUtils.toBean(list, MesWmStockTakingPlanRespVO.class,
  136 + vo -> vo.setParams(finalParamMap.getOrDefault(vo.getId(), Collections.emptyList())));
  137 + }
  138 +
  139 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanParamController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamRespVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO;
  8 +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanParamService;
  9 +import io.swagger.v3.oas.annotations.Operation;
  10 +import io.swagger.v3.oas.annotations.Parameter;
  11 +import io.swagger.v3.oas.annotations.tags.Tag;
  12 +import jakarta.annotation.Resource;
  13 +import jakarta.validation.Valid;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
  15 +import org.springframework.validation.annotation.Validated;
  16 +import org.springframework.web.bind.annotation.*;
  17 +
  18 +import java.util.List;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  21 +
  22 +@Tag(name = "管理后台 - MES 盘点方案参数")
  23 +@RestController
  24 +@RequestMapping("/mes/wm/stocktaking-plan-param")
  25 +@Validated
  26 +public class MesWmStockTakingPlanParamController {
  27 +
  28 + @Resource
  29 + private MesWmStockTakingPlanParamService stockTakingPlanParamService;
  30 +
  31 + @PostMapping("/create")
  32 + @Operation(summary = "创建盘点方案参数")
  33 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')")
  34 + public CommonResult<Long> createStockTakingPlanParam(@Valid @RequestBody MesWmStockTakingPlanParamSaveReqVO createReqVO) {
  35 + return success(stockTakingPlanParamService.createStockTakingPlanParam(createReqVO));
  36 + }
  37 +
  38 + @PutMapping("/update")
  39 + @Operation(summary = "修改盘点方案参数")
  40 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')")
  41 + public CommonResult<Boolean> updateStockTakingPlanParam(@Valid @RequestBody MesWmStockTakingPlanParamSaveReqVO updateReqVO) {
  42 + stockTakingPlanParamService.updateStockTakingPlanParam(updateReqVO);
  43 + return success(true);
  44 + }
  45 +
  46 + @DeleteMapping("/delete")
  47 + @Operation(summary = "删除盘点方案参数")
  48 + @Parameter(name = "id", description = "编号", required = true)
  49 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')")
  50 + public CommonResult<Boolean> deleteStockTakingPlanParam(@RequestParam("id") Long id) {
  51 + stockTakingPlanParamService.deleteStockTakingPlanParam(id);
  52 + return success(true);
  53 + }
  54 +
  55 + @GetMapping("/get")
  56 + @Operation(summary = "获得盘点方案参数")
  57 + @Parameter(name = "id", description = "编号", required = true)
  58 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:query')")
  59 + public CommonResult<MesWmStockTakingPlanParamRespVO> getStockTakingPlanParam(@RequestParam("id") Long id) {
  60 + MesWmStockTakingPlanParamDO param = stockTakingPlanParamService.getStockTakingPlanParam(id);
  61 + return success(param == null ? null : BeanUtils.toBean(param, MesWmStockTakingPlanParamRespVO.class));
  62 + }
  63 +
  64 + // TODO @AI:不需要这个接口;前端只需要分页接口;
  65 + @GetMapping("/list")
  66 + @Operation(summary = "获得盘点方案参数列表")
  67 + @Parameter(name = "planId", description = "方案编号", required = true)
  68 + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:query')")
  69 + public CommonResult<List<MesWmStockTakingPlanParamRespVO>> getStockTakingPlanParamList(@RequestParam("planId") Long planId) {
  70 + return success(BeanUtils.toBean(stockTakingPlanParamService.getStockTakingPlanParamList(planId),
  71 + MesWmStockTakingPlanParamRespVO.class));
  72 + }
  73 +
  74 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanGenerateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo;
  2 +
  3 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
  7 +import lombok.Data;
  8 +
  9 +import java.time.LocalDateTime;
  10 +import java.util.List;
  11 +
  12 +@Schema(description = "管理后台 - MES 盘点方案生成任务 Request VO")
  13 +@Data
  14 +public class MesWmStockTakingPlanGenerateReqVO {
  15 +
  16 + @Schema(description = "方案编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  17 + @NotNull(message = "方案编号不能为空")
  18 + private Long planId;
  19 +
  20 + @Schema(description = "任务编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ST202603080001")
  21 + @NotEmpty(message = "任务编码不能为空")
  22 + private String code;
  23 +
  24 + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓月度盘点任务")
  25 + @NotEmpty(message = "任务名称不能为空")
  26 + private String name;
  27 +
  28 + @Schema(description = "盘点日期")
  29 + private LocalDateTime takingDate;
  30 +
  31 + @Schema(description = "盘点人 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  32 + @NotNull(message = "盘点人不能为空")
  33 + private Long userId;
  34 +
  35 + @Schema(description = "备注", example = "备注")
  36 + private String remark;
  37 +
  38 + @Schema(description = "方案参数列表,为空时使用方案自身参数")
  39 + private List<MesWmStockTakingPlanParamSaveReqVO> params;
  40 +
  41 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo;
  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 org.springframework.format.annotation.DateTimeFormat;
  8 +
  9 +import java.time.LocalDateTime;
  10 +
  11 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  12 +
  13 +@Schema(description = "管理后台 - MES 盘点方案分页 Request VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +public class MesWmStockTakingPlanPageReqVO extends PageParam {
  17 +
  18 + @Schema(description = "方案编码", example = "STP202603080001")
  19 + private String code;
  20 +
  21 + @Schema(description = "方案名称", example = "原料仓月度盘点方案")
  22 + private String name;
  23 +
  24 + @Schema(description = "盘点类型", example = "1")
  25 + private Integer type;
  26 +
  27 + @Schema(description = "状态", example = "0")
  28 + private Integer status;
  29 +
  30 + @Schema(description = "是否启用", example = "true")
  31 + private Boolean enableFlag;
  32 +
  33 + @Schema(description = "计划开始时间范围")
  34 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  35 + private LocalDateTime[] startTime;
  36 +
  37 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo;
  2 +
  3 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  4 +import cn.idev.excel.annotation.ExcelProperty;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamRespVO;
  6 +import io.swagger.v3.oas.annotations.media.Schema;
  7 +import lombok.Data;
  8 +
  9 +import java.time.LocalDateTime;
  10 +import java.util.List;
  11 +
  12 +@Schema(description = "管理后台 - MES 盘点方案 Response VO")
  13 +@Data
  14 +@ExcelIgnoreUnannotated
  15 +public class MesWmStockTakingPlanRespVO {
  16 +
  17 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  18 + @ExcelProperty("编号")
  19 + private Long id;
  20 +
  21 + @Schema(description = "方案编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "STP202603080001")
  22 + @ExcelProperty("方案编码")
  23 + private String code;
  24 +
  25 + @Schema(description = "方案名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓月度盘点方案")
  26 + @ExcelProperty("方案名称")
  27 + private String name;
  28 +
  29 + @Schema(description = "盘点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  30 + @ExcelProperty("盘点类型")
  31 + private Integer type;
  32 +
  33 + @Schema(description = "计划开始时间")
  34 + @ExcelProperty("计划开始时间")
  35 + private LocalDateTime startTime;
  36 +
  37 + @Schema(description = "计划结束时间")
  38 + @ExcelProperty("计划结束时间")
  39 + private LocalDateTime endTime;
  40 +
  41 + @Schema(description = "是否盲盘", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  42 + @ExcelProperty("是否盲盘")
  43 + private Boolean blindFlag;
  44 +
  45 + @Schema(description = "是否冻结库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  46 + @ExcelProperty("是否冻结库存")
  47 + private Boolean frozenFlag;
  48 +
  49 + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
  50 + @ExcelProperty("是否启用")
  51 + private Boolean enableFlag;
  52 +
  53 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  54 + @ExcelProperty("状态")
  55 + private Integer status;
  56 +
  57 + @Schema(description = "备注", example = "备注")
  58 + @ExcelProperty("备注")
  59 + private String remark;
  60 +
  61 + @Schema(description = "方案参数列表")
  62 + private List<MesWmStockTakingPlanParamRespVO> params;
  63 +
  64 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  65 + @ExcelProperty("创建时间")
  66 + private LocalDateTime createTime;
  67 +
  68 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - MES 盘点方案新增/修改 Request VO")
  11 +@Data
  12 +public class MesWmStockTakingPlanSaveReqVO {
  13 +
  14 + @Schema(description = "编号", example = "1024")
  15 + private Long id;
  16 +
  17 + @Schema(description = "方案编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "STP202603080001")
  18 + @NotEmpty(message = "方案编码不能为空")
  19 + private String code;
  20 +
  21 + @Schema(description = "方案名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓月度盘点方案")
  22 + @NotEmpty(message = "方案名称不能为空")
  23 + private String name;
  24 +
  25 + @Schema(description = "盘点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  26 + @NotNull(message = "盘点类型不能为空")
  27 + private Integer type;
  28 +
  29 + @Schema(description = "计划开始时间")
  30 + private LocalDateTime startTime;
  31 +
  32 + @Schema(description = "计划结束时间")
  33 + private LocalDateTime endTime;
  34 +
  35 + @Schema(description = "是否盲盘", example = "false")
  36 + @NotNull(message = "是否盲盘不能为空")
  37 + private Boolean blindFlag;
  38 +
  39 + @Schema(description = "是否冻结库存", example = "false")
  40 + @NotNull(message = "是否冻结库存不能为空")
  41 + private Boolean frozenFlag;
  42 +
  43 + @Schema(description = "是否启用", example = "true")
  44 + @NotNull(message = "是否启用不能为空")
  45 + private Boolean enableFlag;
  46 +
  47 + @Schema(description = "备注", example = "备注")
  48 + private String remark;
  49 +
  50 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/param/MesWmStockTakingPlanParamRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +@Schema(description = "管理后台 - MES 盘点方案参数 Response VO")
  7 +@Data
  8 +public class MesWmStockTakingPlanParamRespVO {
  9 +
  10 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  11 + private Long id;
  12 +
  13 + @Schema(description = "方案 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  14 + private Long planId;
  15 +
  16 + @Schema(description = "参数类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "102")
  17 + private Integer type;
  18 +
  19 + @Schema(description = "参数值 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  20 + private Long valueId;
  21 +
  22 + @Schema(description = "参数值编码", example = "WH001")
  23 + private String valueCode;
  24 +
  25 + @Schema(description = "参数值名称", example = "原料仓")
  26 + private String valueName;
  27 +
  28 + @Schema(description = "备注", example = "备注")
  29 + private String remark;
  30 +
  31 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/param/MesWmStockTakingPlanParamSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
  5 +import lombok.Data;
  6 +
  7 +@Schema(description = "管理后台 - MES 盘点方案参数新增/修改 Request VO")
  8 +@Data
  9 +public class MesWmStockTakingPlanParamSaveReqVO {
  10 +
  11 + @Schema(description = "编号", example = "1024")
  12 + private Long id;
  13 +
  14 + @Schema(description = "方案 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  15 + @NotNull(message = "方案 ID 不能为空")
  16 + private Long planId;
  17 +
  18 + @Schema(description = "参数类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "102")
  19 + @NotNull(message = "参数类型不能为空")
  20 + private Integer type;
  21 +
  22 + @Schema(description = "参数值 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  23 + @NotNull(message = "参数值 ID 不能为空")
  24 + private Long valueId;
  25 +
  26 + @Schema(description = "参数值编码", example = "WH001")
  27 + private String valueCode;
  28 +
  29 + @Schema(description = "参数值名称", example = "原料仓")
  30 + private String valueName;
  31 +
  32 + @Schema(description = "备注", example = "备注")
  33 + private String remark;
  34 +
  35 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanStatusEnum;
  5 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTypeEnum;
  6 +import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableId;
  8 +import com.baomidou.mybatisplus.annotation.TableName;
  9 +import lombok.*;
  10 +
  11 +import java.time.LocalDateTime;
  12 +
  13 +// TODO @AI:缺少注释;
  14 +
  15 +/**
  16 + * MES 盘点方案 DO
  17 + */
  18 +@TableName("mes_wm_stock_taking_plan")
  19 +@KeySequence("mes_wm_stock_taking_plan_seq")
  20 +@Data
  21 +@EqualsAndHashCode(callSuper = true)
  22 +@ToString(callSuper = true)
  23 +@Builder
  24 +@NoArgsConstructor
  25 +@AllArgsConstructor
  26 +public class MesWmStockTakingPlanDO extends BaseDO {
  27 +
  28 + @TableId
  29 + private Long id;
  30 +
  31 + private String code;
  32 +
  33 + private String name;
  34 +
  35 + /**
  36 + * 枚举 {@link MesWmStockTakingTypeEnum}
  37 + */
  38 + private Integer type;
  39 +
  40 + private LocalDateTime startTime;
  41 +
  42 + private LocalDateTime endTime;
  43 +
  44 + private Boolean blindFlag;
  45 +
  46 + private Boolean frozenFlag;
  47 +
  48 + // TODO @AI:这个 enableFlag 改成 status,对应 CommonStatus;
  49 + private Boolean enableFlag;
  50 +
  51 + // TODO @AI:这个字段没用,可以删除掉;
  52 + /**
  53 + * 枚举 {@link MesWmStockTakingPlanStatusEnum}
  54 + */
  55 + private Integer status;
  56 +
  57 + private String remark;
  58 +
  59 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanParamDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanParamTypeEnum;
  5 +import com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableId;
  7 +import com.baomidou.mybatisplus.annotation.TableName;
  8 +import lombok.*;
  9 +
  10 +/**
  11 + * MES 盘点方案参数 DO
  12 + */
  13 +@TableName("mes_wm_stock_taking_plan_param")
  14 +@KeySequence("mes_wm_stock_taking_plan_param_seq")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +@Builder
  19 +@NoArgsConstructor
  20 +@AllArgsConstructor
  21 +public class MesWmStockTakingPlanParamDO extends BaseDO {
  22 +
  23 + @TableId
  24 + private Long id;
  25 +
  26 + /**
  27 + * 盘点方案编号
  28 + *
  29 + * 关联 {@link MesWmStockTakingPlanDO#getId()}
  30 + */
  31 + private Long planId;
  32 +
  33 + /**
  34 + * 枚举 {@link MesWmStockTakingPlanParamTypeEnum}
  35 + */
  36 + private Integer type;
  37 +
  38 + /**
  39 + * 参数值编号,例如仓库、库区、库位、物料、批次的主键 ID
  40 + */
  41 + private Long valueId;
  42 +
  43 + /**
  44 + * 参数值编码,例如仓库编码、库区编码、库位编码、物料编码、批次编码
  45 + */
  46 + private String valueCode;
  47 +
  48 + /**
  49 + * 参数值名称,例如仓库名称、库区名称、库位名称、物料名称、批次名称
  50 + */
  51 + private String valueName;
  52 +
  53 + private String remark;
  54 +
  55 + private Long tenantId;
  56 +
  57 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
@@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Mapper; @@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Mapper;
11 import java.math.BigDecimal; 11 import java.math.BigDecimal;
12 import java.util.Collection; 12 import java.util.Collection;
13 import java.util.List; 13 import java.util.List;
  14 +import java.util.Set;
14 15
15 /** 16 /**
16 * MES 库存台账 Mapper 17 * MES 库存台账 Mapper
@@ -64,4 +65,17 @@ public interface MesWmMaterialStockMapper extends BaseMapperX&lt;MesWmMaterialStock @@ -64,4 +65,17 @@ public interface MesWmMaterialStockMapper extends BaseMapperX&lt;MesWmMaterialStock
64 .eqIfPresent(MesWmMaterialStockDO::getBatchId, batchId)); 65 .eqIfPresent(MesWmMaterialStockDO::getBatchId, batchId));
65 } 66 }
66 67
  68 + default List<MesWmMaterialStockDO> selectListForStockTaking(Set<Long> warehouseIds, Set<Long> locationIds,
  69 + Set<Long> areaIds, Set<Long> itemIds,
  70 + Set<Long> batchIds) {
  71 + return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>()
  72 + .inIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseIds)
  73 + .inIfPresent(MesWmMaterialStockDO::getLocationId, locationIds)
  74 + .inIfPresent(MesWmMaterialStockDO::getAreaId, areaIds)
  75 + .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds)
  76 + .inIfPresent(MesWmMaterialStockDO::getBatchId, batchIds)
  77 + .ne(MesWmMaterialStockDO::getQuantityOnhand, BigDecimal.ZERO)
  78 + .orderByAsc(MesWmMaterialStockDO::getId));
  79 + }
  80 +
67 } 81 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * MES 盘点方案 Mapper
  14 + */
  15 +@Mapper
  16 +public interface MesWmStockTakingPlanMapper extends BaseMapperX<MesWmStockTakingPlanDO> {
  17 +
  18 + default MesWmStockTakingPlanDO selectByCode(String code) {
  19 + return selectOne(MesWmStockTakingPlanDO::getCode, code);
  20 + }
  21 +
  22 + default PageResult<MesWmStockTakingPlanDO> selectPage(MesWmStockTakingPlanPageReqVO reqVO) {
  23 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmStockTakingPlanDO>()
  24 + .likeIfPresent(MesWmStockTakingPlanDO::getCode, reqVO.getCode())
  25 + .likeIfPresent(MesWmStockTakingPlanDO::getName, reqVO.getName())
  26 + .eqIfPresent(MesWmStockTakingPlanDO::getType, reqVO.getType())
  27 + .eqIfPresent(MesWmStockTakingPlanDO::getStatus, reqVO.getStatus())
  28 + .eqIfPresent(MesWmStockTakingPlanDO::getEnableFlag, reqVO.getEnableFlag())
  29 + .betweenIfPresent(MesWmStockTakingPlanDO::getStartTime, reqVO.getStartTime())
  30 + .orderByDesc(MesWmStockTakingPlanDO::getId));
  31 + }
  32 +
  33 + default List<MesWmStockTakingPlanDO> selectListByStatus(Integer status) {
  34 + return selectList(new LambdaQueryWrapperX<MesWmStockTakingPlanDO>()
  35 + .eqIfPresent(MesWmStockTakingPlanDO::getStatus, status)
  36 + .eq(MesWmStockTakingPlanDO::getEnableFlag, true)
  37 + .orderByDesc(MesWmStockTakingPlanDO::getId));
  38 + }
  39 +
  40 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanParamMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO;
  6 +import org.apache.ibatis.annotations.Mapper;
  7 +
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * MES 盘点方案参数 Mapper
  13 + */
  14 +@Mapper
  15 +public interface MesWmStockTakingPlanParamMapper extends BaseMapperX<MesWmStockTakingPlanParamDO> {
  16 +
  17 + default List<MesWmStockTakingPlanParamDO> selectListByPlanId(Long planId) {
  18 + return selectList(MesWmStockTakingPlanParamDO::getPlanId, planId);
  19 + }
  20 +
  21 + default List<MesWmStockTakingPlanParamDO> selectListByPlanIds(Collection<Long> planIds) {
  22 + return selectList(MesWmStockTakingPlanParamDO::getPlanId, planIds);
  23 + }
  24 +
  25 + default void deleteByPlanId(Long planId) {
  26 + delete(MesWmStockTakingPlanParamDO::getPlanId, planId);
  27 + }
  28 +
  29 + default List<MesWmStockTakingPlanParamDO> selectListByPlanIdAndType(Long planId, Integer type) {
  30 + return selectList(new LambdaQueryWrapperX<MesWmStockTakingPlanParamDO>()
  31 + .eq(MesWmStockTakingPlanParamDO::getPlanId, planId)
  32 + .eq(MesWmStockTakingPlanParamDO::getType, type)
  33 + .orderByAsc(MesWmStockTakingPlanParamDO::getId));
  34 + }
  35 +
  36 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.MesWmStockTakingTaskLineDO;
  6 +import org.apache.ibatis.annotations.Mapper;
  7 +
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +import java.util.Set;
  11 +
  12 +/**
  13 + * MES 盘点任务行 Mapper
  14 + */
  15 +@Mapper
  16 +public interface MesWmStockTakingTaskLineMapper extends BaseMapperX<MesWmStockTakingTaskLineDO> {
  17 +
  18 + default List<MesWmStockTakingTaskLineDO> selectListByTaskId(Long taskId) {
  19 + return selectList(new LambdaQueryWrapperX<MesWmStockTakingTaskLineDO>()
  20 + .eq(MesWmStockTakingTaskLineDO::getTaskId, taskId)
  21 + .orderByAsc(MesWmStockTakingTaskLineDO::getId));
  22 + }
  23 +
  24 + default List<MesWmStockTakingTaskLineDO> selectListByTaskIds(Collection<Long> taskIds) {
  25 + return selectList(MesWmStockTakingTaskLineDO::getTaskId, taskIds);
  26 + }
  27 +
  28 + default List<MesWmStockTakingTaskLineDO> selectListByIds(Collection<Long> ids) {
  29 + return selectByIds(ids);
  30 + }
  31 +
  32 + default List<MesWmStockTakingTaskLineDO> selectListByTaskIdAndIds(Long taskId, Set<Long> ids) {
  33 + return selectList(new LambdaQueryWrapperX<MesWmStockTakingTaskLineDO>()
  34 + .eq(MesWmStockTakingTaskLineDO::getTaskId, taskId)
  35 + .inIfPresent(MesWmStockTakingTaskLineDO::getId, ids)
  36 + .orderByAsc(MesWmStockTakingTaskLineDO::getId));
  37 + }
  38 +
  39 + default void deleteByTaskId(Long taskId) {
  40 + delete(MesWmStockTakingTaskLineDO::getTaskId, taskId);
  41 + }
  42 +
  43 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.vo.task.MesWmStockTakingTaskPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.MesWmStockTakingTaskDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * MES 盘点任务 Mapper
  12 + */
  13 +@Mapper
  14 +public interface MesWmStockTakingTaskMapper extends BaseMapperX<MesWmStockTakingTaskDO> {
  15 +
  16 + default MesWmStockTakingTaskDO selectByCode(String code) {
  17 + return selectOne(MesWmStockTakingTaskDO::getCode, code);
  18 + }
  19 +
  20 + default PageResult<MesWmStockTakingTaskDO> selectPage(MesWmStockTakingTaskPageReqVO reqVO) {
  21 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmStockTakingTaskDO>()
  22 + .likeIfPresent(MesWmStockTakingTaskDO::getCode, reqVO.getCode())
  23 + .likeIfPresent(MesWmStockTakingTaskDO::getName, reqVO.getName())
  24 + .eqIfPresent(MesWmStockTakingTaskDO::getType, reqVO.getType())
  25 + .eqIfPresent(MesWmStockTakingTaskDO::getStatus, reqVO.getStatus())
  26 + .eqIfPresent(MesWmStockTakingTaskDO::getUserId, reqVO.getUserId())
  27 + .eqIfPresent(MesWmStockTakingTaskDO::getPlanId, reqVO.getPlanId())
  28 + .betweenIfPresent(MesWmStockTakingTaskDO::getTakingDate, reqVO.getTakingDate())
  29 + .orderByDesc(MesWmStockTakingTaskDO::getId));
  30 + }
  31 +
  32 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.vo.result.MesWmStockTakingTaskResultPageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.MesWmStockTakingTaskResultDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * MES 盘点结果 Mapper
  14 + */
  15 +@Mapper
  16 +public interface MesWmStockTakingTaskResultMapper extends BaseMapperX<MesWmStockTakingTaskResultDO> {
  17 +
  18 + default PageResult<MesWmStockTakingTaskResultDO> selectPage(MesWmStockTakingTaskResultPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmStockTakingTaskResultDO>()
  20 + .eqIfPresent(MesWmStockTakingTaskResultDO::getTaskId, reqVO.getTaskId())
  21 + .eqIfPresent(MesWmStockTakingTaskResultDO::getItemId, reqVO.getItemId())
  22 + .eqIfPresent(MesWmStockTakingTaskResultDO::getWarehouseId, reqVO.getWarehouseId())
  23 + .eqIfPresent(MesWmStockTakingTaskResultDO::getLocationId, reqVO.getLocationId())
  24 + .eqIfPresent(MesWmStockTakingTaskResultDO::getAreaId, reqVO.getAreaId())
  25 + .orderByDesc(MesWmStockTakingTaskResultDO::getId));
  26 + }
  27 +
  28 + default List<MesWmStockTakingTaskResultDO> selectListByTaskId(Long taskId) {
  29 + return selectList(new LambdaQueryWrapperX<MesWmStockTakingTaskResultDO>()
  30 + .eq(MesWmStockTakingTaskResultDO::getTaskId, taskId)
  31 + .orderByAsc(MesWmStockTakingTaskResultDO::getId));
  32 + }
  33 +
  34 + default void deleteByTaskId(Long taskId) {
  35 + delete(MesWmStockTakingTaskResultDO::getTaskId, taskId);
  36 + }
  37 +
  38 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -469,6 +469,21 @@ public interface ErrorCodeConstants { @@ -469,6 +469,21 @@ public interface ErrorCodeConstants {
469 ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在"); 469 ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在");
470 ErrorCode WM_RETURN_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_713_200, "销售退货单明细不存在"); 470 ErrorCode WM_RETURN_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_713_200, "销售退货单明细不存在");
471 471
  472 + // ========== MES 仓库管理-盘点方案/任务/结果(1-040-714-100) ==========
  473 + ErrorCode WM_STOCK_TAKING_PLAN_NOT_EXISTS = new ErrorCode(1_040_714_100, "盘点方案不存在");
  474 + ErrorCode WM_STOCK_TAKING_PLAN_CODE_DUPLICATE = new ErrorCode(1_040_714_101, "盘点方案编码已存在");
  475 + ErrorCode WM_STOCK_TAKING_PLAN_NOT_PREPARE = new ErrorCode(1_040_714_102, "只有草稿状态的盘点方案才允许此操作");
  476 + ErrorCode WM_STOCK_TAKING_PLAN_NOT_CONFIRMED = new ErrorCode(1_040_714_103, "只有已确认状态的盘点方案才允许生成任务");
  477 + ErrorCode WM_STOCK_TAKING_PLAN_PARAM_NOT_EXISTS = new ErrorCode(1_040_714_104, "盘点方案参数不存在");
  478 + ErrorCode WM_STOCK_TAKING_TASK_NOT_EXISTS = new ErrorCode(1_040_714_110, "盘点任务不存在");
  479 + ErrorCode WM_STOCK_TAKING_TASK_CODE_DUPLICATE = new ErrorCode(1_040_714_111, "盘点任务编码已存在");
  480 + ErrorCode WM_STOCK_TAKING_TASK_NOT_PREPARE = new ErrorCode(1_040_714_112, "只有草稿状态的盘点任务才允许此操作");
  481 + ErrorCode WM_STOCK_TAKING_TASK_NOT_IN_PROGRESS = new ErrorCode(1_040_714_113, "只有盘点中状态的任务才允许此操作");
  482 + ErrorCode WM_STOCK_TAKING_TASK_CANNOT_CANCEL = new ErrorCode(1_040_714_114, "已完成或已取消的盘点任务不允许取消");
  483 + ErrorCode WM_STOCK_TAKING_TASK_NO_STOCK = new ErrorCode(1_040_714_115, "未找到符合条件的库存数据");
  484 + ErrorCode WM_STOCK_TAKING_TASK_NO_LINE = new ErrorCode(1_040_714_116, "盘点任务至少需要一条任务行");
  485 + ErrorCode WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS = new ErrorCode(1_040_714_117, "盘点任务行不存在");
  486 +
472 // ========== MES 仓库管理-销售出库单(1-040-714-000) ========== 487 // ========== MES 仓库管理-销售出库单(1-040-714-000) ==========
473 ErrorCode WM_PRODUCT_SALES_NOT_EXISTS = new ErrorCode(1_040_714_000, "销售出库单不存在"); 488 ErrorCode WM_PRODUCT_SALES_NOT_EXISTS = new ErrorCode(1_040_714_000, "销售出库单不存在");
474 ErrorCode WM_PRODUCT_SALES_CODE_DUPLICATE = new ErrorCode(1_040_714_001, "销售出库单号已存在"); 489 ErrorCode WM_PRODUCT_SALES_CODE_DUPLICATE = new ErrorCode(1_040_714_001, "销售出库单号已存在");
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingPlanParamTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.enums.wm;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.Getter;
  7 +
  8 +import java.util.Arrays;
  9 +
  10 +// TODO @AI:缺少注释;type + name 这种;
  11 +/**
  12 + * MES 盘点方案参数类型枚举
  13 + */
  14 +@Getter
  15 +@AllArgsConstructor
  16 +public enum MesWmStockTakingPlanParamTypeEnum implements ArrayValuable<Integer> {
  17 +
  18 + WAREHOUSE(MesBizTypeConstants.WM_WAREHOUSE, "仓库"),
  19 + LOCATION(MesBizTypeConstants.WM_LOCATION, "库区"),
  20 + AREA(MesBizTypeConstants.WM_AREA, "库位"),
  21 + ITEM(MesBizTypeConstants.MD_ITEM, "物料"),
  22 + BATCH(MesBizTypeConstants.WM_BATCH, "批次");
  23 +
  24 + public static final Integer[] ARRAYS = Arrays.stream(values())
  25 + .map(MesWmStockTakingPlanParamTypeEnum::getType).toArray(Integer[]::new);
  26 +
  27 + private final Integer type;
  28 + private final String name;
  29 +
  30 + @Override
  31 + public Integer[] array() {
  32 + return ARRAYS;
  33 + }
  34 +
  35 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingPlanStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.enums.wm;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.Getter;
  7 +
  8 +import java.util.Arrays;
  9 +
  10 +// TODO @AI:缺少注释;status + name 这种;
  11 +/**
  12 + * MES 盘点方案状态枚举
  13 + */
  14 +@Getter
  15 +@AllArgsConstructor
  16 +public enum MesWmStockTakingPlanStatusEnum implements ArrayValuable<Integer> {
  17 +
  18 + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"),
  19 + CONFIRMED(MesOrderStatusConstants.CONFIRMED, "已确认");
  20 +
  21 + public static final Integer[] ARRAYS = Arrays.stream(values())
  22 + .map(MesWmStockTakingPlanStatusEnum::getStatus).toArray(Integer[]::new);
  23 +
  24 + private final Integer status;
  25 + private final String name;
  26 +
  27 + @Override
  28 + public Integer[] array() {
  29 + return ARRAYS;
  30 + }
  31 +
  32 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.enums.wm;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +// TODO @AI:缺少注释;status + name 这种;
  10 +/**
  11 + * MES 盘点任务行状态枚举
  12 + */
  13 +@Getter
  14 +@AllArgsConstructor
  15 +public enum MesWmStockTakingTaskLineStatusEnum implements ArrayValuable<Integer> {
  16 +
  17 + UNCOUNTED(0, "未盘点"),
  18 + NORMAL(1, "正常"),
  19 + GAIN(2, "盘盈"),
  20 + LOSS(3, "盘亏");
  21 +
  22 + public static final Integer[] ARRAYS = Arrays.stream(values())
  23 + .map(MesWmStockTakingTaskLineStatusEnum::getStatus).toArray(Integer[]::new);
  24 +
  25 + private final Integer status;
  26 + private final String name;
  27 +
  28 + @Override
  29 + public Integer[] array() {
  30 + return ARRAYS;
  31 + }
  32 +
  33 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.enums.wm;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.Getter;
  7 +
  8 +import java.util.Arrays;
  9 +
  10 +// TODO @AI:缺少注释;status + name 这种;
  11 +/**
  12 + * MES 盘点任务状态枚举
  13 + */
  14 +@Getter
  15 +@AllArgsConstructor
  16 +public enum MesWmStockTakingTaskStatusEnum implements ArrayValuable<Integer> {
  17 +
  18 + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"),
  19 + IN_PROGRESS(MesOrderStatusConstants.CONFIRMED, "盘点中"),
  20 + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"),
  21 + CANCELED(MesOrderStatusConstants.CANCELLED, "已取消");
  22 +
  23 + public static final Integer[] ARRAYS = Arrays.stream(values())
  24 + .map(MesWmStockTakingTaskStatusEnum::getStatus).toArray(Integer[]::new);
  25 +
  26 + private final Integer status;
  27 + private final String name;
  28 +
  29 + @Override
  30 + public Integer[] array() {
  31 + return ARRAYS;
  32 + }
  33 +
  34 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.enums.wm;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +// TODO @AI:缺少注释;type + name 这种;
  10 +/**
  11 + * MES 盘点类型枚举
  12 + */
  13 +@Getter
  14 +@AllArgsConstructor
  15 +public enum MesWmStockTakingTypeEnum implements ArrayValuable<Integer> {
  16 +
  17 + // TODO @AI:只有 2 种:动态盘点、静态盘点;按照这个顺序枚举;
  18 + OPEN(1, "开放盘点"),
  19 + CYCLE(2, "循环盘点"),
  20 + DYNAMIC(3, "动态盘点");
  21 +
  22 + public static final Integer[] ARRAYS = Arrays.stream(values())
  23 + .map(MesWmStockTakingTypeEnum::getType).toArray(Integer[]::new);
  24 +
  25 + private final Integer type;
  26 + private final String name;
  27 +
  28 + @Override
  29 + public Integer[] array() {
  30 + return ARRAYS;
  31 + }
  32 +
  33 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
@@ -11,6 +11,7 @@ import java.time.LocalDateTime; @@ -11,6 +11,7 @@ import java.time.LocalDateTime;
11 import java.util.Collection; 11 import java.util.Collection;
12 import java.util.List; 12 import java.util.List;
13 import java.util.Map; 13 import java.util.Map;
  14 +import java.util.Set;
14 15
15 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; 16 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
16 17
@@ -82,6 +83,11 @@ public interface MesWmMaterialStockService { @@ -82,6 +83,11 @@ public interface MesWmMaterialStockService {
82 */ 83 */
83 List<MesWmMaterialStockDO> getMaterialStockList(Collection<Long> ids); 84 List<MesWmMaterialStockDO> getMaterialStockList(Collection<Long> ids);
84 85
  86 + // TODO @芋艿:不确定性;感觉就是一个查询接口,参数比较多;
  87 + List<MesWmMaterialStockDO> getMaterialStockListForStockTaking(Set<Long> warehouseIds, Set<Long> locationIds,
  88 + Set<Long> areaIds, Set<Long> itemIds,
  89 + Set<Long> batchIds);
  90 +
85 default Map<Long, MesWmMaterialStockDO> getMaterialStockMap(Collection<Long> ids) { 91 default Map<Long, MesWmMaterialStockDO> getMaterialStockMap(Collection<Long> ids) {
86 return convertMap(getMaterialStockList(ids), MesWmMaterialStockDO::getId); 92 return convertMap(getMaterialStockList(ids), MesWmMaterialStockDO::getId);
87 } 93 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -107,6 +107,13 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService @@ -107,6 +107,13 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService
107 return materialStockMapper.selectListByIds(ids); 107 return materialStockMapper.selectListByIds(ids);
108 } 108 }
109 109
  110 + @Override
  111 + public List<MesWmMaterialStockDO> getMaterialStockListForStockTaking(Set<Long> warehouseIds, Set<Long> locationIds,
  112 + Set<Long> areaIds, Set<Long> itemIds,
  113 + Set<Long> batchIds) {
  114 + return materialStockMapper.selectListForStockTaking(warehouseIds, locationIds, areaIds, itemIds, batchIds);
  115 + }
  116 +
110 // TODO DONE @AI:increaseStock 方法命名合理,语义清晰 117 // TODO DONE @AI:increaseStock 方法命名合理,语义清晰
111 @Override 118 @Override
112 public void increaseStock(Long itemId, Long warehouseId, Long locationId, Long areaId, 119 public void increaseStock(Long itemId, Long warehouseId, Long locationId, Long areaId,
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanParamService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan;
  2 +
  3 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO;
  4 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO;
  5 +import jakarta.validation.Valid;
  6 +
  7 +import java.util.Collection;
  8 +import java.util.List;
  9 +import java.util.Map;
  10 +
  11 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap;
  12 +
  13 +// TODO @AI:必要的注释
  14 +/**
  15 + * MES 盘点方案参数 Service 接口
  16 + */
  17 +public interface MesWmStockTakingPlanParamService {
  18 +
  19 + Long createStockTakingPlanParam(@Valid MesWmStockTakingPlanParamSaveReqVO createReqVO);
  20 +
  21 + void updateStockTakingPlanParam(@Valid MesWmStockTakingPlanParamSaveReqVO updateReqVO);
  22 +
  23 + void deleteStockTakingPlanParam(Long id);
  24 +
  25 + MesWmStockTakingPlanParamDO getStockTakingPlanParam(Long id);
  26 +
  27 + List<MesWmStockTakingPlanParamDO> getStockTakingPlanParamList(Long planId);
  28 +
  29 + default Map<Long, List<MesWmStockTakingPlanParamDO>> getStockTakingPlanParamMap(Collection<Long> planIds) {
  30 + return convertMultiMap(getStockTakingPlanParamList(planIds), MesWmStockTakingPlanParamDO::getPlanId);
  31 + }
  32 +
  33 + List<MesWmStockTakingPlanParamDO> getStockTakingPlanParamList(Collection<Long> planIds);
  34 +
  35 + void deleteStockTakingPlanParamByPlanId(Long planId);
  36 +
  37 + MesWmStockTakingPlanParamDO validateStockTakingPlanParamExists(Long id);
  38 +
  39 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanParamServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO;
  8 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan.MesWmStockTakingPlanParamMapper;
  9 +import jakarta.annotation.Resource;
  10 +import org.springframework.context.annotation.Lazy;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.validation.annotation.Validated;
  13 +
  14 +import java.util.Collection;
  15 +import java.util.Collections;
  16 +import java.util.List;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  19 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_PLAN_PARAM_NOT_EXISTS;
  20 +
  21 +// TODO @AI:必要的注释
  22 +/**
  23 + * MES 盘点方案参数 Service 实现类
  24 + */
  25 +@Service
  26 +@Validated
  27 +public class MesWmStockTakingPlanParamServiceImpl implements MesWmStockTakingPlanParamService {
  28 +
  29 + @Resource
  30 + private MesWmStockTakingPlanParamMapper stockTakingPlanParamMapper;
  31 + @Resource
  32 + @Lazy
  33 + private MesWmStockTakingPlanService stockTakingPlanService;
  34 +
  35 + @Override
  36 + public Long createStockTakingPlanParam(MesWmStockTakingPlanParamSaveReqVO createReqVO) {
  37 + MesWmStockTakingPlanDO plan = stockTakingPlanService.validateStockTakingPlanEditable(createReqVO.getPlanId());
  38 +
  39 + MesWmStockTakingPlanParamDO param = BeanUtils.toBean(createReqVO, MesWmStockTakingPlanParamDO.class);
  40 + param.setPlanId(plan.getId());
  41 + stockTakingPlanParamMapper.insert(param);
  42 + return param.getId();
  43 + }
  44 +
  45 + @Override
  46 + public void updateStockTakingPlanParam(MesWmStockTakingPlanParamSaveReqVO updateReqVO) {
  47 + MesWmStockTakingPlanParamDO param = validateStockTakingPlanParamExists(updateReqVO.getId());
  48 + stockTakingPlanService.validateStockTakingPlanEditable(param.getPlanId());
  49 +
  50 + MesWmStockTakingPlanParamDO updateObj = BeanUtils.toBean(updateReqVO, MesWmStockTakingPlanParamDO.class);
  51 + updateObj.setPlanId(param.getPlanId());
  52 + stockTakingPlanParamMapper.updateById(updateObj);
  53 + }
  54 +
  55 + @Override
  56 + public void deleteStockTakingPlanParam(Long id) {
  57 + MesWmStockTakingPlanParamDO param = validateStockTakingPlanParamExists(id);
  58 + stockTakingPlanService.validateStockTakingPlanEditable(param.getPlanId());
  59 + stockTakingPlanParamMapper.deleteById(id);
  60 + }
  61 +
  62 + @Override
  63 + public MesWmStockTakingPlanParamDO getStockTakingPlanParam(Long id) {
  64 + return stockTakingPlanParamMapper.selectById(id);
  65 + }
  66 +
  67 + @Override
  68 + public List<MesWmStockTakingPlanParamDO> getStockTakingPlanParamList(Long planId) {
  69 + return stockTakingPlanParamMapper.selectListByPlanId(planId);
  70 + }
  71 +
  72 + @Override
  73 + public List<MesWmStockTakingPlanParamDO> getStockTakingPlanParamList(Collection<Long> planIds) {
  74 + if (CollUtil.isEmpty(planIds)) {
  75 + return Collections.emptyList();
  76 + }
  77 + return stockTakingPlanParamMapper.selectListByPlanIds(planIds);
  78 + }
  79 +
  80 + @Override
  81 + public void deleteStockTakingPlanParamByPlanId(Long planId) {
  82 + stockTakingPlanParamMapper.deleteByPlanId(planId);
  83 + }
  84 +
  85 + @Override
  86 + public MesWmStockTakingPlanParamDO validateStockTakingPlanParamExists(Long id) {
  87 + MesWmStockTakingPlanParamDO param = stockTakingPlanParamMapper.selectById(id);
  88 + if (param == null) {
  89 + throw exception(WM_STOCK_TAKING_PLAN_PARAM_NOT_EXISTS);
  90 + }
  91 + return param;
  92 + }
  93 +
  94 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanGenerateReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanPageReqVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO;
  8 +import jakarta.validation.Valid;
  9 +
  10 +import java.util.Collection;
  11 +import java.util.List;
  12 +import java.util.Map;
  13 +
  14 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  15 +
  16 +// TODO @AI:必要的注释
  17 +/**
  18 + * MES 盘点方案 Service 接口
  19 + */
  20 +public interface MesWmStockTakingPlanService {
  21 +
  22 + Long createStockTakingPlan(@Valid MesWmStockTakingPlanSaveReqVO createReqVO);
  23 +
  24 + void updateStockTakingPlan(@Valid MesWmStockTakingPlanSaveReqVO updateReqVO);
  25 +
  26 + void deleteStockTakingPlan(Long id);
  27 +
  28 + void confirmStockTakingPlan(Long id);
  29 +
  30 + Long generateStockTakingTask(@Valid MesWmStockTakingPlanGenerateReqVO reqVO);
  31 +
  32 + MesWmStockTakingPlanDO getStockTakingPlan(Long id);
  33 +
  34 + MesWmStockTakingPlanDO validateStockTakingPlanExists(Long id);
  35 +
  36 + MesWmStockTakingPlanDO validateStockTakingPlanEditable(Long id);
  37 +
  38 + List<MesWmStockTakingPlanDO> getStockTakingPlanList(Collection<Long> ids);
  39 +
  40 + default Map<Long, MesWmStockTakingPlanDO> getStockTakingPlanMap(Collection<Long> ids) {
  41 + return convertMap(getStockTakingPlanList(ids), MesWmStockTakingPlanDO::getId);
  42 + }
  43 +
  44 + PageResult<MesWmStockTakingPlanDO> getStockTakingPlanPage(MesWmStockTakingPlanPageReqVO pageReqVO);
  45 +
  46 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanGenerateReqVO;
  7 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanPageReqVO;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanSaveReqVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.vo.task.MesWmStockTakingTaskSaveReqVO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO;
  12 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan.MesWmStockTakingPlanMapper;
  13 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanStatusEnum;
  14 +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.MesWmStockTakingTaskService;
  15 +import jakarta.annotation.Resource;
  16 +import org.springframework.stereotype.Service;
  17 +import org.springframework.transaction.annotation.Transactional;
  18 +import org.springframework.validation.annotation.Validated;
  19 +
  20 +import java.util.Collection;
  21 +import java.util.Collections;
  22 +import java.util.List;
  23 +import java.util.Objects;
  24 +
  25 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  26 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
  27 +
  28 +// TODO @AI:必要的注释
  29 +@Service
  30 +@Validated
  31 +public class MesWmStockTakingPlanServiceImpl implements MesWmStockTakingPlanService {
  32 +
  33 + @Resource
  34 + private MesWmStockTakingPlanMapper stockTakingPlanMapper;
  35 + @Resource
  36 + private MesWmStockTakingPlanParamService stockTakingPlanParamService;
  37 + @Resource
  38 + private MesWmStockTakingTaskService stockTakingTaskService;
  39 +
  40 + @Override
  41 + @Transactional(rollbackFor = Exception.class)
  42 + public Long createStockTakingPlan(MesWmStockTakingPlanSaveReqVO createReqVO) {
  43 + validatePlanCodeUnique(null, createReqVO.getCode());
  44 +
  45 + MesWmStockTakingPlanDO plan = BeanUtils.toBean(createReqVO, MesWmStockTakingPlanDO.class);
  46 + plan.setStatus(MesWmStockTakingPlanStatusEnum.PREPARE.getStatus());
  47 + stockTakingPlanMapper.insert(plan);
  48 + return plan.getId();
  49 + }
  50 +
  51 + // TODO @AI:开启后,就不允许编辑、删除了;
  52 + @Override
  53 + @Transactional(rollbackFor = Exception.class)
  54 + public void updateStockTakingPlan(MesWmStockTakingPlanSaveReqVO updateReqVO) {
  55 + validatePlanExistsAndPrepare(updateReqVO.getId());
  56 + validatePlanCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
  57 +
  58 + MesWmStockTakingPlanDO updateObj = BeanUtils.toBean(updateReqVO, MesWmStockTakingPlanDO.class);
  59 + stockTakingPlanMapper.updateById(updateObj);
  60 + }
  61 +
  62 + // TODO @AI:开启后,就不允许编辑、删除了;
  63 + @Override
  64 + @Transactional(rollbackFor = Exception.class)
  65 + public void deleteStockTakingPlan(Long id) {
  66 + validatePlanExistsAndPrepare(id);
  67 + stockTakingPlanParamService.deleteStockTakingPlanParamByPlanId(id);
  68 + stockTakingPlanMapper.deleteById(id);
  69 + }
  70 +
  71 + @Override
  72 + public void confirmStockTakingPlan(Long id) {
  73 + MesWmStockTakingPlanDO plan = validatePlanExistsAndPrepare(id);
  74 + plan.setStatus(MesWmStockTakingPlanStatusEnum.CONFIRMED.getStatus());
  75 + stockTakingPlanMapper.updateById(plan);
  76 + }
  77 +
  78 + // TODO @AI:这个方法不需要了呀;
  79 + @Override
  80 + public Long generateStockTakingTask(MesWmStockTakingPlanGenerateReqVO reqVO) {
  81 + MesWmStockTakingPlanDO plan = validatePlanExistsAndConfirmed(reqVO.getPlanId());
  82 + MesWmStockTakingTaskSaveReqVO taskSaveReqVO = new MesWmStockTakingTaskSaveReqVO();
  83 + taskSaveReqVO.setCode(reqVO.getCode());
  84 + taskSaveReqVO.setName(reqVO.getName());
  85 + taskSaveReqVO.setTakingDate(reqVO.getTakingDate());
  86 + taskSaveReqVO.setType(plan.getType());
  87 + taskSaveReqVO.setUserId(reqVO.getUserId());
  88 + taskSaveReqVO.setPlanId(plan.getId());
  89 + taskSaveReqVO.setBlindFlag(plan.getBlindFlag());
  90 + taskSaveReqVO.setFrozenFlag(plan.getFrozenFlag());
  91 + taskSaveReqVO.setRemark(reqVO.getRemark());
  92 +
  93 + List<MesWmStockTakingPlanParamSaveReqVO> params = reqVO.getParams();
  94 + if (CollUtil.isEmpty(params)) {
  95 + params = BeanUtils.toBean(stockTakingPlanParamService.getStockTakingPlanParamList(plan.getId()), MesWmStockTakingPlanParamSaveReqVO.class);
  96 + }
  97 + return stockTakingTaskService.createStockTakingTaskByPlan(reqVO, taskSaveReqVO, params);
  98 + }
  99 +
  100 + @Override
  101 + public MesWmStockTakingPlanDO getStockTakingPlan(Long id) {
  102 + return stockTakingPlanMapper.selectById(id);
  103 + }
  104 +
  105 + @Override
  106 + public MesWmStockTakingPlanDO validateStockTakingPlanExists(Long id) {
  107 + MesWmStockTakingPlanDO plan = stockTakingPlanMapper.selectById(id);
  108 + if (plan == null) {
  109 + throw exception(WM_STOCK_TAKING_PLAN_NOT_EXISTS);
  110 + }
  111 + return plan;
  112 + }
  113 +
  114 + @Override
  115 + public MesWmStockTakingPlanDO validateStockTakingPlanEditable(Long id) {
  116 + return validatePlanExistsAndPrepare(id);
  117 + }
  118 +
  119 + @Override
  120 + public List<MesWmStockTakingPlanDO> getStockTakingPlanList(Collection<Long> ids) {
  121 + if (CollUtil.isEmpty(ids)) {
  122 + return Collections.emptyList();
  123 + }
  124 + return stockTakingPlanMapper.selectByIds(ids);
  125 + }
  126 +
  127 + @Override
  128 + public PageResult<MesWmStockTakingPlanDO> getStockTakingPlanPage(MesWmStockTakingPlanPageReqVO pageReqVO) {
  129 + return stockTakingPlanMapper.selectPage(pageReqVO);
  130 + }
  131 +
  132 +
  133 + private void validatePlanCodeUnique(Long id, String code) {
  134 + MesWmStockTakingPlanDO plan = stockTakingPlanMapper.selectByCode(code);
  135 + if (plan == null) {
  136 + return;
  137 + }
  138 + if (id == null || !Objects.equals(plan.getId(), id)) {
  139 + throw exception(WM_STOCK_TAKING_PLAN_CODE_DUPLICATE);
  140 + }
  141 + }
  142 +
  143 + private MesWmStockTakingPlanDO validatePlanExistsAndPrepare(Long id) {
  144 + MesWmStockTakingPlanDO plan = validateStockTakingPlanExists(id);
  145 + if (!MesWmStockTakingPlanStatusEnum.PREPARE.getStatus().equals(plan.getStatus())) {
  146 + throw exception(WM_STOCK_TAKING_PLAN_NOT_PREPARE);
  147 + }
  148 + return plan;
  149 + }
  150 +
  151 + private MesWmStockTakingPlanDO validatePlanExistsAndConfirmed(Long id) {
  152 + MesWmStockTakingPlanDO plan = validateStockTakingPlanExists(id);
  153 + if (!MesWmStockTakingPlanStatusEnum.CONFIRMED.getStatus().equals(plan.getStatus())) {
  154 + throw exception(WM_STOCK_TAKING_PLAN_NOT_CONFIRMED);
  155 + }
  156 + return plan;
  157 + }
  158 +
  159 +}