diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java new file mode 100644 index 0000000..d39eaa5 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.batch; + +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.batch.vo.MesWmBatchRespVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; +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.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 批次管理") +@RestController +@RequestMapping("/mes/wm/batch") +@Validated +public class MesWmBatchController { + + @Resource + private MesWmBatchService batchService; + + @GetMapping("/forward-list") + @Operation(summary = "批次向前追溯") + @Parameter(name = "code", description = "批次编码", required = true, example = "BATCH20250314001") + @PreAuthorize("@ss.hasPermission('mes:wm-batch:query')") + public CommonResult> getForwardList(@RequestParam("code") @Valid String code) { + List list = batchService.getForwardBatchList(code); + return success(BeanUtils.toBean(list, MesWmBatchRespVO.class)); + } + + @GetMapping("/backward-list") + @Operation(summary = "批次向后追溯") + @Parameter(name = "code", description = "批次编码", required = true, example = "BATCH20250314001") + @PreAuthorize("@ss.hasPermission('mes:wm-batch:query')") + public CommonResult> getBackwardList(@RequestParam("code") @Valid String code) { + List list = batchService.getBackwardBatchList(code); + return success(BeanUtils.toBean(list, MesWmBatchRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/vo/MesWmBatchRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/vo/MesWmBatchRespVO.java new file mode 100644 index 0000000..a0602b5 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/vo/MesWmBatchRespVO.java @@ -0,0 +1,99 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 批次管理 Response VO") +@Data +public class MesWmBatchRespVO { + + @Schema(description = "批次 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "批次编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "BATCH20250314001") + private String code; + + @Schema(description = "物料 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "ITEM001") + private String itemCode; + + @Schema(description = "物料名称", example = "产品A") + private String itemName; + + @Schema(description = "规格型号", example = "100*200") + private String itemSpecification; + + @Schema(description = "单位名称", example = "个") + private String unitName; + + @Schema(description = "生产日期") + private LocalDateTime produceDate; + + @Schema(description = "有效期") + private LocalDateTime expireDate; + + @Schema(description = "入库日期") + private LocalDateTime receiptDate; + + @Schema(description = "供应商 ID", example = "1") + private Long vendorId; + + @Schema(description = "供应商编码", example = "V001") + private String vendorCode; + + @Schema(description = "供应商名称", example = "供应商A") + private String vendorName; + + @Schema(description = "客户 ID", example = "1") + private Long clientId; + + @Schema(description = "客户编码", example = "C001") + private String clientCode; + + @Schema(description = "客户名称", example = "客户A") + private String clientName; + + @Schema(description = "采购订单编号", example = "PO20250314001") + private String purchaseOrderCode; + + @Schema(description = "销售订单编号", example = "SO20250314001") + private String salesOrderCode; + + @Schema(description = "生产工单 ID", example = "1") + private Long workOrderId; + + @Schema(description = "生产工单编号", example = "WO20250314001") + private String workOrderCode; + + @Schema(description = "生产任务 ID", example = "1") + private Long taskId; + + @Schema(description = "工作站 ID", example = "1") + private Long workstationId; + + @Schema(description = "工作站编码", example = "WS001") + private String workstationCode; + + @Schema(description = "工具 ID", example = "1") + private Long toolId; + + @Schema(description = "模具 ID", example = "1") + private Long moldId; + + @Schema(description = "生产批号", example = "LOT20250314001") + private String lotNumber; + + @Schema(description = "质量状态", example = "1") + private String qualityStatus; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java index d6a0cce..6a6d2e4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.mes.dal.mysql.wm.batch; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; -import cn.hutool.core.util.ObjUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.apache.ibatis.annotations.Mapper; @@ -105,4 +105,20 @@ public interface MesWmBatchMapper extends BaseMapperX { return CollUtil.getFirst(list); } + /** + * 查询向前追溯批次列表 + *

+ * 查询当前批次被哪些工单的哪些批次产品消耗 + * SQL 逻辑:从领料明细 -> 领料单 -> 报工记录 -> 生产入库单 -> 生产入库行 + */ + List selectListByForward(String batchCode); + + /** + * 查询向后追溯批次列表 + *

+ * 查询当前批次的产品使用了哪些批次的物资 + * SQL 逻辑:从生产入库明细 -> 生产入库单 -> 领料单 -> 领料明细 + */ + List selectListByBackward(String batchCode); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java index 29da386..dd5723d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.mes.service.wm.batch; import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; +import java.util.List; + /** * 批次管理 Service 接口 * @@ -20,4 +22,24 @@ public interface MesWmBatchService { */ MesWmBatchDO getOrGenerateBatchCode(MesWmBatchGenerateReqVO reqVO); + /** + * 批次向前追溯(递归查询) + *

+ * 查询当前批次被哪些工单的哪些批次产品消耗 + * + * @param code 批次编码 + * @return 批次列表 + */ + List getForwardBatchList(String code); + + /** + * 批次向后追溯(递归查询) + *

+ * 查询当前批次的产品使用了哪些批次的物资 + * + * @param code 批次编码 + * @return 批次列表 + */ + List getBackwardBatchList(String code); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java index efbb90e..6cf65b6 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.mes.service.wm.batch; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; @@ -18,6 +19,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.util.ArrayList; +import java.util.List; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -171,4 +175,32 @@ public class MesWmBatchServiceImpl implements MesWmBatchService { return batch; } + @Override + public List getForwardBatchList(String code) { + List list = batchMapper.selectListByForward(code); + if (CollUtil.isEmpty(list)) { + return list; + } + // 继续递归查询下游批次 + List results = new ArrayList<>(list); + for (MesWmBatchDO batch : list) { + results.addAll(getForwardBatchList(batch.getCode())); + } + return results; + } + + @Override + public List getBackwardBatchList(String code) { + List list = batchMapper.selectListByBackward(code); + if (CollUtil.isEmpty(list)) { + return list; + } + // 继续递归查询上游批次 + List results = new ArrayList<>(list); + for (MesWmBatchDO batch : list) { + results.addAll(getBackwardBatchList(batch.getCode())); + } + return results; + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java index a7889d4..a29ee86 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java @@ -163,7 +163,7 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO(); // 从入库单行获取 batchReqVO.setItemId(reqVO.getItemId()).setProduceDate(reqVO.getProductionDate()) - .setExpireDate(reqVO.getExpireDate()).setLotNumber(reqVO.getProductionBatchNumber()); + .setExpireDate(reqVO.getExpireDate()).setLotNumber(reqVO.getLotNumber()); // 从父单据获取 batchReqVO.setVendorId(receipt.getVendorId()).setReceiptDate(receipt.getReceiptDate()); // 从到货通知单获取采购订单号(如果关联了到货通知单) diff --git a/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml b/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml new file mode 100644 index 0000000..3338313 --- /dev/null +++ b/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +