liu
2026-10-24 3990ae574c221e3764ce9cbc2e4e3eb71b7b1b52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.mes.dal.mysql.wm.batch.MesWmBatchMapper">
 
    <resultMap id="BatchTraceResult" type="cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO">
        <id property="id" column="batch_id"/>
        <result property="code" column="batch_code"/>
        <result property="workOrderId" column="work_order_id"/>
        <result property="itemId" column="item_id"/>
    </resultMap>
 
    <!--
        向前追溯:原料消耗明细 → 消耗单 → 产品产出单 → 产品产出行。
        新数据优先按 feedback_id 精确关联;历史/自动生成单据缺少 feedback_id 时,
        退化为同一 work_order_id 关联,保证已有生产数据也能形成批次链路。
    -->
    <select id="selectListByForward" parameterType="String" resultMap="BatchTraceResult">
        SELECT DISTINCT pp.work_order_id, ppl.item_id, ppl.batch_id, ppl.batch_code
        FROM mes_wm_item_consume_detail icd
        JOIN mes_wm_item_consume ic ON ic.id = icd.consume_id AND ic.deleted = 0
        JOIN mes_wm_product_produce pp ON pp.deleted = 0 AND (
            (ic.feedback_id IS NOT NULL AND pp.feedback_id = ic.feedback_id)
            OR ((ic.feedback_id IS NULL OR pp.feedback_id IS NULL)
                AND pp.work_order_id = ic.work_order_id)
        )
        JOIN mes_wm_product_produce_line ppl ON ppl.produce_id = pp.id AND ppl.deleted = 0
        WHERE icd.batch_code = #{batchCode}
          AND icd.deleted = 0
          AND ppl.batch_id IS NOT NULL
    </select>
 
    <!-- 向后追溯:产品产出行 → 产品产出单 → 消耗单 → 原料消耗明细。关联规则同向前追溯。 -->
    <select id="selectListByBackward" parameterType="String" resultMap="BatchTraceResult">
        SELECT DISTINCT ic.work_order_id, icd.item_id, icd.batch_id, icd.batch_code
        FROM mes_wm_product_produce_line ppl
        JOIN mes_wm_product_produce pp ON pp.id = ppl.produce_id AND pp.deleted = 0
        JOIN mes_wm_item_consume ic ON ic.deleted = 0 AND (
            (pp.feedback_id IS NOT NULL AND ic.feedback_id = pp.feedback_id)
            OR ((pp.feedback_id IS NULL OR ic.feedback_id IS NULL)
                AND ic.work_order_id = pp.work_order_id)
        )
        JOIN mes_wm_item_consume_detail icd ON icd.consume_id = ic.id AND icd.deleted = 0
        WHERE ppl.batch_code = #{batchCode}
          AND ppl.deleted = 0
          AND icd.batch_id IS NOT NULL
    </select>
 
    <!-- 批次采购来源:批次 → 采购入库行 → 采购入库单 → IQC -->
    <select id="selectPurchaseSourceList" parameterType="String"
            resultType="cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPurchaseSourceRespVO">
        SELECT r.code AS receipt_code, r.receipt_date, r.purchase_order_code, r.vendor_id,
               iqc.code AS iqc_code, iqc.check_result AS check_result,
               rl.batch_code, rl.item_id, rl.received_quantity
        FROM mes_wm_item_receipt_line rl
        JOIN mes_wm_item_receipt r ON r.id = rl.receipt_id AND r.deleted = 0
        LEFT JOIN mes_qc_iqc iqc ON iqc.id = r.iqc_id AND iqc.deleted = 0
        WHERE rl.batch_code = #{batchCode} AND rl.deleted = 0
    </select>
 
    <!-- 批次销售去向:批次 → 销售出库行 → 销售出库单 → OQC -->
    <select id="selectSalesTargetList" parameterType="String"
            resultType="cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchSalesTargetRespVO">
        SELECT s.code AS sales_code, s.sales_date, s.sales_order_code, s.client_id,
               oqc.code AS oqc_code, oqc.check_result AS check_result,
               sl.batch_code, sl.item_id, sl.quantity, sl.quality_status
        FROM mes_wm_product_sales_line sl
        JOIN mes_wm_product_sales s ON s.id = sl.sales_id AND s.deleted = 0
        LEFT JOIN mes_qc_oqc oqc ON oqc.id = sl.oqc_id AND oqc.deleted = 0
        WHERE sl.batch_code = #{batchCode} AND sl.deleted = 0
    </select>
 
    <!-- 批次工序流转:产出(OUT)/投入(IN) 事件聚合,无需建表 -->
    <select id="selectProcessTraceList" parameterType="String"
            resultType="cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchProcessTraceRespVO">
        SELECT 'OUT' AS event_type, pp.work_order_id, pp.process_id,
               ppl.batch_code, ppl.quantity, ppl.quality_status, pp.produce_date AS event_time,
               wop.sort AS process_sort
        FROM mes_wm_product_produce_line ppl
        JOIN mes_wm_product_produce pp ON pp.id = ppl.produce_id AND pp.deleted = 0
        LEFT JOIN mes_pro_work_order_process wop
               ON wop.work_order_id = pp.work_order_id AND wop.process_id = pp.process_id AND wop.deleted = 0
        WHERE ppl.batch_code = #{batchCode} AND ppl.deleted = 0
        UNION ALL
        SELECT 'IN' AS event_type, ic.work_order_id, ic.process_id,
               icd.batch_code, icd.quantity, NULL AS quality_status, ic.consume_date AS event_time,
               wop.sort AS process_sort
        FROM mes_wm_item_consume_detail icd
        JOIN mes_wm_item_consume ic ON ic.id = icd.consume_id AND ic.deleted = 0
        LEFT JOIN mes_pro_work_order_process wop
               ON wop.work_order_id = ic.work_order_id AND wop.process_id = ic.process_id AND wop.deleted = 0
        WHERE icd.batch_code = #{batchCode} AND icd.deleted = 0
    </select>
 
</mapper>