| | |
| | | |
| | | <!-- |
| | | 向前追溯:从某个原材料批次出发,查找它被哪些工单消耗后,产出了哪些成品批次 |
| | | SQL 路径:库存事务(消耗 OUT) → 消耗单 → 报工记录 → 库存事务(产出 IN) → 批次 |
| | | 链路:库存事务(消耗 OUT, biz=123, biz_id=消耗单id) → 消耗单 → 报工 → 产出单(feedback_id) → 库存事务(产出 IN, biz=124, biz_id=产出单id) → 批次 |
| | | --> |
| | | <select id="selectListByForward" parameterType="String" resultMap="BatchTraceResult"> |
| | | SELECT DISTINCT pf.work_order_id, pf.item_id, ppl.batch_id, ppl.batch_code |
| | | SELECT DISTINCT pf.work_order_id, pf.item_id, tx_produce.batch_id, tx_produce.batch_code |
| | | FROM mes_wm_transaction tx_consume |
| | | LEFT JOIN mes_wm_item_consume ic ON tx_consume.biz_id = ic.id AND tx_consume.biz_type = 123 AND ic.deleted = 0 |
| | | LEFT JOIN mes_pro_feedback pf ON pf.id = ic.feedback_id AND pf.deleted = 0 |
| | | LEFT JOIN mes_wm_transaction tx_produce ON tx_produce.biz_id = pf.id AND tx_produce.biz_type = 124 AND tx_produce.deleted = 0 |
| | | LEFT JOIN mes_wm_product_produce pp ON tx_produce.biz_id = pp.id AND tx_produce.biz_type = 124 AND pp.deleted = 0 |
| | | JOIN mes_wm_item_consume ic ON tx_consume.biz_id = ic.id AND tx_consume.biz_type = 123 AND ic.deleted = 0 |
| | | JOIN mes_pro_feedback pf ON pf.id = ic.feedback_id AND pf.deleted = 0 |
| | | JOIN mes_wm_product_produce pp ON pp.feedback_id = pf.id AND pp.deleted = 0 |
| | | JOIN mes_wm_transaction tx_produce ON tx_produce.biz_id = pp.id AND tx_produce.biz_type = 124 AND tx_produce.deleted = 0 |
| | | WHERE tx_consume.batch_code = #{batchCode} |
| | | AND tx_consume.biz_type = 123 |
| | | AND tx_consume.deleted = 0 |
| | |
| | | |
| | | <!-- |
| | | 向后追溯:从某个成品批次出发,查找生产它时消耗了哪些原材料批次 |
| | | SQL 路径:库存事务(产出 IN) → 产出单 → 报工记录 → 库存事务(消耗 OUT) → 批次 |
| | | 链路:库存事务(产出 IN, biz=124, biz_id=产出单id) → 产出单 → 报工 → 消耗单(feedback_id) → 库存事务(消耗 OUT, biz=123, biz_id=消耗单id) → 批次 |
| | | --> |
| | | <select id="selectListByBackward" parameterType="String" resultMap="BatchTraceResult"> |
| | | SELECT DISTINCT ic.work_order_id, icd.item_id, icd.batch_id, icd.batch_code |
| | | SELECT DISTINCT ic.work_order_id, tx_consume.item_id, tx_consume.batch_id, tx_consume.batch_code |
| | | FROM mes_wm_transaction tx_produce |
| | | LEFT JOIN mes_wm_product_produce pp ON tx_produce.biz_id = pp.id AND tx_produce.biz_type = 124 AND pp.deleted = 0 |
| | | LEFT JOIN mes_pro_feedback pf ON pf.id = pp.feedback_id AND pf.deleted = 0 |
| | | LEFT JOIN mes_wm_transaction tx_consume ON tx_consume.biz_id = pf.id AND tx_consume.biz_type = 123 AND tx_consume.deleted = 0 |
| | | LEFT JOIN mes_wm_item_consume ic ON tx_consume.biz_id = ic.id AND tx_consume.biz_type = 123 AND ic.deleted = 0 |
| | | JOIN mes_wm_product_produce pp ON tx_produce.biz_id = pp.id AND tx_produce.biz_type = 124 AND pp.deleted = 0 |
| | | JOIN mes_pro_feedback pf ON pf.id = pp.feedback_id AND pf.deleted = 0 |
| | | JOIN mes_wm_item_consume ic ON ic.feedback_id = pf.id AND ic.deleted = 0 |
| | | JOIN mes_wm_transaction tx_consume ON tx_consume.biz_id = ic.id AND tx_consume.biz_type = 123 AND tx_consume.deleted = 0 |
| | | WHERE tx_produce.batch_code = #{batchCode} |
| | | AND tx_produce.biz_type = 124 |
| | | AND tx_produce.deleted = 0 |
| | | AND tx_consume.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(行上直接记录批次的流程); |
| | | ② 明细级匹配:批次 → 扫码出库明细 → 销售出库单 → OQC(种子袋码/托盘扫码出库时批次只写入明细表,按单据聚合数量)。 |
| | | 同一出库行若已有明细级匹配则不再重复出行级记录;排除已取消(状态 5)单据。 |
| | | --> |
| | | <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, s.client_name, |
| | | 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 AND s.status != 5 |
| | | AND NOT EXISTS (SELECT 1 FROM mes_wm_product_sales_detail d |
| | | WHERE d.line_id = sl.id AND d.batch_code = #{batchCode} AND d.deleted = 0) |
| | | UNION ALL |
| | | SELECT s.code AS sales_code, s.sales_date, s.sales_order_code, s.client_id, s.client_name, |
| | | oqc.code AS oqc_code, oqc.check_result AS check_result, |
| | | d.batch_code, d.item_id, SUM(d.quantity) AS quantity, MAX(sl.quality_status) AS quality_status |
| | | FROM mes_wm_product_sales_detail d |
| | | JOIN mes_wm_product_sales s ON s.id = d.sales_id AND s.deleted = 0 |
| | | JOIN mes_wm_product_sales_line sl ON sl.id = d.line_id AND sl.deleted = 0 |
| | | LEFT JOIN mes_qc_oqc oqc ON oqc.id = sl.oqc_id AND oqc.deleted = 0 |
| | | WHERE d.batch_code = #{batchCode} AND d.deleted = 0 AND s.status != 5 |
| | | GROUP BY s.id, s.code, s.sales_date, s.sales_order_code, s.client_id, s.client_name, |
| | | oqc.code, oqc.check_result, d.batch_code, d.item_id |
| | | ORDER BY sales_date |
| | | </select> |
| | | |
| | | <!-- 批次出入库流水(种子流向):库存事务 → 仓库/库区/库位 → 销售出库单(biz_type 119 带出客户名称) --> |
| | | <select id="selectBatchFlowList" parameterType="String" |
| | | resultType="cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchFlowRespVO"> |
| | | SELECT tx.type, tx.biz_type, tx.biz_code, tx.quantity, tx.transaction_time, |
| | | w.name AS warehouse_name, loc.name AS location_name, area.name AS area_name, |
| | | sales.client_name |
| | | FROM mes_wm_transaction tx |
| | | LEFT JOIN mes_wm_warehouse w ON w.id = tx.warehouse_id AND w.deleted = 0 |
| | | LEFT JOIN mes_wm_warehouse_location loc ON loc.id = tx.location_id AND loc.deleted = 0 |
| | | LEFT JOIN mes_wm_warehouse_area area ON area.id = tx.area_id AND area.deleted = 0 |
| | | LEFT JOIN mes_wm_product_sales sales ON tx.biz_type = 119 AND sales.id = tx.biz_id AND sales.deleted = 0 |
| | | WHERE tx.batch_code = #{batchCode} AND tx.deleted = 0 |
| | | ORDER BY tx.transaction_time |
| | | </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> |