8 天以前 1e123568c2f561013f5636e45dc0db30b17a3517
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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
<?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.quality.mapper.QualityTraceMapper">
 
    <!-- 报工节点公共列:报工单→工单→生产订单→成品 -->
    <sql id="reportColumns">
        ppm.id                                                as productMainId,
        pot.production_order_id                               as productionOrderId,
        po.nps_no                                             as npsNo,
        concat(ifnull(p.product_name, ''), '/', ifnull(pmf.model, '')) as finishedProduct,
        pmf.unit                                              as unit,
        ifnull(po.quantity, 0)                                as planQty,
        ifnull(po.complete_quantity, 0)                       as completeQty,
        po.status                                             as orderStatus,
        coalesce(po.create_time, po.start_time)               as orderCreateTime,
        pot.work_order_no                                     as workOrderNo,
        poro.operation_name                                   as operationName,
        ppm.user_name                                         as userName,
        ppm.device_name                                       as deviceName,
        ifnull(ppo.quantity, 0)                               as outputQty,
        ifnull(ppo.scrap_qty, 0)                              as scrapQty,
        ppm.product_no                                        as productNo,
        ppm.create_time                                       as reportTime
    </sql>
 
    <sql id="reportJoins">
        from production_product_main ppm
        join production_operation_task pot on pot.id = ppm.production_operation_task_id
        join production_order po on po.id = pot.production_order_id
        left join production_order_routing_operation poro on poro.id = pot.production_order_routing_operation_id
        left join product_model pmf on pmf.id = po.product_model_id
        left join product p on p.id = pmf.product_id
        left join production_product_output ppo on ppo.production_product_main_id = ppm.id
    </sql>
 
    <select id="listInboundByFinishedBatch" resultType="com.ruoyi.quality.dto.QualityTraceFinishedBatchVo">
        select x.productionOrderId, x.productMainId, x.batchNo, x.productModelId, x.qty, x.inTime, x.recordType
        from (
            select pot.production_order_id as productionOrderId,
                   sir.record_id           as productMainId,
                   sir.batch_no            as batchNo,
                   sir.product_model_id    as productModelId,
                   ifnull(sir.stock_in_num, 0) as qty,
                   sir.create_time         as inTime,
                   sir.record_type         as recordType
            from stock_in_record sir
                     join production_product_main ppm on ppm.id = sir.record_id
                     join production_operation_task pot on pot.id = ppm.production_operation_task_id
            where sir.batch_no = #{batchNo} and sir.record_type = '2'
            union all
            select pot.production_order_id,
                   qi.product_main_id,
                   sir.batch_no,
                   sir.product_model_id,
                   ifnull(sir.stock_in_num, 0),
                   sir.create_time,
                   sir.record_type
            from stock_in_record sir
                     join quality_inspect qi on qi.id = sir.record_id
                     join production_product_main ppm on ppm.id = qi.product_main_id
                     join production_operation_task pot on pot.id = ppm.production_operation_task_id
            where sir.batch_no = #{batchNo} and sir.record_type = '6'
        ) x
        order by x.productionOrderId, x.inTime
    </select>
 
    <select id="listReportsByMainIds" resultType="com.ruoyi.quality.dto.QualityTraceReportVo">
        select <include refid="reportColumns"/>
        <include refid="reportJoins"/>
        where ppm.id in
        <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
        order by pot.production_order_id, poro.drag_sort, ppm.id
    </select>
 
    <select id="listReportsByOrderIds" resultType="com.ruoyi.quality.dto.QualityTraceReportVo">
        select <include refid="reportColumns"/>
        <include refid="reportJoins"/>
        where pot.production_order_id in
        <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
        order by pot.production_order_id, poro.drag_sort, ppm.id
    </select>
 
    <select id="listInputsByMainIds" resultType="com.ruoyi.quality.dto.QualityTraceInputVo">
        select ppi.production_product_main_id as productMainId,
               ppi.product_model_id           as productModelId,
               ifnull(p.product_name, '')     as materialName,
               ifnull(pm.model, '')           as materialModel,
               pm.unit                        as unit,
               ifnull(ppi.input_quantity, 0)  as inputQty,
               pot.work_order_no              as workOrderNo,
               poro.operation_name            as operationName
        from production_product_input ppi
                 join production_product_main ppm on ppm.id = ppi.production_product_main_id
                 join production_operation_task pot on pot.id = ppm.production_operation_task_id
                 left join production_order_routing_operation poro on poro.id = pot.production_order_routing_operation_id
                 join product_model pm on pm.id = ppi.product_model_id
                 left join product p on p.id = pm.product_id
        where ppi.production_product_main_id in
        <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
        order by ppi.production_product_main_id, ppi.id
    </select>
 
    <sql id="pickColumns">
        pop.production_order_id  as productionOrderId,
        pop.product_model_id     as productModelId,
        ifnull(p.product_name, '') as materialName,
        ifnull(pm.model, '')     as materialModel,
        pm.unit                  as unit,
        pop.batch_no             as batchNo,
        ifnull(pop.quantity, 0)  as quantity,
        pop.operation_name       as operationName,
        pop.create_time          as pickTime
    </sql>
 
    <select id="listPicksByOrderIds" resultType="com.ruoyi.quality.dto.QualityTracePickVo">
        select <include refid="pickColumns"/>
        from production_order_pick pop
                 join product_model pm on pm.id = pop.product_model_id
                 left join product p on p.id = pm.product_id
        where pop.production_order_id in
        <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
          and pop.batch_no is not null and pop.batch_no &lt;&gt; ''
        order by pop.production_order_id, pop.id
    </select>
 
    <select id="listPicksByBatchNo" resultType="com.ruoyi.quality.dto.QualityTracePickVo">
        select <include refid="pickColumns"/>
        from production_order_pick pop
                 join product_model pm on pm.id = pop.product_model_id
                 left join product p on p.id = pm.product_id
        where pop.batch_no = #{batchNo}
        order by pop.production_order_id, pop.id
    </select>
 
    <select id="listInspectsByMainIds" resultType="com.ruoyi.quality.dto.QualityTraceInspectVo">
        select qi.id                             as inspectId,
               qi.product_main_id                as productMainId,
               qi.inspect_type                   as inspectType,
               case qi.inspect_type when 0 then '原料检验' when 1 then '过程检验' when 2 then '出厂检验'
                                    else '其他' end as inspectTypeName,
               qi.process                        as process,
               qi.check_name                     as checkName,
               qi.product_name                   as productName,
               qi.model                          as model,
               qi.unit                           as unit,
               ifnull(qi.quantity, 0)            as quantity,
               ifnull(qi.qualified_quantity, 0)  as qualifiedQuantity,
               ifnull(qi.unqualified_quantity, 0) as unqualifiedQuantity,
               qi.check_result                   as checkResult,
               qi.check_time                     as checkTime,
               qi.inspect_state                  as inspectState,
               qi.defective_phenomena            as defectivePhenomena
        from quality_inspect qi
        where qi.product_main_id in
        <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
        order by qi.id
    </select>
 
    <select id="listUnqualifiedByInspectIds" resultType="com.ruoyi.quality.dto.QualityTraceUnqualifiedVo">
        select qu.id                             as id,
               qu.inspect_id                     as inspectId,
               qu.product_name                   as productName,
               qu.model                          as model,
               qu.unit                           as unit,
               ifnull(qu.quantity, 0)            as quantity,
               qu.defective_phenomena            as defectivePhenomena,
               qu.deal_result                    as dealResult,
               qu.deal_name                      as dealName,
               qu.deal_time                      as dealTime,
               qu.inspect_state                  as inspectState,
               qu.check_time                     as checkTime
        from quality_unqualified qu
        where qu.inspect_id in
        <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
        order by qu.id
    </select>
 
    <select id="listOutboundByBatch" resultType="com.ruoyi.quality.dto.QualityTraceOutboundVo">
        select sor.id                            as id,
               sor.batch_no                      as batchNo,
               ifnull(p.product_name, '')        as productName,
               ifnull(pm.model, '')              as productModel,
               pm.unit                           as unit,
               ifnull(sor.stock_out_num, 0)      as qty,
               sor.record_type                   as recordType,
               sor.create_time                   as outTime,
               sor.remark                        as remark
        from stock_out_record sor
                 join product_model pm on pm.id = sor.product_model_id
                 left join product p on p.id = pm.product_id
        where sor.batch_no = #{batchNo}
        order by sor.id
    </select>
 
    <select id="listFinishedBatchesByOrderIds" resultType="com.ruoyi.quality.dto.QualityTraceFinishedBatchVo">
        select x.productionOrderId, x.productMainId, x.batchNo, x.productModelId, x.qty, x.inTime, x.recordType
        from (
            select pot.production_order_id as productionOrderId,
                   sir.record_id           as productMainId,
                   sir.batch_no            as batchNo,
                   sir.product_model_id    as productModelId,
                   ifnull(sir.stock_in_num, 0) as qty,
                   sir.create_time         as inTime,
                   sir.record_type         as recordType
            from stock_in_record sir
                     join production_product_main ppm on ppm.id = sir.record_id
                     join production_operation_task pot on pot.id = ppm.production_operation_task_id
                     join production_order po on po.id = pot.production_order_id
            where sir.record_type = '2' and sir.batch_no is not null and sir.batch_no &lt;&gt; ''
              and sir.product_model_id = po.product_model_id
              and pot.production_order_id in
              <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
            union all
            select pot.production_order_id,
                   qi.product_main_id,
                   sir.batch_no,
                   sir.product_model_id,
                   ifnull(sir.stock_in_num, 0),
                   sir.create_time,
                   sir.record_type
            from stock_in_record sir
                     join quality_inspect qi on qi.id = sir.record_id
                     join production_product_main ppm on ppm.id = qi.product_main_id
                     join production_operation_task pot on pot.id = ppm.production_operation_task_id
                     join production_order po on po.id = pot.production_order_id
            where sir.record_type = '6' and sir.batch_no is not null and sir.batch_no &lt;&gt; ''
              and sir.product_model_id = po.product_model_id
              and pot.production_order_id in
              <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
        ) x
        order by x.productionOrderId, x.inTime
    </select>
 
    <select id="listMaterialBatchInfoByBatches" resultType="com.ruoyi.quality.dto.QualityTraceMaterialBatchVo">
        select sir.id                                as inRecordId,
               sir.batch_no                          as batchNo,
               sir.product_model_id                  as productModelId,
               ifnull(p.product_name, '')            as materialName,
               ifnull(pm.model, '')                  as materialModel,
               pm.unit                               as unit,
               ifnull(sir.stock_in_num, 0)           as qty,
               sir.create_time                       as inTime,
               sir.record_type                       as recordType,
               qi.id                                 as inspectId,
               ifnull(qi.quantity, 0)                as inspectQty,
               ifnull(qi.qualified_quantity, 0)      as qualifiedQty,
               ifnull(qi.unqualified_quantity, 0)    as unqualifiedQty,
               qi.check_result                       as checkResult,
               qi.check_time                         as checkTime,
               coalesce(pl.supplier_name, pl_direct.supplier_name, qi.supplier) as supplierName,
               coalesce(pl.purchase_contract_number, pl_direct.purchase_contract_number) as contractNo,
               coalesce(pl.entry_date, pl_direct.entry_date) as entryDate
        from stock_in_record sir
                 join product_model pm on pm.id = sir.product_model_id
                 left join product p on p.id = pm.product_id
                 left join quality_inspect qi on qi.id = sir.record_id and sir.record_type in ('6', '10')
                 left join purchase_ledger pl on pl.id = qi.purchase_ledger_id
                 left join purchase_ledger pl_direct on pl_direct.id = sir.record_id and sir.record_type = '7'
        where sir.batch_no in
        <foreach collection="batchNos" item="bn" open="(" separator="," close=")">#{bn}</foreach>
        order by sir.id
    </select>
 
    <select id="listBatchOptions" resultType="com.ruoyi.quality.dto.QualityTraceBatchOptionVo">
        <choose>
            <when test="type == 'material'">
                select pop.batch_no                       as batchNo,
                       ifnull(p.product_name, '')         as productName,
                       ifnull(pm.model, '')               as productModel,
                       pm.unit                            as unit,
                       ifnull(pop.quantity, 0)            as qty,
                       pop.create_time                    as inTime,
                       po.nps_no                          as npsNo
                from production_order_pick pop
                         join product_model pm on pm.id = pop.product_model_id
                         left join product p on p.id = pm.product_id
                         left join production_order po on po.id = pop.production_order_id
                where pop.batch_no is not null and pop.batch_no &lt;&gt; ''
            </when>
            <otherwise>
                select sir.batch_no                       as batchNo,
                       ifnull(p.product_name, '')         as productName,
                       ifnull(pm.model, '')               as productModel,
                       pm.unit                            as unit,
                       ifnull(sir.stock_in_num, 0)        as qty,
                       sir.create_time                    as inTime,
                       po.nps_no                          as npsNo
                from stock_in_record sir
                         join product_model pm on pm.id = sir.product_model_id
                         left join product p on p.id = pm.product_id
                         left join quality_inspect qi on qi.id = sir.record_id and sir.record_type = '6'
                         left join production_product_main ppm
                                   on ppm.id = case when sir.record_type = '2' then sir.record_id else qi.product_main_id end
                         left join production_operation_task pot on pot.id = ppm.production_operation_task_id
                         left join production_order po on po.id = pot.production_order_id
                where sir.record_type in ('2', '6') and sir.batch_no is not null and sir.batch_no &lt;&gt; ''
            </otherwise>
        </choose>
        <if test="keyword != null and keyword != ''">
            and (
            <choose>
                <when test="type == 'material'">pop</when>
                <otherwise>sir</otherwise>
            </choose>
            .batch_no like concat('%', #{keyword}, '%')
                or p.product_name like concat('%', #{keyword}, '%')
                or pm.model like concat('%', #{keyword}, '%')
            )
        </if>
        order by inTime desc
        limit #{limit}
    </select>
</mapper>