diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java new file mode 100644 index 0000000..1d9f51b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeController.java @@ -0,0 +1,140 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice; + +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.salesnotice.vo.MesWmSalesNoticePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticeRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; +import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; +import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeService; +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/sales-notice") +@Validated +public class MesWmSalesNoticeController { + + @Resource + private MesWmSalesNoticeService salesNoticeService; + + @Resource + private MesMdClientService clientService; + + @PostMapping("/create") + @Operation(summary = "创建发货通知单") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:create')") + public CommonResult createSalesNotice(@Valid @RequestBody MesWmSalesNoticeSaveReqVO createReqVO) { + return success(salesNoticeService.createSalesNotice(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改发货通知单") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:update')") + public CommonResult updateSalesNotice(@Valid @RequestBody MesWmSalesNoticeSaveReqVO updateReqVO) { + salesNoticeService.updateSalesNotice(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除发货通知单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:delete')") + public CommonResult deleteSalesNotice(@RequestParam("id") Long id) { + salesNoticeService.deleteSalesNotice(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得发货通知单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:query')") + public CommonResult getSalesNotice(@RequestParam("id") Long id) { + MesWmSalesNoticeDO notice = salesNoticeService.getSalesNotice(id); + if (notice == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(notice)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得发货通知单分页") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:query')") + public CommonResult> getSalesNoticePage( + @Valid MesWmSalesNoticePageReqVO pageReqVO) { + PageResult pageResult = salesNoticeService.getSalesNoticePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出发货通知单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportSalesNoticeExcel(@Valid MesWmSalesNoticePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = salesNoticeService.getSalesNoticePage(pageReqVO); + ExcelUtils.write(response, "发货通知单.xls", "数据", MesWmSalesNoticeRespVO.class, + buildRespVOList(pageResult.getList())); + } + + @PutMapping("/submit") + @Operation(summary = "提交发货通知单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:update')") + public CommonResult submitSalesNotice(@RequestParam("id") Long id) { + salesNoticeService.submitSalesNotice(id); + return success(true); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得发货通知单精简列表") + @Parameter(name = "status", description = "状态", example = "1") + public CommonResult> getSalesNoticeSimpleList( + @RequestParam(value = "status", required = false) Integer status) { + List list = salesNoticeService.getSalesNoticeListByStatus(status); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map clientMap = clientService.getClientMap( + convertSet(list, MesWmSalesNoticeDO::getClientId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmSalesNoticeRespVO.class, vo -> { + MapUtils.findAndThen(clientMap, vo.getClientId(), client -> + vo.setClientCode(client.getCode()).setClientName(client.getName())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeLineController.java new file mode 100644 index 0000000..2f349ec --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/MesWmSalesNoticeLineController.java @@ -0,0 +1,114 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice; + +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.salesnotice.vo.line.MesWmSalesNoticeLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeLineService; +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/sales-notice-line") +@Validated +public class MesWmSalesNoticeLineController { + + @Resource + private MesWmSalesNoticeLineService salesNoticeLineService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @PostMapping("/create") + @Operation(summary = "创建发货通知单行") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:create')") + public CommonResult createSalesNoticeLine(@Valid @RequestBody MesWmSalesNoticeLineSaveReqVO createReqVO) { + return success(salesNoticeLineService.createSalesNoticeLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改发货通知单行") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:update')") + public CommonResult updateSalesNoticeLine(@Valid @RequestBody MesWmSalesNoticeLineSaveReqVO updateReqVO) { + salesNoticeLineService.updateSalesNoticeLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除发货通知单行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:delete')") + public CommonResult deleteSalesNoticeLine(@RequestParam("id") Long id) { + salesNoticeLineService.deleteSalesNoticeLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得发货通知单行") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:query')") + public CommonResult getSalesNoticeLine(@RequestParam("id") Long id) { + MesWmSalesNoticeLineDO line = salesNoticeLineService.getSalesNoticeLine(id); + if (line == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(line)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得发货通知单行分页") + @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:query')") + public CommonResult> getSalesNoticeLinePage( + @Valid MesWmSalesNoticeLinePageReqVO pageReqVO) { + PageResult pageResult = salesNoticeLineService.getSalesNoticeLinePage(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, MesWmSalesNoticeLineDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmSalesNoticeLineRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java new file mode 100644 index 0000000..e702e70 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticePageReqVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.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 MesWmSalesNoticePageReqVO extends PageParam { + + @Schema(description = "通知单编码", example = "SN202603010001") + private String noticeCode; + + @Schema(description = "通知单名称", example = "测试发货通知") + private String noticeName; + + @Schema(description = "销售订单编号", example = "SO202603010001") + private String salesOrderCode; + + @Schema(description = "客户编号", example = "1") + private Long clientId; + + @Schema(description = "发货日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] salesDate; + + @Schema(description = "状态", example = "0") + private Integer status; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java new file mode 100644 index 0000000..bf453e6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeRespVO.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.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 MesWmSalesNoticeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "通知单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "SN202603010001") + @ExcelProperty("通知单编码") + private String noticeCode; + + @Schema(description = "通知单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试发货通知") + @ExcelProperty("通知单名称") + private String noticeName; + + @Schema(description = "销售订单编号", example = "SO202603010001") + @ExcelProperty("销售订单编号") + private String salesOrderCode; + + @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long clientId; + + @Schema(description = "客户编码", example = "C001") + @ExcelProperty("客户编码") + private String clientCode; + + @Schema(description = "客户名称", example = "某客户") + @ExcelProperty("客户名称") + private String clientName; + + @Schema(description = "发货日期", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("发货日期") + private LocalDateTime salesDate; + + @Schema(description = "收货人", example = "张三") + @ExcelProperty("收货人") + private String recipientName; + + @Schema(description = "联系方式", example = "13800138000") + @ExcelProperty("联系方式") + private String recipientTelephone; + + @Schema(description = "收货地址", example = "北京市朝阳区xxx") + @ExcelProperty("收货地址") + private String recipientAddress; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @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/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java new file mode 100644 index 0000000..ee7b87b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/MesWmSalesNoticeSaveReqVO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.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; + +@Schema(description = "管理后台 - MES 发货通知单新增/修改 Request VO") +@Data +public class MesWmSalesNoticeSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "通知单编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "SN202603010001") + @NotEmpty(message = "通知单编码不能为空") + private String noticeCode; + + @Schema(description = "通知单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试发货通知") + @NotEmpty(message = "通知单名称不能为空") + private String noticeName; + + @Schema(description = "销售订单编号", example = "SO202603010001") + private String salesOrderCode; + + @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "客户编号不能为空") + private Long clientId; + + @Schema(description = "发货日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "发货日期不能为空") + private LocalDateTime salesDate; + + @Schema(description = "收货人", example = "张三") + private String recipientName; + + @Schema(description = "联系方式", example = "13800138000") + private String recipientTelephone; + + @Schema(description = "收货地址", example = "北京市朝阳区xxx") + private String recipientAddress; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLinePageReqVO.java new file mode 100644 index 0000000..c3b7180 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLinePageReqVO.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.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 MesWmSalesNoticeLinePageReqVO extends PageParam { + + @Schema(description = "发货通知单编号", example = "1") + private Long noticeId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java new file mode 100644 index 0000000..a6b483b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineRespVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.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 MesWmSalesNoticeLineRespVO { + + @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 = "产品A") + private String itemName; + + @Schema(description = "规格型号", example = "10mm*100mm") + private String specification; + + @Schema(description = "计量单位名称", example = "个") + private String unitMeasureName; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "批次号", example = "BATCH001") + private String batchCode; + + @Schema(description = "发货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + private BigDecimal quantity; + + @Schema(description = "是否检验", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + private Boolean oqcCheck; + + @Schema(description = "备注", example = "备注") + private String remark; + + @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/salesnotice/vo/line/MesWmSalesNoticeLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineSaveReqVO.java new file mode 100644 index 0000000..94faa68 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/salesnotice/vo/line/MesWmSalesNoticeLineSaveReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 发货通知单行新增/修改 Request VO") +@Data +public class MesWmSalesNoticeLineSaveReqVO { + + @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 = "1") + private Long batchId; + + @Schema(description = "批次号", example = "BATCH001") + private String batchCode; + + @Schema(description = "发货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "发货数量不能为空") + @DecimalMin(value = "0.01", message = "发货数量必须大于 0") + private BigDecimal quantity; + + @Schema(description = "是否检验", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否检验不能为空") + private Boolean oqcCheck; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java new file mode 100644 index 0000000..a89c44e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeDO.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; +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_sales_notice") +@KeySequence("mes_wm_sales_notice_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmSalesNoticeDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 通知单编码 + */ + private String noticeCode; + /** + * 通知单名称 + */ + private String noticeName; + /** + * 销售订单编号 + */ + private String salesOrderCode; + /** + * 客户编号 + * + * 关联 {@link MesMdClientDO#getId()} + */ + private Long clientId; + /** + * 发货日期 + */ + private LocalDateTime salesDate; + /** + * 收货人 + */ + private String recipientName; + /** + * 联系方式 + */ + private String recipientTelephone; + /** + * 收货地址 + */ + private String recipientAddress; + /** + * 状态 + * + * 0-草稿,1-已提交 + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java new file mode 100644 index 0000000..6ff5950 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/salesnotice/MesWmSalesNoticeLineDO.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice; + +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_sales_notice_line") +@KeySequence("mes_wm_sales_notice_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmSalesNoticeLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 发货通知单编号 + * + * 关联 {@link MesWmSalesNoticeDO#getId()} + */ + private Long noticeId; + /** + * 物料编号 + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 批次编号 + */ + private Long batchId; + /** + * 批次号 + */ + private String batchCode; + /** + * 发货数量 + */ + private BigDecimal quantity; + /** + * 是否检验 + */ + private Boolean oqcCheck; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesMapper.java index 9a2ab4b..5ecd736 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productsales/MesWmProductSalesMapper.java @@ -21,7 +21,7 @@ public interface MesWmProductSalesMapper extends BaseMapperX { + + default PageResult selectPage(MesWmSalesNoticeLinePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmSalesNoticeLineDO::getNoticeId, reqVO.getNoticeId()) + .orderByDesc(MesWmSalesNoticeLineDO::getId)); + } + + default List selectListByNoticeId(Long noticeId) { + return selectList(MesWmSalesNoticeLineDO::getNoticeId, noticeId); + } + + default void deleteByNoticeId(Long noticeId) { + delete(MesWmSalesNoticeLineDO::getNoticeId, noticeId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java new file mode 100644 index 0000000..93b22d7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/salesnotice/MesWmSalesNoticeMapper.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice; + +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.salesnotice.vo.MesWmSalesNoticePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 发货通知单 Mapper + */ +@Mapper +public interface MesWmSalesNoticeMapper extends BaseMapperX { + + default PageResult selectPage(MesWmSalesNoticePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmSalesNoticeDO::getNoticeCode, reqVO.getNoticeCode()) + .likeIfPresent(MesWmSalesNoticeDO::getNoticeName, reqVO.getNoticeName()) + .likeIfPresent(MesWmSalesNoticeDO::getSalesOrderCode, reqVO.getSalesOrderCode()) + .eqIfPresent(MesWmSalesNoticeDO::getClientId, reqVO.getClientId()) + .betweenIfPresent(MesWmSalesNoticeDO::getSalesDate, reqVO.getSalesDate()) + .eqIfPresent(MesWmSalesNoticeDO::getStatus, reqVO.getStatus()) + .orderByDesc(MesWmSalesNoticeDO::getId)); + } + + default MesWmSalesNoticeDO selectByNoticeCode(String noticeCode) { + return selectOne(MesWmSalesNoticeDO::getNoticeCode, noticeCode); + } + + default List selectListByStatus(Integer status) { + return selectList(MesWmSalesNoticeDO::getStatus, status); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index ad9b2a8..8619c11 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -441,4 +441,12 @@ public interface ErrorCodeConstants { ErrorCode WM_PRODUCT_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_714_011, "销售出库明细不存在"); ErrorCode WM_PRODUCT_SALES_STOCK_INSUFFICIENT = new ErrorCode(1_040_714_012, "库存不足,无法拣货"); + // ========== MES 仓库管理-发货通知单(1-040-720-000) ========== + ErrorCode WM_SALES_NOTICE_NOT_EXISTS = new ErrorCode(1_040_720_000, "发货通知单不存在"); + ErrorCode WM_SALES_NOTICE_CODE_DUPLICATE = new ErrorCode(1_040_720_001, "通知单编号重复"); + ErrorCode WM_SALES_NOTICE_STATUS_NOT_ALLOW_DELETE = new ErrorCode(1_040_720_002, "单据状态不允许删除"); + ErrorCode WM_SALES_NOTICE_STATUS_NOT_ALLOW_UPDATE = new ErrorCode(1_040_720_003, "单据状态不允许修改"); + ErrorCode WM_SALES_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_720_010, "发货通知单行不存在"); + ErrorCode WM_SALES_NOTICE_LINE_EMPTY = new ErrorCode(1_040_720_011, "发货通知单行为空,不能提交"); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java index f7ae041..0fec492 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java @@ -47,7 +47,6 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe // 新增 MesWmProductSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmProductSalesLineDO.class); - line.setPickedQuantity(BigDecimal.ZERO); productSalesLineMapper.insert(line); return line.getId(); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java new file mode 100644 index 0000000..4fc969d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineService.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.mes.service.wm.salesnotice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 发货通知单行 Service 接口 + */ +public interface MesWmSalesNoticeLineService { + + /** + * 创建发货通知单行 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSalesNoticeLine(@Valid MesWmSalesNoticeLineSaveReqVO createReqVO); + + /** + * 修改发货通知单行 + * + * @param updateReqVO 修改信息 + */ + void updateSalesNoticeLine(@Valid MesWmSalesNoticeLineSaveReqVO updateReqVO); + + /** + * 删除发货通知单行 + * + * @param id 编号 + */ + void deleteSalesNoticeLine(Long id); + + /** + * 获得发货通知单行 + * + * @param id 编号 + * @return 发货通知单行 + */ + MesWmSalesNoticeLineDO getSalesNoticeLine(Long id); + + /** + * 获得发货通知单行分页 + * + * @param pageReqVO 分页参数 + * @return 发货通知单行分页 + */ + PageResult getSalesNoticeLinePage(MesWmSalesNoticeLinePageReqVO pageReqVO); + + /** + * 按通知单编号获得行列表 + * + * @param noticeId 通知单编号 + * @return 行列表 + */ + List getSalesNoticeLineListByNoticeId(Long noticeId); + + /** + * 按通知单编号批量删除行 + * + * @param noticeId 通知单编号 + */ + void deleteSalesNoticeLineByNoticeId(Long noticeId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java new file mode 100644 index 0000000..c2111b6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java @@ -0,0 +1,107 @@ +package cn.iocoder.yudao.module.mes.service.wm.salesnotice; + +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.salesnotice.vo.line.MesWmSalesNoticeLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.line.MesWmSalesNoticeLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeLineMapper; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +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.*; + +/** + * MES 发货通知单行 Service 实现类 + */ +@Service +@Validated +public class MesWmSalesNoticeLineServiceImpl implements MesWmSalesNoticeLineService { + + @Resource + private MesWmSalesNoticeLineMapper salesNoticeLineMapper; + + @Resource + @Lazy + private MesWmSalesNoticeService salesNoticeService; + + @Override + public Long createSalesNoticeLine(MesWmSalesNoticeLineSaveReqVO createReqVO) { + // 校验父单据存在且为草稿状态 + validateNoticeStatusDraft(createReqVO.getNoticeId()); + + // 插入 + MesWmSalesNoticeLineDO line = BeanUtils.toBean(createReqVO, MesWmSalesNoticeLineDO.class); + salesNoticeLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateSalesNoticeLine(MesWmSalesNoticeLineSaveReqVO updateReqVO) { + // 校验存在 + MesWmSalesNoticeLineDO line = validateSalesNoticeLineExists(updateReqVO.getId()); + // 校验父单据存在且为草稿状态 + validateNoticeStatusDraft(line.getNoticeId()); + + // 更新 + MesWmSalesNoticeLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmSalesNoticeLineDO.class); + salesNoticeLineMapper.updateById(updateObj); + } + + @Override + public void deleteSalesNoticeLine(Long id) { + // 校验存在 + validateSalesNoticeLineExists(id); + // 删除 + salesNoticeLineMapper.deleteById(id); + } + + @Override + public MesWmSalesNoticeLineDO getSalesNoticeLine(Long id) { + return salesNoticeLineMapper.selectById(id); + } + + @Override + public PageResult getSalesNoticeLinePage(MesWmSalesNoticeLinePageReqVO pageReqVO) { + return salesNoticeLineMapper.selectPage(pageReqVO); + } + + @Override + public List getSalesNoticeLineListByNoticeId(Long noticeId) { + return salesNoticeLineMapper.selectListByNoticeId(noticeId); + } + + @Override + public void deleteSalesNoticeLineByNoticeId(Long noticeId) { + salesNoticeLineMapper.deleteByNoticeId(noticeId); + } + + private MesWmSalesNoticeLineDO validateSalesNoticeLineExists(Long id) { + MesWmSalesNoticeLineDO line = salesNoticeLineMapper.selectById(id); + if (line == null) { + throw exception(WM_SALES_NOTICE_LINE_NOT_EXISTS); + } + return line; + } + + /** + * 校验父发货通知单存在且为草稿状态 + */ + private void validateNoticeStatusDraft(Long noticeId) { + MesWmSalesNoticeDO notice = salesNoticeService.getSalesNotice(noticeId); + if (notice == null) { + throw exception(WM_SALES_NOTICE_NOT_EXISTS); + } + if (ObjUtil.notEqual(0, notice.getStatus())) { + throw exception(WM_SALES_NOTICE_STATUS_NOT_ALLOW_UPDATE); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java new file mode 100644 index 0000000..3861c77 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeService.java @@ -0,0 +1,78 @@ +package cn.iocoder.yudao.module.mes.service.wm.salesnotice; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; + +/** + * MES 发货通知单 Service 接口 + */ +public interface MesWmSalesNoticeService { + + /** + * 创建发货通知单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSalesNotice(@Valid MesWmSalesNoticeSaveReqVO createReqVO); + + /** + * 修改发货通知单 + * + * @param updateReqVO 修改信息 + */ + void updateSalesNotice(@Valid MesWmSalesNoticeSaveReqVO updateReqVO); + + /** + * 删除发货通知单 + * + * @param id 编号 + */ + void deleteSalesNotice(Long id); + + /** + * 获得发货通知单 + * + * @param id 编号 + * @return 发货通知单 + */ + MesWmSalesNoticeDO getSalesNotice(Long id); + + /** + * 获得发货通知单分页 + * + * @param pageReqVO 分页参数 + * @return 发货通知单分页 + */ + PageResult getSalesNoticePage(MesWmSalesNoticePageReqVO pageReqVO); + + /** + * 提交发货通知单 + * + * @param id 编号 + */ + void submitSalesNotice(Long id); + + /** + * 获得发货通知单列表 + * + * @param ids 编号列表 + * @return 发货通知单列表 + */ + List getSalesNoticeList(Collection ids); + + /** + * 按状态获得发货通知单列表 + * + * @param status 状态 + * @return 发货通知单列表 + */ + List getSalesNoticeListByStatus(Integer status); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java new file mode 100644 index 0000000..b8ae069 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java @@ -0,0 +1,146 @@ +package cn.iocoder.yudao.module.mes.service.wm.salesnotice; + +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.salesnotice.vo.MesWmSalesNoticePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.salesnotice.vo.MesWmSalesNoticeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeMapper; +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.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 +@Slf4j +public class MesWmSalesNoticeServiceImpl implements MesWmSalesNoticeService { + + @Resource + private MesWmSalesNoticeMapper salesNoticeMapper; + + @Resource + private MesWmSalesNoticeLineService salesNoticeLineService; + + @Override + public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) { + // 校验编码唯一 + validateNoticeCodeUnique(null, createReqVO.getNoticeCode()); + + // 插入 + MesWmSalesNoticeDO notice = BeanUtils.toBean(createReqVO, MesWmSalesNoticeDO.class); + notice.setStatus(0); // 草稿状态 + salesNoticeMapper.insert(notice); + return notice.getId(); + } + + @Override + public void updateSalesNotice(MesWmSalesNoticeSaveReqVO updateReqVO) { + // 校验存在 + 草稿状态 + validateSalesNoticeExistsAndDraft(updateReqVO.getId()); + // 校验编码唯一 + validateNoticeCodeUnique(updateReqVO.getId(), updateReqVO.getNoticeCode()); + + // 更新 + MesWmSalesNoticeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmSalesNoticeDO.class); + salesNoticeMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteSalesNotice(Long id) { + // 校验存在 + 草稿状态 + validateSalesNoticeExistsAndDraft(id); + + // 级联删除行 + salesNoticeLineService.deleteSalesNoticeLineByNoticeId(id); + // 删除 + salesNoticeMapper.deleteById(id); + } + + @Override + public MesWmSalesNoticeDO getSalesNotice(Long id) { + return salesNoticeMapper.selectById(id); + } + + @Override + public PageResult getSalesNoticePage(MesWmSalesNoticePageReqVO pageReqVO) { + return salesNoticeMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submitSalesNotice(Long id) { + // 1.1 校验存在 + 草稿状态 + validateSalesNoticeExistsAndDraft(id); + // 1.2 检查是否有行项目 + List lines = salesNoticeLineService.getSalesNoticeLineListByNoticeId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_SALES_NOTICE_LINE_EMPTY); + } + + // 2. 更新状态:草稿 → 已提交 + salesNoticeMapper.updateById(new MesWmSalesNoticeDO() + .setId(id).setStatus(1)); + } + + @Override + public List getSalesNoticeList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return salesNoticeMapper.selectByIds(ids); + } + + @Override + public List getSalesNoticeListByStatus(Integer status) { + if (status == null) { + return salesNoticeMapper.selectList(); + } + return salesNoticeMapper.selectListByStatus(status); + } + + private MesWmSalesNoticeDO validateSalesNoticeExists(Long id) { + MesWmSalesNoticeDO notice = salesNoticeMapper.selectById(id); + if (notice == null) { + throw exception(WM_SALES_NOTICE_NOT_EXISTS); + } + return notice; + } + + /** + * 校验发货通知单存在且为草稿状态 + */ + private MesWmSalesNoticeDO validateSalesNoticeExistsAndDraft(Long id) { + MesWmSalesNoticeDO notice = validateSalesNoticeExists(id); + if (ObjUtil.notEqual(0, notice.getStatus())) { + throw exception(WM_SALES_NOTICE_STATUS_NOT_ALLOW_DELETE); + } + return notice; + } + + private void validateNoticeCodeUnique(Long id, String noticeCode) { + MesWmSalesNoticeDO notice = salesNoticeMapper.selectByNoticeCode(noticeCode); + if (notice == null) { + return; + } + if (ObjUtil.notEqual(id, notice.getId())) { + throw exception(WM_SALES_NOTICE_CODE_DUPLICATE); + } + } + +}