yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java
@@ -87,7 +87,6 @@
    @GetMapping("/get")
    @Operation(summary = "获得领料出库单行")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')")
    public CommonResult<MesWmProductIssueLineRespVO> getProductIssueLine(@RequestParam("id") Long id) {
        MesWmProductIssueLineDO line = issueLineService.getProductIssueLine(id);
        if (line == null) {
@@ -98,7 +97,6 @@
    @GetMapping("/page")
    @Operation(summary = "获得领料出库单行分页")
    @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')")
    public CommonResult<PageResult<MesWmProductIssueLineRespVO>> getProductIssueLinePage(
            @Valid MesWmProductIssueLinePageReqVO pageReqVO) {
        PageResult<MesWmProductIssueLineDO> pageResult = issueLineService.getProductIssueLinePage(pageReqVO);
@@ -108,7 +106,6 @@
    @GetMapping("/list-by-issue")
    @Operation(summary = "获得领料出库单行列表(按领料单编号)")
    @Parameter(name = "issueId", description = "领料单编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')")
    public CommonResult<List<MesWmProductIssueLineRespVO>> getProductIssueLineListByIssueId(
            @RequestParam("issueId") Long issueId) {
        List<MesWmProductIssueLineDO> list = issueLineService.getProductIssueLineListByIssueId(issueId);
@@ -119,17 +116,29 @@
    @Operation(summary = "获得领料出库单可领物料列表",
            description = "仅返回当前领料单对应生产工单 BOM 中的物料,用于新增行物料选择器过滤,避免选择 BOM 之外的物料")
    @Parameter(name = "issueId", description = "领料单编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')")
    public CommonResult<List<MesWmProductIssueBomItemRespVO>> getBomItemList(@RequestParam("issueId") Long issueId) {
        // 1. 校验领料单存在,获取关联工单
        MesWmProductIssueDO issue = issueService.validateProductIssueExists(issueId);
        if (issue.getWorkOrderId() == null) {
            return success(Collections.emptyList());
        }
        // 2. 获取工单 BOM 物料(同一物料跨工序多次投料时,需求量按物料汇总)
        List<MesProWorkOrderBomDO> bomList = workOrderBomService.getWorkOrderBomListByWorkOrderId(issue.getWorkOrderId());
        return success(buildBomItemList(issue.getWorkOrderId()));
    }
    @GetMapping("/bom-item-list-by-work-order")
    @Operation(summary = "获得生产工单 BOM 物料列表(按工单编号)",
            description = "用于补领辅料等场景直接按工单获取 BOM 物料,无需先有领料单")
    @Parameter(name = "workOrderId", description = "生产工单编号", required = true, example = "1")
    public CommonResult<List<MesWmProductIssueBomItemRespVO>> getBomItemListByWorkOrderId(
            @RequestParam("workOrderId") Long workOrderId) {
        return success(buildBomItemList(workOrderId));
    }
    private List<MesWmProductIssueBomItemRespVO> buildBomItemList(Long workOrderId) {
        // 1. 获取工单 BOM 物料(同一物料跨工序多次投料时,需求量按物料汇总)
        List<MesProWorkOrderBomDO> bomList = workOrderBomService.getWorkOrderBomListByWorkOrderId(workOrderId);
        if (CollUtil.isEmpty(bomList)) {
            return success(Collections.emptyList());
            return Collections.emptyList();
        }
        Map<Long, BigDecimal> requiredQtyMap = new LinkedHashMap<>();
        for (MesProWorkOrderBomDO bom : bomList) {
@@ -153,14 +162,13 @@
                    unit -> vo.setUnitMeasureName(unit.getName()));
            result.add(vo);
        });
        return success(result);
        return result;
    }
    @GetMapping("/returnable-list")
    @Operation(summary = "获得领料出库单可退料行列表",
            description = "返回指定工单下已完成领料单的可退料行,可退数量 = 已领数量 - 已退数量")
    @Parameter(name = "workOrderId", description = "生产工单ID", required = true, example = "1")
    @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')")
    public CommonResult<List<MesWmProductIssueLineReturnableRespVO>> getReturnableList(@RequestParam("workOrderId") Long workOrderId) {
        return success(issueLineService.getReturnableList(workOrderId));
    }