From 09442e65616b19df0f4221d31ef339ece9ff7d8b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 22 Feb 2026 15:43:49 +0800 Subject: [PATCH] feat(mes): add VO and service for managing MES arrival notice and arrival notice line --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java | 30 ++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java | 18 ++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeLineMapper.java | 32 ++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java | 30 ++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 16 files changed, 1216 insertions(+), 0 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeLineMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java new file mode 100644 index 0000000..75f7a58 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java @@ -0,0 +1,140 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice; + +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.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; +import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; +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/arrival-notice") +@Validated +public class MesWmArrivalNoticeController { + + @Resource + private MesWmArrivalNoticeService arrivalNoticeService; + + @Resource + private MesMdVendorService vendorService; + + @PostMapping("/create") + @Operation(summary = "创建到货通知单") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:create')") + public CommonResult createArrivalNotice(@Valid @RequestBody MesWmArrivalNoticeSaveReqVO createReqVO) { + return success(arrivalNoticeService.createArrivalNotice(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改到货通知单") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:update')") + public CommonResult updateArrivalNotice(@Valid @RequestBody MesWmArrivalNoticeSaveReqVO updateReqVO) { + arrivalNoticeService.updateArrivalNotice(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除到货通知单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:delete')") + public CommonResult deleteArrivalNotice(@RequestParam("id") Long id) { + arrivalNoticeService.deleteArrivalNotice(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得到货通知单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:query')") + public CommonResult getArrivalNotice(@RequestParam("id") Long id) { + MesWmArrivalNoticeDO notice = arrivalNoticeService.getArrivalNotice(id); + if (notice == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(notice)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得到货通知单分页") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:query')") + public CommonResult> getArrivalNoticePage( + @Valid MesWmArrivalNoticePageReqVO pageReqVO) { + PageResult pageResult = arrivalNoticeService.getArrivalNoticePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出到货通知单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportArrivalNoticeExcel(@Valid MesWmArrivalNoticePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = arrivalNoticeService.getArrivalNoticePage(pageReqVO); + ExcelUtils.write(response, "到货通知单.xls", "数据", MesWmArrivalNoticeRespVO.class, + buildRespVOList(pageResult.getList())); + } + + @PutMapping("/submit") + @Operation(summary = "提交到货通知单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:update')") + public CommonResult submitArrivalNotice(@RequestParam("id") Long id) { + arrivalNoticeService.submitArrivalNotice(id); + return success(true); + } + + @PutMapping("/approve") + @Operation(summary = "审批到货通知单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:update')") + public CommonResult approveArrivalNotice(@RequestParam("id") Long id) { + arrivalNoticeService.approveArrivalNotice(id); + return success(true); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map vendorMap = vendorService.getVendorMap( + convertSet(list, MesWmArrivalNoticeDO::getVendorId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmArrivalNoticeRespVO.class, vo -> { + MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> + vo.setVendorCode(vendor.getCode()).setVendorName(vendor.getName())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java new file mode 100644 index 0000000..1efbc6f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java @@ -0,0 +1,126 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcService; +import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeLineService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 到货通知单行") +@RestController +@RequestMapping("/mes/wm/arrival-notice-line") +@Validated +public class MesWmArrivalNoticeLineController { + + @Resource + private MesWmArrivalNoticeLineService arrivalNoticeLineService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @Resource + private MesQcIqcService iqcService; + + @PostMapping("/create") + @Operation(summary = "创建到货通知单行") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:create')") + public CommonResult createArrivalNoticeLine(@Valid @RequestBody MesWmArrivalNoticeLineSaveReqVO createReqVO) { + return success(arrivalNoticeLineService.createArrivalNoticeLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改到货通知单行") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:update')") + public CommonResult updateArrivalNoticeLine(@Valid @RequestBody MesWmArrivalNoticeLineSaveReqVO updateReqVO) { + arrivalNoticeLineService.updateArrivalNoticeLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除到货通知单行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:delete')") + public CommonResult deleteArrivalNoticeLine(@RequestParam("id") Long id) { + arrivalNoticeLineService.deleteArrivalNoticeLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得到货通知单行") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:query')") + public CommonResult getArrivalNoticeLine(@RequestParam("id") Long id) { + MesWmArrivalNoticeLineDO line = arrivalNoticeLineService.getArrivalNoticeLine(id); + if (line == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(line)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得到货通知单行分页") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:query')") + public CommonResult> getArrivalNoticeLinePage( + @Valid MesWmArrivalNoticeLinePageReqVO pageReqVO) { + PageResult pageResult = arrivalNoticeLineService.getArrivalNoticeLinePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmArrivalNoticeLineDO::getItemId)); + Map iqcMap = iqcService.getIqcMap( + convertSet(list, MesWmArrivalNoticeLineDO::getIqcId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmArrivalNoticeLineRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + // 查询物料的计量单位名称 + // TODO @AI:也批量查询,避免逐个; + if (item.getUnitMeasureId() != null) { + MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(item.getUnitMeasureId()); + if (unitMeasure != null) { + vo.setUnitMeasureName(unitMeasure.getName()); + } + } + }); + MapUtils.findAndThen(iqcMap, vo.getIqcId(), iqc -> vo.setIqcCode(iqc.getCode())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java new file mode 100644 index 0000000..07057e1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticePageReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.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; + +@Schema(description = "管理后台 - MES 到货通知单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmArrivalNoticePageReqVO extends PageParam { + + @Schema(description = "通知单编码", example = "AN2026020001") + private String code; + + @Schema(description = "通知单名称", example = "钢板到货") + private String name; + + @Schema(description = "采购订单编号", example = "PO20260101") + private String purchaseOrderCode; + + @Schema(description = "供应商编号", example = "1") + private Long vendorId; + + @Schema(description = "状态", example = "0") + private Integer status; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java new file mode 100644 index 0000000..f486bb9 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java @@ -0,0 +1,78 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 到货通知单 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesWmArrivalNoticeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "通知单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "AN2026020001") + @ExcelProperty("通知单编码") + private String code; + + @Schema(description = "通知单名称", example = "2 月份钢板到货") + @ExcelProperty("通知单名称") + private String name; + + @Schema(description = "采购订单编号", example = "PO20260101") + @ExcelProperty("采购订单编号") + private String purchaseOrderCode; + + @Schema(description = "供应商编号", example = "1") + private Long vendorId; + + @Schema(description = "供应商编码", example = "V001") + @ExcelProperty("供应商编码") + private String vendorCode; + + @Schema(description = "供应商名称", example = "某供应商") + @ExcelProperty("供应商名称") + private String vendorName; + + @Schema(description = "到货日期") + @ExcelProperty("到货日期") + private LocalDateTime arrivalDate; + + @Schema(description = "联系人", example = "张三") + @ExcelProperty("联系人") + private String contactName; + + @Schema(description = "联系电话", example = "13800138000") + @ExcelProperty("联系电话") + private String contactTelephone; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + 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 = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java new file mode 100644 index 0000000..6a8cf8e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 到货通知单新增/修改 Request VO") +@Data +public class MesWmArrivalNoticeSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "通知单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "AN2026020001") + @NotEmpty(message = "通知单编码不能为空") + private String code; + + @Schema(description = "通知单名称", example = "2 月份钢板到货") + private String name; + + @Schema(description = "采购订单编号", example = "PO20260101") + private String purchaseOrderCode; + + @Schema(description = "供应商编号", example = "1") + private Long vendorId; + + @Schema(description = "到货日期") + private LocalDateTime arrivalDate; + + @Schema(description = "联系人", example = "张三") + private String contactName; + + @Schema(description = "联系电话", example = "13800138000") + private String contactTelephone; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java new file mode 100644 index 0000000..699b6f1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line; + +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; + +@Schema(description = "管理后台 - MES 到货通知单行分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmArrivalNoticeLinePageReqVO extends PageParam { + + @Schema(description = "到货通知单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long noticeId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java new file mode 100644 index 0000000..e9345aa --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineRespVO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.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 MesWmArrivalNoticeLineRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "到货通知单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long noticeId; + + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "M001") + private String itemCode; + + @Schema(description = "物料名称", example = "钢板") + private String itemName; + + @Schema(description = "规格型号", example = "10mm*100mm") + private String specification; + + @Schema(description = "计量单位名称", example = "千克") + private String unitMeasureName; + + @Schema(description = "到货数量", example = "500.00") + private BigDecimal arrivalQuantity; + + @Schema(description = "合格数量", example = "500.00") + private BigDecimal qualifiedQuantity; + + @Schema(description = "是否需要来料检验", example = "true") + private Boolean iqcCheckFlag; + + @Schema(description = "来料检验单编号", example = "1") + private Long iqcId; + + @Schema(description = "来料检验单编码", example = "IQC20260201") + private String iqcCode; + + @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 = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java new file mode 100644 index 0000000..523bee6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 到货通知单行新增/修改 Request VO") +@Data +public class MesWmArrivalNoticeLineSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "到货通知单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "到货通知单编号不能为空") + private Long noticeId; + + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料编号不能为空") + private Long itemId; + + @Schema(description = "到货数量", example = "500.00") + private BigDecimal arrivalQuantity; + + @Schema(description = "合格数量", example = "500.00") + private BigDecimal qualifiedQuantity; + + @Schema(description = "是否需要来料检验", example = "true") + private Boolean iqcCheckFlag; + + @Schema(description = "来料检验单编号", example = "1") + private Long iqcId; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java new file mode 100644 index 0000000..9c29754 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java @@ -0,0 +1,89 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +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 + */ +@TableName("mes_wm_arrival_notice") +@KeySequence("mes_wm_arrival_notice_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmArrivalNoticeDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 通知单编码 + */ + private String code; + /** + * 通知单名称 + */ + private String name; + /** + * 采购订单编号 + */ + private String purchaseOrderCode; + /** + * 供应商编号 + * + * 关联 {@link MesMdVendorDO#getId()} + */ + private Long vendorId; + /** + * 到货日期 + */ + private LocalDateTime arrivalDate; + /** + * 联系人 + */ + private String contactName; + /** + * 联系电话 + */ + private String contactTelephone; + // TODO @AI:枚举类;需要 @关联 + // TODO @AI:字典类;需要 @关联 + /** + * 状态 + * + * 0=草稿 1=已提交 2=已审批 3=已完成 + */ + 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/arrivalnotice/MesWmArrivalNoticeLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java new file mode 100644 index 0000000..2819e80 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java @@ -0,0 +1,82 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice; + +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_arrival_notice_line") +@KeySequence("mes_wm_arrival_notice_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmArrivalNoticeLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 到货通知单编号 + * + * 关联 {@link MesWmArrivalNoticeDO#getId()} + */ + private Long noticeId; + /** + * 物料编号 + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 到货数量 + */ + private BigDecimal arrivalQuantity; + /** + * 合格数量 + */ + private BigDecimal qualifiedQuantity; + /** + * 是否需要来料检验 + */ + private Boolean iqcCheckFlag; + // TODO @AI:关联下 iqcId 字段 + /** + * 来料检验单编号 + * + * 关联 mes_qc_iqc.id + */ + private Long iqcId; + /** + * 备注 + */ + 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/arrivalnotice/MesWmArrivalNoticeLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeLineMapper.java new file mode 100644 index 0000000..d2dff2a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeLineMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice; + +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.arrivalnotice.vo.line.MesWmArrivalNoticeLinePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 到货通知单行 Mapper + */ +@Mapper +public interface MesWmArrivalNoticeLineMapper extends BaseMapperX { + + default PageResult selectPage(MesWmArrivalNoticeLinePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmArrivalNoticeLineDO::getNoticeId, reqVO.getNoticeId()) + .orderByDesc(MesWmArrivalNoticeLineDO::getId)); + } + + default List selectListByNoticeId(Long noticeId) { + return selectList(MesWmArrivalNoticeLineDO::getNoticeId, noticeId); + } + + default void deleteByNoticeId(Long noticeId) { + delete(MesWmArrivalNoticeLineDO::getNoticeId, noticeId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java new file mode 100644 index 0000000..2f0e41c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice; + +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.arrivalnotice.vo.MesWmArrivalNoticePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 到货通知单 Mapper + */ +@Mapper +public interface MesWmArrivalNoticeMapper extends BaseMapperX { + + default PageResult selectPage(MesWmArrivalNoticePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmArrivalNoticeDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmArrivalNoticeDO::getName, reqVO.getName()) + .likeIfPresent(MesWmArrivalNoticeDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode()) + .eqIfPresent(MesWmArrivalNoticeDO::getVendorId, reqVO.getVendorId()) + .eqIfPresent(MesWmArrivalNoticeDO::getStatus, reqVO.getStatus()) + .orderByDesc(MesWmArrivalNoticeDO::getId)); + } + + default MesWmArrivalNoticeDO selectByCode(String code) { + return selectOne(MesWmArrivalNoticeDO::getCode, code); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java new file mode 100644 index 0000000..091dac8 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 到货通知单行 Service 接口 + */ +public interface MesWmArrivalNoticeLineService { + + /** + * 创建到货通知单行 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createArrivalNoticeLine(@Valid MesWmArrivalNoticeLineSaveReqVO createReqVO); + + /** + * 修改到货通知单行 + * + * @param updateReqVO 修改信息 + */ + void updateArrivalNoticeLine(@Valid MesWmArrivalNoticeLineSaveReqVO updateReqVO); + + /** + * 删除到货通知单行 + * + * @param id 编号 + */ + void deleteArrivalNoticeLine(Long id); + + /** + * 获得到货通知单行 + * + * @param id 编号 + * @return 到货通知单行 + */ + MesWmArrivalNoticeLineDO getArrivalNoticeLine(Long id); + + /** + * 获得到货通知单行分页 + * + * @param pageReqVO 分页参数 + * @return 到货通知单行分页 + */ + PageResult getArrivalNoticeLinePage(MesWmArrivalNoticeLinePageReqVO pageReqVO); + + // TODO @AI:不用的接口,就删除掉; + /** + * 按通知单编号获得行列表 + * + * @param noticeId 通知单编号 + * @return 行列表 + */ + List getArrivalNoticeLineListByNoticeId(Long noticeId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java new file mode 100644 index 0000000..7b0435d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice; + +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.arrivalnotice.vo.line.MesWmArrivalNoticeLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeLineMapper; +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_ARRIVAL_NOTICE_LINE_NOT_EXISTS; + +/** + * MES 到货通知单行 Service 实现类 + */ +@Service +@Validated +public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLineService { + + @Resource + private MesWmArrivalNoticeLineMapper arrivalNoticeLineMapper; + + @Override + public Long createArrivalNoticeLine(MesWmArrivalNoticeLineSaveReqVO createReqVO) { + // TODO @AI:关联表的校验; + + // 插入 + MesWmArrivalNoticeLineDO line = BeanUtils.toBean(createReqVO, MesWmArrivalNoticeLineDO.class); + // 如果不需要检验,则合格品数量直接等于到货数量 + // TODO @AI:isFalase,减少反向判断; + if (!Boolean.TRUE.equals(line.getIqcCheckFlag())) { + line.setQualifiedQuantity(line.getArrivalQuantity()); + } + arrivalNoticeLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateArrivalNoticeLine(MesWmArrivalNoticeLineSaveReqVO updateReqVO) { + // 校验存在 + validateArrivalNoticeLineExists(updateReqVO.getId()); + // TODO @AI:关联表的校验; + + // 更新 + MesWmArrivalNoticeLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmArrivalNoticeLineDO.class); + // 如果不需要检验,则合格品数量直接等于到货数量 + // TODO @AI:isFalase,减少反向判断; + if (!Boolean.TRUE.equals(updateObj.getIqcCheckFlag())) { + updateObj.setQualifiedQuantity(updateObj.getArrivalQuantity()); + } + arrivalNoticeLineMapper.updateById(updateObj); + } + + @Override + public void deleteArrivalNoticeLine(Long id) { + // 校验存在 + validateArrivalNoticeLineExists(id); + // 删除 + arrivalNoticeLineMapper.deleteById(id); + } + + @Override + public MesWmArrivalNoticeLineDO getArrivalNoticeLine(Long id) { + return arrivalNoticeLineMapper.selectById(id); + } + + @Override + public PageResult getArrivalNoticeLinePage(MesWmArrivalNoticeLinePageReqVO pageReqVO) { + return arrivalNoticeLineMapper.selectPage(pageReqVO); + } + + @Override + public List getArrivalNoticeLineListByNoticeId(Long noticeId) { + return arrivalNoticeLineMapper.selectListByNoticeId(noticeId); + } + + private void validateArrivalNoticeLineExists(Long id) { + if (arrivalNoticeLineMapper.selectById(id) == null) { + throw exception(WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java new file mode 100644 index 0000000..2b883b8 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java @@ -0,0 +1,92 @@ +package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +/** + * MES 到货通知单 Service 接口 + */ +public interface MesWmArrivalNoticeService { + + /** + * 创建到货通知单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createArrivalNotice(@Valid MesWmArrivalNoticeSaveReqVO createReqVO); + + /** + * 修改到货通知单 + * + * @param updateReqVO 修改信息 + */ + void updateArrivalNotice(@Valid MesWmArrivalNoticeSaveReqVO updateReqVO); + + /** + * 删除到货通知单(级联删除行) + * + * @param id 编号 + */ + void deleteArrivalNotice(Long id); + + /** + * 获得到货通知单 + * + * @param id 编号 + * @return 到货通知单 + */ + MesWmArrivalNoticeDO getArrivalNotice(Long id); + + /** + * 获得到货通知单分页 + * + * @param pageReqVO 分页参数 + * @return 到货通知单分页 + */ + PageResult getArrivalNoticePage(MesWmArrivalNoticePageReqVO pageReqVO); + + // TODO @AI:0-》1、1-》2 尽量写状态;不要写这种; + /** + * 提交到货通知单(0→1) + * + * @param id 编号 + */ + void submitArrivalNotice(Long id); + + /** + * 审批到货通知单(1→2) + * + * @param id 编号 + */ + void approveArrivalNotice(Long id); + + /** + * 完成到货通知单(→3),内部调用 + * + * @param id 编号 + */ + void finishArrivalNotice(Long id); + + /** + * 按编号集合获得到货通知单列表 + * + * @param ids 编号集合 + * @return 到货通知单列表 + */ + List getArrivalNoticeList(Collection ids); + + default Map getArrivalNoticeMap(Collection ids) { + return convertMap(getArrivalNoticeList(ids), MesWmArrivalNoticeDO::getId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java new file mode 100644 index 0000000..4621611 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java @@ -0,0 +1,177 @@ +package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeLineMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 到货通知单 Service 实现类 + */ +@Service +@Validated +public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService { + + @Resource + private MesWmArrivalNoticeMapper arrivalNoticeMapper; + + // TODO @AI:不允许调用对方的,调用 service; + @Resource + private MesWmArrivalNoticeLineMapper arrivalNoticeLineMapper; + + @Override + public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) { + // 校验编码唯一 + validateCodeUnique(null, createReqVO.getCode()); + // TODO @AI:关联数据的校验 + + // 插入 + MesWmArrivalNoticeDO notice = BeanUtils.toBean(createReqVO, MesWmArrivalNoticeDO.class); + // TODO @AI:使用枚举类; + notice.setStatus(0); // 草稿 + arrivalNoticeMapper.insert(notice); + return notice.getId(); + } + + @Override + public void updateArrivalNotice(MesWmArrivalNoticeSaveReqVO updateReqVO) { + // 校验存在 + MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(updateReqVO.getId()); + // 校验状态:只有草稿才允许修改 + // TODO @AI:使用枚举类; + if (notice.getStatus() != 0) { + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); + } + // 校验编码唯一 + validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // TODO @AI:关联数据的校验 + + // 更新 + MesWmArrivalNoticeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmArrivalNoticeDO.class); + arrivalNoticeMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteArrivalNotice(Long id) { + // 校验存在 + MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); + // 校验状态:只有草稿才允许删除 TODO @AI:抽个统一的校验+ 存在 “草稿”的方法,允许修改、删除 + // TODO @AI:使用枚举类; + if (notice.getStatus() != 0) { + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); + } + + // 级联删除行 + arrivalNoticeLineMapper.deleteByNoticeId(id); + // 删除 + arrivalNoticeMapper.deleteById(id); + } + + @Override + public MesWmArrivalNoticeDO getArrivalNotice(Long id) { + return arrivalNoticeMapper.selectById(id); + } + + @Override + public PageResult getArrivalNoticePage(MesWmArrivalNoticePageReqVO pageReqVO) { + return arrivalNoticeMapper.selectPage(pageReqVO); + } + + @Override + public void submitArrivalNotice(Long id) { + // 校验存在 + MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); + if (notice.getStatus() != 0) { // TODO @AI:抽个统一的校验+ 存在 “草稿”的方法,允许修改、删除 + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); + } + + // 检查是否有行项目 + // TODO @AI:搞个 count 方法,在对方 service,传递 noticeId + 状态 + List lines = arrivalNoticeLineMapper.selectListByNoticeId(id); + // 检查所有行的 iqcCheckFlag:如果没有需要检验的行,则直接审批通过 + boolean needCheck = lines.stream().anyMatch(line -> Boolean.TRUE.equals(line.getIqcCheckFlag())); + // TODO @AI:计算 status,然后去更新; + if (!needCheck) { + // 不需要检验,直接审批通过 + arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(id).setStatus(2)); + } else { + // 需要检验,提交待审批 + arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(id).setStatus(1)); + } + } + + @Override + public void approveArrivalNotice(Long id) { + // 校验存在 + MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); + if (notice.getStatus() != 1) { + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); + } + // TODO @AI:校验状态 + 状态; + + // 校验所有 iqcCheckFlag=true 的行必须 iqcId 不为空 + // TODO @AI:对方 service ;搞个 count 方法,在对方 service,传递 noticeId + 状态;另外,看看能不能和上面的,保持 service 方法,保持统一; + List lines = arrivalNoticeLineMapper.selectListByNoticeId(id); + boolean hasUnchecked = lines.stream() + .anyMatch(line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null); + if (hasUnchecked) { + throw exception(WM_ARRIVAL_NOTICE_IQC_PENDING); + } + // 审批通过 + arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(id).setStatus(2)); + } + + @Override + public void finishArrivalNotice(Long id) { + validateArrivalNoticeExists(id); + // TODO @AI:校验状态 + 状态; + + // 完成 + arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(id).setStatus(3)); + } + + @Override + public List getArrivalNoticeList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return arrivalNoticeMapper.selectByIds(ids); + } + + private MesWmArrivalNoticeDO validateArrivalNoticeExists(Long id) { + MesWmArrivalNoticeDO notice = arrivalNoticeMapper.selectById(id); + if (notice == null) { + throw exception(WM_ARRIVAL_NOTICE_NOT_EXISTS); + } + return notice; + } + + private void validateCodeUnique(Long id, String code) { + MesWmArrivalNoticeDO notice = arrivalNoticeMapper.selectByCode(code); + if (notice == null) { + return; + } + // TODO @AI:notEquals + if (id == null || !id.equals(notice.getId())) { + throw exception(WM_ARRIVAL_NOTICE_CODE_DUPLICATE); + } + } + +} -- libgit2 0.21.4