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
<?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.purchase.mapper.PurchaseLedgerMapper">
 
    <update id="updateContractAmountById">
        UPDATE purchase_ledger
        SET contract_amount = #{totalTaxInclusiveAmount},
            net_contract_amount = #{totalTaxInclusiveAmount}
        WHERE id = #{id}
    </update>
    <select id="selectPurchaseStats" resultType="com.ruoyi.home.dto.IncomeExpenseAnalysisDto">
        SELECT DATE_FORMAT(entry_date, #{dateFormat}) as dateStr, IFNULL(SUM(contract_amount), 0) as amount
        FROM purchase_ledger
        WHERE entry_date BETWEEN #{startDate} AND #{endDate}
        GROUP BY dateStr
    </select>
 
    <select id="selectPurchaseLedgerListPage" resultType="com.ruoyi.purchase.dto.PurchaseLedgerDto">
        SELECT result.*
        FROM (
            SELECT
                pl.id,
                pl.purchase_contract_number,
                pl.sales_contract_no,
                pl.supplier_id,
                pl.supplier_name,
                pl.project_name,
                pl.contract_amount,
                pl.net_contract_amount,
                pl.entry_date,
                pl.execution_date,
                pl.recorder_id,
                pl.recorder_name,
                pl.template_name,
                pl.approve_user_ids,
                sm.is_white,
                pl.approval_status,
                pl.payment_method,
                pl.remarks,
                CASE
                    WHEN IFNULL(ls.total_product_count, 0) = 0 THEN '待入库'
                    WHEN IFNULL(ls.full_product_count, 0) &gt;= IFNULL(ls.total_product_count, 0) THEN '完全入库'
                    WHEN IFNULL(ls.approved_product_count, 0) &gt; 0 THEN '入库中'
                    ELSE '待入库'
                END AS stock_in_status
            FROM purchase_ledger pl
            LEFT JOIN supplier_manage sm ON pl.supplier_id = sm.id
            LEFT JOIN (
                SELECT
                    product_status.sales_ledger_id,
                    COUNT(1) AS total_product_count,
                    SUM(CASE WHEN product_status.approved_stock_in_num &gt; 0 THEN 1 ELSE 0 END) AS approved_product_count,
                    SUM(CASE WHEN product_status.approved_stock_in_num &gt;= product_status.product_quantity THEN 1 ELSE 0 END) AS full_product_count
                FROM (
                    SELECT
                        slp.id AS sales_ledger_product_id,
                        slp.sales_ledger_id,
                        IFNULL(slp.quantity, 0) AS product_quantity,
                        IFNULL(approved_qty.approved_stock_in_num, 0) AS approved_stock_in_num
                    FROM sales_ledger_product slp
                    LEFT JOIN (
                        SELECT rel.sales_ledger_product_id,
                               IFNULL(SUM(rel.stock_in_num), 0) AS approved_stock_in_num
                        FROM (
                            SELECT slp.id AS sales_ledger_product_id,
                                   sir.stock_in_num
                            FROM stock_in_record sir
                            INNER JOIN sales_ledger_product slp
                                ON slp.type = 2
                                AND TRIM(sir.record_type) = '7'
                                AND sir.record_id = slp.sales_ledger_id
                                AND (
                                    (sir.batch_no IS NOT NULL AND sir.batch_no LIKE CONCAT('%-', slp.id))
                                    OR (sir.batch_no IS NULL AND sir.product_model_id = slp.product_model_id)
                                )
                            WHERE sir.approval_status = 1
 
                            UNION ALL
 
                            SELECT slp.id AS sales_ledger_product_id,
                                   sir.stock_in_num
                            FROM stock_in_record sir
                            INNER JOIN quality_inspect qi
                                ON TRIM(sir.record_type) = '10'
                                AND sir.record_id = qi.id
                            INNER JOIN sales_ledger_product slp
                                ON slp.type = 2
                                AND slp.sales_ledger_id = qi.purchase_ledger_id
                                AND slp.product_model_id = qi.product_model_id
                            WHERE sir.approval_status = 1
                        ) rel
                        GROUP BY rel.sales_ledger_product_id
                    ) approved_qty ON approved_qty.sales_ledger_product_id = slp.id
                    WHERE slp.type = 2
                ) product_status
                GROUP BY product_status.sales_ledger_id
            ) ls ON ls.sales_ledger_id = pl.id
            <where>
                <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
                    AND pl.purchase_contract_number LIKE CONCAT('%', #{c.purchaseContractNumber}, '%')
                </if>
                <if test="c.approvalStatus != null and c.approvalStatus != ''">
                    AND pl.approval_status = #{c.approvalStatus}
                </if>
                <if test="c.supplierName != null and c.supplierName != ''">
                    AND pl.supplier_name LIKE CONCAT('%', #{c.supplierName}, '%')
                </if>
                <if test="c.salesContractNo != null and c.salesContractNo != ''">
                    AND pl.sales_contract_no LIKE CONCAT('%', #{c.salesContractNo}, '%')
                </if>
                <if test="c.projectName != null and c.projectName != ''">
                    AND pl.project_name LIKE CONCAT('%', #{c.projectName}, '%')
                </if>
                <if test="c.entryDateStart != null and c.entryDateStart != ''">
                    AND pl.entry_date &gt;= #{c.entryDateStart}
                </if>
                <if test="c.entryDateEnd != null and c.entryDateEnd != ''">
                    AND pl.entry_date &lt;= #{c.entryDateEnd}
                </if>
                <if test="c.supplierId != null">
                    AND pl.supplier_id = #{c.supplierId}
                </if>
                <if test="c.ids != null and c.ids.size() > 0">
                    AND pl.id IN
                    <foreach collection="c.ids" item="id" open="(" separator="," close=")">
                        #{id}
                    </foreach>
                </if>
                <if test="c.approvalStatus != null">
                    AND pl.approval_status = #{c.approvalStatus}
                </if>
            </where>
        ) result
        <if test="c.stockInStatus != null and c.stockInStatus != ''">
            WHERE result.stock_in_status = #{c.stockInStatus}
        </if>
        ORDER BY result.entry_date DESC
    </select>
 
    <select id="selectReturnablePurchaseLedgerList" resultType="com.ruoyi.purchase.pojo.PurchaseLedger">
        SELECT DISTINCT pl.*
        FROM purchase_ledger pl
        WHERE 1 = 1
        <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
            AND pl.purchase_contract_number LIKE CONCAT('%', #{c.purchaseContractNumber}, '%')
        </if>
        <if test="c.supplierId != null">
            AND pl.supplier_id = #{c.supplierId}
        </if>
        <if test="c.approvalStatus != null">
            AND pl.approval_status = #{c.approvalStatus}
        </if>
        AND EXISTS (
            SELECT 1
            FROM stock_in_record sir
            LEFT JOIN quality_inspect qi
                ON sir.record_type = '10'
               AND sir.record_id = qi.id
            LEFT JOIN sales_ledger_product slp
                ON slp.sales_ledger_id = pl.id
               AND slp.product_model_id = sir.product_model_id
               AND slp.type = 2
            LEFT JOIN (
                SELECT stock_in_record_id, SUM(return_quantity) AS total_return_num
                FROM purchase_return_order_products
                GROUP BY stock_in_record_id
            ) rs ON rs.stock_in_record_id = sir.id
            WHERE sir.approval_status = 1
              AND sir.record_type IN ('7','10')
              AND (
                  (sir.record_type = '7' AND sir.record_id = pl.id)
                  OR (sir.record_type = '10' AND qi.purchase_ledger_id = pl.id)
              )
              AND slp.id IS NOT NULL
              AND GREATEST(sir.stock_in_num - COALESCE(rs.total_return_num, 0), 0) > 0
        )
        ORDER BY pl.entry_date DESC
    </select>
 
    <select id="selectTotalPurchaseAmount" resultType="java.math.BigDecimal">
        SELECT IFNULL(SUM(contract_amount), 0)
        FROM purchase_ledger
        <where>
            <if test="startDate != null and startDate != ''">
                AND entry_date &gt;= #{startDate}
            </if>
            <if test="endDate != null and endDate != ''">
                AND entry_date &lt;= #{endDate}
            </if>
        </where>
    </select>
</mapper>