diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferController.java new file mode 100644 index 0000000..4b9a849 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferController.java @@ -0,0 +1,128 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.MesWmTransferPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.MesWmTransferRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.MesWmTransferSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDO; +import cn.iocoder.yudao.module.mes.service.wm.transfer.MesWmTransferService; +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 static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 转移单") +@RestController +@RequestMapping("/mes/wm/transfer") +@Validated +public class MesWmTransferController { + + @Resource + private MesWmTransferService transferService; + + @PostMapping("/create") + @Operation(summary = "创建转移单") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:create')") + public CommonResult createTransfer(@Valid @RequestBody MesWmTransferSaveReqVO createReqVO) { + return success(transferService.createTransfer(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改转移单") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:update')") + public CommonResult updateTransfer(@Valid @RequestBody MesWmTransferSaveReqVO updateReqVO) { + transferService.updateTransfer(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除转移单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:delete')") + public CommonResult deleteTransfer(@RequestParam("id") Long id) { + transferService.deleteTransfer(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得转移单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") + public CommonResult getTransfer(@RequestParam("id") Long id) { + MesWmTransferDO transfer = transferService.getTransfer(id); + return success(BeanUtils.toBean(transfer, MesWmTransferRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得转移单分页") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") + public CommonResult> getTransferPage( + @Valid MesWmTransferPageReqVO pageReqVO) { + PageResult pageResult = transferService.getTransferPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesWmTransferRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出转移单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportTransferExcel(@Valid MesWmTransferPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = transferService.getTransferPage(pageReqVO); + ExcelUtils.write(response, "转移单.xls", "数据", MesWmTransferRespVO.class, + BeanUtils.toBean(pageResult.getList(), MesWmTransferRespVO.class)); + } + + @PutMapping("/submit") + @Operation(summary = "提交转移单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:update')") + public CommonResult submitTransfer(@RequestParam("id") Long id) { + transferService.submitTransfer(id); + return success(true); + } + + @PutMapping("/confirm") + @Operation(summary = "确认转移单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:update')") + public CommonResult confirmTransfer(@RequestParam("id") Long id) { + transferService.confirmTransfer(id); + return success(true); + } + + @PutMapping("/finish") + @Operation(summary = "完成转移单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:finish')") + public CommonResult finishTransfer(@RequestParam("id") Long id) { + transferService.finishTransfer(id); + return success(true); + } + + @PutMapping("/cancel") + @Operation(summary = "取消转移单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:update')") + public CommonResult cancelTransfer(@RequestParam("id") Long id) { + transferService.cancelTransfer(id); + return success(true); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java new file mode 100644 index 0000000..03450f3 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDetailDO; +import cn.iocoder.yudao.module.mes.service.wm.transfer.MesWmTransferDetailService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 调拨明细") +@RestController +@RequestMapping("/mes/wm/transfer-detail") +@Validated +public class MesWmTransferDetailController { + + @Resource + private MesWmTransferDetailService transferDetailService; + + @PostMapping("/create") + @Operation(summary = "创建调拨明细") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:create')") + public CommonResult createTransferDetail(@Valid @RequestBody MesWmTransferDetailSaveReqVO createReqVO) { + return success(transferDetailService.createTransferDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改调拨明细") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:update')") + public CommonResult updateTransferDetail(@Valid @RequestBody MesWmTransferDetailSaveReqVO updateReqVO) { + transferDetailService.updateTransferDetail(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除调拨明细") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:delete')") + public CommonResult deleteTransferDetail(@RequestParam("id") Long id) { + transferDetailService.deleteTransferDetail(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得调拨明细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") + public CommonResult getTransferDetail(@RequestParam("id") Long id) { + MesWmTransferDetailDO detail = transferDetailService.getTransferDetail(id); + return success(BeanUtils.toBean(detail, MesWmTransferDetailRespVO.class)); + } + + @GetMapping("/list-by-line") + @Operation(summary = "获得调拨明细列表(按行编号)") + @Parameter(name = "lineId", description = "行编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") + public CommonResult> getTransferDetailListByLineId( + @RequestParam("lineId") Long lineId) { + List list = transferDetailService.getTransferDetailListByLineId(lineId); + return success(BeanUtils.toBean(list, MesWmTransferDetailRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java new file mode 100644 index 0000000..acdade7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTransferLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTransferLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO; +import cn.iocoder.yudao.module.mes.service.wm.transfer.MesWmTransferLineService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 转移单行") +@RestController +@RequestMapping("/mes/wm/transfer-line") +@Validated +public class MesWmTransferLineController { + + @Resource + private MesWmTransferLineService transferLineService; + + @PostMapping("/create") + @Operation(summary = "创建转移单行") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:create')") + public CommonResult createTransferLine(@Valid @RequestBody MesWmTransferLineSaveReqVO createReqVO) { + return success(transferLineService.createTransferLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改转移单行") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:update')") + public CommonResult updateTransferLine(@Valid @RequestBody MesWmTransferLineSaveReqVO updateReqVO) { + transferLineService.updateTransferLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除转移单行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:delete')") + public CommonResult deleteTransferLine(@RequestParam("id") Long id) { + transferLineService.deleteTransferLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得转移单行") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") + public CommonResult getTransferLine(@RequestParam("id") Long id) { + MesWmTransferLineDO line = transferLineService.getTransferLine(id); + return success(BeanUtils.toBean(line, MesWmTransferLineRespVO.class)); + } + + @GetMapping("/list") + @Operation(summary = "获得转移单行列表") + @Parameter(name = "transferId", description = "转移单编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") + public CommonResult> getTransferLineList(@RequestParam("transferId") Long transferId) { + List list = transferLineService.getTransferLineListByTransferId(transferId); + return success(BeanUtils.toBean(list, MesWmTransferLineRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferPageReqVO.java new file mode 100644 index 0000000..6fb25ee --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferPageReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.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 MesWmTransferPageReqVO extends PageParam { + + @Schema(description = "转移单编号", example = "TR2026020001") + private String code; + + @Schema(description = "转移单名称", example = "钢板转移单") + private String name; + + @Schema(description = "转移单类型", example = "1") + private Integer type; + + @Schema(description = "转移日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] transferDate; + + @Schema(description = "单据状态", example = "0") + private Integer status; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferRespVO.java new file mode 100644 index 0000000..e9ce237 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferRespVO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 转移单 Response VO") +@Data +public class MesWmTransferRespVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "转移单编号", example = "TR2026020001") + private String code; + + @Schema(description = "转移单名称", example = "钢板转移单") + private String name; + + @Schema(description = "转移单类型", example = "1") + private Integer type; + + @Schema(description = "是否配送", example = "true") + private Boolean deliveryFlag; + + @Schema(description = "收货人", example = "张三") + private String recipientName; + + @Schema(description = "联系方式", example = "13800138000") + private String recipientTelephone; + + @Schema(description = "目的地", example = "上海市浦东新区") + private String destinationAddress; + + @Schema(description = "承运商", example = "顺丰速运") + private String carrier; + + @Schema(description = "运输单号", example = "SF123456789") + private String shippingNumber; + + @Schema(description = "是否已确认", example = "false") + private Boolean confirmFlag; + + @Schema(description = "转移日期") + private LocalDateTime transferDate; + + @Schema(description = "单据状态", example = "0") + private Integer status; + + @Schema(description = "备注", example = "备注信息") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferSaveReqVO.java new file mode 100644 index 0000000..cf3d395 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/MesWmTransferSaveReqVO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 转移单 Save Request VO") +@Data +public class MesWmTransferSaveReqVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "转移单编号", example = "TR2026020001") + private String code; + + @Schema(description = "转移单名称", example = "钢板转移单") + private String name; + + @Schema(description = "转移单类型", example = "1") + private Integer type; + + @Schema(description = "是否配送", example = "true") + private Boolean deliveryFlag; + + @Schema(description = "收货人", example = "张三") + private String recipientName; + + @Schema(description = "联系方式", example = "13800138000") + private String recipientTelephone; + + @Schema(description = "目的地", example = "上海市浦东新区") + private String destinationAddress; + + @Schema(description = "承运商", example = "顺丰速运") + private String carrier; + + @Schema(description = "运输单号", example = "SF123456789") + private String shippingNumber; + + @Schema(description = "是否已确认", example = "false") + private Boolean confirmFlag; + + @Schema(description = "转移日期") + private LocalDateTime transferDate; + + @Schema(description = "单据状态", example = "0") + private Integer status; + + @Schema(description = "备注", example = "备注信息") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailRespVO.java new file mode 100644 index 0000000..e0baf5a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailRespVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 调拨明细 Response VO") +@Data +public class MesWmTransferDetailRespVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "转移单行编号", example = "1") + private Long lineId; + + @Schema(description = "转移单编号", example = "1") + private Long transferId; + + @Schema(description = "物料编号", example = "1") + private Long itemId; + + @Schema(description = "上架数量", example = "100") + private BigDecimal quantity; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "移入仓库编号", example = "1") + private Long toWarehouseId; + + @Schema(description = "移入库区编号", example = "1") + private Long toLocationId; + + @Schema(description = "移入库位编号", example = "1") + private Long toAreaId; + + @Schema(description = "备注", example = "备注信息") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailSaveReqVO.java new file mode 100644 index 0000000..df5621d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailSaveReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 调拨明细 Save Request VO") +@Data +public class MesWmTransferDetailSaveReqVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "转移单行编号", example = "1") + private Long lineId; + + @Schema(description = "转移单编号", example = "1") + private Long transferId; + + @Schema(description = "物料编号", example = "1") + private Long itemId; + + @Schema(description = "上架数量", example = "100") + private BigDecimal quantity; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "移入仓库编号", example = "1") + private Long toWarehouseId; + + @Schema(description = "移入库区编号", example = "1") + private Long toLocationId; + + @Schema(description = "移入库位编号", example = "1") + private Long toAreaId; + + @Schema(description = "备注", example = "备注信息") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineRespVO.java new file mode 100644 index 0000000..a61db9f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineRespVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 转移单行 Response VO") +@Data +public class MesWmTransferLineRespVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "转移单编号", example = "1") + private Long transferId; + + @Schema(description = "库存记录编号", example = "1") + private Long materialStockId; + + @Schema(description = "物料编号", example = "1") + private Long itemId; + + @Schema(description = "转移数量", example = "100") + private BigDecimal quantity; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "移出仓库编号", example = "1") + private Long fromWarehouseId; + + @Schema(description = "移出库区编号", example = "1") + private Long fromLocationId; + + @Schema(description = "移出库位编号", example = "1") + private Long fromAreaId; + + @Schema(description = "备注", example = "备注信息") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java new file mode 100644 index 0000000..2b3f5a2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 转移单行 Save Request VO") +@Data +public class MesWmTransferLineSaveReqVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "转移单编号", example = "1") + private Long transferId; + + @Schema(description = "库存记录编号", example = "1") + private Long materialStockId; + + @Schema(description = "物料编号", example = "1") + private Long itemId; + + @Schema(description = "转移数量", example = "100") + private BigDecimal quantity; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "移出仓库编号", example = "1") + private Long fromWarehouseId; + + @Schema(description = "移出库区编号", example = "1") + private Long fromLocationId; + + @Schema(description = "移出库位编号", example = "1") + private Long fromAreaId; + + @Schema(description = "备注", example = "备注信息") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDO.java new file mode 100644 index 0000000..d593a3e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDO.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransferStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransferTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * MES 转移单 DO + * + * @author 芋道源码 + */ +@TableName("mes_wm_transfer") +@KeySequence("mes_wm_transfer_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmTransferDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 转移单编号 + */ + private String code; + /** + * 转移单名称 + */ + private String name; + /** + * 转移单类型 + * + * 枚举 {@link MesWmTransferTypeEnum} + */ + private Integer type; + + /** + * 是否配送 + */ + private Boolean deliveryFlag; + /** + * 收货人 + */ + private String recipientName; + /** + * 联系方式 + */ + private String recipientTelephone; + /** + * 目的地 + */ + private String destinationAddress; + /** + * 承运商 + */ + private String carrier; + /** + * 运输单号 + */ + private String shippingNumber; + /** + * 是否已确认 + */ + private Boolean confirmFlag; + + /** + * 转移日期 + */ + private LocalDateTime transferDate; + + /** + * 状态 + * + * 枚举 {@link MesWmTransferStatusEnum} + */ + private Integer status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDetailDO.java new file mode 100644 index 0000000..61a679f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDetailDO.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer; + +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 + * + * @author 芋道源码 + */ +@TableName("mes_wm_transfer_detail") +@KeySequence("mes_wm_transfer_detail_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmTransferDetailDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + + /** + * 转移单行编号 + * + * 关联 {@link MesWmTransferLineDO#getId()} + */ + private Long lineId; + /** + * 转移单编号 + * + * 关联 {@link MesWmTransferDO#getId()} + */ + private Long transferId; + /** + * 物料编号 + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 上架数量 + */ + private BigDecimal quantity; + /** + * 批次编号 + */ + private Long batchId; + + // TODO @AI:需要 @ + /** + * 移入仓库编号 + */ + private Long toWarehouseId; + /** + * 移入库区编号 + */ + private Long toLocationId; + /** + * 移入库位编号 + */ + private Long toAreaId; + + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferLineDO.java new file mode 100644 index 0000000..59fa528 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferLineDO.java @@ -0,0 +1,76 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer; + +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 + * + * @author 芋道源码 + */ +@TableName("mes_wm_transfer_line") +@KeySequence("mes_wm_transfer_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmTransferLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 转移单编号 + * + * 关联 {@link MesWmTransferDO#getId()} + */ + private Long transferId; + /** + * 库存记录编号 + */ + private Long materialStockId; + /** + * 物料编号 + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 转移数量 + */ + private BigDecimal quantity; + /** + * 批次编号 + */ + private Long batchId; + + // TODO @AI:需要 @ + /** + * 移出仓库编号 + */ + private Long fromWarehouseId; + /** + * 移出库区编号 + */ + private Long fromLocationId; + /** + * 移出库位编号 + */ + private Long fromAreaId; + + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageLineMapper.java index b4e2640..071ec18 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageLineMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageLineMapper.java @@ -16,6 +16,8 @@ import org.apache.ibatis.annotations.Mapper; public interface MesWmPackageLineMapper extends BaseMapperX { default PageResult selectPage(MesWmPackageLinePageReqVO reqVO) { + // TODO @芋艿:需确认“父箱详情 -> 装箱清单”是否需要汇总当前箱及其所有子孙箱的明细; + // ktg-mes 当前通过 SQL + ancestors 实现聚合查询,这里现在仅按 packageId 精确查询。 return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(MesWmPackageLineDO::getPackageId, reqVO.getPackageId()) .orderByDesc(MesWmPackageLineDO::getId)); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferDetailMapper.java new file mode 100644 index 0000000..0957ece --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferDetailMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 调拨明细 Mapper + */ +@Mapper +public interface MesWmTransferDetailMapper extends BaseMapperX { + + default List selectListByLineId(Long lineId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmTransferDetailDO::getLineId, lineId) + .orderByAsc(MesWmTransferDetailDO::getId)); + } + + default List selectListByTransferId(Long transferId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmTransferDetailDO::getTransferId, transferId) + .orderByAsc(MesWmTransferDetailDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferLineMapper.java new file mode 100644 index 0000000..f712f60 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferLineMapper.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 转移单行 Mapper + */ +@Mapper +public interface MesWmTransferLineMapper extends BaseMapperX { + + default List selectListByTransferId(Long transferId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmTransferLineDO::getTransferId, transferId) + .orderByAsc(MesWmTransferLineDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferMapper.java new file mode 100644 index 0000000..d509b11 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transfer/MesWmTransferMapper.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer; + +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.transfer.vo.MesWmTransferPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 转移单 Mapper + */ +@Mapper +public interface MesWmTransferMapper extends BaseMapperX { + + default PageResult selectPage(MesWmTransferPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmTransferDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmTransferDO::getName, reqVO.getName()) + .eqIfPresent(MesWmTransferDO::getType, reqVO.getType()) + .betweenIfPresent(MesWmTransferDO::getTransferDate, reqVO.getTransferDate()) + .eqIfPresent(MesWmTransferDO::getStatus, reqVO.getStatus()) + .orderByDesc(MesWmTransferDO::getId)); + } + + default MesWmTransferDO selectByCode(String code) { + return selectOne(MesWmTransferDO::getCode, code); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java index b46e0f2..067cb75 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java @@ -52,5 +52,7 @@ public interface DictTypeConstants { String MES_WM_RETURN_ISSUE_TYPE = "mes_return_issue_type"; // MES 生产退料类型 String MES_WM_MISC_ISSUE_TYPE = "mes_wm_misc_issue_type"; // MES 杂项出库类型 String MES_WM_MISC_ISSUE_STATUS = "mes_wm_misc_issue_status"; // MES 杂项出库单状态 + String MES_WM_TRANSFER_STATUS = "mes_wm_transfer_status"; // MES 转移单状态 + String MES_WM_TRANSFER_TYPE = "mes_wm_transfer_type"; // MES 转移单类型 } 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 f428436..27baef2 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 @@ -395,7 +395,18 @@ public interface ErrorCodeConstants { ErrorCode WM_PRODUCT_PRODUCE_LINE_NOT_EXISTS = new ErrorCode(1_040_709_100, "生产入库单行不存在"); ErrorCode WM_PRODUCT_PRODUCE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_709_200, "生产入库单明细不存在"); - // ========== MES 仓库管理-生产退料单(1-040-710-000) ========== + // ========== MES 仓库管理-转移调拨(1-040-710-000) ========== + ErrorCode WM_TRANSFER_NOT_EXISTS = new ErrorCode(1_040_710_000, "转移单不存在"); + ErrorCode WM_TRANSFER_NOT_EDITABLE = new ErrorCode(1_040_710_001, "当前转移单状态不允许编辑"); + ErrorCode WM_TRANSFER_CODE_DUPLICATE = new ErrorCode(1_040_710_002, "转移单编号已存在"); + ErrorCode WM_TRANSFER_NOT_DRAFT = new ErrorCode(1_040_710_003, "只有草稿状态的转移单才可操作"); + ErrorCode WM_TRANSFER_NOT_CONFIRMED = new ErrorCode(1_040_710_004, "只有待确认状态的转移单才可执行确认"); + ErrorCode WM_TRANSFER_NOT_UNEXECUTE = new ErrorCode(1_040_710_005, "只有待执行状态的转移单才可完成"); + ErrorCode WM_TRANSFER_ALREADY_FINISHED = new ErrorCode(1_040_710_006, "转移单已完成或已取消,无法继续操作"); + ErrorCode WM_TRANSFER_LINE_NOT_EXISTS = new ErrorCode(1_040_710_100, "转移单行不存在"); + ErrorCode WM_TRANSFER_DETAIL_NOT_EXISTS = new ErrorCode(1_040_710_200, "调拨明细不存在"); + + // ========== MES 仓库管理-生产退料单(1-040-711-000) ========== ErrorCode WM_RETURN_ISSUE_NOT_EXISTS = new ErrorCode(1_040_710_000, "生产退料单不存在"); ErrorCode WM_RETURN_ISSUE_STATUS_INVALID = new ErrorCode(1_040_710_001, "生产退料单状态不正确,无法执行该操作"); ErrorCode WM_RETURN_ISSUE_NOT_PREPARE = new ErrorCode(1_040_710_002, "只有草稿状态的退料单才可操作"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferStatusEnum.java new file mode 100644 index 0000000..eb690fe --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferStatusEnum.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * MES 转移单状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MesWmTransferStatusEnum implements ArrayValuable { + + // TODO @AI:/Users/yunai/Java/yudao-all-in-one/ruoyi-vue-pro/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmOutsourceReceiptStatusEnum.java,增加 “对应方法” + /** + * 草稿 + */ + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), + /** + * 待确认(仅配送模式) + */ + UNCONFIRMED(MesOrderStatusConstants.CONFIRMED, "待确认"), + /** + * 待上架 + */ + UNSTOCK(MesOrderStatusConstants.APPROVING, "待上架"), + /** + * 待执行 + */ + UNEXECUTE(MesOrderStatusConstants.APPROVED, "待执行"), + /** + * 已完成 + */ + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), + /** + * 已取消 + */ + CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmTransferStatusEnum::getStatus).toArray(Integer[]::new); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferTypeEnum.java new file mode 100644 index 0000000..c016113 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferTypeEnum.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +// TODO @AI:没有 IntArrayValuable,你检查下;应该是另外个 +/** + * MES 转移单类型枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MesWmTransferTypeEnum implements ArrayValuable { + + /** + * 内部调拨 + */ + INNER(1, "内部调拨"), + /** + * 外部调拨 + */ + OUTER(2, "外部调拨"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmTransferTypeEnum::getType).toArray(Integer[]::new); + + /** + * 类型值 + */ + private final Integer type; + /** + * 类型名 + */ + private final String name; + + public static MesWmTransferTypeEnum valueOf(Integer type) { + return Arrays.stream(values()).filter(e -> e.getType().equals(type)).findFirst().orElse(null); + } + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailService.java new file mode 100644 index 0000000..e5e00bc --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailService.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.service.wm.transfer; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDetailDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 调拨明细 Service 接口 + */ +public interface MesWmTransferDetailService { + + /** + * 创建调拨明细 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTransferDetail(@Valid MesWmTransferDetailSaveReqVO createReqVO); + + /** + * 更新调拨明细 + * + * @param updateReqVO 更新信息 + */ + void updateTransferDetail(@Valid MesWmTransferDetailSaveReqVO updateReqVO); + + /** + * 删除调拨明细 + * + * @param id 编号 + */ + void deleteTransferDetail(Long id); + + /** + * 获得调拨明细 + * + * @param id 编号 + * @return 调拨明细 + */ + MesWmTransferDetailDO getTransferDetail(Long id); + + /** + * 根据行 ID 获取明细列表 + * + * @param lineId 行 ID + * @return 明细列表 + */ + List getTransferDetailListByLineId(Long lineId); + + /** + * 根据转移单 ID 获取明细列表 + * + * @param transferId 转移单 ID + * @return 明细列表 + */ + List getTransferDetailListByTransferId(Long transferId); + + /** + * 根据转移单 ID 删除明细 + * + * @param transferId 转移单 ID + */ + void deleteTransferDetailByTransferId(Long transferId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailServiceImpl.java new file mode 100644 index 0000000..17034ef --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailServiceImpl.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.mes.service.wm.transfer; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer.MesWmTransferDetailMapper; +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.WM_TRANSFER_DETAIL_NOT_EXISTS; + +// TODO @AI:注释完善下 +/** + * MES 调拨明细 Service 实现类 + */ +@Service +@Validated +public class MesWmTransferDetailServiceImpl implements MesWmTransferDetailService { + + @Resource + private MesWmTransferDetailMapper transferDetailMapper; + + @Resource + @Lazy + private MesWmTransferLineService transferLineService; + + @Override + public Long createTransferDetail(MesWmTransferDetailSaveReqVO createReqVO) { + transferLineService.validateTransferLineExists(createReqVO.getLineId()); + // TODO @AI:看看还有没关联的数据要校验的;包括状态的 + + MesWmTransferDetailDO detail = BeanUtils.toBean(createReqVO, MesWmTransferDetailDO.class); + transferDetailMapper.insert(detail); + return detail.getId(); + } + + @Override + public void updateTransferDetail(MesWmTransferDetailSaveReqVO updateReqVO) { + validateTransferDetailExists(updateReqVO.getId()); + transferLineService.validateTransferLineExists(updateReqVO.getLineId()); + // TODO @AI:看看还有没关联的数据要校验的;包括状态的 + + MesWmTransferDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmTransferDetailDO.class); + transferDetailMapper.updateById(updateObj); + } + + @Override + public void deleteTransferDetail(Long id) { + // TODO @AI:看看还有没关联的数据要校验的;包括状态的 + validateTransferDetailExists(id); + transferDetailMapper.deleteById(id); + } + + @Override + public MesWmTransferDetailDO getTransferDetail(Long id) { + return transferDetailMapper.selectById(id); + } + + @Override + public List getTransferDetailListByLineId(Long lineId) { + return transferDetailMapper.selectListByLineId(lineId); + } + + @Override + public List getTransferDetailListByTransferId(Long transferId) { + return transferDetailMapper.selectListByTransferId(transferId); + } + + @Override + public void deleteTransferDetailByTransferId(Long transferId) { + getTransferDetailListByTransferId(transferId) + .forEach(detail -> transferDetailMapper.deleteById(detail.getId())); + } + + private void validateTransferDetailExists(Long id) { + if (transferDetailMapper.selectById(id) == null) { + throw exception(WM_TRANSFER_DETAIL_NOT_EXISTS); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineService.java new file mode 100644 index 0000000..c5e8651 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineService.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.service.wm.transfer; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTransferLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 转移单行 Service 接口 + */ +public interface MesWmTransferLineService { + + /** + * 创建转移单行 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTransferLine(@Valid MesWmTransferLineSaveReqVO createReqVO); + + /** + * 更新转移单行 + * + * @param updateReqVO 更新信息 + */ + void updateTransferLine(@Valid MesWmTransferLineSaveReqVO updateReqVO); + + /** + * 删除转移单行 + * + * @param id 编号 + */ + void deleteTransferLine(Long id); + + /** + * 获得转移单行 + * + * @param id 编号 + * @return 转移单行 + */ + MesWmTransferLineDO getTransferLine(Long id); + + /** + * 根据转移单 ID 获取行列表 + * + * @param transferId 转移单 ID + * @return 行列表 + */ + List getTransferLineListByTransferId(Long transferId); + + /** + * 根据转移单 ID 删除行 + * + * @param transferId 转移单 ID + */ + void deleteTransferLineByTransferId(Long transferId); + + /** + * 校验转移单行是否存在 + * + * @param id 编号 + * @return 转移单行 + */ + MesWmTransferLineDO validateTransferLineExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java new file mode 100644 index 0000000..af03fda --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferLineServiceImpl.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.service.wm.transfer; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTransferLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer.MesWmTransferLineMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +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.WM_TRANSFER_LINE_NOT_EXISTS; + +// TODO @AI:注释完善下 +/** + * MES 转移单行 Service 实现类 + */ +@Service +@Validated +public class MesWmTransferLineServiceImpl implements MesWmTransferLineService { + + @Resource + private MesWmTransferLineMapper transferLineMapper; + + @Resource + @Lazy + private MesWmTransferService transferService; + @Resource + private MesMdItemService itemService; + + @Override + public Long createTransferLine(MesWmTransferLineSaveReqVO createReqVO) { + transferService.validateTransferEditable(createReqVO.getTransferId()); + itemService.validateItemExists(createReqVO.getItemId()); + // TODO @AI:看看还有没关联的数据要校验的;包括状态的 + + MesWmTransferLineDO line = BeanUtils.toBean(createReqVO, MesWmTransferLineDO.class); + transferLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateTransferLine(MesWmTransferLineSaveReqVO updateReqVO) { + validateTransferLineExists(updateReqVO.getId()); + transferService.validateTransferEditable(updateReqVO.getTransferId()); + itemService.validateItemExists(updateReqVO.getItemId()); + // TODO @AI:看看还有没关联的数据要校验的;包括状态的 + + MesWmTransferLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmTransferLineDO.class); + transferLineMapper.updateById(updateObj); + } + + @Override + public void deleteTransferLine(Long id) { + validateTransferLineExists(id); + transferLineMapper.deleteById(id); + } + + @Override + public MesWmTransferLineDO getTransferLine(Long id) { + return transferLineMapper.selectById(id); + } + + @Override + public List getTransferLineListByTransferId(Long transferId) { + return transferLineMapper.selectListByTransferId(transferId); + } + + @Override + public void deleteTransferLineByTransferId(Long transferId) { + getTransferLineListByTransferId(transferId) + .forEach(line -> transferLineMapper.deleteById(line.getId())); + } + + @Override + public MesWmTransferLineDO validateTransferLineExists(Long id) { + MesWmTransferLineDO line = transferLineMapper.selectById(id); + if (line == null) { + throw exception(WM_TRANSFER_LINE_NOT_EXISTS); + } + return line; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferService.java new file mode 100644 index 0000000..e7d9c35 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferService.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.mes.service.wm.transfer; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.MesWmTransferPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.MesWmTransferSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDO; +import jakarta.validation.Valid; + +/** + * MES 转移单 Service 接口 + */ +public interface MesWmTransferService { + + /** + * 创建转移单 + */ + Long createTransfer(@Valid MesWmTransferSaveReqVO createReqVO); + + /** + * 修改转移单 + */ + void updateTransfer(@Valid MesWmTransferSaveReqVO updateReqVO); + + /** + * 删除转移单 + */ + void deleteTransfer(Long id); + + /** + * 获得转移单 + */ + MesWmTransferDO getTransfer(Long id); + + /** + * 获得转移单分页 + */ + PageResult getTransferPage(MesWmTransferPageReqVO pageReqVO); + + /** + * 提交转移单(草稿 → 待确认/待上架) + */ + void submitTransfer(Long id); + + /** + * 确认转移单(待确认 → 待上架) + */ + void confirmTransfer(Long id); + + /** + * 完成转移单(待执行 → 已完成) + */ + void finishTransfer(Long id); + + /** + * 取消转移单 + */ + void cancelTransfer(Long id); + + /** + * 校验转移单存在且处于可编辑状态 + */ + MesWmTransferDO validateTransferEditable(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java new file mode 100644 index 0000000..1708480 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java @@ -0,0 +1,206 @@ +package cn.iocoder.yudao.module.mes.service.wm.transfer; + +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.transfer.vo.MesWmTransferPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.MesWmTransferSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer.MesWmTransferMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransferStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransferTypeEnum; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +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 MesWmTransferServiceImpl implements MesWmTransferService { + + @Resource + private MesWmTransferMapper transferMapper; + + // TODO @AI:MesWmTransferLineService、MesWmTransferDetailService 类不存在; + @Resource + private MesWmTransferLineService transferLineService; + @Resource + private MesWmTransferDetailService transferDetailService; + + @Override + public Long createTransfer(MesWmTransferSaveReqVO createReqVO) { + // 校验编码唯一 + validateCodeUnique(null, createReqVO.getCode()); + + // 插入 + MesWmTransferDO transfer = BeanUtils.toBean(createReqVO, MesWmTransferDO.class); + transfer.setStatus(MesWmTransferStatusEnum.PREPARE.getStatus()); + transferMapper.insert(transfer); + return transfer.getId(); + } + + @Override + public void updateTransfer(MesWmTransferSaveReqVO updateReqVO) { + // 校验存在 + 草稿状态 + validateTransferExistsAndDraft(updateReqVO.getId()); + // 校验编码唯一 + validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + + // 更新 + MesWmTransferDO updateObj = BeanUtils.toBean(updateReqVO, MesWmTransferDO.class); + transferMapper.updateById(updateObj); + } + + // TODO @AI:少了事务; + @Override + public void deleteTransfer(Long id) { + // 校验存在 + 草稿状态 + validateTransferExistsAndDraft(id); + + // 级联删除明细和行 + transferDetailService.deleteTransferDetailByTransferId(id); + transferLineService.deleteTransferLineByTransferId(id); + // 删除 + transferMapper.deleteById(id); + } + + @Override + public MesWmTransferDO getTransfer(Long id) { + return transferMapper.selectById(id); + } + + @Override + public PageResult getTransferPage(MesWmTransferPageReqVO pageReqVO) { + return transferMapper.selectPage(pageReqVO); + } + + @Override + public void submitTransfer(Long id) { + // 校验存在 + 草稿状态 + MesWmTransferDO transfer = validateTransferExistsAndDraft(id); + + // TODO @芋艿:这里的逻辑对齐不对;需要再次看看; + // 根据转移单类型设置状态 + // 内部调拨:草稿 -> 待上架 + // 外部调拨:草稿 -> 待确认 + if (MesWmTransferTypeEnum.INNER.getType().equals(transfer.getType())) { + transfer.setStatus(MesWmTransferStatusEnum.UNSTOCK.getStatus()); + } else { + transfer.setStatus(MesWmTransferStatusEnum.UNCONFIRMED.getStatus()); + } + transferMapper.updateById(transfer); + } + + @Override + public void confirmTransfer(Long id) { + // 校验存在 + 待确认状态 + MesWmTransferDO transfer = validateTransferExistsAndConfirm(id); + + // 更新状态:待确认 -> 待上架 + transfer.setStatus(MesWmTransferStatusEnum.UNSTOCK.getStatus()); + transfer.setConfirmFlag(true); + transferMapper.updateById(transfer); + } + + @Override + public void finishTransfer(Long id) { + // 校验存在 + 待执行状态 + MesWmTransferDO transfer = validateTransferExistsAndUnexecute(id); + + // TODO: 执行库存转移逻辑 + + // 更新状态:待执行 -> 已完成 + transfer.setStatus(MesWmTransferStatusEnum.FINISHED.getStatus()); + transferMapper.updateById(transfer); + } + + @Override + public void cancelTransfer(Long id) { + // 校验存在 + 非已完成/已取消状态 + MesWmTransferDO transfer = validateTransferExistsAndNotFinished(id); + + // 更新状态 -> 已取消 + transfer.setStatus(MesWmTransferStatusEnum.CANCELED.getStatus()); + transferMapper.updateById(transfer); + } + + @Override + public MesWmTransferDO validateTransferEditable(Long id) { + MesWmTransferDO transfer = transferMapper.selectById(id); + // TODO @AI:错误码缺少;是不是少了 WM_ + if (transfer == null) { + throw exception(WM_TRANSFER_NOT_EXISTS); + } + if (!MesWmTransferStatusEnum.PREPARE.getStatus().equals(transfer.getStatus())) { + throw exception(WM_TRANSFER_NOT_EDITABLE); + } + return transfer; + } + + // ==================== 私有方法 ==================== + + private void validateCodeUnique(Long id, String code) { + MesWmTransferDO transfer = transferMapper.selectByCode(code); + if (transfer == null) { + return; + } + // 如果 id 为空,说明是新增,存在同名则报错 + if (id == null) { + throw exception(WM_TRANSFER_CODE_DUPLICATE); + } + // 如果 id 不为空,说明是修改,存在同名且不是自己则报错 + if (!transfer.getId().equals(id)) { + throw exception(WM_TRANSFER_CODE_DUPLICATE); + } + } + + private MesWmTransferDO validateTransferExistsAndDraft(Long id) { + MesWmTransferDO transfer = transferMapper.selectById(id); + if (transfer == null) { + throw exception(WM_TRANSFER_NOT_EXISTS); + } + if (!MesWmTransferStatusEnum.PREPARE.getStatus().equals(transfer.getStatus())) { + throw exception(WM_TRANSFER_NOT_DRAFT); + } + return transfer; + } + + private MesWmTransferDO validateTransferExistsAndConfirm(Long id) { + MesWmTransferDO transfer = transferMapper.selectById(id); + if (transfer == null) { + throw exception(WM_TRANSFER_NOT_EXISTS); + } + if (!MesWmTransferStatusEnum.UNCONFIRMED.getStatus().equals(transfer.getStatus())) { + throw exception(WM_TRANSFER_NOT_CONFIRMED); + } + return transfer; + } + + private MesWmTransferDO validateTransferExistsAndUnexecute(Long id) { + MesWmTransferDO transfer = transferMapper.selectById(id); + if (transfer == null) { + throw exception(WM_TRANSFER_NOT_EXISTS); + } + if (!MesWmTransferStatusEnum.UNEXECUTE.getStatus().equals(transfer.getStatus())) { + throw exception(WM_TRANSFER_NOT_UNEXECUTE); + } + return transfer; + } + + private MesWmTransferDO validateTransferExistsAndNotFinished(Long id) { + MesWmTransferDO transfer = transferMapper.selectById(id); + if (transfer == null) { + throw exception(WM_TRANSFER_NOT_EXISTS); + } + if (MesWmTransferStatusEnum.FINISHED.getStatus().equals(transfer.getStatus()) + || MesWmTransferStatusEnum.CANCELED.getStatus().equals(transfer.getStatus())) { + throw exception(WM_TRANSFER_ALREADY_FINISHED); + } + return transfer; + } + +}