From 911ddc37558336f6b4577532c52ce009c2bff276 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 3 Mar 2026 14:05:05 +0800 Subject: [PATCH] ✨ feat(mes): 添加杂项入库单及行相关请求和响应 VO --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptController.java | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLinePageReqVO.java | 20 ++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineRespVO.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptLineDO.java | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptLineMapper.java | 29 +++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptMapper.java | 32 ++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourcereceipt/MesWmOutsourceReceiptLineMapper.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptStatusEnum.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineService.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptService.java | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 19 files changed, 1205 insertions(+), 0 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLinePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptLineDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptLineMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourcereceipt/MesWmOutsourceReceiptLineMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptStatusEnum.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptController.java new file mode 100644 index 0000000..55f7361 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptController.java @@ -0,0 +1,123 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +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.miscreceipt.vo.MesWmMiscReceiptPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptDO; +import cn.iocoder.yudao.module.mes.service.wm.miscreceipt.MesWmMiscReceiptService; +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.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +/** + * MES 杂项入库单 Controller + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - MES 杂项入库单") +@RestController +@RequestMapping("/mes/wm/misc-receipt") +@Validated +public class MesWmMiscReceiptController { + + @Resource + private MesWmMiscReceiptService miscReceiptService; + + @PostMapping("/create") + @Operation(summary = "创建杂项入库单") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:create')") + public CommonResult createMiscReceipt(@Valid @RequestBody MesWmMiscReceiptSaveReqVO createReqVO) { + return success(miscReceiptService.createMiscReceipt(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改杂项入库单") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:update')") + public CommonResult updateMiscReceipt(@Valid @RequestBody MesWmMiscReceiptSaveReqVO updateReqVO) { + miscReceiptService.updateMiscReceipt(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除杂项入库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:delete')") + public CommonResult deleteMiscReceipt(@RequestParam("id") Long id) { + miscReceiptService.deleteMiscReceipt(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得杂项入库单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')") + public CommonResult getMiscReceipt(@RequestParam("id") Long id) { + MesWmMiscReceiptDO receipt = miscReceiptService.getMiscReceipt(id); + return success(BeanUtils.toBean(receipt, MesWmMiscReceiptRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得杂项入库单分页") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')") + public CommonResult> getMiscReceiptPage(@Valid MesWmMiscReceiptPageReqVO pageReqVO) { + PageResult pageResult = miscReceiptService.getMiscReceiptPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesWmMiscReceiptRespVO.class)); + } + + @PutMapping("/submit") + @Operation(summary = "提交审批") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:submit')") + public CommonResult submitMiscReceipt(@RequestParam("id") Long id) { + miscReceiptService.submitMiscReceipt(id); + return success(true); + } + + @PutMapping("/finish") + @Operation(summary = "执行入库") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:finish')") + public CommonResult finishMiscReceipt(@RequestParam("id") Long id) { + miscReceiptService.finishMiscReceipt(id); + return success(true); + } + + @PutMapping("/cancel") + @Operation(summary = "取消杂项入库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:cancel')") + public CommonResult cancelMiscReceipt(@RequestParam("id") Long id) { + miscReceiptService.cancelMiscReceipt(id); + return success(true); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出杂项入库单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportMiscReceiptExcel(@Valid MesWmMiscReceiptPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(Integer.MAX_VALUE); + List list = miscReceiptService.getMiscReceiptPage(pageReqVO).getList(); + ExcelUtils.write(response, "杂项入库单.xls", "数据", MesWmMiscReceiptRespVO.class, + BeanUtils.toBean(list, MesWmMiscReceiptRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java new file mode 100644 index 0000000..0116322 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.line.MesWmMiscReceiptLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.line.MesWmMiscReceiptLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptLineDO; +import cn.iocoder.yudao.module.mes.service.wm.miscreceipt.MesWmMiscReceiptLineService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +/** + * MES 杂项入库单行 Controller + */ +@Tag(name = "管理后台 - MES 杂项入库单行") +@RestController +@RequestMapping("/mes/wm/misc-receipt-line") +@Validated +public class MesWmMiscReceiptLineController { + + @Resource + private MesWmMiscReceiptLineService miscReceiptLineService; + + @PostMapping("/create") + @Operation(summary = "创建杂项入库单行") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:create')") + public CommonResult createMiscReceiptLine(@Valid @RequestBody MesWmMiscReceiptLineSaveReqVO createReqVO) { + return success(miscReceiptLineService.createMiscReceiptLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改杂项入库单行") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:update')") + public CommonResult updateMiscReceiptLine(@Valid @RequestBody MesWmMiscReceiptLineSaveReqVO updateReqVO) { + miscReceiptLineService.updateMiscReceiptLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除杂项入库单行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:delete')") + public CommonResult deleteMiscReceiptLine(@RequestParam("id") Long id) { + miscReceiptLineService.deleteMiscReceiptLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得杂项入库单行") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')") + public CommonResult getMiscReceiptLine(@RequestParam("id") Long id) { + MesWmMiscReceiptLineDO line = miscReceiptLineService.getMiscReceiptLine(id); + return success(BeanUtils.toBean(line, MesWmMiscReceiptLineRespVO.class)); + } + + @GetMapping("/list-by-receipt-id") + @Operation(summary = "获得杂项入库单行列表") + @Parameter(name = "receiptId", description = "入库单编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')") + public CommonResult> getMiscReceiptLineListByReceiptId(@RequestParam("receiptId") Long receiptId) { + List list = miscReceiptLineService.getMiscReceiptLineListByReceiptId(receiptId); + return success(BeanUtils.toBean(list, MesWmMiscReceiptLineRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java new file mode 100644 index 0000000..38af9b1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +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) +@ToString(callSuper = true) +public class MesWmMiscReceiptPageReqVO extends PageParam { + + @Schema(description = "入库单编码", example = "MR2026030001") + private String code; + + @Schema(description = "入库单名称", example = "退料入库单") + private String name; + + @Schema(description = "杂项类型", example = "RETURN") + private String type; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "入库日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] receiptDate; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java new file mode 100644 index 0000000..8a8960b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 杂项入库单 Response VO") +@Data +public class MesWmMiscReceiptRespVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "入库单编码", example = "MR2026030001") + private String code; + + @Schema(description = "入库单名称", example = "退料入库单") + private String name; + + @Schema(description = "杂项类型", example = "RETURN") + private String type; + + @Schema(description = "来源单据 ID", example = "1") + private Long sourceDocId; + + @Schema(description = "来源单据编码", example = "WO2026030001") + private String sourceDocCode; + + @Schema(description = "来源单据类型", example = "WORK_ORDER") + private String sourceDocType; + + @Schema(description = "入库日期") + private LocalDateTime receiptDate; + + @Schema(description = "状态", example = "0") + private Integer status; + + @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/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java new file mode 100644 index 0000000..94d184c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.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; + +// TODO @AI:字段的必传,需要对齐下前端; +@Schema(description = "管理后台 - MES 杂项入库单新增/修改 Request VO") +@Data +public class MesWmMiscReceiptSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "入库单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "MR2026030001") + @NotEmpty(message = "入库单编码不能为空") + private String code; + + @Schema(description = "入库单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "退料入库单") + @NotEmpty(message = "入库单名称不能为空") + private String name; + + @Schema(description = "杂项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "RETURN") + @NotEmpty(message = "杂项类型不能为空") + private String type; + + @Schema(description = "来源单据 ID", example = "1") + private Long sourceDocId; + + @Schema(description = "来源单据编码", example = "WO2026030001") + private String sourceDocCode; + + @Schema(description = "来源单据类型", example = "WORK_ORDER") + private String sourceDocType; + + @Schema(description = "入库日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "入库日期不能为空") + private LocalDateTime receiptDate; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLinePageReqVO.java new file mode 100644 index 0000000..9086567 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLinePageReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.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 MesWmMiscReceiptLinePageReqVO extends PageParam { + + @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "入库单编号不能为空") + private Long receiptId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineRespVO.java new file mode 100644 index 0000000..c95493b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineRespVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.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 MesWmMiscReceiptLineRespVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "入库单编号", example = "1") + private Long receiptId; + + @Schema(description = "物料编号", example = "1") + private Long itemId; + + @Schema(description = "入库数量", example = "100.00") + private BigDecimal quantity; + + @Schema(description = "批次号", example = "BATCH20260301") + private String batchCode; + + @Schema(description = "仓库编号", example = "1") + private Long warehouseId; + + @Schema(description = "库区编号", example = "1") + private Long locationId; + + @Schema(description = "库位编号", example = "1") + private Long areaId; + + @Schema(description = "生产日期") + private LocalDateTime productionDate; + + @Schema(description = "有效期") + private LocalDateTime expireDate; + + @Schema(description = "生产批号", example = "PROD20260301") + private String productionBatchNumber; + + @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/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java new file mode 100644 index 0000000..2348be4 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 杂项入库单行新增/修改 Request VO") +@Data +public class MesWmMiscReceiptLineSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "入库单编号不能为空") + private Long receiptId; + + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料不能为空") + private Long itemId; + + @Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "入库数量不能为空") + private BigDecimal quantity; + + @Schema(description = "批次号", example = "BATCH20260301") + private String batchCode; + + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "仓库不能为空") + private Long warehouseId; + + @Schema(description = "库区编号", example = "1") + private Long locationId; + + @Schema(description = "库位编号", example = "1") + private Long areaId; + + @Schema(description = "生产日期") + private LocalDateTime productionDate; + + @Schema(description = "有效期") + private LocalDateTime expireDate; + + @Schema(description = "生产批号", example = "PROD20260301") + private String productionBatchNumber; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java new file mode 100644 index 0000000..44ade8d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscReceiptStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscReceiptTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * MES 杂项入库单 DO + * + * @author 芋道源码 + */ +@TableName("mes_wm_misc_receipt") +@KeySequence("mes_wm_misc_receipt_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmMiscReceiptDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 入库单编码 + */ + private String code; + /** + * 入库单名称 + */ + private String name; + /** + * 杂项类型 + * + * 枚举 {@link MesWmMiscReceiptTypeEnum} + */ + private String type; + // TODO @芋艿:后续看看怎么跟进; + /** + * 来源单据 ID + */ + private Long sourceDocId; + /** + * 来源单据编码 + */ + private String sourceDocCode; + /** + * 来源单据类型 + */ + private String sourceDocType; + /** + * 入库日期 + */ + private LocalDateTime receiptDate; + /** + * 状态 + * + * 枚举 {@link MesWmMiscReceiptStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptLineDO.java new file mode 100644 index 0000000..51bef07 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptLineDO.java @@ -0,0 +1,91 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt; + +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.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; +import java.time.LocalDateTime; + +/** + * MES 杂项入库单行 DO + * + * @author 芋道源码 + */ +@TableName("mes_wm_misc_receipt_line") +@KeySequence("mes_wm_misc_receipt_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmMiscReceiptLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 入库单编号 + * + * 关联 {@link MesWmMiscReceiptDO#getId()} + */ + private Long receiptId; + /** + * 物料编号 + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 入库数量 + */ + private BigDecimal quantity; + /** + * 批次号 + */ + private String batchCode; + /** + * 仓库编号 + * + * 关联 {@link MesWmWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 库区编号 + * + * 关联 {@link MesWmWarehouseLocationDO#getId()} + */ + private Long locationId; + /** + * 库位编号 + * + * 关联 {@link MesWmWarehouseAreaDO#getId()} + */ + private Long areaId; + /** + * 生产日期(暂不使用) + */ + private LocalDateTime productionDate; + /** + * 有效期(暂不使用) + */ + private LocalDateTime expireDate; + /** + * 生产批号(暂不使用) + */ + private String productionBatchNumber; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptLineMapper.java new file mode 100644 index 0000000..9432645 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptLineMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.miscreceipt; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 杂项入库单行 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesWmMiscReceiptLineMapper extends BaseMapperX { + + default List selectListByReceiptId(Long receiptId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmMiscReceiptLineDO::getReceiptId, receiptId) + .orderByAsc(MesWmMiscReceiptLineDO::getId)); + } + + default int deleteByReceiptId(Long receiptId) { + return delete(new LambdaQueryWrapperX() + .eq(MesWmMiscReceiptLineDO::getReceiptId, receiptId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptMapper.java new file mode 100644 index 0000000..693175b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscreceipt/MesWmMiscReceiptMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.miscreceipt; + +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.miscreceipt.vo.MesWmMiscReceiptPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 杂项入库单 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesWmMiscReceiptMapper extends BaseMapperX { + + default PageResult selectPage(MesWmMiscReceiptPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmMiscReceiptDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmMiscReceiptDO::getName, reqVO.getName()) + .eqIfPresent(MesWmMiscReceiptDO::getType, reqVO.getType()) + .eqIfPresent(MesWmMiscReceiptDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesWmMiscReceiptDO::getReceiptDate, reqVO.getReceiptDate()) + .orderByDesc(MesWmMiscReceiptDO::getId)); + } + + default MesWmMiscReceiptDO selectByCode(String code) { + return selectOne(MesWmMiscReceiptDO::getCode, code); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourcereceipt/MesWmOutsourceReceiptLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourcereceipt/MesWmOutsourceReceiptLineMapper.java new file mode 100644 index 0000000..f717cd3 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/outsourcereceipt/MesWmOutsourceReceiptLineMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 外协入库单行 Mapper + */ +@Mapper +public interface MesWmOutsourceReceiptLineMapper extends BaseMapperX { + + default List selectListByReceiptId(Long receiptId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmOutsourceReceiptLineDO::getReceiptId, receiptId) + .orderByAsc(MesWmOutsourceReceiptLineDO::getId)); + } + + default int deleteByReceiptId(Long receiptId) { + return delete(new LambdaQueryWrapperX() + .eq(MesWmOutsourceReceiptLineDO::getReceiptId, receiptId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptStatusEnum.java new file mode 100644 index 0000000..eb21ce0 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptStatusEnum.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * MES 杂项入库单状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MesWmMiscReceiptStatusEnum implements ArrayValuable { + + /** + * 草稿 + */ + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), + /** + * 已审批 + */ + APPROVED(MesOrderStatusConstants.APPROVED, "已审批"), + /** + * 已完成 + */ + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), + /** + * 已取消 + */ + CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmMiscReceiptStatusEnum::getStatus).toArray(Integer[]::new); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java new file mode 100644 index 0000000..17f55c2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java @@ -0,0 +1,39 @@ +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; + +/** + * MES 杂项入库类型枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MesWmMiscReceiptTypeEnum implements ArrayValuable { + + RETURN("RETURN", "退料入库"), + ADJUST("ADJUST", "调整入库"), + TRANSFER("TRANSFER", "调拨入库"), + OTHER("OTHER", "其他入库"); + + public static final String[] ARRAYS = Arrays.stream(values()).map(MesWmMiscReceiptTypeEnum::getType).toArray(String[]::new); + + /** + * 类型值 + */ + private final String type; + /** + * 类型名 + */ + private final String name; + + @Override + public String[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineService.java new file mode 100644 index 0000000..b9b0452 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineService.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.service.wm.miscreceipt; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.line.MesWmMiscReceiptLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptLineDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 杂项入库单行 Service 接口 + */ +public interface MesWmMiscReceiptLineService { + + /** + * 创建杂项入库单行 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMiscReceiptLine(@Valid MesWmMiscReceiptLineSaveReqVO createReqVO); + + /** + * 修改杂项入库单行 + * + * @param updateReqVO 修改信息 + */ + void updateMiscReceiptLine(@Valid MesWmMiscReceiptLineSaveReqVO updateReqVO); + + /** + * 删除杂项入库单行 + * + * @param id 编号 + */ + void deleteMiscReceiptLine(Long id); + + /** + * 获得杂项入库单行 + * + * @param id 编号 + * @return 杂项入库单行 + */ + MesWmMiscReceiptLineDO getMiscReceiptLine(Long id); + + /** + * 获得杂项入库单行列表 + * + * @param receiptId 入库单编号 + * @return 杂项入库单行列表 + */ + List getMiscReceiptLineListByReceiptId(Long receiptId); + + /** + * 校验杂项入库单行存在 + * + * @param id 编号 + * @return 杂项入库单行 + */ + MesWmMiscReceiptLineDO validateMiscReceiptLineExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java new file mode 100644 index 0000000..73e8d59 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.mes.service.wm.miscreceipt; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.line.MesWmMiscReceiptLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.miscreceipt.MesWmMiscReceiptLineMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +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_MISC_RECEIPT_LINE_NOT_EXISTS; + +/** + * MES 杂项入库单行 Service 实现类 + */ +@Service +@Validated +public class MesWmMiscReceiptLineServiceImpl implements MesWmMiscReceiptLineService { + + @Resource + private MesWmMiscReceiptLineMapper miscReceiptLineMapper; + + @Override + public Long createMiscReceiptLine(MesWmMiscReceiptLineSaveReqVO createReqVO) { + // 插入 + MesWmMiscReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmMiscReceiptLineDO.class); + miscReceiptLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateMiscReceiptLine(MesWmMiscReceiptLineSaveReqVO updateReqVO) { + // 校验存在 + validateMiscReceiptLineExists(updateReqVO.getId()); + + // 更新 + MesWmMiscReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMiscReceiptLineDO.class); + miscReceiptLineMapper.updateById(updateObj); + } + + @Override + public void deleteMiscReceiptLine(Long id) { + // 校验存在 + validateMiscReceiptLineExists(id); + + // 删除 + miscReceiptLineMapper.deleteById(id); + } + + @Override + public MesWmMiscReceiptLineDO getMiscReceiptLine(Long id) { + return miscReceiptLineMapper.selectById(id); + } + + @Override + public List getMiscReceiptLineListByReceiptId(Long receiptId) { + return miscReceiptLineMapper.selectListByReceiptId(receiptId); + } + + @Override + public MesWmMiscReceiptLineDO validateMiscReceiptLineExists(Long id) { + MesWmMiscReceiptLineDO line = miscReceiptLineMapper.selectById(id); + if (line == null) { + throw exception(WM_MISC_RECEIPT_LINE_NOT_EXISTS); + } + return line; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptService.java new file mode 100644 index 0000000..2ad8a29 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptService.java @@ -0,0 +1,83 @@ +package cn.iocoder.yudao.module.mes.service.wm.miscreceipt; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptDO; +import jakarta.validation.Valid; + +/** + * MES 杂项入库单 Service 接口 + * + * @author 芋道源码 + */ +public interface MesWmMiscReceiptService { + + /** + * 创建杂项入库单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMiscReceipt(@Valid MesWmMiscReceiptSaveReqVO createReqVO); + + /** + * 修改杂项入库单 + * + * @param updateReqVO 修改信息 + */ + void updateMiscReceipt(@Valid MesWmMiscReceiptSaveReqVO updateReqVO); + + /** + * 删除杂项入库单(级联删除行) + * + * @param id 编号 + */ + void deleteMiscReceipt(Long id); + + /** + * 获得杂项入库单 + * + * @param id 编号 + * @return 杂项入库单 + */ + MesWmMiscReceiptDO getMiscReceipt(Long id); + + /** + * 获得杂项入库单分页 + * + * @param pageReqVO 分页参数 + * @return 杂项入库单分页 + */ + PageResult getMiscReceiptPage(MesWmMiscReceiptPageReqVO pageReqVO); + + /** + * 提交审批(草稿 → 已审批) + * + * @param id 编号 + */ + void submitMiscReceipt(Long id); + + /** + * 执行入库(已审批 → 已完成),更新库存台账 + * + * @param id 编号 + */ + void finishMiscReceipt(Long id); + + /** + * 取消杂项入库单(草稿/已审批 → 已取消) + * + * @param id 编号 + */ + void cancelMiscReceipt(Long id); + + /** + * 校验杂项入库单存在 + * + * @param id 编号 + * @return 杂项入库单 + */ + MesWmMiscReceiptDO validateMiscReceiptExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java new file mode 100644 index 0000000..eebd264 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java @@ -0,0 +1,193 @@ +package cn.iocoder.yudao.module.mes.service.wm.miscreceipt; + +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.miscreceipt.vo.MesWmMiscReceiptPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.MesWmMiscReceiptSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.miscreceipt.MesWmMiscReceiptLineMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.miscreceipt.MesWmMiscReceiptMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscReceiptStatusEnum; +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 杂项入库单 Service 实现类 + */ +@Service +@Validated +@Slf4j +public class MesWmMiscReceiptServiceImpl implements MesWmMiscReceiptService { + + @Resource + private MesWmMiscReceiptMapper miscReceiptMapper; + + @Resource + private MesWmMiscReceiptLineMapper miscReceiptLineMapper; + + @Resource + private MesWmMaterialStockService materialStockService; + + @Override + public Long createMiscReceipt(MesWmMiscReceiptSaveReqVO createReqVO) { + // 校验编码唯一 + validateCodeUnique(null, createReqVO.getCode()); + + // 插入 + MesWmMiscReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmMiscReceiptDO.class); + receipt.setStatus(MesWmMiscReceiptStatusEnum.PREPARE.getStatus()); + miscReceiptMapper.insert(receipt); + return receipt.getId(); + } + + @Override + public void updateMiscReceipt(MesWmMiscReceiptSaveReqVO updateReqVO) { + // 校验存在 + 草稿状态 + validateMiscReceiptExistsAndPrepare(updateReqVO.getId()); + // 校验编码唯一 + validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + + // 更新 + MesWmMiscReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMiscReceiptDO.class); + miscReceiptMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteMiscReceipt(Long id) { + // 校验存在 + 草稿状态 + validateMiscReceiptExistsAndPrepare(id); + + // 级联删除行 + miscReceiptLineMapper.deleteByReceiptId(id); + // 删除主表 + miscReceiptMapper.deleteById(id); + } + + @Override + public MesWmMiscReceiptDO getMiscReceipt(Long id) { + return miscReceiptMapper.selectById(id); + } + + @Override + public PageResult getMiscReceiptPage(MesWmMiscReceiptPageReqVO pageReqVO) { + return miscReceiptMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submitMiscReceipt(Long id) { + // 校验存在 + 草稿状态 + validateMiscReceiptExistsAndPrepare(id); + // 校验至少有一条行 + List lines = miscReceiptLineMapper.selectListByReceiptId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_MISC_RECEIPT_NO_LINE); + } + + // 校验行数据完整性 + // TODO @AI:不用做这块的校验; + for (MesWmMiscReceiptLineDO line : lines) { + if (line.getWarehouseId() == null) { + throw exception(WM_MISC_RECEIPT_WAREHOUSE_REQUIRED); + } + if (line.getQuantity() == null || line.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { + throw exception(WM_MISC_RECEIPT_QUANTITY_INVALID); + } + } + + // 提交审批(草稿 → 已审批) + miscReceiptMapper.updateById(new MesWmMiscReceiptDO() + .setId(id).setStatus(MesWmMiscReceiptStatusEnum.APPROVED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finishMiscReceipt(Long id) { + // 校验存在 + MesWmMiscReceiptDO receipt = validateMiscReceiptExists(id); + if (ObjUtil.notEqual(MesWmMiscReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) { + throw exception(WM_MISC_RECEIPT_STATUS_NOT_APPROVED); + } + + // 遍历所有行,更新库存台账 + // TODO @芋艿:后续对齐下; + // TODO @AI:这里有编译报错; + List lines = miscReceiptLineMapper.selectListByReceiptId(id); + for (MesWmMiscReceiptLineDO line : lines) { + materialStockService.increaseStock( + line.getItemId(), + line.getWarehouseId(), + line.getLocationId(), + line.getAreaId(), + line.getBatchCode(), + null, // vendorId 传 null(杂项入库无供应商) + line.getQuantity() + ); + } + + // 执行入库(已审批 → 已完成) + miscReceiptMapper.updateById(new MesWmMiscReceiptDO() + .setId(id).setStatus(MesWmMiscReceiptStatusEnum.FINISHED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelMiscReceipt(Long id) { + // 校验存在 + MesWmMiscReceiptDO receipt = validateMiscReceiptExists(id); + + // 已完成和已取消状态不允许取消 + if (ObjUtil.equal(MesWmMiscReceiptStatusEnum.FINISHED.getStatus(), receipt.getStatus()) + || ObjUtil.equal(MesWmMiscReceiptStatusEnum.CANCELED.getStatus(), receipt.getStatus())) { + throw exception(WM_MISC_RECEIPT_CANCEL_NOT_ALLOWED); + } + + // 取消 + miscReceiptMapper.updateById(new MesWmMiscReceiptDO() + .setId(id).setStatus(MesWmMiscReceiptStatusEnum.CANCELED.getStatus())); + } + + @Override + public MesWmMiscReceiptDO validateMiscReceiptExists(Long id) { + MesWmMiscReceiptDO receipt = miscReceiptMapper.selectById(id); + if (receipt == null) { + throw exception(WM_MISC_RECEIPT_NOT_EXISTS); + } + return receipt; + } + + // ==================== 私有方法 ==================== + + private void validateCodeUnique(Long id, String code) { + MesWmMiscReceiptDO receipt = miscReceiptMapper.selectByCode(code); + if (receipt == null) { + return; + } + if (id == null || ObjUtil.notEqual(id, receipt.getId())) { + throw exception(WM_MISC_RECEIPT_CODE_DUPLICATE); + } + } + + private MesWmMiscReceiptDO validateMiscReceiptExistsAndPrepare(Long id) { + MesWmMiscReceiptDO receipt = validateMiscReceiptExists(id); + if (ObjUtil.notEqual(MesWmMiscReceiptStatusEnum.PREPARE.getStatus(), receipt.getStatus())) { + throw exception(WM_MISC_RECEIPT_STATUS_NOT_PREPARE); + } + return receipt; + } + +} -- libgit2 0.21.4