6 小时以前 7bf754a7835d06f26240c4ca15bc5f83650de377
src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -35,12 +35,18 @@
        pm.model,
        pm.unit,
        u.nick_name as createBy,
        sl.sales_contract_no as salesContractNo
        <!-- 油品出库可绑多个销售台账(多客户),sor.sales_ledger_id 只存首项,故从绑定表汇总全部合同号;
             未绑定绑定表的存量行仍退回 sor.sales_ledger_id 关联的单个合同号 -->
        IFNULL(
            (select group_concat(distinct slb.sales_contract_no separator ',')
             from stock_out_record_sales_ledger b
                      join sales_ledger slb on slb.id = b.sales_ledger_id
             where b.stock_out_record_id = sor.id),
            sl.sales_contract_no) as salesContractNo
        FROM stock_out_record as sor
        LEFT JOIN product_model as pm on sor.product_model_id = pm.id
        LEFT JOIN product as p on pm.product_id = p.id
        LEFT JOIN sys_user as u on sor.create_user = u.user_id
        <!-- 绑定了销售台账的出库带出合同号;sales_ledger_id 本身已随 sor.* 返回 -->
        LEFT JOIN sales_ledger as sl on sl.id = sor.sales_ledger_id
        <where>
            <if test="params.timeStr != null and params.timeStr != ''">
@@ -140,37 +146,59 @@
        order by sor.id desc
    </select>
    <!-- 财务管理 · 销售出库台账(收款/开票候选)。
         两类来源:① record_type='13' 的手工发货单出库,客户/明细/发货编号都走 shipping_info;
         ② 油品出库(type 为空)按「出库单×客户」拆到绑定行,一个出库单绑几个台账就出几行,
         金额只算该客户分摊的那部分(b.quantity × 单价),不再是整单数量。
         用 LEFT JOIN 而不是 UNION ALL:DataScopeSqlInterceptor 看到 from 后面紧跟 '(' 会整条放行,
         把两条分支包成派生表会让出库单的数据权限静默失效。 -->
    <select id="listPageAccountSales" resultType="com.ruoyi.account.bean.vo.sales.SalesOutboundVo">
    SELECT
        sor.id,
        sor.outbound_batches,
        sl.customer_name,
        IFNULL(b.customer_name, sl.customer_name) AS customerName,
        sor.create_time as shippingDate,
        p.product_name,
        pm.model as specification_model,
        slp.tax_rate,
        sor.stock_out_num * slp.tax_inclusive_unit_price as outboundAmount,
        IFNULL(pb.product_name, p.product_name) AS productName,
        IFNULL(pmb.model, pm.model) as specification_model,
        IFNULL(slpb.tax_rate, slp.tax_rate) as tax_rate,
        CASE
            WHEN b.id IS NOT NULL THEN b.quantity * slpb.tax_inclusive_unit_price
            ELSE sor.stock_out_num * slp.tax_inclusive_unit_price
        END as outboundAmount,
        s.shipping_no,
        sl.sales_contract_no
        IFNULL(slb.sales_contract_no, sl.sales_contract_no) as sales_contract_no,
        b.id AS bindingId,
        IFNULL(b.customer_id, sl.customer_id) AS customer_id
        FROM stock_out_record sor
        <!-- 只有油品出库才去绑绑定表;手工发货单出库的 type 也是空,但它 record_type='13' 且没有绑定行,
             b.id 为 NULL 时下面统一回落到 shipping_info 那一套 -->
        LEFT JOIN stock_out_record_sales_ledger b ON b.stock_out_record_id = sor.id
        left join shipping_info s on sor.record_id = s.id
        LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
        LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id and slp.type = 1
        LEFT JOIN sales_ledger slb ON slb.id = b.sales_ledger_id
        LEFT JOIN sales_ledger_product slpb ON slpb.id = b.sales_ledger_product_id and slpb.type = 1
        left join product_model pm on slp.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        WHERE sor.record_type='13' and sor.approval_status=1
        left join product_model pmb on sor.product_model_id = pmb.id
        left join product pb on pmb.product_id = pb.id
        WHERE sor.approval_status=1
        AND (
            sor.record_type='13'
            OR (b.id IS NOT NULL AND (sor.type IS NULL OR sor.type = ''))
        )
        <if test="req.outboundBatches != null and req.outboundBatches != ''">
            AND sor.outbound_batches LIKE CONCAT('%',#{req.outboundBatches},'%')
        </if>
        <if test="req.customerName != null and req.customerName != ''">
            AND sl.customer_name LIKE CONCAT('%',#{req.customerName},'%')
            AND IFNULL(b.customer_name, sl.customer_name) LIKE CONCAT('%',#{req.customerName},'%')
        </if>
        <if test="req.customerId != null ">
            AND sl.customer_id = #{req.customerId}
            AND IFNULL(b.customer_id, sl.customer_id) = #{req.customerId}
        </if>
        <if test="req.startDate != null and req.endDate != null">
            AND s.shipping_date BETWEEN #{req.startDate} AND #{req.endDate}
            AND IFNULL(s.shipping_date, sor.create_time) BETWEEN #{req.startDate} AND #{req.endDate}
        </if>
        order by sor.id DESC
        order by sor.id DESC, IFNULL(b.id, 0)
    </select>
</mapper>