From 7c90ad4a76921ea9912ee5fbc0ace5e6edfbb185 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 4 Apr 2026 20:07:56 +0800 Subject: [PATCH] ✨ feat(mes): 新增生产流转卡状态管理功能 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java | 28 ++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java | 4 ++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java | 1 - yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 2 ++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java | 16 +++++++++++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java | 21 +++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 7 files changed, 139 insertions(+), 8 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java index 53db8d3..6e7ed79 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java @@ -80,6 +80,34 @@ public class MesProCardController { return success(true); } + @PutMapping("/submit") + @Operation(summary = "提交生产流转卡") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:pro-card:update')") + public CommonResult submitCard(@RequestParam("id") Long id) { + cardService.submitCard(id); + return success(true); + } + + // TODO @AI:要不改成 finish,因为它是完成; + @PutMapping("/execute") + @Operation(summary = "执行生产流转卡") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:pro-card:update')") + public CommonResult executeCard(@RequestParam("id") Long id) { + cardService.executeCard(id); + return success(true); + } + + @PutMapping("/cancel") + @Operation(summary = "取消生产流转卡") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:pro-card:update')") + public CommonResult cancelCard(@RequestParam("id") Long id) { + cardService.cancelCard(id); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得生产流转卡") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java index 1925873..59e2c7e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/vo/MesProCardRespVO.java @@ -62,6 +62,10 @@ public class MesProCardRespVO { @ExcelProperty("流转数量") private BigDecimal transferedQuantity; + @Schema(description = "状态", example = "0") + @ExcelProperty("状态") + private Integer status; + @Schema(description = "备注", example = "备注") @ExcelProperty("备注") private String remark; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java index 500a366..750ad47 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/card/MesProCardDO.java @@ -54,7 +54,6 @@ public class MesProCardDO extends BaseDO { * 流转数量 */ private BigDecimal transferedQuantity; - // TODO @芋艿:预留字段,暂未使用; /** * 状态 * 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 0fea051..fabd288 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 @@ -274,6 +274,8 @@ public interface ErrorCodeConstants { // ========== MES 生产管理-生产流转卡(1-040-507-000) ========== ErrorCode PRO_CARD_NOT_EXISTS = new ErrorCode(1_040_507_000, "生产流转卡不存在"); ErrorCode PRO_CARD_CODE_DUPLICATE = new ErrorCode(1_040_507_001, "流转卡编码已存在"); + ErrorCode PRO_CARD_STATUS_ERROR = new ErrorCode(1_040_507_002, "流转卡状态不正确"); + ErrorCode PRO_CARD_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_507_003, "已完成或已取消的流转卡不允许取消"); // ========== MES 生产管理-流转卡工序(1-040-507-100) ========== ErrorCode PRO_CARD_PROCESS_NOT_EXISTS = new ErrorCode(1_040_507_100, "流转卡工序记录不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java index a30ce7c..34c65ef 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardProcessServiceImpl.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process.MesProCa import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.process.MesProCardProcessSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardProcessDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.card.MesProCardProcessMapper; +import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -30,10 +31,18 @@ public class MesProCardProcessServiceImpl implements MesProCardProcessService { @Lazy private MesProCardService cardService; + @Resource + private MesProProcessService processService; + @Override public Long createCardProcess(MesProCardProcessSaveReqVO createReqVO) { - // 1. 校验流转卡存在 + // TODO @AI:validateXXXSaveData + // 1.1 校验流转卡存在 cardService.validateCardExists(createReqVO.getCardId()); + // 1.2 校验工序存在 + if (createReqVO.getProcessId() != null) { + processService.validateProcessExists(createReqVO.getProcessId()); + } // 2. 插入 MesProCardProcessDO cardProcess = BeanUtils.toBean(createReqVO, MesProCardProcessDO.class); @@ -45,8 +54,13 @@ public class MesProCardProcessServiceImpl implements MesProCardProcessService { public void updateCardProcess(MesProCardProcessSaveReqVO updateReqVO) { // 1.1 校验存在 validateCardProcessExists(updateReqVO.getId()); + // TODO @AI:validateXXXSaveData // 1.2 校验流转卡存在 cardService.validateCardExists(updateReqVO.getCardId()); + // 1.3 校验工序存在 + if (updateReqVO.getProcessId() != null) { + processService.validateProcessExists(updateReqVO.getProcessId()); + } // 2. 更新 MesProCardProcessDO updateObj = BeanUtils.toBean(updateReqVO, MesProCardProcessDO.class); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java index 87ce413..f01f1e2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardService.java @@ -67,4 +67,25 @@ public interface MesProCardService { */ List getCardSimpleList(); + /** + * 提交生产流转卡(草稿 → 已确认) + * + * @param id 编号 + */ + void submitCard(Long id); + + /** + * 执行生产流转卡(已确认 → 已完成) + * + * @param id 编号 + */ + void executeCard(Long id); + + /** + * 取消生产流转卡(任意非已完成/已取消状态 → 已取消) + * + * @param id 编号 + */ + void cancelCard(Long id); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java index 2248a90..607ce4a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/card/MesProCardServiceImpl.java @@ -3,13 +3,14 @@ package cn.iocoder.yudao.module.mes.service.pro.card; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - -import java.util.List; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.card.vo.MesProCardSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.card.MesProCardDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.card.MesProCardMapper; +import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; import jakarta.annotation.Resource; @@ -18,9 +19,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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.PRO_CARD_CODE_DUPLICATE; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRO_CARD_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 生产流转卡 Service 实现类 @@ -42,17 +44,23 @@ public class MesProCardServiceImpl implements MesProCardService { @Resource private MesProWorkOrderService workOrderService; @Resource + private MesMdItemService itemService; + @Resource private MesWmBarcodeService barcodeService; @Override public Long createCard(MesProCardSaveReqVO createReqVO) { + // TODO @AI:validateXXXSaveData // 1.1 校验编码唯一 validateCardCodeUnique(null, createReqVO.getCode()); // 1.2 校验工单存在 workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); + // 1.3 校验物料存在 + itemService.validateItemExists(createReqVO.getItemId()); // 2. 插入 - MesProCardDO card = BeanUtils.toBean(createReqVO, MesProCardDO.class); + MesProCardDO card = BeanUtils.toBean(createReqVO, MesProCardDO.class) + .setStatus(MesProWorkOrderStatusEnum.PREPARE.getStatus()); cardMapper.insert(card); // 3. 自动生成条码 @@ -63,10 +71,15 @@ public class MesProCardServiceImpl implements MesProCardService { @Override public void updateCard(MesProCardSaveReqVO updateReqVO) { + // TODO @AI:validateXXXSaveData // 1.1 校验存在 validateCardExists(updateReqVO.getId()); // 1.2 校验编码唯一 validateCardCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // 1.3 校验工单存在 + workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId()); + // 1.4 校验物料存在 + itemService.validateItemExists(updateReqVO.getItemId()); // 2. 更新 MesProCardDO updateObj = BeanUtils.toBean(updateReqVO, MesProCardDO.class); @@ -99,13 +112,63 @@ public class MesProCardServiceImpl implements MesProCardService { return cardMapper.selectList(); } + @Override + public void submitCard(Long id) { + // 1. 校验存在 + 草稿状态 + validateCardExistsAndStatus(id, MesProWorkOrderStatusEnum.PREPARE); + + // 2. 提交(草稿 → 已确认) + cardMapper.updateById(new MesProCardDO() + .setId(id).setStatus(MesProWorkOrderStatusEnum.CONFIRMED.getStatus())); + } + + @Override + public void executeCard(Long id) { + // 1. 校验存在 + 已确认状态 + validateCardExistsAndStatus(id, MesProWorkOrderStatusEnum.CONFIRMED); + + // 2. 执行(已确认 → 已完成) + cardMapper.updateById(new MesProCardDO() + .setId(id).setStatus(MesProWorkOrderStatusEnum.FINISHED.getStatus())); + } + + @Override + public void cancelCard(Long id) { + // 1.1 校验存在 + MesProCardDO card = validateCardExistsInternal(id); + // 1.2 已完成和已取消不允许取消 + if (ObjectUtils.equalsAny(card.getStatus(), + MesProWorkOrderStatusEnum.FINISHED.getStatus(), + MesProWorkOrderStatusEnum.CANCELED.getStatus())) { + throw exception(PRO_CARD_CANCEL_NOT_ALLOWED); + } + + // 2. 取消 + cardMapper.updateById(new MesProCardDO() + .setId(id).setStatus(MesProWorkOrderStatusEnum.CANCELED.getStatus())); + } + // ==================== 校验方法 ==================== @Override public void validateCardExists(Long id) { - if (cardMapper.selectById(id) == null) { + validateCardExistsInternal(id); + } + + private MesProCardDO validateCardExistsInternal(Long id) { + MesProCardDO card = cardMapper.selectById(id); + if (card == null) { throw exception(PRO_CARD_NOT_EXISTS); } + return card; + } + + private MesProCardDO validateCardExistsAndStatus(Long id, MesProWorkOrderStatusEnum status) { + MesProCardDO card = validateCardExistsInternal(id); + if (ObjUtil.notEqual(status.getStatus(), card.getStatus())) { + throw exception(PRO_CARD_STATUS_ERROR); + } + return card; } private void validateCardCodeUnique(Long id, String code) { -- libgit2 0.21.4