6f7ebcb4f8ccbb8849c4d2832f28a89c30b5bc93..f00a59b4f30accf2b23ae0d58fac23d966a48d24
2026-06-13 yuan
fix: 优化生产订单查询
f00a59 对比 | 目录
2026-06-13 yuan
fix: 采购台账不合格处理 放行 算入库
655cb5 对比 | 目录
已添加2个文件
已修改6个文件
141 ■■■■■ 文件已修改
src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/SupplierManageMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOperationTaskMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.production.bean.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
@Schema(name = "ProcessRouteStatusVo", description = "工序生产进度项")
public class ProcessRouteStatusVo {
    @Schema(description = "工序名称")
    private String name;
    @Schema(description = "完成进度百分比")
    private BigDecimal percentage;
}
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.production.bean.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
@Schema(name = "ProductionOrderProcessTaskVo", description = "生产订单工序任务进度")
public class ProductionOrderProcessTaskVo {
    @Schema(description = "生产订单ID")
    private Long productionOrderId;
    @Schema(description = "工序名称")
    private String operationName;
    @Schema(description = "完成进度")
    private BigDecimal completionStatus;
}
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
@@ -44,4 +44,7 @@
    @Schema(description = "是否已退料")
    private Boolean returned;
    @Schema(description = "工序生产进度")
    private List<ProcessRouteStatusVo> processRouteStatus;
}
src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
@@ -7,6 +7,7 @@
import com.ruoyi.home.dto.processDataProductionStatisticsDto;
import com.ruoyi.production.bean.dto.ProductionOperationTaskDto;
import com.ruoyi.production.bean.vo.ProductionOperationTaskVo;
import com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo;
import com.ruoyi.production.pojo.ProductionOperationTask;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -43,4 +44,6 @@
    ProductionOperationTaskDto getProductWorkOrderFlowCard(@Param("id") Long id);
    List<ProductionOperationTaskVo> getOperation(@Param("c") ProductionOperationTaskDto dto);
    List<ProductionOrderProcessTaskVo> listProcessStatusByOrderIds(@Param("orderIds") List<Long> orderIds);
}
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -22,6 +22,8 @@
import com.ruoyi.production.bean.vo.ProductionOrderVo;
import com.ruoyi.production.bean.vo.ProductionPlanVo;
import com.ruoyi.production.bean.vo.ProductionOrderWorkOrderDetailVo;
import com.ruoyi.production.bean.vo.ProcessRouteStatusVo;
import com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo;
import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
@@ -86,6 +88,7 @@
        // åˆ†é¡µæŸ¥è¯¢ç”Ÿäº§è®¢å•
        Page<ProductionOrderVo> result = (Page<ProductionOrderVo>) baseMapper.pageProductionOrder(page, dto);
        fillProductImages(result.getRecords());
        fillProcessRouteStatus(result.getRecords());
        return result;
    }
@@ -94,6 +97,7 @@
        // æŸ¥è¯¢ç”Ÿäº§è®¢å•列表
        List<ProductionOrderVo> records = baseMapper.listProductionOrder(dto);
        fillProductImages(records);
        fillProcessRouteStatus(records);
        return records;
    }
