diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanController.java new file mode 100644 index 0000000..0f773d1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanController.java @@ -0,0 +1,139 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.*; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO; +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanParamService; +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 盘点方案") +@RestController +@RequestMapping("/mes/wm/stocktaking-plan") +@Validated +public class MesWmStockTakingPlanController { + + @Resource + private MesWmStockTakingPlanService stockTakingPlanService; + @Resource + private MesWmStockTakingPlanParamService stockTakingPlanParamService; + + @PostMapping("/create") + @Operation(summary = "创建盘点方案") + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:create')") + public CommonResult createStockTakingPlan(@Valid @RequestBody MesWmStockTakingPlanSaveReqVO createReqVO) { + return success(stockTakingPlanService.createStockTakingPlan(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改盘点方案") + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')") + public CommonResult updateStockTakingPlan(@Valid @RequestBody MesWmStockTakingPlanSaveReqVO updateReqVO) { + stockTakingPlanService.updateStockTakingPlan(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除盘点方案") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:delete')") + public CommonResult deleteStockTakingPlan(@RequestParam("id") Long id) { + stockTakingPlanService.deleteStockTakingPlan(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得盘点方案") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:query')") + public CommonResult getStockTakingPlan(@RequestParam("id") Long id) { + MesWmStockTakingPlanDO plan = stockTakingPlanService.getStockTakingPlan(id); + if (plan == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(plan), true).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得盘点方案分页") + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:query')") + public CommonResult> getStockTakingPlanPage(@Valid MesWmStockTakingPlanPageReqVO pageReqVO) { + PageResult pageResult = stockTakingPlanService.getStockTakingPlanPage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList(), false), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出盘点方案 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportStockTakingPlanExcel(@Valid MesWmStockTakingPlanPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = stockTakingPlanService.getStockTakingPlanPage(pageReqVO); + ExcelUtils.write(response, "盘点方案.xls", "数据", MesWmStockTakingPlanRespVO.class, + buildRespVOList(pageResult.getList(), false)); + } + + // TODO @AI:去掉 confirmStockTakingPlan 方法;改成 updateStatus 这种接口; + @PutMapping("/confirm") + @Operation(summary = "确认盘点方案") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')") + public CommonResult confirmStockTakingPlan(@RequestParam("id") Long id) { + stockTakingPlanService.confirmStockTakingPlan(id); + return success(true); + } + + // TODO @AI:去掉 generateStockTakingTask 方法 + @PostMapping("/generate-task") + @Operation(summary = "根据盘点方案生成盘点任务") + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-task:create')") + public CommonResult generateStockTakingTask(@Valid @RequestBody MesWmStockTakingPlanGenerateReqVO reqVO) { + return success(stockTakingPlanService.generateStockTakingTask(reqVO)); + } + + private List buildRespVOList(List list, boolean includeParams) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + final Map> finalParamMap; + if (includeParams) { + Collection planIds = convertSet(list, MesWmStockTakingPlanDO::getId); + Map> paramMap = new java.util.HashMap<>(); + stockTakingPlanParamService.getStockTakingPlanParamMap(planIds) + .forEach((planId, params) -> paramMap.put(planId, + BeanUtils.toBean(params, MesWmStockTakingPlanParamRespVO.class))); + finalParamMap = paramMap; + } else { + finalParamMap = Collections.emptyMap(); + } + return BeanUtils.toBean(list, MesWmStockTakingPlanRespVO.class, + vo -> vo.setParams(finalParamMap.getOrDefault(vo.getId(), Collections.emptyList()))); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanParamController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanParamController.java new file mode 100644 index 0000000..6ae1a38 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/MesWmStockTakingPlanParamController.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO; +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanParamService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 盘点方案参数") +@RestController +@RequestMapping("/mes/wm/stocktaking-plan-param") +@Validated +public class MesWmStockTakingPlanParamController { + + @Resource + private MesWmStockTakingPlanParamService stockTakingPlanParamService; + + @PostMapping("/create") + @Operation(summary = "创建盘点方案参数") + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')") + public CommonResult createStockTakingPlanParam(@Valid @RequestBody MesWmStockTakingPlanParamSaveReqVO createReqVO) { + return success(stockTakingPlanParamService.createStockTakingPlanParam(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改盘点方案参数") + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')") + public CommonResult updateStockTakingPlanParam(@Valid @RequestBody MesWmStockTakingPlanParamSaveReqVO updateReqVO) { + stockTakingPlanParamService.updateStockTakingPlanParam(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除盘点方案参数") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:update')") + public CommonResult deleteStockTakingPlanParam(@RequestParam("id") Long id) { + stockTakingPlanParamService.deleteStockTakingPlanParam(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得盘点方案参数") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:query')") + public CommonResult getStockTakingPlanParam(@RequestParam("id") Long id) { + MesWmStockTakingPlanParamDO param = stockTakingPlanParamService.getStockTakingPlanParam(id); + return success(param == null ? null : BeanUtils.toBean(param, MesWmStockTakingPlanParamRespVO.class)); + } + + // TODO @AI:不需要这个接口;前端只需要分页接口; + @GetMapping("/list") + @Operation(summary = "获得盘点方案参数列表") + @Parameter(name = "planId", description = "方案编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-stocktaking-plan:query')") + public CommonResult> getStockTakingPlanParamList(@RequestParam("planId") Long planId) { + return success(BeanUtils.toBean(stockTakingPlanParamService.getStockTakingPlanParamList(planId), + MesWmStockTakingPlanParamRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanGenerateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanGenerateReqVO.java new file mode 100644 index 0000000..7d4eed8 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanGenerateReqVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - MES 盘点方案生成任务 Request VO") +@Data +public class MesWmStockTakingPlanGenerateReqVO { + + @Schema(description = "方案编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "方案编号不能为空") + private Long planId; + + @Schema(description = "任务编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ST202603080001") + @NotEmpty(message = "任务编码不能为空") + private String code; + + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓月度盘点任务") + @NotEmpty(message = "任务名称不能为空") + private String name; + + @Schema(description = "盘点日期") + private LocalDateTime takingDate; + + @Schema(description = "盘点人 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "盘点人不能为空") + private Long userId; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "方案参数列表,为空时使用方案自身参数") + private List params; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanPageReqVO.java new file mode 100644 index 0000000..075f829 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanPageReqVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - MES 盘点方案分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MesWmStockTakingPlanPageReqVO extends PageParam { + + @Schema(description = "方案编码", example = "STP202603080001") + private String code; + + @Schema(description = "方案名称", example = "原料仓月度盘点方案") + private String name; + + @Schema(description = "盘点类型", example = "1") + private Integer type; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "是否启用", example = "true") + private Boolean enableFlag; + + @Schema(description = "计划开始时间范围") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] startTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanRespVO.java new file mode 100644 index 0000000..5f000df --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanRespVO.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - MES 盘点方案 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesWmStockTakingPlanRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "方案编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "STP202603080001") + @ExcelProperty("方案编码") + private String code; + + @Schema(description = "方案名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓月度盘点方案") + @ExcelProperty("方案名称") + private String name; + + @Schema(description = "盘点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("盘点类型") + private Integer type; + + @Schema(description = "计划开始时间") + @ExcelProperty("计划开始时间") + private LocalDateTime startTime; + + @Schema(description = "计划结束时间") + @ExcelProperty("计划结束时间") + private LocalDateTime endTime; + + @Schema(description = "是否盲盘", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @ExcelProperty("是否盲盘") + private Boolean blindFlag; + + @Schema(description = "是否冻结库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") + @ExcelProperty("是否冻结库存") + private Boolean frozenFlag; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @ExcelProperty("是否启用") + private Boolean enableFlag; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "方案参数列表") + private List params; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanSaveReqVO.java new file mode 100644 index 0000000..868ec7b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanSaveReqVO.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 盘点方案新增/修改 Request VO") +@Data +public class MesWmStockTakingPlanSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "方案编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "STP202603080001") + @NotEmpty(message = "方案编码不能为空") + private String code; + + @Schema(description = "方案名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原料仓月度盘点方案") + @NotEmpty(message = "方案名称不能为空") + private String name; + + @Schema(description = "盘点类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "盘点类型不能为空") + private Integer type; + + @Schema(description = "计划开始时间") + private LocalDateTime startTime; + + @Schema(description = "计划结束时间") + private LocalDateTime endTime; + + @Schema(description = "是否盲盘", example = "false") + @NotNull(message = "是否盲盘不能为空") + private Boolean blindFlag; + + @Schema(description = "是否冻结库存", example = "false") + @NotNull(message = "是否冻结库存不能为空") + private Boolean frozenFlag; + + @Schema(description = "是否启用", example = "true") + @NotNull(message = "是否启用不能为空") + private Boolean enableFlag; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/param/MesWmStockTakingPlanParamRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/param/MesWmStockTakingPlanParamRespVO.java new file mode 100644 index 0000000..332244f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/param/MesWmStockTakingPlanParamRespVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - MES 盘点方案参数 Response VO") +@Data +public class MesWmStockTakingPlanParamRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "方案 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long planId; + + @Schema(description = "参数类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "102") + private Integer type; + + @Schema(description = "参数值 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long valueId; + + @Schema(description = "参数值编码", example = "WH001") + private String valueCode; + + @Schema(description = "参数值名称", example = "原料仓") + private String valueName; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/param/MesWmStockTakingPlanParamSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/param/MesWmStockTakingPlanParamSaveReqVO.java new file mode 100644 index 0000000..00c7f6d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/param/MesWmStockTakingPlanParamSaveReqVO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - MES 盘点方案参数新增/修改 Request VO") +@Data +public class MesWmStockTakingPlanParamSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "方案 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "方案 ID 不能为空") + private Long planId; + + @Schema(description = "参数类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "102") + @NotNull(message = "参数类型不能为空") + private Integer type; + + @Schema(description = "参数值 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "参数值 ID 不能为空") + private Long valueId; + + @Schema(description = "参数值编码", example = "WH001") + private String valueCode; + + @Schema(description = "参数值名称", example = "原料仓") + private String valueName; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java new file mode 100644 index 0000000..7060759 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +// TODO @AI:缺少注释; + +/** + * MES 盘点方案 DO + */ +@TableName("mes_wm_stock_taking_plan") +@KeySequence("mes_wm_stock_taking_plan_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmStockTakingPlanDO extends BaseDO { + + @TableId + private Long id; + + private String code; + + private String name; + + /** + * 枚举 {@link MesWmStockTakingTypeEnum} + */ + private Integer type; + + private LocalDateTime startTime; + + private LocalDateTime endTime; + + private Boolean blindFlag; + + private Boolean frozenFlag; + + // TODO @AI:这个 enableFlag 改成 status,对应 CommonStatus; + private Boolean enableFlag; + + // TODO @AI:这个字段没用,可以删除掉; + /** + * 枚举 {@link MesWmStockTakingPlanStatusEnum} + */ + private Integer status; + + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanParamDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanParamDO.java new file mode 100644 index 0000000..71a8c85 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanParamDO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanParamTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * MES 盘点方案参数 DO + */ +@TableName("mes_wm_stock_taking_plan_param") +@KeySequence("mes_wm_stock_taking_plan_param_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmStockTakingPlanParamDO extends BaseDO { + + @TableId + private Long id; + + /** + * 盘点方案编号 + * + * 关联 {@link MesWmStockTakingPlanDO#getId()} + */ + private Long planId; + + /** + * 枚举 {@link MesWmStockTakingPlanParamTypeEnum} + */ + private Integer type; + + /** + * 参数值编号,例如仓库、库区、库位、物料、批次的主键 ID + */ + private Long valueId; + + /** + * 参数值编码,例如仓库编码、库区编码、库位编码、物料编码、批次编码 + */ + private String valueCode; + + /** + * 参数值名称,例如仓库名称、库区名称、库位名称、物料名称、批次名称 + */ + private String valueName; + + private String remark; + + private Long tenantId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java index 304718c..cff0946 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java @@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Mapper; import java.math.BigDecimal; import java.util.Collection; import java.util.List; +import java.util.Set; /** * MES 库存台账 Mapper @@ -64,4 +65,17 @@ public interface MesWmMaterialStockMapper extends BaseMapperX selectListForStockTaking(Set warehouseIds, Set locationIds, + Set areaIds, Set itemIds, + Set batchIds) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseIds) + .inIfPresent(MesWmMaterialStockDO::getLocationId, locationIds) + .inIfPresent(MesWmMaterialStockDO::getAreaId, areaIds) + .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds) + .inIfPresent(MesWmMaterialStockDO::getBatchId, batchIds) + .ne(MesWmMaterialStockDO::getQuantityOnhand, BigDecimal.ZERO) + .orderByAsc(MesWmMaterialStockDO::getId)); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanMapper.java new file mode 100644 index 0000000..5d1d2e7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanMapper.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 盘点方案 Mapper + */ +@Mapper +public interface MesWmStockTakingPlanMapper extends BaseMapperX { + + default MesWmStockTakingPlanDO selectByCode(String code) { + return selectOne(MesWmStockTakingPlanDO::getCode, code); + } + + default PageResult selectPage(MesWmStockTakingPlanPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmStockTakingPlanDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmStockTakingPlanDO::getName, reqVO.getName()) + .eqIfPresent(MesWmStockTakingPlanDO::getType, reqVO.getType()) + .eqIfPresent(MesWmStockTakingPlanDO::getStatus, reqVO.getStatus()) + .eqIfPresent(MesWmStockTakingPlanDO::getEnableFlag, reqVO.getEnableFlag()) + .betweenIfPresent(MesWmStockTakingPlanDO::getStartTime, reqVO.getStartTime()) + .orderByDesc(MesWmStockTakingPlanDO::getId)); + } + + default List selectListByStatus(Integer status) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MesWmStockTakingPlanDO::getStatus, status) + .eq(MesWmStockTakingPlanDO::getEnableFlag, true) + .orderByDesc(MesWmStockTakingPlanDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanParamMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanParamMapper.java new file mode 100644 index 0000000..6babf6a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/plan/MesWmStockTakingPlanParamMapper.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +/** + * MES 盘点方案参数 Mapper + */ +@Mapper +public interface MesWmStockTakingPlanParamMapper extends BaseMapperX { + + default List selectListByPlanId(Long planId) { + return selectList(MesWmStockTakingPlanParamDO::getPlanId, planId); + } + + default List selectListByPlanIds(Collection planIds) { + return selectList(MesWmStockTakingPlanParamDO::getPlanId, planIds); + } + + default void deleteByPlanId(Long planId) { + delete(MesWmStockTakingPlanParamDO::getPlanId, planId); + } + + default List selectListByPlanIdAndType(Long planId, Integer type) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmStockTakingPlanParamDO::getPlanId, planId) + .eq(MesWmStockTakingPlanParamDO::getType, type) + .orderByAsc(MesWmStockTakingPlanParamDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java new file mode 100644 index 0000000..a2cd84a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskLineMapper.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.MesWmStockTakingTaskLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * MES 盘点任务行 Mapper + */ +@Mapper +public interface MesWmStockTakingTaskLineMapper extends BaseMapperX { + + default List selectListByTaskId(Long taskId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmStockTakingTaskLineDO::getTaskId, taskId) + .orderByAsc(MesWmStockTakingTaskLineDO::getId)); + } + + default List selectListByTaskIds(Collection taskIds) { + return selectList(MesWmStockTakingTaskLineDO::getTaskId, taskIds); + } + + default List selectListByIds(Collection ids) { + return selectByIds(ids); + } + + default List selectListByTaskIdAndIds(Long taskId, Set ids) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmStockTakingTaskLineDO::getTaskId, taskId) + .inIfPresent(MesWmStockTakingTaskLineDO::getId, ids) + .orderByAsc(MesWmStockTakingTaskLineDO::getId)); + } + + default void deleteByTaskId(Long taskId) { + delete(MesWmStockTakingTaskLineDO::getTaskId, taskId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskMapper.java new file mode 100644 index 0000000..984df31 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.vo.task.MesWmStockTakingTaskPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.MesWmStockTakingTaskDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 盘点任务 Mapper + */ +@Mapper +public interface MesWmStockTakingTaskMapper extends BaseMapperX { + + default MesWmStockTakingTaskDO selectByCode(String code) { + return selectOne(MesWmStockTakingTaskDO::getCode, code); + } + + default PageResult selectPage(MesWmStockTakingTaskPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmStockTakingTaskDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmStockTakingTaskDO::getName, reqVO.getName()) + .eqIfPresent(MesWmStockTakingTaskDO::getType, reqVO.getType()) + .eqIfPresent(MesWmStockTakingTaskDO::getStatus, reqVO.getStatus()) + .eqIfPresent(MesWmStockTakingTaskDO::getUserId, reqVO.getUserId()) + .eqIfPresent(MesWmStockTakingTaskDO::getPlanId, reqVO.getPlanId()) + .betweenIfPresent(MesWmStockTakingTaskDO::getTakingDate, reqVO.getTakingDate()) + .orderByDesc(MesWmStockTakingTaskDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java new file mode 100644 index 0000000..46dc601 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.vo.result.MesWmStockTakingTaskResultPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.MesWmStockTakingTaskResultDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 盘点结果 Mapper + */ +@Mapper +public interface MesWmStockTakingTaskResultMapper extends BaseMapperX { + + default PageResult selectPage(MesWmStockTakingTaskResultPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmStockTakingTaskResultDO::getTaskId, reqVO.getTaskId()) + .eqIfPresent(MesWmStockTakingTaskResultDO::getItemId, reqVO.getItemId()) + .eqIfPresent(MesWmStockTakingTaskResultDO::getWarehouseId, reqVO.getWarehouseId()) + .eqIfPresent(MesWmStockTakingTaskResultDO::getLocationId, reqVO.getLocationId()) + .eqIfPresent(MesWmStockTakingTaskResultDO::getAreaId, reqVO.getAreaId()) + .orderByDesc(MesWmStockTakingTaskResultDO::getId)); + } + + default List selectListByTaskId(Long taskId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmStockTakingTaskResultDO::getTaskId, taskId) + .orderByAsc(MesWmStockTakingTaskResultDO::getId)); + } + + default void deleteByTaskId(Long taskId) { + delete(MesWmStockTakingTaskResultDO::getTaskId, taskId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index d217817..a234b79 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -469,6 +469,21 @@ public interface ErrorCodeConstants { ErrorCode WM_RETURN_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_713_100, "销售退货单行不存在"); ErrorCode WM_RETURN_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_713_200, "销售退货单明细不存在"); + // ========== MES 仓库管理-盘点方案/任务/结果(1-040-714-100) ========== + ErrorCode WM_STOCK_TAKING_PLAN_NOT_EXISTS = new ErrorCode(1_040_714_100, "盘点方案不存在"); + ErrorCode WM_STOCK_TAKING_PLAN_CODE_DUPLICATE = new ErrorCode(1_040_714_101, "盘点方案编码已存在"); + ErrorCode WM_STOCK_TAKING_PLAN_NOT_PREPARE = new ErrorCode(1_040_714_102, "只有草稿状态的盘点方案才允许此操作"); + ErrorCode WM_STOCK_TAKING_PLAN_NOT_CONFIRMED = new ErrorCode(1_040_714_103, "只有已确认状态的盘点方案才允许生成任务"); + ErrorCode WM_STOCK_TAKING_PLAN_PARAM_NOT_EXISTS = new ErrorCode(1_040_714_104, "盘点方案参数不存在"); + ErrorCode WM_STOCK_TAKING_TASK_NOT_EXISTS = new ErrorCode(1_040_714_110, "盘点任务不存在"); + ErrorCode WM_STOCK_TAKING_TASK_CODE_DUPLICATE = new ErrorCode(1_040_714_111, "盘点任务编码已存在"); + ErrorCode WM_STOCK_TAKING_TASK_NOT_PREPARE = new ErrorCode(1_040_714_112, "只有草稿状态的盘点任务才允许此操作"); + ErrorCode WM_STOCK_TAKING_TASK_NOT_IN_PROGRESS = new ErrorCode(1_040_714_113, "只有盘点中状态的任务才允许此操作"); + ErrorCode WM_STOCK_TAKING_TASK_CANNOT_CANCEL = new ErrorCode(1_040_714_114, "已完成或已取消的盘点任务不允许取消"); + ErrorCode WM_STOCK_TAKING_TASK_NO_STOCK = new ErrorCode(1_040_714_115, "未找到符合条件的库存数据"); + ErrorCode WM_STOCK_TAKING_TASK_NO_LINE = new ErrorCode(1_040_714_116, "盘点任务至少需要一条任务行"); + ErrorCode WM_STOCK_TAKING_TASK_LINE_NOT_EXISTS = new ErrorCode(1_040_714_117, "盘点任务行不存在"); + // ========== MES 仓库管理-销售出库单(1-040-714-000) ========== ErrorCode WM_PRODUCT_SALES_NOT_EXISTS = new ErrorCode(1_040_714_000, "销售出库单不存在"); ErrorCode WM_PRODUCT_SALES_CODE_DUPLICATE = new ErrorCode(1_040_714_001, "销售出库单号已存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingPlanParamTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingPlanParamTypeEnum.java new file mode 100644 index 0000000..f02c90d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingPlanParamTypeEnum.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +// TODO @AI:缺少注释;type + name 这种; +/** + * MES 盘点方案参数类型枚举 + */ +@Getter +@AllArgsConstructor +public enum MesWmStockTakingPlanParamTypeEnum implements ArrayValuable { + + WAREHOUSE(MesBizTypeConstants.WM_WAREHOUSE, "仓库"), + LOCATION(MesBizTypeConstants.WM_LOCATION, "库区"), + AREA(MesBizTypeConstants.WM_AREA, "库位"), + ITEM(MesBizTypeConstants.MD_ITEM, "物料"), + BATCH(MesBizTypeConstants.WM_BATCH, "批次"); + + public static final Integer[] ARRAYS = Arrays.stream(values()) + .map(MesWmStockTakingPlanParamTypeEnum::getType).toArray(Integer[]::new); + + private final Integer type; + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingPlanStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingPlanStatusEnum.java new file mode 100644 index 0000000..20a0e80 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingPlanStatusEnum.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +// TODO @AI:缺少注释;status + name 这种; +/** + * MES 盘点方案状态枚举 + */ +@Getter +@AllArgsConstructor +public enum MesWmStockTakingPlanStatusEnum implements ArrayValuable { + + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), + CONFIRMED(MesOrderStatusConstants.CONFIRMED, "已确认"); + + public static final Integer[] ARRAYS = Arrays.stream(values()) + .map(MesWmStockTakingPlanStatusEnum::getStatus).toArray(Integer[]::new); + + private final Integer status; + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java new file mode 100644 index 0000000..acabf98 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskLineStatusEnum.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +// TODO @AI:缺少注释;status + name 这种; +/** + * MES 盘点任务行状态枚举 + */ +@Getter +@AllArgsConstructor +public enum MesWmStockTakingTaskLineStatusEnum implements ArrayValuable { + + UNCOUNTED(0, "未盘点"), + NORMAL(1, "正常"), + GAIN(2, "盘盈"), + LOSS(3, "盘亏"); + + public static final Integer[] ARRAYS = Arrays.stream(values()) + .map(MesWmStockTakingTaskLineStatusEnum::getStatus).toArray(Integer[]::new); + + private final Integer status; + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java new file mode 100644 index 0000000..bcf1384 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTaskStatusEnum.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +// TODO @AI:缺少注释;status + name 这种; +/** + * MES 盘点任务状态枚举 + */ +@Getter +@AllArgsConstructor +public enum MesWmStockTakingTaskStatusEnum implements ArrayValuable { + + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), + IN_PROGRESS(MesOrderStatusConstants.CONFIRMED, "盘点中"), + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), + CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); + + public static final Integer[] ARRAYS = Arrays.stream(values()) + .map(MesWmStockTakingTaskStatusEnum::getStatus).toArray(Integer[]::new); + + private final Integer status; + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTypeEnum.java new file mode 100644 index 0000000..c77e580 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmStockTakingTypeEnum.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +// TODO @AI:缺少注释;type + name 这种; +/** + * MES 盘点类型枚举 + */ +@Getter +@AllArgsConstructor +public enum MesWmStockTakingTypeEnum implements ArrayValuable { + + // TODO @AI:只有 2 种:动态盘点、静态盘点;按照这个顺序枚举; + OPEN(1, "开放盘点"), + CYCLE(2, "循环盘点"), + DYNAMIC(3, "动态盘点"); + + public static final Integer[] ARRAYS = Arrays.stream(values()) + .map(MesWmStockTakingTypeEnum::getType).toArray(Integer[]::new); + + private final Integer type; + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java index 46946be..f39a45c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java @@ -11,6 +11,7 @@ import java.time.LocalDateTime; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; @@ -82,6 +83,11 @@ public interface MesWmMaterialStockService { */ List getMaterialStockList(Collection ids); + // TODO @芋艿:不确定性;感觉就是一个查询接口,参数比较多; + List getMaterialStockListForStockTaking(Set warehouseIds, Set locationIds, + Set areaIds, Set itemIds, + Set batchIds); + default Map getMaterialStockMap(Collection ids) { return convertMap(getMaterialStockList(ids), MesWmMaterialStockDO::getId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java index 09d47ae..284e1f7 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java @@ -107,6 +107,13 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService return materialStockMapper.selectListByIds(ids); } + @Override + public List getMaterialStockListForStockTaking(Set warehouseIds, Set locationIds, + Set areaIds, Set itemIds, + Set batchIds) { + return materialStockMapper.selectListForStockTaking(warehouseIds, locationIds, areaIds, itemIds, batchIds); + } + // TODO DONE @AI:increaseStock 方法命名合理,语义清晰 @Override public void increaseStock(Long itemId, Long warehouseId, Long locationId, Long areaId, diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanParamService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanParamService.java new file mode 100644 index 0000000..319b6fd --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanParamService.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; + +// TODO @AI:必要的注释 +/** + * MES 盘点方案参数 Service 接口 + */ +public interface MesWmStockTakingPlanParamService { + + Long createStockTakingPlanParam(@Valid MesWmStockTakingPlanParamSaveReqVO createReqVO); + + void updateStockTakingPlanParam(@Valid MesWmStockTakingPlanParamSaveReqVO updateReqVO); + + void deleteStockTakingPlanParam(Long id); + + MesWmStockTakingPlanParamDO getStockTakingPlanParam(Long id); + + List getStockTakingPlanParamList(Long planId); + + default Map> getStockTakingPlanParamMap(Collection planIds) { + return convertMultiMap(getStockTakingPlanParamList(planIds), MesWmStockTakingPlanParamDO::getPlanId); + } + + List getStockTakingPlanParamList(Collection planIds); + + void deleteStockTakingPlanParamByPlanId(Long planId); + + MesWmStockTakingPlanParamDO validateStockTakingPlanParamExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanParamServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanParamServiceImpl.java new file mode 100644 index 0000000..bd63b9b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanParamServiceImpl.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanParamDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan.MesWmStockTakingPlanParamMapper; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_PLAN_PARAM_NOT_EXISTS; + +// TODO @AI:必要的注释 +/** + * MES 盘点方案参数 Service 实现类 + */ +@Service +@Validated +public class MesWmStockTakingPlanParamServiceImpl implements MesWmStockTakingPlanParamService { + + @Resource + private MesWmStockTakingPlanParamMapper stockTakingPlanParamMapper; + @Resource + @Lazy + private MesWmStockTakingPlanService stockTakingPlanService; + + @Override + public Long createStockTakingPlanParam(MesWmStockTakingPlanParamSaveReqVO createReqVO) { + MesWmStockTakingPlanDO plan = stockTakingPlanService.validateStockTakingPlanEditable(createReqVO.getPlanId()); + + MesWmStockTakingPlanParamDO param = BeanUtils.toBean(createReqVO, MesWmStockTakingPlanParamDO.class); + param.setPlanId(plan.getId()); + stockTakingPlanParamMapper.insert(param); + return param.getId(); + } + + @Override + public void updateStockTakingPlanParam(MesWmStockTakingPlanParamSaveReqVO updateReqVO) { + MesWmStockTakingPlanParamDO param = validateStockTakingPlanParamExists(updateReqVO.getId()); + stockTakingPlanService.validateStockTakingPlanEditable(param.getPlanId()); + + MesWmStockTakingPlanParamDO updateObj = BeanUtils.toBean(updateReqVO, MesWmStockTakingPlanParamDO.class); + updateObj.setPlanId(param.getPlanId()); + stockTakingPlanParamMapper.updateById(updateObj); + } + + @Override + public void deleteStockTakingPlanParam(Long id) { + MesWmStockTakingPlanParamDO param = validateStockTakingPlanParamExists(id); + stockTakingPlanService.validateStockTakingPlanEditable(param.getPlanId()); + stockTakingPlanParamMapper.deleteById(id); + } + + @Override + public MesWmStockTakingPlanParamDO getStockTakingPlanParam(Long id) { + return stockTakingPlanParamMapper.selectById(id); + } + + @Override + public List getStockTakingPlanParamList(Long planId) { + return stockTakingPlanParamMapper.selectListByPlanId(planId); + } + + @Override + public List getStockTakingPlanParamList(Collection planIds) { + if (CollUtil.isEmpty(planIds)) { + return Collections.emptyList(); + } + return stockTakingPlanParamMapper.selectListByPlanIds(planIds); + } + + @Override + public void deleteStockTakingPlanParamByPlanId(Long planId) { + stockTakingPlanParamMapper.deleteByPlanId(planId); + } + + @Override + public MesWmStockTakingPlanParamDO validateStockTakingPlanParamExists(Long id) { + MesWmStockTakingPlanParamDO param = stockTakingPlanParamMapper.selectById(id); + if (param == null) { + throw exception(WM_STOCK_TAKING_PLAN_PARAM_NOT_EXISTS); + } + return param; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java new file mode 100644 index 0000000..b789911 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanService.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanGenerateReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +// TODO @AI:必要的注释 +/** + * MES 盘点方案 Service 接口 + */ +public interface MesWmStockTakingPlanService { + + Long createStockTakingPlan(@Valid MesWmStockTakingPlanSaveReqVO createReqVO); + + void updateStockTakingPlan(@Valid MesWmStockTakingPlanSaveReqVO updateReqVO); + + void deleteStockTakingPlan(Long id); + + void confirmStockTakingPlan(Long id); + + Long generateStockTakingTask(@Valid MesWmStockTakingPlanGenerateReqVO reqVO); + + MesWmStockTakingPlanDO getStockTakingPlan(Long id); + + MesWmStockTakingPlanDO validateStockTakingPlanExists(Long id); + + MesWmStockTakingPlanDO validateStockTakingPlanEditable(Long id); + + List getStockTakingPlanList(Collection ids); + + default Map getStockTakingPlanMap(Collection ids) { + return convertMap(getStockTakingPlanList(ids), MesWmStockTakingPlanDO::getId); + } + + PageResult getStockTakingPlanPage(MesWmStockTakingPlanPageReqVO pageReqVO); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java new file mode 100644 index 0000000..5d2a8c6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/plan/MesWmStockTakingPlanServiceImpl.java @@ -0,0 +1,159 @@ +package cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanGenerateReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.param.MesWmStockTakingPlanParamSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.plan.vo.MesWmStockTakingPlanSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.vo.task.MesWmStockTakingTaskSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.plan.MesWmStockTakingPlanDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.plan.MesWmStockTakingPlanMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingPlanStatusEnum; +import cn.iocoder.yudao.module.mes.service.wm.stocktaking.MesWmStockTakingTaskService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +// TODO @AI:必要的注释 +@Service +@Validated +public class MesWmStockTakingPlanServiceImpl implements MesWmStockTakingPlanService { + + @Resource + private MesWmStockTakingPlanMapper stockTakingPlanMapper; + @Resource + private MesWmStockTakingPlanParamService stockTakingPlanParamService; + @Resource + private MesWmStockTakingTaskService stockTakingTaskService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createStockTakingPlan(MesWmStockTakingPlanSaveReqVO createReqVO) { + validatePlanCodeUnique(null, createReqVO.getCode()); + + MesWmStockTakingPlanDO plan = BeanUtils.toBean(createReqVO, MesWmStockTakingPlanDO.class); + plan.setStatus(MesWmStockTakingPlanStatusEnum.PREPARE.getStatus()); + stockTakingPlanMapper.insert(plan); + return plan.getId(); + } + + // TODO @AI:开启后,就不允许编辑、删除了; + @Override + @Transactional(rollbackFor = Exception.class) + public void updateStockTakingPlan(MesWmStockTakingPlanSaveReqVO updateReqVO) { + validatePlanExistsAndPrepare(updateReqVO.getId()); + validatePlanCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + + MesWmStockTakingPlanDO updateObj = BeanUtils.toBean(updateReqVO, MesWmStockTakingPlanDO.class); + stockTakingPlanMapper.updateById(updateObj); + } + + // TODO @AI:开启后,就不允许编辑、删除了; + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteStockTakingPlan(Long id) { + validatePlanExistsAndPrepare(id); + stockTakingPlanParamService.deleteStockTakingPlanParamByPlanId(id); + stockTakingPlanMapper.deleteById(id); + } + + @Override + public void confirmStockTakingPlan(Long id) { + MesWmStockTakingPlanDO plan = validatePlanExistsAndPrepare(id); + plan.setStatus(MesWmStockTakingPlanStatusEnum.CONFIRMED.getStatus()); + stockTakingPlanMapper.updateById(plan); + } + + // TODO @AI:这个方法不需要了呀; + @Override + public Long generateStockTakingTask(MesWmStockTakingPlanGenerateReqVO reqVO) { + MesWmStockTakingPlanDO plan = validatePlanExistsAndConfirmed(reqVO.getPlanId()); + MesWmStockTakingTaskSaveReqVO taskSaveReqVO = new MesWmStockTakingTaskSaveReqVO(); + taskSaveReqVO.setCode(reqVO.getCode()); + taskSaveReqVO.setName(reqVO.getName()); + taskSaveReqVO.setTakingDate(reqVO.getTakingDate()); + taskSaveReqVO.setType(plan.getType()); + taskSaveReqVO.setUserId(reqVO.getUserId()); + taskSaveReqVO.setPlanId(plan.getId()); + taskSaveReqVO.setBlindFlag(plan.getBlindFlag()); + taskSaveReqVO.setFrozenFlag(plan.getFrozenFlag()); + taskSaveReqVO.setRemark(reqVO.getRemark()); + + List params = reqVO.getParams(); + if (CollUtil.isEmpty(params)) { + params = BeanUtils.toBean(stockTakingPlanParamService.getStockTakingPlanParamList(plan.getId()), MesWmStockTakingPlanParamSaveReqVO.class); + } + return stockTakingTaskService.createStockTakingTaskByPlan(reqVO, taskSaveReqVO, params); + } + + @Override + public MesWmStockTakingPlanDO getStockTakingPlan(Long id) { + return stockTakingPlanMapper.selectById(id); + } + + @Override + public MesWmStockTakingPlanDO validateStockTakingPlanExists(Long id) { + MesWmStockTakingPlanDO plan = stockTakingPlanMapper.selectById(id); + if (plan == null) { + throw exception(WM_STOCK_TAKING_PLAN_NOT_EXISTS); + } + return plan; + } + + @Override + public MesWmStockTakingPlanDO validateStockTakingPlanEditable(Long id) { + return validatePlanExistsAndPrepare(id); + } + + @Override + public List getStockTakingPlanList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return stockTakingPlanMapper.selectByIds(ids); + } + + @Override + public PageResult getStockTakingPlanPage(MesWmStockTakingPlanPageReqVO pageReqVO) { + return stockTakingPlanMapper.selectPage(pageReqVO); + } + + + private void validatePlanCodeUnique(Long id, String code) { + MesWmStockTakingPlanDO plan = stockTakingPlanMapper.selectByCode(code); + if (plan == null) { + return; + } + if (id == null || !Objects.equals(plan.getId(), id)) { + throw exception(WM_STOCK_TAKING_PLAN_CODE_DUPLICATE); + } + } + + private MesWmStockTakingPlanDO validatePlanExistsAndPrepare(Long id) { + MesWmStockTakingPlanDO plan = validateStockTakingPlanExists(id); + if (!MesWmStockTakingPlanStatusEnum.PREPARE.getStatus().equals(plan.getStatus())) { + throw exception(WM_STOCK_TAKING_PLAN_NOT_PREPARE); + } + return plan; + } + + private MesWmStockTakingPlanDO validatePlanExistsAndConfirmed(Long id) { + MesWmStockTakingPlanDO plan = validateStockTakingPlanExists(id); + if (!MesWmStockTakingPlanStatusEnum.CONFIRMED.getStatus().equals(plan.getStatus())) { + throw exception(WM_STOCK_TAKING_PLAN_NOT_CONFIRMED); + } + return plan; + } + +}