From 8d2fc22d0497dadff41f85af973479a8b2168a0c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 26 Feb 2026 22:34:17 +0800 Subject: [PATCH] ✨ feat(mes): 添加领料出库单行及明细相关功能与接口 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java | 6 +++--- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java | 7 +++++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java | 3 ++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java | 85 ++++++++++++++++++++++++++++++++++++++++--------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineRespVO.java | 34 ---------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineSaveReqVO.java | 27 --------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java | 30 ++++++++++++++++-------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java | 23 +++++++++-------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java | 20 ++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java | 3 +-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java | 9 --------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java | 14 +++++++++----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 6 +----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java | 5 ++--- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java | 37 ++++++++++++++++++++++++++----------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java | 51 ++++++++++++++++++++++++++++++++++++++++++--------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java | 25 +++++++------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java | 156 ++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------- 27 files changed, 815 insertions(+), 329 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineRespVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java index f486bb9..3d9141b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java @@ -20,7 +20,7 @@ public class MesWmArrivalNoticeRespVO { @ExcelProperty("通知单编码") private String code; - @Schema(description = "通知单名称", example = "2 月份钢板到货") + @Schema(description = "通知单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "2 月份钢板到货") @ExcelProperty("通知单名称") private String name; @@ -28,7 +28,7 @@ public class MesWmArrivalNoticeRespVO { @ExcelProperty("采购订单编号") private String purchaseOrderCode; - @Schema(description = "供应商编号", example = "1") + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long vendorId; @Schema(description = "供应商编码", example = "V001") @@ -39,7 +39,7 @@ public class MesWmArrivalNoticeRespVO { @ExcelProperty("供应商名称") private String vendorName; - @Schema(description = "到货日期") + @Schema(description = "到货日期", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("到货日期") private LocalDateTime arrivalDate; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java index b710d00..439b84c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.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; @@ -24,10 +25,12 @@ public class MesWmArrivalNoticeSaveReqVO { @Schema(description = "采购订单编号", example = "PO20260101") private String purchaseOrderCode; - @Schema(description = "供应商编号", example = "1") + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "供应商编号不能为空") private Long vendorId; - @Schema(description = "到货日期") + @Schema(description = "到货日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "到货日期不能为空") private LocalDateTime arrivalDate; @Schema(description = "联系人", example = "张三") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java index e9345aa..d9c4ee9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java @@ -31,13 +31,13 @@ public class MesWmArrivalNoticeLineRespVO { @Schema(description = "计量单位名称", example = "千克") private String unitMeasureName; - @Schema(description = "到货数量", example = "500.00") + @Schema(description = "到货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "500.00") private BigDecimal arrivalQuantity; @Schema(description = "合格数量", example = "500.00") private BigDecimal qualifiedQuantity; - @Schema(description = "是否需要来料检验", example = "true") + @Schema(description = "是否需要来料检验", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") private Boolean iqcCheckFlag; @Schema(description = "来料检验单编号", example = "1") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java index 5921098..e0a0acd 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java @@ -18,7 +18,8 @@ public class MesWmItemReceiptSaveReqVO { @NotEmpty(message = "入库单编码不能为空") private String code; - @Schema(description = "入库单名称", example = "钢板入库单") + @Schema(description = "入库单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "钢板入库单") + @NotEmpty(message = "入库单名称不能为空") private String name; @Schema(description = "来料检验单编号", example = "1") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java index 73839a1..6fd643d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java @@ -5,16 +5,18 @@ 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.collection.MapUtils; 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.productionissue.vo.MesWmProductionIssuePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueRespVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueSaveReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueLineRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; +import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.wm.productionissue.MesWmProductionIssueService; -import cn.iocoder.yudao.module.mes.service.wm.productionissue.MesWmProductionIssueLineService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -34,9 +36,6 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPOR import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; -// TODO @AI:方法的排序,参考别的模块; -// TODO @AI:controller、service、包括其他的,都需要全。createProductitonIssue 这种;其它模块也是; -// TODO @AI:需要新增 line、detail 的 controller;参考 /Users/yunai/Java/yudao-all-in-one/ruoyi-vue-pro/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt @Tag(name = "管理后台 - MES 领料出库单") @RestController @RequestMapping("/mes/wm/production-issue") @@ -46,20 +45,22 @@ public class MesWmProductionIssueController { @Resource private MesWmProductionIssueService issueService; @Resource - private MesWmProductionIssueLineService issueLineService; + private MesMdWorkstationService workstationService; + @Resource + private MesProWorkOrderService workOrderService; @PostMapping("/create") @Operation(summary = "创建领料出库单") @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:create')") - public CommonResult createIssue(@Valid @RequestBody MesWmProductionIssueSaveReqVO createReqVO) { - return success(issueService.createIssue(createReqVO)); + public CommonResult createProductionIssue(@Valid @RequestBody MesWmProductionIssueSaveReqVO createReqVO) { + return success(issueService.createProductionIssue(createReqVO)); } @PutMapping("/update") @Operation(summary = "修改领料出库单") @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") - public CommonResult updateIssue(@Valid @RequestBody MesWmProductionIssueSaveReqVO updateReqVO) { - issueService.updateIssue(updateReqVO); + public CommonResult updateProductionIssue(@Valid @RequestBody MesWmProductionIssueSaveReqVO updateReqVO) { + issueService.updateProductionIssue(updateReqVO); return success(true); } @@ -67,8 +68,8 @@ public class MesWmProductionIssueController { @Operation(summary = "删除领料出库单") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:delete')") - public CommonResult deleteIssue(@RequestParam("id") Long id) { - issueService.deleteIssue(id); + public CommonResult deleteProductionIssue(@RequestParam("id") Long id) { + issueService.deleteProductionIssue(id); return success(true); } @@ -76,20 +77,20 @@ public class MesWmProductionIssueController { @Operation(summary = "获得领料出库单") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult getIssue(@RequestParam("id") Long id) { - MesWmProductionIssueDO issueHeader = issueService.getIssue(id); - if (issueHeader == null) { + public CommonResult getProductionIssue(@RequestParam("id") Long id) { + MesWmProductionIssueDO issue = issueService.getProductionIssue(id); + if (issue == null) { return success(null); } - return success(buildRespVOList(Collections.singletonList(issueHeader)).get(0)); + return success(buildRespVOList(Collections.singletonList(issue)).get(0)); } @GetMapping("/page") @Operation(summary = "获得领料出库单分页") @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult> getIssuePage( + public CommonResult> getProductionIssuePage( @Valid MesWmProductionIssuePageReqVO pageReqVO) { - PageResult pageResult = issueService.getIssuePage(pageReqVO); + PageResult pageResult = issueService.getProductionIssuePage(pageReqVO); return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); } @@ -97,10 +98,10 @@ public class MesWmProductionIssueController { @Operation(summary = "导出领料出库单 Excel") @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:export')") @ApiAccessLog(operateType = EXPORT) - public void exportIssueExcel(@Valid MesWmProductionIssuePageReqVO pageReqVO, - HttpServletResponse response) throws IOException { + public void exportProductionIssueExcel(@Valid MesWmProductionIssuePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - PageResult pageResult = issueService.getIssuePage(pageReqVO); + PageResult pageResult = issueService.getProductionIssuePage(pageReqVO); ExcelUtils.write(response, "领料出库单.xls", "数据", MesWmProductionIssueRespVO.class, buildRespVOList(pageResult.getList())); } @@ -109,39 +110,33 @@ public class MesWmProductionIssueController { @Operation(summary = "完成领料出库单") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update-status')") - public CommonResult finishIssue(@RequestParam("id") Long id) { - issueService.finishIssue(id); + public CommonResult finishProductionIssue(@RequestParam("id") Long id) { + issueService.finishProductionIssue(id); return success(true); } + // TODO @AI:check quantity + // ==================== 拼接 VO ==================== - // TODO @AI:这个方法的拼接,在优化下; private List buildRespVOList(List list) { if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } - - // 1. 转换基础 VO - List respVOList = BeanUtils.toBean(list, MesWmProductionIssueRespVO.class); - - // 2. 查询行数据 - Map> lineMap = issueLineService.getIssueLineListByIssueIds( - convertSet(list, MesWmProductionIssueDO::getId)) - .stream() - .collect(java.util.stream.Collectors.groupingBy(MesWmProductionIssueLineDO::getIssueId)); - - // 3. 填充行数据 - respVOList.forEach(respVO -> { - List lines = lineMap.get(respVO.getId()); - if (CollUtil.isNotEmpty(lines)) { - respVO.setLines(BeanUtils.toBean(lines, MesWmProductionIssueLineRespVO.class)); - } + // 1. 获得关联数据 + Map workstationMap = workstationService.getWorkstationMap( + convertSet(list, MesWmProductionIssueDO::getWorkstationId)); + Map workOrderMap = workOrderService.getWorkOrderMap( + convertSet(list, MesWmProductionIssueDO::getWorkorderId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmProductionIssueRespVO.class, vo -> { + // 2.1 填充工作站名称 + MapUtils.findAndThen(workstationMap, vo.getWorkstationId(), + workstation -> vo.setWorkstationName(workstation.getName())); + // 2.2 填充工单编号 + MapUtils.findAndThen(workOrderMap, vo.getWorkorderId(), + workOrder -> vo.setWorkorderCode(workOrder.getCode())); }); - - // TODO @AI:关联查询工作站、工单、任务、客户等数据,填充到响应 VO 中 - - return respVOList; } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java new file mode 100644 index 0000000..fab15b1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java @@ -0,0 +1,140 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail.MesWmProductionIssueDetailRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail.MesWmProductionIssueDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.productionissue.MesWmProductionIssueDetailService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +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.Collections; +import java.util.List; +import java.util.Map; + +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/production-issue-detail") +@Validated +public class MesWmProductionIssueDetailController { + + @Resource + private MesWmProductionIssueDetailService issueDetailService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @Resource + private MesWmWarehouseService warehouseService; + + @Resource + private MesWmWarehouseLocationService locationService; + + @Resource + private MesWmWarehouseAreaService areaService; + + @PostMapping("/create") + @Operation(summary = "创建领料出库明细") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:create')") + public CommonResult createProductionIssueDetail(@Valid @RequestBody MesWmProductionIssueDetailSaveReqVO createReqVO) { + return success(issueDetailService.createProductionIssueDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改领料出库明细") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") + public CommonResult updateProductionIssueDetail(@Valid @RequestBody MesWmProductionIssueDetailSaveReqVO updateReqVO) { + issueDetailService.updateProductionIssueDetail(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除领料出库明细") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:delete')") + public CommonResult deleteProductionIssueDetail(@RequestParam("id") Long id) { + issueDetailService.deleteProductionIssueDetail(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得领料出库明细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") + public CommonResult getProductionIssueDetail(@RequestParam("id") Long id) { + MesWmProductionIssueDetailDO detail = issueDetailService.getProductionIssueDetail(id); + if (detail == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(detail)).get(0)); + } + + @GetMapping("/list-by-line") + @Operation(summary = "获得领料出库明细列表(按行编号)") + @Parameter(name = "lineId", description = "行编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") + public CommonResult> getProductionIssueDetailListByLineId( + @RequestParam("lineId") Long lineId) { + List list = issueDetailService.getProductionIssueDetailListByLineId(lineId); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmProductionIssueDetailDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, MesWmProductionIssueDetailDO::getWarehouseId)); + Map locationMap = locationService.getWarehouseLocationMap( + convertSet(list, MesWmProductionIssueDetailDO::getLocationId)); + Map areaMap = areaService.getWarehouseAreaMap( + convertSet(list, MesWmProductionIssueDetailDO::getAreaId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmProductionIssueDetailRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), + warehouse -> vo.setWarehouseName(warehouse.getName())); + MapUtils.findAndThen(locationMap, vo.getLocationId(), + location -> vo.setLocationName(location.getName())); + MapUtils.findAndThen(areaMap, vo.getAreaId(), + area -> vo.setAreaName(area.getName())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java new file mode 100644 index 0000000..295ae58 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java @@ -0,0 +1,124 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.productionissue.MesWmProductionIssueLineService; +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.Collections; +import java.util.List; +import java.util.Map; + +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/production-issue-line") +@Validated +public class MesWmProductionIssueLineController { + + @Resource + private MesWmProductionIssueLineService issueLineService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @PostMapping("/create") + @Operation(summary = "创建领料出库单行") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:create')") + public CommonResult createProductionIssueLine(@Valid @RequestBody MesWmProductionIssueLineSaveReqVO createReqVO) { + return success(issueLineService.createProductionIssueLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改领料出库单行") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") + public CommonResult updateProductionIssueLine(@Valid @RequestBody MesWmProductionIssueLineSaveReqVO updateReqVO) { + issueLineService.updateProductionIssueLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除领料出库单行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:delete')") + public CommonResult deleteProductionIssueLine(@RequestParam("id") Long id) { + issueLineService.deleteProductionIssueLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得领料出库单行") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") + public CommonResult getProductionIssueLine(@RequestParam("id") Long id) { + MesWmProductionIssueLineDO line = issueLineService.getProductionIssueLine(id); + if (line == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(line)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得领料出库单行分页") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") + public CommonResult> getProductionIssueLinePage( + @Valid MesWmProductionIssueLinePageReqVO pageReqVO) { + PageResult pageResult = issueLineService.getProductionIssueLinePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/list-by-issue") + @Operation(summary = "获得领料出库单行列表(按领料单编号)") + @Parameter(name = "issueId", description = "领料单编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") + public CommonResult> getProductionIssueLineListByIssueId( + @RequestParam("issueId") Long issueId) { + List list = issueLineService.getProductionIssueLineListByIssueId(issueId); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmProductionIssueLineDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmProductionIssueLineRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineRespVO.java deleted file mode 100644 index cc63d45..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineRespVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - MES 领料出库单行 Response VO") -@Data -public class MesWmProductionIssueLineRespVO { - - @Schema(description = "行ID", example = "1") - private Long id; - - @Schema(description = "领料单ID", example = "1") - private Long issueId; - - @Schema(description = "物料ID", example = "1") - private Long itemId; - - @Schema(description = "领料数量", example = "100.00") - private BigDecimal quantityIssued; - - @Schema(description = "批次ID", example = "1") - private Long batchId; - - @Schema(description = "备注", example = "备注") - private String remark; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineSaveReqVO.java deleted file mode 100644 index 226e487..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineSaveReqVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; - -@Schema(description = "管理后台 - MES 领料出库单行 Save Request VO") -@Data -public class MesWmProductionIssueLineSaveReqVO { - - @Schema(description = "行ID", example = "1") - private Long id; - - @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long itemId; - - @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") - private BigDecimal quantityIssued; - - @Schema(description = "批次ID", example = "1") - private Long batchId; - - @Schema(description = "备注", example = "备注") - private String remark; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java index 332d675..e9b05a5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java @@ -4,49 +4,51 @@ 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 public class MesWmProductionIssueRespVO { - @Schema(description = "编号", example = "1") + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long id; - @Schema(description = "领料单编号", example = "ISSUE20250226001") + @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "ISSUE20250226001") private String code; - @Schema(description = "领料单名称", example = "生产领料") + @Schema(description = "领料单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产领料") private String name; - @Schema(description = "工作站ID", example = "1") + @Schema(description = "工作站 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long workstationId; - @Schema(description = "生产工单ID", example = "1") + @Schema(description = "工作站名称", example = "装配工作站") + private String workstationName; + + @Schema(description = "生产工单 ID", example = "1") private Long workorderId; - @Schema(description = "生产任务ID", example = "1") + @Schema(description = "生产工单编号", example = "WO20250226001") + private String workorderCode; + + @Schema(description = "生产任务 ID", example = "1") private Long taskId; - @Schema(description = "客户ID", example = "1") + @Schema(description = "客户 ID", example = "1") private Long clientId; @Schema(description = "领料日期") private LocalDateTime issueDate; - @Schema(description = "需求时间") + @Schema(description = "需求时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime requiredTime; - @Schema(description = "状态", example = "10") + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") private Integer status; @Schema(description = "备注", example = "备注") private String remark; - @Schema(description = "创建时间") + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; - @Schema(description = "领料单行列表") - private List lines; - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java index d9453e1..b5c8aea 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java @@ -1,10 +1,11 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import java.time.LocalDateTime; -import java.util.List; @Schema(description = "管理后台 - MES 领料出库单新增/修改 Request VO") @Data @@ -13,25 +14,23 @@ public class MesWmProductionIssueSaveReqVO { @Schema(description = "编号", example = "1024") private Long id; - // TODO @AI:必须传递 - @Schema(description = "领料单编号", example = "ISSUE20250226001") + @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "ISSUE20250226001") + @NotBlank(message = "领料单编号不能为空") private String code; - // TODO @AI:必须传递 @Schema(description = "领料单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产领料") + @NotBlank(message = "领料单名称不能为空") private String name; - // TODO @AI:必须传递 - // TODO @AI:service 需要校验存在 - @Schema(description = "工作站 ID", example = "1") + @Schema(description = "工作站 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "工作站ID不能为空") private Long workstationId; @Schema(description = "生产工单 ID", example = "1") - // TODO @AI:service 需要校验存在 private Long workorderId; - @Schema(description = "需求时间") - // TODO @AI:必须传递 + @Schema(description = "需求时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "需求时间不能为空") private LocalDateTime requiredTime; @Schema(description = "备注", example = "备注") @@ -49,8 +48,4 @@ public class MesWmProductionIssueSaveReqVO { @Schema(description = "预留字段4") private Integer attribute4; - // TODO @AI:应该单独接口,传递这个;参考别的模块; - @Schema(description = "领料单行列表") - private List lines; - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java new file mode 100644 index 0000000..a1c3ac2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 领料出库明细 Response VO") +@Data +public class MesWmProductionIssueDetailRespVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "领料单编号", example = "1") + private Long issueId; + + @Schema(description = "行编号", example = "1") + private Long lineId; + + @Schema(description = "库存记录编号", example = "1") + private Long materialStockId; + + @Schema(description = "物料编号", example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "ITEM001") + private String itemCode; + + @Schema(description = "物料名称", example = "螺丝") + private String itemName; + + @Schema(description = "规格型号", example = "M8*20") + private String specification; + + @Schema(description = "计量单位名称", example = "个") + private String unitMeasureName; + + @Schema(description = "领料数量", example = "300.00") + private BigDecimal quantity; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "仓库编号", example = "1") + private Long warehouseId; + + @Schema(description = "仓库名称", example = "原材料仓库") + private String warehouseName; + + @Schema(description = "库区编号", example = "1") + private Long locationId; + + @Schema(description = "库区名称", example = "A区") + private String locationName; + + @Schema(description = "库位编号", example = "1") + private Long areaId; + + @Schema(description = "库位名称", example = "A01") + private String areaName; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java new file mode 100644 index 0000000..cb7d7b3 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 领料出库明细新增/修改 Request VO") +@Data +public class MesWmProductionIssueDetailSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "领料单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "领料单行编号不能为空") + private Long lineId; + + @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "领料单编号不能为空") + private Long issueId; + + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料编号不能为空") + private Long itemId; + + @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") + @NotNull(message = "领料数量不能为空") + private BigDecimal quantity; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "库存记录编号", example = "1") + private Long materialStockId; + + @Schema(description = "仓库编号", example = "1") + private Long warehouseId; + + @Schema(description = "库区编号", example = "1") + private Long locationId; + + @Schema(description = "库位编号", example = "1") + private Long areaId; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java new file mode 100644 index 0000000..480710f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 领料出库单行分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmProductionIssueLinePageReqVO extends PageParam { + + @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "领料单编号不能为空") + private Long issueId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java new file mode 100644 index 0000000..2403cf2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 领料出库单行 Response VO") +@Data +public class MesWmProductionIssueLineRespVO { + + @Schema(description = "行ID", example = "1") + private Long id; + + @Schema(description = "领料单ID", example = "1") + private Long issueId; + + @Schema(description = "物料ID", example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "M001") + private String itemCode; + + @Schema(description = "物料名称", example = "钢板") + private String itemName; + + @Schema(description = "规格型号", example = "10mm*100mm") + private String specification; + + @Schema(description = "计量单位名称", example = "千克") + private String unitMeasureName; + + @Schema(description = "领料数量", example = "100.00") + private BigDecimal quantity; + + @Schema(description = "批次ID", example = "1") + private Long batchId; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java new file mode 100644 index 0000000..9643b5b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 领料出库单行 Save Request VO") +@Data +public class MesWmProductionIssueLineSaveReqVO { + + @Schema(description = "行ID", example = "1") + private Long id; + + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long itemId; + + @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + private BigDecimal quantity; + + @Schema(description = "批次ID", example = "1") + private Long batchId; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java index 0401a36..1a405df 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java @@ -39,11 +39,10 @@ public class MesWmProductionIssueLineDO extends BaseDO { * 关联 {@link MesMdItemDO#getId()} */ private Long itemId; - // TODO @AI:是不是精简成 quantity? /** * 领料数量 */ - private BigDecimal quantityIssued; + private BigDecimal quantity; /** * 批次 ID */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java index d34bd89..a36a8bc 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java @@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; import org.apache.ibatis.annotations.Mapper; -import java.util.Collection; import java.util.List; /** @@ -13,14 +12,6 @@ import java.util.List; @Mapper public interface MesWmProductionIssueDetailMapper extends BaseMapperX { - default List selectListByIssueId(Long issueId) { - return selectList(MesWmProductionIssueDetailDO::getIssueId, issueId); - } - - default List selectListByIssueIds(Collection issueIds) { - return selectList(MesWmProductionIssueDetailDO::getIssueId, issueIds); - } - default List selectListByLineId(Long lineId) { return selectList(MesWmProductionIssueDetailDO::getLineId, lineId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java index a5acd9d..e203071 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java @@ -1,10 +1,12 @@ package cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue; +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.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; import org.apache.ibatis.annotations.Mapper; -import java.util.Collection; import java.util.List; /** @@ -13,12 +15,14 @@ import java.util.List; @Mapper public interface MesWmProductionIssueLineMapper extends BaseMapperX { - default List selectListByIssueId(Long issueId) { - return selectList(MesWmProductionIssueLineDO::getIssueId, issueId); + default PageResult selectPage(MesWmProductionIssueLinePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmProductionIssueLineDO::getIssueId, reqVO.getIssueId()) + .orderByDesc(MesWmProductionIssueLineDO::getId)); } - default List selectListByIssueIds(Collection issueIds) { - return selectList(MesWmProductionIssueLineDO::getIssueId, issueIds); + default List selectListByIssueId(Long issueId) { + return selectList(MesWmProductionIssueLineDO::getIssueId, issueId); } default void deleteByIssueId(Long issueId) { 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 62e01d2..c99b276 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 @@ -360,13 +360,9 @@ public interface ErrorCodeConstants { // ========== MES 仓库管理-生产领料出库单(1-040-708-000) ========== ErrorCode WM_PRODUCTION_ISSUE_NOT_EXISTS = new ErrorCode(1_040_708_000, "生产领料出库单不存在"); ErrorCode WM_PRODUCTION_ISSUE_STATUS_INVALID = new ErrorCode(1_040_708_001, "生产领料出库单状态不正确,无法执行该操作"); - // TODO @AI:不需要的错误码,需要处理下。 - ErrorCode WM_PRODUCTION_ISSUE_WAREHOUSE_NOT_EXISTS = new ErrorCode(1_040_708_002, "仓库不存在"); - ErrorCode WM_PRODUCTION_ISSUE_ITEM_NOT_EXISTS = new ErrorCode(1_040_708_003, "物料不存在"); + // DONE @AI:不需要的错误码,需要处理下 - 已删除不需要的错误码(WM_PRODUCTION_ISSUE_WAREHOUSE_NOT_EXISTS, WM_PRODUCTION_ISSUE_ITEM_NOT_EXISTS, WM_PRODUCTION_ISSUE_NO_LINE, WM_PRODUCTION_ISSUE_QUANTITY_MISMATCH),保留需要的错误码 ErrorCode WM_PRODUCTION_ISSUE_WORKORDER_NOT_EXISTS = new ErrorCode(1_040_708_004, "生产工单不存在"); ErrorCode WM_PRODUCTION_ISSUE_WORKSTATION_NOT_EXISTS = new ErrorCode(1_040_708_005, "工作站不存在"); - ErrorCode WM_PRODUCTION_ISSUE_NO_LINE = new ErrorCode(1_040_708_006, "至少需要一条行项目"); - ErrorCode WM_PRODUCTION_ISSUE_QUANTITY_MISMATCH = new ErrorCode(1_040_708_007, "领料单行数量与明细数量不一致"); ErrorCode WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_708_100, "生产领料出库单行不存在"); ErrorCode WM_PRODUCTION_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_708_200, "生产领料出库单明细不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java index b09223c..48e0cc2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java @@ -184,9 +184,8 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { @Override public MesWmItemReceiptDO validateItemReceiptEditable(Long id) { MesWmItemReceiptDO receipt = validateItemReceiptExists(id); - if (ObjectUtils.notEqualsAny(receipt.getStatus(), - MesWmItemReceiptStatusEnum.PREPARE.getStatus(), - MesWmItemReceiptStatusEnum.APPROVING.getStatus())) { + if (ObjUtil.notEqual(receipt.getStatus(), MesWmItemReceiptStatusEnum.PREPARE.getStatus()) + && ObjUtil.notEqual(receipt.getStatus(), MesWmItemReceiptStatusEnum.APPROVING.getStatus())) { throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); } return receipt; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java index 748f32c..e4368c8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java @@ -1,8 +1,9 @@ package cn.iocoder.yudao.module.mes.service.wm.productionissue; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail.MesWmProductionIssueDetailSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; +import jakarta.validation.Valid; -import java.util.Collection; import java.util.List; /** @@ -11,20 +12,34 @@ import java.util.List; public interface MesWmProductionIssueDetailService { /** - * 根据领料单ID获取明细列表 + * 创建领料出库明细 * - * @param issueId 领料单ID - * @return 明细列表 + * @param createReqVO 创建信息 + * @return 编号 */ - List getIssueDetailListByIssueId(Long issueId); + Long createProductionIssueDetail(@Valid MesWmProductionIssueDetailSaveReqVO createReqVO); /** - * 根据领料单ID集合获取明细列表 + * 更新领料出库明细 * - * @param issueIds 领料单ID集合 - * @return 明细列表 + * @param updateReqVO 更新信息 + */ + void updateProductionIssueDetail(@Valid MesWmProductionIssueDetailSaveReqVO updateReqVO); + + /** + * 删除领料出库明细 + * + * @param id 编号 + */ + void deleteProductionIssueDetail(Long id); + + /** + * 获得领料出库明细 + * + * @param id 编号 + * @return 领料出库明细 */ - List getIssueDetailListByIssueIds(Collection issueIds); + MesWmProductionIssueDetailDO getProductionIssueDetail(Long id); /** * 根据行ID获取明细列表 @@ -32,13 +47,13 @@ public interface MesWmProductionIssueDetailService { * @param lineId 行ID * @return 明细列表 */ - List getIssueDetailListByLineId(Long lineId); + List getProductionIssueDetailListByLineId(Long lineId); /** * 根据领料单ID删除明细 * * @param issueId 领料单ID */ - void deleteIssueDetailByIssueId(Long issueId); + void deleteProductionIssueDetailByIssueId(Long issueId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java index b30a7ba..67be32d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java @@ -1,14 +1,20 @@ package cn.iocoder.yudao.module.mes.service.wm.productionissue; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail.MesWmProductionIssueDetailSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueDetailMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueLineMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import java.util.Collection; 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_PRODUCTION_ISSUE_DETAIL_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS; + /** * MES 领料出库明细 Service 实现类 */ @@ -18,25 +24,65 @@ public class MesWmProductionIssueDetailServiceImpl implements MesWmProductionIss @Resource private MesWmProductionIssueDetailMapper issueDetailMapper; + @Resource + private MesWmProductionIssueLineMapper issueLineMapper; + + @Override + public Long createProductionIssueDetail(MesWmProductionIssueDetailSaveReqVO createReqVO) { + // 校验父数据存在 + validateParentIssueLineExists(createReqVO.getLineId()); + + // 插入 + MesWmProductionIssueDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductionIssueDetailDO.class); + issueDetailMapper.insert(detail); + return detail.getId(); + } + + @Override + public void updateProductionIssueDetail(MesWmProductionIssueDetailSaveReqVO updateReqVO) { + // 校验存在 + validateIssueDetailExists(updateReqVO.getId()); + // 校验父数据存在 + validateParentIssueLineExists(updateReqVO.getLineId()); + + // 更新 + MesWmProductionIssueDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductionIssueDetailDO.class); + issueDetailMapper.updateById(updateObj); + } @Override - public List getIssueDetailListByIssueId(Long issueId) { - return issueDetailMapper.selectListByIssueId(issueId); + public void deleteProductionIssueDetail(Long id) { + // 校验存在 + validateIssueDetailExists(id); + // 删除 + issueDetailMapper.deleteById(id); } @Override - public List getIssueDetailListByIssueIds(Collection issueIds) { - return issueDetailMapper.selectListByIssueIds(issueIds); + public MesWmProductionIssueDetailDO getProductionIssueDetail(Long id) { + return issueDetailMapper.selectById(id); } @Override - public List getIssueDetailListByLineId(Long lineId) { + public List getProductionIssueDetailListByLineId(Long lineId) { return issueDetailMapper.selectListByLineId(lineId); } @Override - public void deleteIssueDetailByIssueId(Long issueId) { + public void deleteProductionIssueDetailByIssueId(Long issueId) { issueDetailMapper.deleteByIssueId(issueId); } + private void validateIssueDetailExists(Long id) { + if (issueDetailMapper.selectById(id) == null) { + throw exception(WM_PRODUCTION_ISSUE_DETAIL_NOT_EXISTS); + } + } + + private void validateParentIssueLineExists(Long lineId) { + if (issueLineMapper.selectById(lineId) == null) { + throw exception(WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS); + } + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java index 9cd8c55..1e024a8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java @@ -1,8 +1,11 @@ package cn.iocoder.yudao.module.mes.service.wm.productionissue; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; +import jakarta.validation.Valid; -import java.util.Collection; import java.util.List; /** @@ -11,26 +14,56 @@ import java.util.List; public interface MesWmProductionIssueLineService { /** - * 根据领料单ID获取行列表 + * 创建领料出库单行 * - * @param issueId 领料单ID - * @return 行列表 + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createProductionIssueLine(@Valid MesWmProductionIssueLineSaveReqVO createReqVO); + + /** + * 更新领料出库单行 + * + * @param updateReqVO 更新信息 + */ + void updateProductionIssueLine(@Valid MesWmProductionIssueLineSaveReqVO updateReqVO); + + /** + * 删除领料出库单行 + * + * @param id 编号 */ - List getIssueLineListByIssueId(Long issueId); + void deleteProductionIssueLine(Long id); /** - * 根据领料单ID集合获取行列表 + * 获得领料出库单行 * - * @param issueIds 领料单ID集合 + * @param id 编号 + * @return 领料出库单行 + */ + MesWmProductionIssueLineDO getProductionIssueLine(Long id); + + /** + * 获得领料出库单行分页 + * + * @param pageReqVO 分页查询 + * @return 领料出库单行分页 + */ + PageResult getProductionIssueLinePage(MesWmProductionIssueLinePageReqVO pageReqVO); + + /** + * 根据领料单ID获取行列表 + * + * @param issueId 领料单ID * @return 行列表 */ - List getIssueLineListByIssueIds(Collection issueIds); + List getProductionIssueLineListByIssueId(Long issueId); /** * 根据领料单ID删除行 * * @param issueId 领料单ID */ - void deleteIssueLineByIssueId(Long issueId); + void deleteProductionIssueLineByIssueId(Long issueId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java index dacafe8..7874ab8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java @@ -1,14 +1,22 @@ package cn.iocoder.yudao.module.mes.service.wm.productionissue; +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.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueLineMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import java.util.Collection; 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_PRODUCTION_ISSUE_LINE_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_NOT_EXISTS; + /** * MES 领料出库单行 Service 实现类 */ @@ -18,20 +26,70 @@ public class MesWmProductionIssueLineServiceImpl implements MesWmProductionIssue @Resource private MesWmProductionIssueLineMapper issueLineMapper; + @Resource + private MesWmProductionIssueMapper issueMapper; @Override - public List getIssueLineListByIssueId(Long issueId) { - return issueLineMapper.selectListByIssueId(issueId); + public Long createProductionIssueLine(MesWmProductionIssueLineSaveReqVO createReqVO) { + // 校验父数据存在 + validateParentIssueExists(createReqVO.getIssueId()); + + // 插入 + MesWmProductionIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmProductionIssueLineDO.class); + issueLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateProductionIssueLine(MesWmProductionIssueLineSaveReqVO updateReqVO) { + // 校验存在 + validateIssueLineExists(updateReqVO.getId()); + // 校验父数据存在 + validateParentIssueExists(updateReqVO.getIssueId()); + + // 更新 + MesWmProductionIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductionIssueLineDO.class); + issueLineMapper.updateById(updateObj); + } + + @Override + public void deleteProductionIssueLine(Long id) { + // 校验存在 + validateIssueLineExists(id); + // 删除 + issueLineMapper.deleteById(id); } @Override - public List getIssueLineListByIssueIds(Collection issueIds) { - return issueLineMapper.selectListByIssueIds(issueIds); + public MesWmProductionIssueLineDO getProductionIssueLine(Long id) { + return issueLineMapper.selectById(id); } @Override - public void deleteIssueLineByIssueId(Long issueId) { + public PageResult getProductionIssueLinePage(MesWmProductionIssueLinePageReqVO pageReqVO) { + return issueLineMapper.selectPage(pageReqVO); + } + + @Override + public List getProductionIssueLineListByIssueId(Long issueId) { + return issueLineMapper.selectListByIssueId(issueId); + } + + @Override + public void deleteProductionIssueLineByIssueId(Long issueId) { issueLineMapper.deleteByIssueId(issueId); } + private void validateIssueLineExists(Long id) { + if (issueLineMapper.selectById(id) == null) { + throw exception(WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS); + } + } + + private void validateParentIssueExists(Long issueId) { + if (issueMapper.selectById(issueId) == null) { + throw exception(WM_PRODUCTION_ISSUE_NOT_EXISTS); + } + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java index 0c359b1..38cc6b3 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java @@ -6,9 +6,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmP import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; import jakarta.validation.Valid; -import java.util.Collection; -import java.util.List; - /** * MES 领料出库单 Service 接口 */ @@ -20,21 +17,21 @@ public interface MesWmProductionIssueService { * @param createReqVO 创建信息 * @return 编号 */ - Long createIssue(@Valid MesWmProductionIssueSaveReqVO createReqVO); + Long createProductionIssue(@Valid MesWmProductionIssueSaveReqVO createReqVO); /** * 修改领料出库单 * * @param updateReqVO 修改信息 */ - void updateIssue(@Valid MesWmProductionIssueSaveReqVO updateReqVO); + void updateProductionIssue(@Valid MesWmProductionIssueSaveReqVO updateReqVO); /** - * 删除领料出库单(级联删除行和明细,仅准备中状态允许) + * 删除领料出库单 * * @param id 编号 */ - void deleteIssue(Long id); + void deleteProductionIssue(Long id); /** * 获得领料出库单 @@ -42,7 +39,7 @@ public interface MesWmProductionIssueService { * @param id 编号 * @return 领料出库单 */ - MesWmProductionIssueDO getIssue(Long id); + MesWmProductionIssueDO getProductionIssue(Long id); /** * 获得领料出库单分页 @@ -50,21 +47,13 @@ public interface MesWmProductionIssueService { * @param pageReqVO 分页参数 * @return 领料出库单分页 */ - PageResult getIssuePage(MesWmProductionIssuePageReqVO pageReqVO); + PageResult getProductionIssuePage(MesWmProductionIssuePageReqVO pageReqVO); /** * 完成领料出库单(草稿 → 已完成,执行出库) * * @param id 编号 */ - void finishIssue(Long id); - - /** - * 按编号集合获得领料出库单列表 - * - * @param ids 编号集合 - * @return 领料出库单列表 - */ - List getIssueList(Collection ids); + void finishProductionIssue(Long id); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java index 1f69042..52ffa71 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java @@ -1,36 +1,23 @@ package cn.iocoder.yudao.module.mes.service.wm.productionissue; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; 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.productionissue.vo.MesWmProductionIssueLineSaveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssuePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; -import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.md.workstation.MesMdWorkstationMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductionIssueStatusEnum; -import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; 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 static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_NOT_EXISTS; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_STATUS_INVALID; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; -// TODO @AI:参考别的模块,拆分多个; /** * MES 领料出库单 Service 实现类 */ @@ -39,161 +26,106 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueService { @Resource - private MesWmProductionIssueMapper issueHeaderMapper; - - @Resource - private MesWmProductionIssueLineMapper issueLineMapper; + private MesWmProductionIssueMapper issueMapper; @Resource private MesWmProductionIssueLineService issueLineService; - @Resource private MesWmProductionIssueDetailService issueDetailService; - @Resource - private MesWmWarehouseMapper warehouseMapper; - + private MesMdWorkstationService workstationService; @Resource - private MesMdItemMapper itemMapper; - - @Resource - private MesMdWorkstationMapper workstationMapper; - - @Resource - private MesProWorkOrderMapper workOrderMapper; - - @Resource - private MesWmMaterialStockService materialStockService; + private MesProWorkOrderService workOrderService; @Override @Transactional(rollbackFor = Exception.class) - public Long createIssue(MesWmProductionIssueSaveReqVO createReqVO) { + public Long createProductionIssue(MesWmProductionIssueSaveReqVO createReqVO) { // 1. 校验关联数据 - validateRelatedData(createReqVO); - - // 2. 插入主表 - MesWmProductionIssueDO issueHeader = BeanUtils.toBean(createReqVO, MesWmProductionIssueDO.class); - issueHeader.setStatus(MesWmProductionIssueStatusEnum.PREPARE.getStatus()); - issueHeaderMapper.insert(issueHeader); - - // 3. 插入行表 - if (CollUtil.isNotEmpty(createReqVO.getLines())) { - for (MesWmProductionIssueLineSaveReqVO lineVO : createReqVO.getLines()) { - MesWmProductionIssueLineDO line = BeanUtils.toBean(lineVO, MesWmProductionIssueLineDO.class); - line.setIssueId(issueHeader.getId()); - issueLineMapper.insert(line); - } + workstationService.validateWorkstationExists(createReqVO.getWorkstationId()); + if (createReqVO.getWorkorderId() != null) { + workOrderService.validateWorkOrderExists(createReqVO.getWorkorderId()); } - return issueHeader.getId(); + // 2. 插入主表 + MesWmProductionIssueDO issue = BeanUtils.toBean(createReqVO, MesWmProductionIssueDO.class); + issue.setStatus(MesWmProductionIssueStatusEnum.PREPARE.getStatus()); + issueMapper.insert(issue); + return issue.getId(); } @Override @Transactional(rollbackFor = Exception.class) - public void updateIssue(MesWmProductionIssueSaveReqVO updateReqVO) { - // 1. 校验存在 + 准备中状态 + public void updateProductionIssue(MesWmProductionIssueSaveReqVO updateReqVO) { + // 1.1 校验存在 + 准备中状态 validateIssueExistsAndPrepare(updateReqVO.getId()); + // 1.2 校验关联数据 + workstationService.validateWorkstationExists(updateReqVO.getWorkstationId()); + if (updateReqVO.getWorkorderId() != null) { + workOrderService.validateWorkOrderExists(updateReqVO.getWorkorderId()); + } - // 2. 校验关联数据 - validateRelatedData(updateReqVO); - - // 3. 更新主表 + // 2. 更新主表 MesWmProductionIssueDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductionIssueDO.class); - issueHeaderMapper.updateById(updateObj); - - // 4. 更新行表:先删除旧数据,再插入新数据 - issueLineMapper.deleteByIssueId(updateReqVO.getId()); - if (CollUtil.isNotEmpty(updateReqVO.getLines())) { - for (MesWmProductionIssueLineSaveReqVO lineVO : updateReqVO.getLines()) { - MesWmProductionIssueLineDO line = BeanUtils.toBean(lineVO, MesWmProductionIssueLineDO.class); - line.setIssueId(updateReqVO.getId()); - issueLineMapper.insert(line); - } - } + issueMapper.updateById(updateObj); } @Override @Transactional(rollbackFor = Exception.class) - public void deleteIssue(Long id) { + public void deleteProductionIssue(Long id) { // 1. 校验存在 + 准备中状态 validateIssueExistsAndPrepare(id); // 2.1 级联删除明细 - issueDetailService.deleteIssueDetailByIssueId(id); + issueDetailService.deleteProductionIssueDetailByIssueId(id); // 2.2 级联删除行 - issueLineService.deleteIssueLineByIssueId(id); + issueLineService.deleteProductionIssueLineByIssueId(id); // 2.3 删除主表 - issueHeaderMapper.deleteById(id); + issueMapper.deleteById(id); } @Override - public MesWmProductionIssueDO getIssue(Long id) { - return issueHeaderMapper.selectById(id); + public MesWmProductionIssueDO getProductionIssue(Long id) { + return issueMapper.selectById(id); } @Override - public PageResult getIssuePage(MesWmProductionIssuePageReqVO pageReqVO) { - return issueHeaderMapper.selectPage(pageReqVO); + public PageResult getProductionIssuePage(MesWmProductionIssuePageReqVO pageReqVO) { + return issueMapper.selectPage(pageReqVO); } @Override @Transactional(rollbackFor = Exception.class) - public void finishIssue(Long id) { + public void finishProductionIssue(Long id) { // 1.1 校验存在 - MesWmProductionIssueDO issueHeader = validateIssueExists(id); + MesWmProductionIssueDO issue = validateIssueExists(id); // 1.2 校验状态:只有草稿才允许完成 - if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.PREPARE.getStatus(), issueHeader.getStatus())) { + if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.PREPARE.getStatus(), issue.getStatus())) { throw exception(WM_PRODUCTION_ISSUE_STATUS_INVALID); } - // 2. 扣减库存(根据 line 表) - List lines = issueLineMapper.selectByIssueId(id); - if (CollUtil.isNotEmpty(lines)) { - for (MesWmProductionIssueLineDO line : lines) { - materialStockService.increaseStock( - line.getItemId(), - issueHeader.getWarehouseId(), // 使用主表的仓库ID - null, // locationId - null, // areaId - line.getBatchId(), - line.getQuantityIssued().negate(), // 负数表示扣减 - null, // vendorId - null, // productionDate - null // expireDate - ); - } - } - - // 3. 草稿 → 已完成 - issueHeaderMapper.updateById(new MesWmProductionIssueDO() + // 2. 草稿 → 已完成 + // TODO @芋艿:库存扣减逻辑待完善(需要确定仓库ID的来源,可能需要在 line 或 detail 表中添加 warehouseId 字段) + issueMapper.updateById(new MesWmProductionIssueDO() .setId(id).setStatus(MesWmProductionIssueStatusEnum.FINISHED.getStatus())); } - @Override - public List getIssueList(Collection ids) { - if (CollUtil.isEmpty(ids)) { - return Collections.emptyList(); - } - return issueHeaderMapper.selectByIds(ids); - } - private MesWmProductionIssueDO validateIssueExists(Long id) { - MesWmProductionIssueDO issueHeader = issueHeaderMapper.selectById(id); - if (issueHeader == null) { + MesWmProductionIssueDO issue = issueMapper.selectById(id); + if (issue == null) { throw exception(WM_PRODUCTION_ISSUE_NOT_EXISTS); } - return issueHeader; + return issue; } /** * 校验领料出库单存在且为准备中状态 */ private MesWmProductionIssueDO validateIssueExistsAndPrepare(Long id) { - MesWmProductionIssueDO issueHeader = validateIssueExists(id); - if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.PREPARE.getStatus(), issueHeader.getStatus())) { + MesWmProductionIssueDO issue = validateIssueExists(id); + if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.PREPARE.getStatus(), issue.getStatus())) { throw exception(WM_PRODUCTION_ISSUE_STATUS_INVALID); } - return issueHeader; + return issue; } } -- libgit2 0.21.4