diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java index 83b5ff3..7ac4581 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/MesWmOutsourceIssueController.java @@ -109,12 +109,30 @@ public class MesWmOutsourceIssueController { BeanUtils.toBean(pageResult.getList(), MesWmOutsourceIssueExcelVO.class)); } + @PutMapping("/submit") + @Operation(summary = "提交到待拣货") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-outsource-issue:update')") + public CommonResult submitOutsourceIssue(@RequestParam("id") Long id) { + outsourceIssueService.submitOutsourceIssue(id); + return success(true); + } + + @PutMapping("/stock") + @Operation(summary = "执行拣货") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-outsource-issue:update')") + public CommonResult stockOutsourceIssue(@RequestParam("id") Long id) { + outsourceIssueService.stockOutsourceIssue(id); + return success(true); + } + @PutMapping("/finish") @Operation(summary = "完成外协发料出库") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-outsource-issue:finish')") public CommonResult finishOutsourceIssue(@RequestParam("id") Long id) { - outsourceIssueService.executeOutsourceIssue(id); + outsourceIssueService.finishOutsourceIssue(id); return success(true); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueExcelVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueExcelVO.java index a32208c..ff130a3 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueExcelVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueExcelVO.java @@ -7,6 +7,7 @@ import lombok.Data; import java.time.LocalDateTime; +// TODO @AI:删除掉,融合到 MesWmOutsourceIssueRespVO 中,保持一个 VO 就好 @Schema(description = "管理后台 - MES 外协发料单 Excel VO") @Data @ExcelIgnoreUnannotated @@ -28,10 +29,10 @@ public class MesWmOutsourceIssueExcelVO { private String vendorName; @ExcelProperty("生产工单编码") - private String workorderCode; + private String workOrderCode; @ExcelProperty("生产工单名称") - private String workorderName; + private String workOrderName; @ExcelProperty("发料日期") private LocalDateTime issueDate; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssuePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssuePageReqVO.java index 015466f..8fdddf0 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssuePageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssuePageReqVO.java @@ -27,15 +27,17 @@ public class MesWmOutsourceIssuePageReqVO extends PageParam { private Long vendorId; @Schema(description = "生产工单ID", example = "1") - private Long workorderId; + private Long workOrderId; + // TODO @AI:这个字段,去掉筛选 @Schema(description = "生产工单编码", example = "WO202603020001") - private String workorderCode; + private String workOrderCode; @Schema(description = "发料日期") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] issueDate; + // TODO @AI:这个字段,去掉筛选 @Schema(description = "单据状态", example = "0") private Integer status; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueRespVO.java index f2b861f..ad6a39e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueRespVO.java @@ -36,15 +36,15 @@ public class MesWmOutsourceIssueRespVO { private String vendorName; @Schema(description = "生产工单ID", example = "1") - private Long workorderId; + private Long workOrderId; @Schema(description = "生产工单编码", example = "WO202603020001") @ExcelProperty("生产工单编码") - private String workorderCode; + private String workOrderCode; @Schema(description = "生产工单名称", example = "生产工单001") @ExcelProperty("生产工单名称") - private String workorderName; + private String workOrderName; @Schema(description = "发料日期", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("发料日期") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueSaveReqVO.java index cf08956..3b5a02e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourceissue/vo/MesWmOutsourceIssueSaveReqVO.java @@ -22,27 +22,14 @@ public class MesWmOutsourceIssueSaveReqVO { @NotEmpty(message = "发料单名称不能为空") private String name; - @Schema(description = "供应商ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "供应商ID不能为空") + @Schema(description = "供应商ID", example = "1") private Long vendorId; - @Schema(description = "供应商编码", example = "V001") - private String vendorCode; + @Schema(description = "生产工单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "生产工单ID不能为空") + private Long workOrderId; - @Schema(description = "供应商名称", example = "供应商A") - private String vendorName; - - @Schema(description = "生产工单ID", example = "1") - private Long workorderId; - - @Schema(description = "生产工单编码", example = "WO202603020001") - private String workorderCode; - - @Schema(description = "生产工单名称", example = "生产工单001") - private String workorderName; - - @Schema(description = "发料日期", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "发料日期不能为空") + @Schema(description = "发料日期") private LocalDateTime issueDate; @Schema(description = "备注", example = "备注") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java index b43da8a..a749157 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourceissue/MesWmOutsourceIssueDO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceIssueStatusEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; @@ -44,29 +45,12 @@ public class MesWmOutsourceIssueDO extends BaseDO { * 关联 {@link MesMdVendorDO#getId()} */ private Long vendorId; - // TODO @AI:去掉冗余的 vendorCode、vendorName 字段 - /** - * 供应商编码 - */ - private String vendorCode; - /** - * 供应商名称 - */ - private String vendorName; - // TODO @AI:去掉冗余的 workorderCode、workorderName 字段 - // TODO @AI:拼写不对;应该是 workOrderId; /** * 生产工单ID + * + * 关联 {@link MesProWorkOrderDO#getId()} */ - private Long workorderId; - /** - * 生产工单编码 - */ - private String workorderCode; - /** - * 生产工单名称 - */ - private String workorderName; + private Long workOrderId; /** * 发料日期 */ 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 10e383c..caf42b6 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 @@ -358,6 +358,8 @@ public interface ErrorCodeConstants { ErrorCode WM_OUTSOURCE_ISSUE_STATUS_NOT_PREPARE = new ErrorCode(1_040_707_002, "只有草稿状态才允许此操作"); ErrorCode WM_OUTSOURCE_ISSUE_NO_LINE = new ErrorCode(1_040_707_003, "至少需要一条发料行"); ErrorCode WM_OUTSOURCE_ISSUE_QUANTITY_MISMATCH = new ErrorCode(1_040_707_004, "发料单行数量与明细数量不一致"); + ErrorCode WM_OUTSOURCE_ISSUE_STATUS_NOT_APPROVING = new ErrorCode(1_040_707_005, "只有待拣货状态才允许此操作"); + ErrorCode WM_OUTSOURCE_ISSUE_STATUS_NOT_APPROVED = new ErrorCode(1_040_707_006, "只有待执行出库状态才允许此操作"); ErrorCode WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_707_100, "外协发料单行不存在"); ErrorCode WM_OUTSOURCE_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_707_200, "外协发料单明细不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutsourceIssueStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutsourceIssueStatusEnum.java index ca5edd7..8e9cdf2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutsourceIssueStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutsourceIssueStatusEnum.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.mes.enums.wm; import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourceissue.vo.MesWmOutsourceIssueSaveReqVO; import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import cn.iocoder.yudao.module.mes.service.wm.outsourceissue.MesWmOutsourceIssueService; import lombok.AllArgsConstructor; import lombok.Getter; @@ -10,6 +12,8 @@ import java.util.Arrays; /** * MES 外协发料单状态枚举 * + * 对应字典 mes_wm_outsource_issue_status + * * @author 芋道源码 */ @Getter @@ -18,13 +22,34 @@ public enum MesWmOutsourceIssueStatusEnum implements ArrayValuable { /** * 草稿 + * + * 对应方法:{@link MesWmOutsourceIssueService#createOutsourceIssue(MesWmOutsourceIssueSaveReqVO)} */ PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), - // TODO @AI:状态缺失了; + /** + * 待拣货 + * + * 对应方法:TODO 待实现 + */ + APPROVING(MesOrderStatusConstants.APPROVING, "待拣货"), + /** + * 待执行出库 + * + * 对应方法:TODO 待实现 + */ + APPROVED(MesOrderStatusConstants.APPROVED, "待执行出库"), /** * 已完成 + * + * 对应方法:{@link MesWmOutsourceIssueService#executeOutsourceIssue(Long)} + */ + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), + /** + * 已取消 + * + * 对应方法:TODO 待实现 */ - FINISHED(MesOrderStatusConstants.FINISHED, "已完成"); + CANCELLED(MesOrderStatusConstants.CANCELLED, "已取消"); public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmOutsourceIssueStatusEnum::getStatus).toArray(Integer[]::new); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java index 9a1a105..7278006 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueService.java @@ -52,10 +52,24 @@ public interface MesWmOutsourceIssueService { PageResult getOutsourceIssuePage(MesWmOutsourceIssuePageReqVO pageReqVO); /** - * 执行外协发料出库(草稿 → 已完成,扣减库存) + * 提交到待拣货(草稿 → 待拣货) * * @param id 编号 */ - void executeOutsourceIssue(Long id); + void submitOutsourceIssue(Long id); + + /** + * 执行拣货(待拣货 → 待执行出库) + * + * @param id 编号 + */ + void stockOutsourceIssue(Long id); + + /** + * 完成外协发料出库(待执行出库 → 已完成,扣减库存) + * + * @param id 编号 + */ + void finishOutsourceIssue(Long id); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java index e53fca0..668d1eb 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java @@ -97,29 +97,56 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic @Override @Transactional(rollbackFor = Exception.class) - public void executeOutsourceIssue(Long id) { - // 1. 校验存在 + 草稿状态 - MesWmOutsourceIssueDO issue = validateOutsourceIssueExistsAndDraft(id); - - // 2. 检查是否有发料行 + public void submitOutsourceIssue(Long id) { + // 1.1 校验存在 + 草稿状态 + validateOutsourceIssueExistsAndDraft(id); + // 1.2 检查是否有发料行 List lines = outsourceIssueLineService.getOutsourceIssueLineListByIssueId(id); if (CollUtil.isEmpty(lines)) { throw exception(WM_OUTSOURCE_ISSUE_NO_LINE); } - // 3. 校验数量一致性(行数量 = 明细数量之和) + // 2. 更新单据状态为待拣货 + outsourceIssueMapper.updateById(new MesWmOutsourceIssueDO() + .setId(id).setStatus(MesWmOutsourceIssueStatusEnum.APPROVING.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void stockOutsourceIssue(Long id) { + // 1.1 校验存在 + 待拣货状态 + MesWmOutsourceIssueDO issue = validateOutsourceIssueExists(id); + if (ObjUtil.notEqual(MesWmOutsourceIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { + throw exception(WM_OUTSOURCE_ISSUE_STATUS_NOT_APPROVING); + } + // 1.2 校验数量一致性(行数量 = 明细数量之和) + List lines = outsourceIssueLineService.getOutsourceIssueLineListByIssueId(id); validateQuantityMatch(id, lines); - // 4. 扣减库存(遍历明细表,逐条扣减) + // 2. 更新单据状态为待执行出库 + outsourceIssueMapper.updateById(new MesWmOutsourceIssueDO() + .setId(id).setStatus(MesWmOutsourceIssueStatusEnum.APPROVED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finishOutsourceIssue(Long id) { + // 1. 校验存在 + 待执行出库状态 + MesWmOutsourceIssueDO issue = validateOutsourceIssueExists(id); + if (ObjUtil.notEqual(MesWmOutsourceIssueStatusEnum.APPROVED.getStatus(), issue.getStatus())) { + throw exception(WM_OUTSOURCE_ISSUE_STATUS_NOT_APPROVED); + } + + // 2. 扣减库存(遍历明细表,逐条扣减) List details = outsourceIssueDetailService.getOutsourceIssueDetailListByIssueId(id); for (MesWmOutsourceIssueDetailDO detail : details) { // TODO: 调用库存服务扣减库存 // materialStockService.decreaseStock(detail.getMaterialStockId(), detail.getQuantity()); - log.info("[executeOutsourceIssue][发料单({}) 扣减库存 - 库存ID: {}, 数量: {}]", + log.info("[finishOutsourceIssue][发料单({}) 扣减库存 - 库存ID: {}, 数量: {}]", id, detail.getMaterialStockId(), detail.getQuantity()); } - // 5. 更新单据状态为已完成 + // 3. 更新单据状态为已完成 outsourceIssueMapper.updateById(new MesWmOutsourceIssueDO() .setId(id).setStatus(MesWmOutsourceIssueStatusEnum.FINISHED.getStatus())); } @@ -162,6 +189,7 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic /** * 校验数量一致性(行数量 = 明细数量之和) */ + // TODO @AI:参考别的模块,不要抽成小方法; private void validateQuantityMatch(Long issueId, List lines) { // 获取所有明细 List details = outsourceIssueDetailService.getOutsourceIssueDetailListByIssueId(issueId);