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 new file mode 100644 index 0000000..fa0c04d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java @@ -0,0 +1,161 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.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.wm.productionissue.MesWmProductionIssueDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; +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; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 领料出库单") +@RestController +@RequestMapping("/mes/wm/production-issue") +@Validated +public class MesWmProductionIssueController { + + @Resource + private MesWmProductionIssueService issueService; + @Resource + private MesWmProductionIssueLineService issueLineService; + + @PostMapping("/create") + @Operation(summary = "创建领料出库单") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:create')") + public CommonResult createIssue(@Valid @RequestBody MesWmProductionIssueSaveReqVO createReqVO) { + return success(issueService.createIssue(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改领料出库单") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") + public CommonResult updateIssue(@Valid @RequestBody MesWmProductionIssueSaveReqVO updateReqVO) { + issueService.updateIssue(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @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); + 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 getIssue(@RequestParam("id") Long id) { + MesWmProductionIssueDO issueHeader = issueService.getIssue(id); + if (issueHeader == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(issueHeader)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得领料出库单分页") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") + public CommonResult> getIssuePage( + @Valid MesWmProductionIssuePageReqVO pageReqVO) { + PageResult pageResult = issueService.getIssuePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出领料出库单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportIssueExcel(@Valid MesWmProductionIssuePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = issueService.getIssuePage(pageReqVO); + ExcelUtils.write(response, "领料出库单.xls", "数据", MesWmProductionIssueRespVO.class, + buildRespVOList(pageResult.getList())); + } + + @PutMapping("/approve") + @Operation(summary = "审批领料出库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update-status')") + public CommonResult approveIssue(@RequestParam("id") Long id) { + issueService.approveIssue(id); + return success(true); + } + + @PutMapping("/unapprove") + @Operation(summary = "反审批领料出库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update-status')") + public CommonResult unapproveIssue(@RequestParam("id") Long id) { + issueService.unapproveIssue(id); + return success(true); + } + + @PutMapping("/finish") + @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); + return success(true); + } + + // ==================== 拼接 VO ==================== + + 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)); + } + }); + + // TODO @AI:关联查询工作站、工单、任务、客户等数据,填充到响应 VO 中 + + return respVOList; + } + +} 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 new file mode 100644 index 0000000..cc63d45 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineRespVO.java @@ -0,0 +1,34 @@ +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 new file mode 100644 index 0000000..226e487 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueLineSaveReqVO.java @@ -0,0 +1,27 @@ +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/MesWmProductionIssuePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssuePageReqVO.java new file mode 100644 index 0000000..98c1bc4 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssuePageReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - MES 领料出库单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MesWmProductionIssuePageReqVO extends PageParam { + + @Schema(description = "领料单编号", example = "ISSUE20250226001") + private String code; + + @Schema(description = "领料单名称", example = "生产领料") + private String name; + + @Schema(description = "工作站ID", example = "1") + private Long workstationId; + + @Schema(description = "生产工单ID", example = "1") + private Long workorderId; + + @Schema(description = "生产任务ID", example = "1") + private Long taskId; + + @Schema(description = "客户ID", example = "1") + private Long clientId; + + @Schema(description = "状态", example = "10") + private Integer status; + + @Schema(description = "领料日期范围") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] issueDate; + +} 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 new file mode 100644 index 0000000..332d675 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; + +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") + private Long id; + + @Schema(description = "领料单编号", example = "ISSUE20250226001") + private String code; + + @Schema(description = "领料单名称", example = "生产领料") + private String name; + + @Schema(description = "工作站ID", example = "1") + private Long workstationId; + + @Schema(description = "生产工单ID", example = "1") + private Long workorderId; + + @Schema(description = "生产任务ID", example = "1") + private Long taskId; + + @Schema(description = "客户ID", example = "1") + private Long clientId; + + @Schema(description = "领料日期") + private LocalDateTime issueDate; + + @Schema(description = "需求时间") + private LocalDateTime requiredTime; + + @Schema(description = "状态", example = "10") + private Integer status; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间") + 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 new file mode 100644 index 0000000..8a95441 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java @@ -0,0 +1,58 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - MES 领料出库单新增/修改 Request VO") +@Data +public class MesWmProductionIssueSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "领料单编号", example = "ISSUE20250226001") + private String code; + + @Schema(description = "领料单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产领料") + private String name; + + @Schema(description = "工作站ID", example = "1") + private Long workstationId; + + @Schema(description = "生产工单ID", example = "1") + private Long workorderId; + + @Schema(description = "生产任务ID", example = "1") + private Long taskId; + + @Schema(description = "客户ID", example = "1") + private Long clientId; + + @Schema(description = "领料日期") + private LocalDateTime issueDate; + + @Schema(description = "需求时间") + private LocalDateTime requiredTime; + + @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; + + @Schema(description = "领料单行列表") + private List lines; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDO.java new file mode 100644 index 0000000..2abfa8a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDO.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductionIssueStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +// TODO @AI:【需要一起讨论】不要直接改;是不是叫 issueheader 包?主要后续别的表也有 issue,希望区分下;还是加个合理的前缀?就像 wm_outsource_issue 这种; +/** + * MES 领料出库单 DO + */ +@TableName("mes_wm_issue_header") +@KeySequence("mes_wm_issue_header_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmProductionIssueDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 领料单编号 + */ + private String code; + /** + * 领料单名称 + */ + private String name; + /** + * 工作站 ID + * + * 关联 {@link MesMdWorkstationDO#getId()} + */ + private Long workstationId; + // TODO @AI:workOrderId; + /** + * 生产工单 ID + * + * 关联 {@link MesProWorkOrderDO#getId()} + */ + private Long workorderId; + // TODO @芋艿:【疑问】这个字段的来源? + /** + * 生产任务 ID + * + * 关联 {@link MesProTaskDO#getId()} + */ + private Long taskId; + // TODO @AI:应该不用记录?因为 workorderId 字段的; + /** + * 客户 ID + * + * 关联 {@link MesMdClientDO#getId()} + */ + private Long clientId; + // TODO @芋艿:【疑问】这个字段的更新时间; + /** + * 领料日期 + */ + private LocalDateTime issueDate; + /** + * 需求时间 + */ + private LocalDateTime requiredTime; + /** + * 状态 + * + * 枚举 {@link MesWmProductionIssueStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 预留字段 1 + */ + private String attribute1; + /** + * 预留字段 2 + */ + private String attribute2; + /** + * 预留字段 3 + */ + private Integer attribute3; + /** + * 预留字段 4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDetailDO.java new file mode 100644 index 0000000..b03c7b4 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDetailDO.java @@ -0,0 +1,105 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; +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 com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 领料出库明细 DO + */ +@TableName("mes_wm_issue_detail") +@KeySequence("mes_wm_issue_detail_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmProductionIssueDetailDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 领料单ID + * + * 关联 {@link MesWmProductionIssueDO#getId()} + */ + private Long issueId; + /** + * 行ID + * + * 关联 {@link MesWmProductionIssueLineDO#getId()} + */ + private Long lineId; + /** + * 库存记录ID + * + * 关联 {@link MesWmMaterialStockDO#getId()} + */ + private Long materialStockId; + /** + * 物料ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 领料数量 + */ + private BigDecimal quantity; + /** + * 批次ID + */ + private Long batchId; + /** + * 仓库ID + * + * 关联 {@link MesWmWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 库区ID + * + * 关联 {@link MesWmWarehouseLocationDO#getId()} + */ + private Long locationId; + /** + * 库位ID + * + * 关联 {@link MesWmWarehouseAreaDO#getId()} + */ + private Long areaId; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} 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 new file mode 100644 index 0000000..0401a36 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 领料出库单行 DO + */ +@TableName("mes_wm_issue_line") +@KeySequence("mes_wm_issue_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmProductionIssueLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 领料单 ID + * + * 关联 {@link MesWmProductionIssueDO#getId()} + */ + private Long issueId; + /** + * 物料 ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + // TODO @AI:是不是精简成 quantity? + /** + * 领料数量 + */ + private BigDecimal quantityIssued; + /** + * 批次 ID + */ + private Long batchId; + /** + * 备注 + */ + private String remark; + /** + * 预留字段 1 + */ + private String attribute1; + /** + * 预留字段 2 + */ + private String attribute2; + /** + * 预留字段 3 + */ + private Integer attribute3; + /** + * 预留字段 4 + */ + private Integer attribute4; + +} 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 new file mode 100644 index 0000000..d34bd89 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue; + +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; + +/** + * MES 领料出库明细 Mapper + */ +@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); + } + + default void deleteByIssueId(Long issueId) { + delete(MesWmProductionIssueDetailDO::getIssueId, issueId); + } + +} 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 new file mode 100644 index 0000000..a5acd9d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +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; + +/** + * MES 领料出库单行 Mapper + */ +@Mapper +public interface MesWmProductionIssueLineMapper extends BaseMapperX { + + default List selectListByIssueId(Long issueId) { + return selectList(MesWmProductionIssueLineDO::getIssueId, issueId); + } + + default List selectListByIssueIds(Collection issueIds) { + return selectList(MesWmProductionIssueLineDO::getIssueId, issueIds); + } + + default void deleteByIssueId(Long issueId) { + delete(MesWmProductionIssueLineDO::getIssueId, issueId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueMapper.java new file mode 100644 index 0000000..7699b98 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueMapper.java @@ -0,0 +1,29 @@ +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.MesWmProductionIssuePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 领料出库单 Mapper + */ +@Mapper +public interface MesWmProductionIssueMapper extends BaseMapperX { + + default PageResult selectPage(MesWmProductionIssuePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmProductionIssueDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmProductionIssueDO::getName, reqVO.getName()) + .eqIfPresent(MesWmProductionIssueDO::getWorkstationId, reqVO.getWorkstationId()) + .eqIfPresent(MesWmProductionIssueDO::getWorkorderId, reqVO.getWorkorderId()) + .eqIfPresent(MesWmProductionIssueDO::getTaskId, reqVO.getTaskId()) + .eqIfPresent(MesWmProductionIssueDO::getClientId, reqVO.getClientId()) + .eqIfPresent(MesWmProductionIssueDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesWmProductionIssueDO::getIssueDate, reqVO.getIssueDate()) + .orderByDesc(MesWmProductionIssueDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductionIssueStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductionIssueStatusEnum.java new file mode 100644 index 0000000..4717048 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductionIssueStatusEnum.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +// TODO @AI:需要使用 status constants 去映射; +/** + * MES 领料出库单状态枚举 + */ +@Getter +@AllArgsConstructor +public enum MesWmProductionIssueStatusEnum implements ArrayValuable { + + PREPARE(10, "准备中"), + APPROVED(20, "已审批"), + FINISHED(30, "已完成"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmProductionIssueStatusEnum::getStatus).toArray(Integer[]::new); + + /** + * 状态 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java new file mode 100644 index 0000000..748f32c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.mes.service.wm.productionissue; + +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; + +import java.util.Collection; +import java.util.List; + +/** + * MES 领料出库明细 Service 接口 + */ +public interface MesWmProductionIssueDetailService { + + /** + * 根据领料单ID获取明细列表 + * + * @param issueId 领料单ID + * @return 明细列表 + */ + List getIssueDetailListByIssueId(Long issueId); + + /** + * 根据领料单ID集合获取明细列表 + * + * @param issueIds 领料单ID集合 + * @return 明细列表 + */ + List getIssueDetailListByIssueIds(Collection issueIds); + + /** + * 根据行ID获取明细列表 + * + * @param lineId 行ID + * @return 明细列表 + */ + List getIssueDetailListByLineId(Long lineId); + + /** + * 根据领料单ID删除明细 + * + * @param issueId 领料单ID + */ + void deleteIssueDetailByIssueId(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 new file mode 100644 index 0000000..b30a7ba --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.service.wm.productionissue; + +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueDetailMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.List; + +/** + * MES 领料出库明细 Service 实现类 + */ +@Service +@Validated +public class MesWmProductionIssueDetailServiceImpl implements MesWmProductionIssueDetailService { + + @Resource + private MesWmProductionIssueDetailMapper issueDetailMapper; + + @Override + public List getIssueDetailListByIssueId(Long issueId) { + return issueDetailMapper.selectListByIssueId(issueId); + } + + @Override + public List getIssueDetailListByIssueIds(Collection issueIds) { + return issueDetailMapper.selectListByIssueIds(issueIds); + } + + @Override + public List getIssueDetailListByLineId(Long lineId) { + return issueDetailMapper.selectListByLineId(lineId); + } + + @Override + public void deleteIssueDetailByIssueId(Long issueId) { + issueDetailMapper.deleteByIssueId(issueId); + } + +} 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 new file mode 100644 index 0000000..9cd8c55 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.service.wm.productionissue; + +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; + +import java.util.Collection; +import java.util.List; + +/** + * MES 领料出库单行 Service 接口 + */ +public interface MesWmProductionIssueLineService { + + /** + * 根据领料单ID获取行列表 + * + * @param issueId 领料单ID + * @return 行列表 + */ + List getIssueLineListByIssueId(Long issueId); + + /** + * 根据领料单ID集合获取行列表 + * + * @param issueIds 领料单ID集合 + * @return 行列表 + */ + List getIssueLineListByIssueIds(Collection issueIds); + + /** + * 根据领料单ID删除行 + * + * @param issueId 领料单ID + */ + void deleteIssueLineByIssueId(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 new file mode 100644 index 0000000..dacafe8 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.service.wm.productionissue; + +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; +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; + +/** + * MES 领料出库单行 Service 实现类 + */ +@Service +@Validated +public class MesWmProductionIssueLineServiceImpl implements MesWmProductionIssueLineService { + + @Resource + private MesWmProductionIssueLineMapper issueLineMapper; + + @Override + public List getIssueLineListByIssueId(Long issueId) { + return issueLineMapper.selectListByIssueId(issueId); + } + + @Override + public List getIssueLineListByIssueIds(Collection issueIds) { + return issueLineMapper.selectListByIssueIds(issueIds); + } + + @Override + public void deleteIssueLineByIssueId(Long issueId) { + issueLineMapper.deleteByIssueId(issueId); + } + +} 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 new file mode 100644 index 0000000..e135073 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java @@ -0,0 +1,84 @@ +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.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 jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; + +/** + * MES 领料出库单 Service 接口 + */ +public interface MesWmProductionIssueService { + + /** + * 创建领料出库单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createIssue(@Valid MesWmProductionIssueSaveReqVO createReqVO); + + /** + * 修改领料出库单 + * + * @param updateReqVO 修改信息 + */ + void updateIssue(@Valid MesWmProductionIssueSaveReqVO updateReqVO); + + /** + * 删除领料出库单(级联删除行和明细,仅准备中状态允许) + * + * @param id 编号 + */ + void deleteIssue(Long id); + + /** + * 获得领料出库单 + * + * @param id 编号 + * @return 领料出库单 + */ + MesWmProductionIssueDO getIssue(Long id); + + /** + * 获得领料出库单分页 + * + * @param pageReqVO 分页参数 + * @return 领料出库单分页 + */ + PageResult getIssuePage(MesWmProductionIssuePageReqVO pageReqVO); + + /** + * 审批领料出库单(准备中 → 已审批,扣减库存) + * + * @param id 编号 + */ + void approveIssue(Long id); + + /** + * 反审批领料出库单(已审批 → 准备中,恢复库存) + * + * @param id 编号 + */ + void unapproveIssue(Long id); + + /** + * 完成领料出库单(已审批 → 已完成) + * + * @param id 编号 + */ + void finishIssue(Long id); + + /** + * 按编号集合获得领料出库单列表 + * + * @param ids 编号集合 + * @return 领料出库单列表 + */ + List getIssueList(Collection ids); + +} 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 new file mode 100644 index 0000000..cfb6c82 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java @@ -0,0 +1,191 @@ +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.MesWmProductionIssuePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueLineSaveReqVO; +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.wm.productionissue.MesWmProductionIssueMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueLineMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductionIssueStatusEnum; +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; + +/** + * MES 领料出库单 Service 实现类 + */ +@Service +@Validated +public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueService { + + @Resource + private MesWmProductionIssueMapper issueHeaderMapper; + + @Resource + private MesWmProductionIssueLineMapper issueLineMapper; + + @Resource + private MesWmProductionIssueLineService issueLineService; + + @Resource + private MesWmProductionIssueDetailService issueDetailService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createIssue(MesWmProductionIssueSaveReqVO createReqVO) { + // TODO @AI:领料出库关联数据校验待完善(仓库、物料、工单、工位等基础数据校验) + + // 1. 插入主表 + MesWmProductionIssueDO issueHeader = BeanUtils.toBean(createReqVO, MesWmProductionIssueDO.class); + issueHeader.setStatus(MesWmProductionIssueStatusEnum.PREPARE.getStatus()); + issueHeaderMapper.insert(issueHeader); + + // 2. 插入行表 + if (CollUtil.isNotEmpty(createReqVO.getLines())) { + for (MesWmProductionIssueLineSaveReqVO lineVO : createReqVO.getLines()) { + MesWmProductionIssueLineDO line = BeanUtils.toBean(lineVO, MesWmProductionIssueLineDO.class); + line.setIssueId(issueHeader.getId()); + issueLineMapper.insert(line); + } + } + + return issueHeader.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateIssue(MesWmProductionIssueSaveReqVO updateReqVO) { + // 1. 校验存在 + 准备中状态 + validateIssueExistsAndPrepare(updateReqVO.getId()); + // TODO @AI:领料出库关联数据校验待完善(仓库、物料、工单、工位等基础数据校验) + + // 2. 更新主表 + MesWmProductionIssueDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductionIssueDO.class); + issueHeaderMapper.updateById(updateObj); + + // 3. 更新行表:先删除旧数据,再插入新数据 + 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); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteIssue(Long id) { + // 1. 校验存在 + 准备中状态 + validateIssueExistsAndPrepare(id); + + // 2.1 级联删除明细 + issueDetailService.deleteIssueDetailByIssueId(id); + // 2.2 级联删除行 + issueLineService.deleteIssueLineByIssueId(id); + // 2.3 删除主表 + issueHeaderMapper.deleteById(id); + } + + @Override + public MesWmProductionIssueDO getIssue(Long id) { + return issueHeaderMapper.selectById(id); + } + + @Override + public PageResult getIssuePage(MesWmProductionIssuePageReqVO pageReqVO) { + return issueHeaderMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void approveIssue(Long id) { + // 1.1 校验存在 + MesWmProductionIssueDO issueHeader = validateIssueExists(id); + // 1.2 校验状态:只有准备中才允许审批 + if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.PREPARE.getStatus(), issueHeader.getStatus())) { +// throw exception(WM_ISSUE_STATUS_INVALID); + throw new IllegalArgumentException(); // TODO @芋艿:晚点优化下; + } + + // 2. 准备中 → 已审批 + issueHeaderMapper.updateById(new MesWmProductionIssueDO() + .setId(id).setStatus(MesWmProductionIssueStatusEnum.APPROVED.getStatus())); + + // TODO @AI:扣减库存逻辑待完善(需要调用库存服务,根据 detail 表扣减库存) + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void unapproveIssue(Long id) { + // 1.1 校验存在 + MesWmProductionIssueDO issueHeader = validateIssueExists(id); + // 1.2 校验状态:只有已审批才允许反审批 + if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.APPROVED.getStatus(), issueHeader.getStatus())) { +// throw exception(WM_ISSUE_STATUS_INVALID); + throw new IllegalArgumentException(); // TODO @芋艿:晚点优化下; + } + + // 2. 已审批 → 准备中 + issueHeaderMapper.updateById(new MesWmProductionIssueDO() + .setId(id).setStatus(MesWmProductionIssueStatusEnum.PREPARE.getStatus())); + + // TODO @AI:恢复库存逻辑待完善(需要调用库存服务,根据 detail 表恢复库存) + } + + @Override + public void finishIssue(Long id) { + // 1.1 校验存在 + MesWmProductionIssueDO issueHeader = validateIssueExists(id); + // 1.2 校验状态:只有已审批才允许完成 + if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.APPROVED.getStatus(), issueHeader.getStatus())) { +// throw exception(WM_ISSUE_STATUS_INVALID); + throw new IllegalArgumentException(); // TODO @芋艿:晚点优化下; + } + + // 2. 已审批 → 已完成 + issueHeaderMapper.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) { +// throw exception(WM_ISSUE_NOT_EXISTS); + throw new IllegalArgumentException(); // TODO @芋艿:晚点优化下; + } + return issueHeader; + } + + /** + * 校验领料出库单存在且为准备中状态 + */ + private MesWmProductionIssueDO validateIssueExistsAndPrepare(Long id) { + MesWmProductionIssueDO issueHeader = validateIssueExists(id); + if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.PREPARE.getStatus(), issueHeader.getStatus())) { +// throw exception(WM_ISSUE_STATUS_INVALID); + throw new IllegalArgumentException(); // TODO @芋艿:晚点优化下; + } + return issueHeader; + } + +}