@@ -812,6 +816,46 @@
        }
    }
    private void fillProcessRouteStatus(List<ProductionOrderVo> records) {
        if (records == null || records.isEmpty()) {
            return;
        }
        List<Long> orderIds = records.stream()
                .map(ProductionOrderVo::getId)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        if (orderIds.isEmpty()) {
            return;
        }
        List<ProductionOrderProcessTaskVo> tasks = productionOperationTaskMapper.listProcessStatusByOrderIds(orderIds);
        Map<Long, List<ProcessRouteStatusVo>> statusMap = new LinkedHashMap<>();
        if (tasks != null) {
            for (ProductionOrderProcessTaskVo task : tasks) {
                if (task == null || task.getProductionOrderId() == null) {
                    continue;
                }
                ProcessRouteStatusVo status = new ProcessRouteStatusVo();
                status.setName(task.getOperationName() != null && !task.getOperationName().isBlank()
                        ? task.getOperationName()
                        : "未知工序");
                BigDecimal percentage = task.getCompletionStatus() == null
                        ? BigDecimal.ZERO
                        : task.getCompletionStatus();
                if (percentage.compareTo(new BigDecimal("100")) > 0) {
                    percentage = new BigDecimal("100");
                }
                status.setPercentage(percentage);
                statusMap.computeIfAbsent(task.getProductionOrderId(), key -> new ArrayList<>()).add(status);
            }
        }
        for (ProductionOrderVo record : records) {
            record.setProcessRouteStatus(statusMap.getOrDefault(record.getId(), Collections.emptyList()));
        }
    }
    private StorageBlobVO toStorageBlobVO(StorageBlob blob) {
        // å°†å­˜å‚¨æ–‡ä»¶å¯¹è±¡è½¬æ¢ä¸ºVO
        StorageBlobVO vo = BeanUtil.copyProperties(blob, StorageBlobVO.class);
src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -178,6 +178,29 @@
                                   ON slp_agg.sales_ledger_id = pl2.id
                                       AND slp_agg.product_model_id = sir.product_model_id
               WHERE sir.approval_status = 1 AND sir.record_type = 10
               UNION ALL
               SELECT sir.stock_in_num * slp_agg.tax_inclusive_unit_price AS inbound_amount,
                      slp_agg.sales_ledger_id
               FROM stock_in_record sir
                        INNER JOIN quality_unqualified qu
                                   ON qu.id = sir.record_id
                        INNER JOIN quality_inspect qi
                                   ON qi.id = qu.inspect_id
                        INNER JOIN purchase_ledger pl2
                                   ON pl2.id = qi.purchase_ledger_id
                        INNER JOIN (
                   SELECT
                       sales_ledger_id,
                       product_model_id,
                       MIN(tax_inclusive_unit_price) AS tax_inclusive_unit_price
                   FROM sales_ledger_product
                   WHERE type = 2
                   GROUP BY sales_ledger_id, product_model_id
               ) slp_agg
                                   ON slp_agg.sales_ledger_id = pl2.id
                                       AND slp_agg.product_model_id = sir.product_model_id
               WHERE sir.approval_status = 1
                 AND sir.record_type = 11
           ) t
           GROUP BY t.sales_ledger_id
       ) T2 ON T2.sales_ledger_id = pl.id
src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -215,4 +215,18 @@
        order by min(poro.drag_sort), poro.operation_name
    </select>
    <select id="listProcessStatusByOrderIds" resultType="com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo">
        select pot.production_order_id as productionOrderId,
               poro.operation_name as operationName,
               ROUND(IFNULL(pot.complete_quantity, 0) / NULLIF(pot.plan_quantity, 0) * 100, 2) AS completionStatus
        from production_operation_task pot
                 left join production_order_routing_operation poro
                           on pot.production_order_routing_operation_id = poro.id
        where pot.production_order_id in
        <foreach collection="orderIds" item="orderId" open="(" separator="," close=")">
            #{orderId}
        </foreach>
        order by pot.production_order_id, poro.drag_sort asc, pot.id asc
    </select>
</mapper>
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -88,6 +88,23 @@
                                AND slp.sales_ledger_id = qi.purchase_ledger_id
                                AND slp.product_model_id = qi.product_model_id
                            WHERE sir.approval_status = 1
                            UNION ALL
        SELECT slp.id AS sales_ledger_product_id,
        sir.stock_in_num
        FROM stock_in_record sir
        INNER JOIN quality_unqualified qu
        ON TRIM(sir.record_type) = '11'
        AND sir.record_id = qu.id
        INNER JOIN quality_inspect qi
        ON qi.id = qu.inspect_id
        INNER JOIN sales_ledger_product slp
        ON slp.type = 2
        AND slp.sales_ledger_id = qi.purchase_ledger_id
        AND slp.product_model_id = qi.product_model_id
        WHERE sir.approval_status = 1
                        ) rel
                        GROUP BY rel.sales_ledger_product_id
                    ) approved_qty ON approved_qty.sales_ledger_product_id = slp.id