| | |
| | | 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 != ''"> |
| | |
| | | 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> |