yuan
6 天以前 bb5a4ce65ce5a2d68829cf88df4704cb079ce628
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
<?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="com.ruoyi.basic.mapper.SupplierManageMapper">
 
    <select id="supplierListPage" resultType="com.ruoyi.basic.dto.SupplierManageDto">
        SELECT
        T1.id,
        T1.supplier_name,
        T1.taxpayer_identification_num,
        T1.company_address,
        T1.company_phone,
        T1.bank_account_name,
        T1.bank_account_num,
        T1.contact_user_name,
        T1.contact_user_phone,
        T1.maintain_user_id,
        T1.maintain_time,
        T1.create_time,
        T1.create_user,
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T1.is_white,
        T2.nick_name AS maintainUserName,
        T1.supplier_type
        FROM supplier_manage T1
        LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
        <where>
            <if test="supplierManageDto.supplierName != null and supplierManageDto.supplierName != '' ">
                AND T1.supplier_name LIKE CONCAT('%',#{supplierManageDto.supplierName},'%')
            </if>
            <if test="supplierManageDto.isWhite != null">
                AND T1.is_white = #{supplierManageDto.isWhite}
            </if>
        </where>
        order by T1.id desc
    </select>
 
    <select id="supplierExportList" resultType="com.ruoyi.basic.excel.SupplierManageExcelDto">
        SELECT
        T1.id,
        T1.supplier_name,
        T1.taxpayer_identification_num,
        T1.company_address,
        T1.company_phone,
        T1.bank_account_name,
        T1.bank_account_num,
        T1.contact_user_name,
        T1.contact_user_phone,
        T1.maintain_user_id,
        T1.maintain_time,
        T1.create_time,
        T1.create_user,
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T1.is_white,
        T2.nick_name AS maintainUserName
        FROM supplier_manage T1
        LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
        <where>
            <if test="supplierManageDto.supplierName != null and supplierManageDto.supplierName != '' ">
                AND T1.supplier_name LIKE CONCAT('%',#{supplierManageDto.supplierName},'%')
            </if>
            <if test="supplierManageDto.isWhite != null">
                AND T1.is_white = #{supplierManageDto.isWhite}
            </if>
        </where>
    </select>
    <select id="supplierTransactions" resultType="com.ruoyi.purchase.vo.SupplierTransactionsVo">
        select c.supplier_id,
               sm.supplier_name,
               c.contractAmounts,
               -- 付款金额:逐合同按合同金额封顶后再汇总,避免重复付款导致付款金额大于合同金额
               c.paymentAmount,
               -- 应付金额:逐合同「取(入库金额, 合同金额)较小者 - 封顶后付款金额 - 退货金额」后再汇总,下限为 0
               c.payableAmount
        from (
            select pl.supplier_id,
                   sum(COALESCE(pl.contract_amount, 0)) as contractAmounts,
                   sum(LEAST(IFNULL(pay.paymentAmount, 0), COALESCE(pl.contract_amount, 0))) as paymentAmount,
                   sum(GREATEST(
                       IFNULL(ib.InboundAmount, 0)
                           - IF(ib.InboundAmount <![CDATA[ > ]]> COALESCE(pl.contract_amount, 0), ib.InboundAmount - COALESCE(pl.contract_amount, 0), 0)
                       - LEAST(IFNULL(pay.paymentAmount, 0), COALESCE(pl.contract_amount, 0))
                       - IFNULL(rt.returnAmount, 0)
                   , 0)) as payableAmount
            from purchase_ledger pl
            left join (
                select
                    t.purchase_ledger_id as id,
                    sum(t.payment_amount) as paymentAmount
                from (
                    select
                        app.id,
                        app.payment_amount,
                        pl.id as purchase_ledger_id
                    from account_purchase_payment app
                    left join account_payment_application apa on app.account_payment_application_id = apa.id
                    left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0
                    LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
                    LEFT JOIN purchase_ledger pl
                              ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
                    WHERE sir.approval_status = 1
                      AND sir.record_type IN ('7','10')
                    group by app.id, pl.id
                ) t
                group by t.purchase_ledger_id
            ) pay on pay.id = pl.id
            left join (
                SELECT
                    pl.id,
                    sum(sir.stock_in_num * slp.tax_inclusive_unit_price) AS InboundAmount
                FROM stock_in_record sir
                         LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
                         LEFT JOIN purchase_ledger pl
                                   ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
                         LEFT JOIN sales_ledger_product slp ON pl.id = slp.sales_ledger_id
                WHERE sir.approval_status = 1 AND slp.type = 2
                  AND sir.record_type IN ('7','10')
                group by pl.id
            ) ib on ib.id = pl.id
            left join (
                select pl.id,
                       sum(pro.total_amount) as returnAmount
                from purchase_return_orders pro
                         left join purchase_ledger pl on pro.purchase_ledger_id = pl.id
                group by pl.id
            ) rt on rt.id = pl.id
            group by pl.supplier_id
        ) c
        left join supplier_manage sm on c.supplier_id = sm.id
        <where>
            <if test="supplierName!=null and supplierName!=''">
                AND sm.supplier_name LIKE CONCAT('%',#{supplierName},'%')
            </if>
        </where>
        order by c.supplier_id desc
    </select>
    <select id="supplierTransactionsDetails"
            resultType="com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo">
       select pl.id  purchaseLedgerId,
              pl.purchase_contract_number,
              pl.execution_date,
              pl.contract_amount,
              -- 付款金额按合同金额封顶,避免重复付款导致付款金额大于合同金额
              LEAST(IFNULL(T1.paymentAmount, 0), COALESCE(pl.contract_amount, 0)) AS paymentAmount,
              -- 应付金额 = 取(入库金额, 合同金额)的较小者 - 封顶后付款金额 - 退货金额
              -- 入库金额按合同金额封顶,避免入库流程重复提交导致应付金额大于合同金额;
              -- 已付款金额(回款/付款单)与退货金额均需从应付中扣减。
              GREATEST(
                  IFNULL(T2.InboundAmount, 0)
                      - IF(T2.InboundAmount <![CDATA[ > ]]> COALESCE(pl.contract_amount, 0), T2.InboundAmount - COALESCE(pl.contract_amount, 0), 0)
                  - LEAST(IFNULL(T1.paymentAmount, 0), COALESCE(pl.contract_amount, 0))
                  - IFNULL(T3.returnAmount, 0)
              , 0) AS payableAmount
       from purchase_ledger pl
       left join (
           select
               pl.id,
               sum(t.payment_amount) as paymentAmount
           from (
               select
                   app.id,
                   app.payment_amount,
                   pl.id as purchase_ledger_id
               from account_purchase_payment app
               left join account_payment_application apa on app.account_payment_application_id = apa.id
               left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0
                   -- 10 类型才关联质检表
               LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
                   -- 动态关联采购(自动适配 7 和 10)
               LEFT JOIN purchase_ledger pl
                         ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
               WHERE sir.approval_status = 1
                 AND sir.record_type IN ('7','10')
               group by app.id, pl.id
           ) t
           left join purchase_ledger pl on t.purchase_ledger_id = pl.id
           group by pl.id
       )T1 on T1.id = pl.id
       left join (
           SELECT
               pl.id,
               sum(sir.stock_in_num * slp.tax_inclusive_unit_price) AS InboundAmount
           FROM stock_in_record sir
                    -- 10 类型才关联质检表
                    LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
               -- 动态关联采购(自动适配 7 和 10)
                    LEFT JOIN purchase_ledger pl
                              ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
               -- 产品关联不动
                    LEFT JOIN sales_ledger_product slp ON pl.id = slp.sales_ledger_id
           -- 条件
           WHERE sir.approval_status = 1 AND slp.type = 2
             AND sir.record_type IN ('7','10')
           group by pl.id
       )T2 on T2.id = pl.id
       left join (
           select pl.id,
                  sum(pro.total_amount) as returnAmount
           from purchase_return_orders pro
                    left join purchase_ledger pl on pro.purchase_ledger_id = pl.id
           group by pl.id
       )T3 on T3.id = pl.id
       where pl.supplier_id = #{supplierId}
       order by pl.id desc
    </select>
 
</mapper>