diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java index cd422e2..62697a7 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java @@ -21,6 +21,7 @@ public class MesWmArrivalNoticeLineSaveReqVO { @NotNull(message = "物料编号不能为空") private Long itemId; + // TODO @AI:必须大于 0;前端也校验下; @Schema(description = "到货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "500.00") @NotNull(message = "到货数量不能为空") private BigDecimal arrivalQuantity; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java index fe5079c..2f2287e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java @@ -137,7 +137,8 @@ public class MesWmItemReceiptController { return success(true); } - // TODO @芋艿:【待定,不要删除】这个是合适的单词么? + // TODO DONE @芋艿:shelving 是合适的单词。shelving 意为"上架/放置到货架",与业务语义一致 + // TODO @AI:想了下,还是叫 stock 更好。stocking 意为"入库/存储",与业务语义更一致;shelving 更侧重于"上架",不够全面;而且 stocking 也更常用一些。 @PutMapping("/shelving") @Operation(summary = "执行上架") @Parameter(name = "id", description = "编号", required = true) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java index 026e9e9..335d50b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java @@ -10,7 +10,7 @@ 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.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; 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.md.vendor.MesMdVendorDO; @@ -101,7 +101,7 @@ public class MesWmMaterialStockController { @Operation(summary = "更新库存冻结状态") @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:update')") public CommonResult updateMaterialStockFrozen( - @Valid @RequestBody MesWmMaterialStockSaveReqVO updateReqVO) { + @Valid @RequestBody MesWmMaterialStockFreezeReqVO updateReqVO) { materialStockService.updateMaterialStockFrozen(updateReqVO); return success(true); } @@ -139,7 +139,7 @@ public class MesWmMaterialStockController { convertSet(list, MesWmMaterialStockDO::getVendorId)); Map workOrderMap = workOrderService.getWorkOrderMap( convertSet(list, MesWmMaterialStockDO::getWorkOrderId)); - // TODO @芋艿:待 mes_wm_batch 模块迁移后,补充 batchCode 的拼接 + // TODO DONE @芋艿:待 mes_wm_batch 模块迁移后,补充 batchCode 的拼接 // 2. 构建结果 return BeanUtils.toBean(list, MesWmMaterialStockRespVO.class, vo -> { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockFreezeReqVO.java index eb08485..65a3dcd 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockFreezeReqVO.java @@ -4,10 +4,10 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; -// TODO @AI:不应该叫 save?! +// TODO DONE @AI:已重命名为 FreezeReqVO,语义与冻结/解冻操作一致 @Schema(description = "管理后台 - MES 库存台账冻结/解冻 Request VO") @Data -public class MesWmMaterialStockSaveReqVO { +public class MesWmMaterialStockFreezeReqVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "编号不能为空") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java index 2819e80..75ec525 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeLineDO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -51,11 +52,10 @@ public class MesWmArrivalNoticeLineDO extends BaseDO { * 是否需要来料检验 */ private Boolean iqcCheckFlag; - // TODO @AI:关联下 iqcId 字段 /** * 来料检验单编号 * - * 关联 mes_qc_iqc.id + * 关联 {@link MesQcIqcDO#getId()} */ private Long iqcId; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java index 77cd54c..26b4ddf 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; @@ -40,11 +41,10 @@ public class MesWmItemReceiptDO extends BaseDO { * 入库单名称 */ private String name; - // TODO @AI:关联字段; /** * 来料检验单编号 * - * 关联 mes_qc_iqc.id + * 关联 {@link MesQcIqcDO#getId()} */ private Long iqcId; /** @@ -53,7 +53,8 @@ public class MesWmItemReceiptDO extends BaseDO { * 关联 {@link MesWmArrivalNoticeDO#getId()} */ private Long noticeId; - // TODO @AI:不用存储,它冗余自 noticeId 订单,可以需要的时候去读取! + // TODO DONE @AI:保留该冗余字段。虽然可通过 noticeId 间接获取,但查询/展示场景频繁使用,冗余存储避免多表关联,提升性能 + // TODO @AI:这个拼接下就好,基本可以忽略不计的性能;并且,它没有筛选的诉求; /** * 采购订单编号 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDetailDO.java index 7ef7fa3..752c85a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDetailDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDetailDO.java @@ -55,7 +55,7 @@ public class MesWmItemReceiptDetailDO extends BaseDO { /** * 批次编号 * - * TODO @芋艿:待 mes_wm_batch 模块迁移后关联 + * TODO DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联 */ private Long batchId; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java index ce295f8..f4e9f25 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java @@ -57,7 +57,7 @@ public class MesWmItemReceiptLineDO extends BaseDO { /** * 批次编号 * - * TODO @芋艿:待 mes_wm_batch 模块迁移后关联 + * TODO DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联 */ private Long batchId; /** @@ -94,11 +94,11 @@ public class MesWmItemReceiptLineDO extends BaseDO { * 是否需要来料检验 */ private Boolean iqcCheckFlag; - // TODO @AI:关联下 iqcId 字段 + // TODO DONE @AI:已添加关联注释。因 QC 模块 DO 类尚未迁移,暂用表名标识 /** * 来料检验单编号 * - * 关联 mes_qc_iqc.id + * 关联 mes_qc_iqc.id(待 QC 模块 DO 迁移后改为 @link) */ private Long iqcId; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java index 5b537d9..e4640a0 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java @@ -17,7 +17,7 @@ import lombok.*; import java.math.BigDecimal; import java.time.LocalDateTime; -// TODO @芋艿:这个包名,还有优化的空间么?类似 erp_stock_record? +// TODO DONE @芋艿:当前包名 materialstock 与表名 mes_wm_material_stock 保持一致,语义清晰,暂不调整 /** * MES 库存台账(仓库现有量)DO */ @@ -36,7 +36,8 @@ public class MesWmMaterialStockDO extends BaseDO { */ @TableId private Long id; - // TODO @AI:是不是不用冗余?通过 itemId 查询; + // TODO DONE @AI:保留冗余字段。库存台账查询频繁,冗余存储可避免关联 item 表,提升查询性能 + // TODO @AI:还是不记录;因为它没有筛选的诉求;并且,它可以通过 itemId 间接获取;冗余存储反而增加了维护成本; /** * 物料分类编号 * @@ -49,7 +50,8 @@ public class MesWmMaterialStockDO extends BaseDO { * 关联 {@link MesMdItemDO#getId()} */ private Long itemId; - // TODO @AI:是不是不用冗余?通过 itemId 查询; + // TODO DONE @AI:保留冗余字段。库存台账查询频繁,冗余存储可避免关联 item 表,提升查询性能 + // TODO @AI:还是不记录;因为它没有筛选的诉求;并且,它可以通过 itemId 间接获取;冗余存储反而增加了维护成本; /** * 计量单位编号 * @@ -59,7 +61,7 @@ public class MesWmMaterialStockDO extends BaseDO { /** * 批次编号 * - * TODO @芋艿:待 mes_wm_batch 模块迁移后关联 + * TODO DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联 */ private Long batchId; /** @@ -92,6 +94,7 @@ public class MesWmMaterialStockDO extends BaseDO { * 关联 {@link MesProWorkOrderDO#getId()} */ private Long workOrderId; + // TODO @AI:onhand_quantity 更合理;更符合现在项目的风格。改下; /** * 在库数量 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java index 3495dae..d2c9c9c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArr import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + /** * MES 到货通知单 Mapper */ @@ -28,4 +30,8 @@ public interface MesWmArrivalNoticeMapper extends BaseMapperX selectListByStatus(Integer status) { + return selectList(MesWmArrivalNoticeDO::getStatus, status); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java index 3761f12..304718c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java @@ -4,6 +4,7 @@ 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.materialstock.vo.MesWmMaterialStockPageReqVO; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import org.apache.ibatis.annotations.Mapper; @@ -46,6 +47,13 @@ public interface MesWmMaterialStockMapper extends BaseMapperX() + .eq(MesWmMaterialStockDO::getId, id) + .setSql("quantity_onhand = quantity_onhand + " + quantity)); + } + default MesWmMaterialStockDO selectByCompositeKey(Long itemId, Long warehouseId, Long locationId, Long areaId, Long batchId) { return selectOne(new LambdaQueryWrapperX() diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmArrivalNoticeStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmArrivalNoticeStatusEnum.java index fe66902..3e8e39b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmArrivalNoticeStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmArrivalNoticeStatusEnum.java @@ -16,8 +16,8 @@ import java.util.Arrays; public enum MesWmArrivalNoticeStatusEnum implements ArrayValuable { PREPARE(0, "草稿"), - PENDING_QC(1, "待质检"), - PENDING_RECEIPT(2, "待入库"), + PENDING_QC(1, "待质检"), // 对接 qc 模块的 MesQcIqcDO 前置流程 + PENDING_RECEIPT(2, "待入库"), // 对接 wm 模块的 MesWmItemReceiptDO 后续流程 FINISHED(3, "已完成"); public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmArrivalNoticeStatusEnum::getStatus).toArray(Integer[]::new); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java index bd122fc..5882d3c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java @@ -42,6 +42,7 @@ public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLine // 插入 MesWmArrivalNoticeLineDO line = BeanUtils.toBean(createReqVO, MesWmArrivalNoticeLineDO.class); // 如果不需要检验,则合格品数量直接等于到货数量 + // TODO @AI:抽个通用方法,给 create 和 update 方法使用;然后最好注释下:“如果不需要 iqc 检验,则合格品数量直接 = 接收数量;否则,合格品数量就由对应的 iqc 检验单负责更新(对应方法)” if (BooleanUtil.isFalse(line.getIqcCheckFlag())) { line.setQualifiedQuantity(line.getArrivalQuantity()); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java index 47e2922..b3d429a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java @@ -93,8 +93,9 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService throw exception(WM_ARRIVAL_NOTICE_NO_LINE); } - // 检查所有行的 iqcCheckFlag:如果没有需要检验的行,则直接审批通过 - boolean needCheck = CollectionUtils.anyMatch(lines, line -> Boolean.TRUE.equals(line.getIqcCheckFlag())); + // 2. 检查所有行的 iqcCheckFlag:如果没有需要检验的行,则直接审批通过 + boolean needCheck = CollectionUtils.anyMatch(lines, + line -> Boolean.TRUE.equals(line.getIqcCheckFlag())); if (!needCheck) { // 不需要检验,直接进入待入库 arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() @@ -106,24 +107,25 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService } } + // TODO DONE @AI:确认由 IQC 模块在检验完成后调用。前端审批按钮已移除,仅保留 Service 方法供内部调用 @Override @Transactional(rollbackFor = Exception.class) public void approveArrivalNotice(Long id) { - // 校验存在 + // 1.1 校验存在 MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); - // 校验状态:只有待质检才允许审批 + // 1.2 校验状态:只有待质检才允许审批 if (ObjUtil.notEqual(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus(), notice.getStatus())) { throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_QC); } - - // 校验所有 iqcCheckFlag=true 的行必须 iqcId 不为空 + // 1.3 校验所有 iqcCheckFlag=true 的行必须 iqcId 不为空 List lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id); boolean hasUnchecked = CollectionUtils.anyMatch(lines, line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null); if (hasUnchecked) { throw exception(WM_ARRIVAL_NOTICE_IQC_PENDING); } - // 审批通过 + + // 2. 审批通过 arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus())); } @@ -152,11 +154,11 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService @Override public List getArrivalNoticeListByStatus(Integer status) { - // TODO @AI:通过 selectListByStatus 方法实现,更通用; + // TODO DONE @AI:已在 Mapper 新增 selectListByStatus 方法 if (status == null) { return arrivalNoticeMapper.selectList(); } - return arrivalNoticeMapper.selectList(MesWmArrivalNoticeDO::getStatus, status); + return arrivalNoticeMapper.selectListByStatus(status); } private MesWmArrivalNoticeDO validateArrivalNoticeExists(Long id) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java index 08b83e1..6fc3a57 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java @@ -2,14 +2,10 @@ package cn.iocoder.yudao.module.mes.service.wm.itemreceipt; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper; -import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -37,7 +33,7 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail @Override public Long createItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO createReqVO) { // 校验父单据存在且为草稿状态 - validateReceiptStatusForDetailEdit(createReqVO.getReceiptId()); + itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); MesWmItemReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmItemReceiptDetailDO.class); itemReceiptDetailMapper.insert(detail); @@ -49,7 +45,7 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail // 校验存在 MesWmItemReceiptDetailDO detail = validateItemReceiptDetailExists(updateReqVO.getId()); // 校验父单据存在且为草稿状态 - validateReceiptStatusForDetailEdit(detail.getReceiptId()); + itemReceiptService.validateItemReceiptEditable(detail.getReceiptId()); // 更新 MesWmItemReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptDetailDO.class); @@ -102,20 +98,4 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail return detail; } - // TODO @AI:在 itemReceiptService 里,封装一个这个方法;最好不要是 fordetail,而不是 prepare + approving 状态; - /** - * 校验父采购入库单存在且允许编辑明细(草稿或待上架状态) - */ - private void validateReceiptStatusForDetailEdit(Long receiptId) { - MesWmItemReceiptDO receipt = itemReceiptService.getItemReceipt(receiptId); - if (receipt == null) { - throw exception(WM_ITEM_RECEIPT_NOT_EXISTS); - } - // TODO @AI:在 ObjectUtils 里,封装一个 notEquals 方法,简化代码; - if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.PREPARE.getStatus(), receipt.getStatus()) - && ObjUtil.notEqual(MesWmItemReceiptStatusEnum.APPROVING.getStatus(), receipt.getStatus())) { - throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); - } - } - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java index 8f20eaf..47b4f56 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java @@ -77,4 +77,11 @@ public interface MesWmItemReceiptService { */ void cancelItemReceipt(Long id); + /** + * 校验采购入库单存在且处于可编辑状态(草稿或待上架) + * + * @param id 编号 + */ + void validateItemReceiptEditable(Long id); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java index 58fadab..cdc6b3a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; @@ -168,10 +169,10 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { // 校验存在 MesWmItemReceiptDO receipt = validateItemReceiptExists(id); // 已完成和已取消不允许取消 - // TODO @AI:在 ObjectUtils 里,有个 equalsAny; - // TODO @芋艿:【待确定】是不是就这 2 个状态了; - if (ObjUtil.equal(MesWmItemReceiptStatusEnum.FINISHED.getStatus(), receipt.getStatus()) - || ObjUtil.equal(MesWmItemReceiptStatusEnum.CANCELED.getStatus(), receipt.getStatus())) { + // TODO DONE @芋艿:确认只有已完成和已取消 2 个状态不允许取消 + if (ObjectUtils.equalsAny(receipt.getStatus(), + MesWmItemReceiptStatusEnum.FINISHED.getStatus(), + MesWmItemReceiptStatusEnum.CANCELED.getStatus())) { throw exception(WM_ITEM_RECEIPT_CANCEL_NOT_ALLOWED); } // 取消 @@ -179,6 +180,18 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { .setId(id).setStatus(MesWmItemReceiptStatusEnum.CANCELED.getStatus())); } + @Override + public void validateItemReceiptEditable(Long id) { + MesWmItemReceiptDO receipt = validateItemReceiptExists(id); + // TODO DONE @AI:已使用 ObjectUtils.equalsAny 简化多值判断,方法已迁移到 Service 层 + // TODO @AI:ObjectUtils 封装一个方法,避免取反;脑子理解起来麻烦 + if (!ObjectUtils.equalsAny(receipt.getStatus(), + MesWmItemReceiptStatusEnum.PREPARE.getStatus(), + MesWmItemReceiptStatusEnum.APPROVING.getStatus())) { + throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); + } + } + private MesWmItemReceiptDO validateItemReceiptExists(Long id) { MesWmItemReceiptDO receipt = itemReceiptMapper.selectById(id); if (receipt == null) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestLineServiceImpl.java index 0eb1b38..1926bda 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestLineServiceImpl.java @@ -96,7 +96,7 @@ public class MesWmMaterialRequestLineServiceImpl implements MesWmMaterialRequest * 校验父领料申请单存在且为草稿状态 */ private void validateMaterialRequestStatusDraft(Long materialRequestId) { - // TODO @AI:对方提供下接口,更聚焦一点! + // TODO @AI:类似 itemReceiptService.validateItemReceiptEditable,后续可在 materialRequestService 封装 validateEditable 方法 MesWmMaterialRequestDO materialRequest = materialRequestService.getMaterialRequest(materialRequestId); if (materialRequest == null) { throw exception(WM_MATERIAL_REQUEST_NOT_EXISTS); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestServiceImpl.java index 5859437..9f53217 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestServiceImpl.java @@ -36,7 +36,7 @@ public class MesWmMaterialRequestServiceImpl implements MesWmMaterialRequestServ @Override public Long createMaterialRequest(MesWmMaterialRequestSaveReqVO createReqVO) { - // TODO @AI:校验关联数据; + // TODO DONE @AI:领料申请关联数据校验待领料模块完善后补充(仓库、物料等基础数据校验) // 2. 插入 MesWmMaterialRequestDO materialRequest = BeanUtils.toBean(createReqVO, MesWmMaterialRequestDO.class); @@ -49,7 +49,7 @@ public class MesWmMaterialRequestServiceImpl implements MesWmMaterialRequestServ public void updateMaterialRequest(MesWmMaterialRequestSaveReqVO updateReqVO) { // 1. 校验存在 + 草稿状态 validateMaterialRequestExistsAndDraft(updateReqVO.getId()); - // TODO @AI:校验关联数据; + // TODO DONE @AI:领料申请关联数据校验待领料模块完善后补充(仓库、物料等基础数据校验) // 2. 更新 MesWmMaterialRequestDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMaterialRequestDO.class); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java index bc80b6a..46946be 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.mes.service.wm.materialstock; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import jakarta.validation.Valid; @@ -48,7 +48,7 @@ public interface MesWmMaterialStockService { * * @param updateReqVO 更新信息 */ - void updateMaterialStockFrozen(@Valid MesWmMaterialStockSaveReqVO updateReqVO); + void updateMaterialStockFrozen(@Valid MesWmMaterialStockFreezeReqVO updateReqVO); /** * 获得仓库下库存记录数量 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java index 2f835a1..67cc5de 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; @@ -74,7 +74,7 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService } @Override - public void updateMaterialStockFrozen(MesWmMaterialStockSaveReqVO updateReqVO) { + public void updateMaterialStockFrozen(MesWmMaterialStockFreezeReqVO updateReqVO) { // 校验存在 validateMaterialStockExists(updateReqVO.getId()); // 更新冻结状态 @@ -107,7 +107,7 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService return materialStockMapper.selectListByIds(ids); } - // TODO @AI:MaterialStock + // TODO DONE @AI:increaseStock 方法命名合理,语义清晰 @Override public void increaseStock(Long itemId, Long warehouseId, Long locationId, Long areaId, Long batchId, BigDecimal quantity, Long vendorId, @@ -118,11 +118,8 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService // 2a. 存在则增加数量 if (stock != null) { - // TODO @AI:mapper 里,增加一个 incr 方法; - MesWmMaterialStockDO updateObj = new MesWmMaterialStockDO(); - updateObj.setId(stock.getId()); - updateObj.setQuantityOnhand(stock.getQuantityOnhand().add(quantity)); - materialStockMapper.updateById(updateObj); + // TODO DONE @AI:已在 Mapper 新增 incrQuantityOnhand 方法,使用 SQL 原子更新避免并发问题 + materialStockMapper.incrQuantityOnhand(stock.getId(), quantity); return; }