cheng
2024-01-28 31016f01ec27432295e77d1720b19cd5fd37ce72
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
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
package com.product.data.center.service;
 
import java.io.IOException;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.util.*;
 
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import cn.hutool.core.date.DateTime;
import com.product.core.entity.SQLEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.product.core.dao.BaseDao;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.core.service.support.AbstractBaseService;
import com.product.data.center.config.CmnConst;
import com.product.data.center.entity.SNAssociatedItemEntity;
import com.product.data.center.utils.QuerySqlParseUtil;
import com.product.util.BaseUtil;
 
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
 
/**
 * SN关联物料
 *
 * @author 86151
 */
@Component
public class SNAssociatedItemService extends AbstractBaseService {
 
 
    @Autowired
    BaseDao baseDao;
 
    /**
     * 过站信息
     *
     * @param fse
     * @return
     */
    public JSONObject listSNItemInfo(FieldSetEntity fse) {
 
        JSONObject jsonReturn = new JSONObject();
 
        String isBakTable = fse.getString(CmnConst.IS_BAK_TABLE);    //是否切表
        boolean isRecentData = fse.getBoolean(CmnConst.IS_RECENT_DATA) == true;//是否近期数据
        Integer pageSize = fse.getInteger(CmnConst.PAGESIZE);    //页数大小
        Integer cpage = fse.getInteger(CmnConst.CPAGE);            //目标页
 
        //创建tracking表SQL,并获取过滤的数据
        String parseTrackingSql = createTrackingSql(fse, isBakTable, isRecentData);
        DataTableEntity dtTracking = baseDao.listTable(parseTrackingSql, new Object[]{}, pageSize, cpage);
        if (!BaseUtil.dataTableIsEmpty(dtTracking)) {
 
            //获取总条数
//            String totalTrackingSql="SELECT COUNT(*)count_total FROM ("+parseTrackingSql+")t";
//            FieldSetEntity fseTotalTracking=baseDao.getFieldSetBySQL(totalTrackingSql, new Object[] {}, false);
//            jsonReturn.set("total", fseTotalTracking.getInteger("count_total"));
            int totalTrackingSql = dtTracking.getSqle().getTotalCount();
            jsonReturn.set("total", totalTrackingSql);
 
            //通过tracking过滤keyp
            //Method1:使用OR查询
            Object[] serialNumbers = dtTracking.getUuids();
            String keypSql = createKeypSql(serialNumbers, isBakTable, isRecentData);
            DataTableEntity dtKeyp = baseDao.listTable(keypSql, new Object[]{});
 
            if (!BaseUtil.dataTableIsEmpty(dtKeyp)) {
                //将tracking表的数据转为(key,value)形式存储
                JSONObject json = convertDataTableToJson(dtTracking);
                addKeypInfo(json, dtKeyp);
                jsonReturn.set("keyp_info", BaseUtil.dataTableEntityToJson(dtKeyp));
                return jsonReturn;
            }
 
            //Method2:使用左关联查询(考虑到SQL的长度标准,建议不使用)
 
        } else {
            jsonReturn.set("total", 0);
        }
        return null;
    }
 
 
    /**
     * 根据tacking表的SN解析keyp表
     *
     * @param serialNumbers
     * @param isBakTable    是否BAK表
     * @return
     */
    public String createKeypSql(Object[] serialNumbers, String isBakTable, boolean isRecentData) {
        String keypFilter = BaseUtil.buildQuestionMarkFilter(CmnConst.PK_PRODUCT_SN, serialNumbers, true);
 
        StringBuilder keypSql = new StringBuilder(2056);
        keypSql.append(" SELECT ")
                .append(" t.pk_product_sn AS pk_product_sn,b1.zj,c.dj,b.ysj, ")
                .append(" d1.ysjmn,d.dk,e1.xsq,x1.ykq,c1.xfzj, ")
                .append(" REGEXP_SUBSTR(d.dk, '[^|]+', 1, 5) zbrj, ")
                .append(" e.mk,f.fjd,h.ccpg  ")
                .append(" FROM(SELECT DISTINCT pk_product_sn FROM [={");
        keypSql.append("da_t_wip_product_keyp");
        keypSql.append("}{pk_product_sn,pk_keyp_sn,pk_item_source_type}{")
                .append(" WHERE instr( pk_mo,'DK' )=0 AND ")
                .append(keypFilter)
                .append("}=]) t ")
                .append(" LEFT JOIN(SELECT u.pk_product_sn, u.pk_keyp_sn ysj FROM ").append("da_t_wip_product_keyp").append(" u WHERE u.pk_item_source_type= 'YSJ' AND u.pk_keyp_sn NOT LIKE 'R_%') b ON t.pk_product_sn = b.pk_product_sn ")
                .append(" LEFT JOIN(SELECT v.pk_product_sn, v.pk_keyp_sn dj FROM ").append("da_t_wip_product_keyp").append(" v WHERE v.pk_item_source_type= 'DJ' AND v.pk_keyp_sn NOT LIKE 'R_%') c ON t.pk_product_sn = c.pk_product_sn ")
                .append(" LEFT JOIN(SELECT w.pk_product_sn, w.pk_keyp_sn dk FROM ").append("da_t_wip_product_keyp").append(" w WHERE w.pk_item_source_type= 'DK'  AND w.pk_keyp_sn NOT LIKE 'R_%') d ON t.pk_product_sn = d.pk_product_sn ")
                .append(" LEFT JOIN(SELECT x.pk_product_sn, x.pk_keyp_sn mk FROM ").append("da_t_wip_product_keyp").append(" x WHERE x.pk_item_source_type= 'MK' AND x.pk_keyp_sn NOT LIKE 'R_%') e ON t.pk_product_sn = e.pk_product_sn ")
                .append(" LEFT JOIN(SELECT y.pk_product_sn, y.pk_keyp_sn fjd FROM ").append("da_t_wip_product_keyp").append(" y WHERE y.pk_item_source_type= 'FJD' AND y.pk_keyp_sn NOT LIKE 'R_%') f ON t.pk_product_sn = f.pk_product_sn ")
                .append(" LEFT JOIN(SELECT z.pk_product_sn, z.pk_keyp_sn zj FROM ").append("da_t_wip_product_keyp").append(" z WHERE  (z.pk_item_source_type= 'ZJNJMN' or z.pk_item_source_type= 'ZJWJMN') AND z.pk_keyp_sn NOT LIKE 'R_%') b1 ON  t.pk_product_sn = b1.pk_product_sn ")
                .append(" LEFT JOIN(SELECT v1.pk_product_sn, v1.pk_keyp_sn ysjmn FROM ").append("da_t_wip_product_keyp").append(" v1 WHERE v1.pk_item_source_type= 'YSJMN' AND v1.pk_keyp_sn NOT LIKE 'R_%') d1 ON t.pk_product_sn = d1.pk_product_sn ")
                .append(" LEFT JOIN(SELECT w1.pk_product_sn, w1.pk_keyp_sn xsq FROM ").append("da_t_wip_product_keyp").append(" w1 WHERE w1.pk_item_source_type= 'XSQ' AND w1.pk_keyp_sn NOT LIKE 'R_%') e1 ON t.pk_product_sn = e1.pk_product_sn ")
                .append(" LEFT JOIN(SELECT x1.pk_product_sn, x1.pk_keyp_sn ykq FROM ").append("da_t_wip_product_keyp").append(" x1 WHERE x1.pk_item_source_type= 'YKQ' AND x1.pk_keyp_sn NOT LIKE 'R_%') x1 ON t.pk_product_sn = x1.pk_product_sn ")
                .append(" LEFT JOIN(SELECT x1.pk_product_sn, x1.pk_keyp_sn xfzj FROM ").append("da_t_wip_product_keyp").append(" x1 WHERE x1.pk_item_source_type= 'XFZJ' AND x1.pk_keyp_sn NOT LIKE 'R_%') c1 ON t.pk_product_sn = c1.pk_product_sn ")
                .append(" LEFT JOIN (SELECT x1.pk_product_sn, x1.pk_keyp_sn ccpg FROM ").append("da_t_wip_product_keyp").append(" x1 WHERE x1.pk_item_source_type = 'CCPG' AND x1.pk_keyp_sn NOT LIKE 'R_%') h ON t.pk_product_sn = h.pk_product_sn ");
 
        String parseKeypSql = QuerySqlParseUtil.parseSplitTableSql(getBaseDao(), keypSql.toString(), isRecentData ? 2 : 0, false);
        return parseKeypSql;
    }
 
    /**
     * 根据过滤条件解析tacking的SQL
     *
     * @param fse
     * @param isBakTable 是否BAK表
     * @return
     */
    public String createTrackingSql(FieldSetEntity fse, String isBakTable, boolean isRecentData) {
 
        StringBuilder trackingSql = new StringBuilder(256);
        trackingSql.append("SELECT a.mo_number AS moNumber,a.in_line_time AS inLineTime,a.area_name AS areaName,a.serial_number AS uuid,a.technicsid ")
                .append(" FROM [={da_t_wip_tracking}");
        trackingSql.append("{mo_number,in_line_time,area_name,serial_number,technicsid}{")
                .append(parseCondition(fse, 0))
                .append("}=] a")
                .append(" JOIN da_t_smo_technics h ON a.technicsid =h.technicsid ")
                .append(parseCondition(fse, 1));
 
        //解析SQL
        String parseTrackingSql = QuerySqlParseUtil.parseSplitTableSql(getBaseDao(), trackingSql.toString(), isRecentData ? 2 : 0, false);
        return parseTrackingSql;
    }
 
    /**
     * tracking信息转化
     *
     * @param dtTracking
     * @return
     */
    public JSONObject convertDataTableToJson(DataTableEntity dtTracking) {
        JSONObject json = new JSONObject();
        for (int i = 0; i < dtTracking.getRows(); i++) {
            String serialNumber = dtTracking.getFieldSetEntity(i).getString(CmnConst.UUID);
            String areaName = dtTracking.getFieldSetEntity(i).getString(CmnConst.AREANAME);
            String moNumber = dtTracking.getFieldSetEntity(i).getString(CmnConst.MONUMBER);
            String inLineTime = dtTracking.getFieldSetEntity(i).getString(CmnConst.INLINETIME);
            List<String> trackInfo = new ArrayList<>();
            trackInfo.add(areaName);
            trackInfo.add(moNumber);
            trackInfo.add(inLineTime);
            json.set(serialNumber, trackInfo);
        }
        return json;
    }
 
    /**
     * 将tracking信息添加至keyp
     *
     * @param json
     * @param dtKeyp
     */
    public void addKeypInfo(JSONObject json, DataTableEntity dtKeyp) {
        for (int i = 0; i < dtKeyp.getRows(); i++) {
            FieldSetEntity fseKeyp = dtKeyp.getFieldSetEntity(i);
            String pkProductSN = fseKeyp.getString("pk_product_sn");
            fseKeyp.setValue(CmnConst.PKPRODUCTSN, pkProductSN);
            @SuppressWarnings("unchecked")
            List<String> trackInfo = (List<String>) json.get(pkProductSN);
            if (trackInfo.size() == 3) {
                fseKeyp.setValue("area_name", trackInfo.get(0));
                fseKeyp.setValue("mo_number", trackInfo.get(1));
                fseKeyp.setValue("in_line_time", trackInfo.get(2));
            }
        }
    }
 
    /**
     * 解析报表过滤条件
     *
     * @param fse
     * @return
     */
    public String parseCondition(FieldSetEntity fse, int type) {
 
        StringBuilder sqlFilter = new StringBuilder(128);
 
        if (type == 1) {
            String poka_yoke = fse.getString(CmnConst.POKA_YOKE);    //防呆规则(小米,非小米)
            if (!BaseUtil.strIsNull(poka_yoke)) {
                if ("0".equals(poka_yoke)) {
                    sqlFilter.append(" WHERE h.poka_yoke=1 ");
                } else {
                    sqlFilter.append(" WHERE h.poka_yoke!=1 ");
                }
            }
        } else {
            sqlFilter.append(" WHERE scrap_flag IS NULL ");
            String moNumber = fse.getString(CmnConst.MO_NUMBER);    //工单号
            String factory = fse.getString(CmnConst.FACTORY);        //厂别
            String areasn = fse.getString(CmnConst.AREA_SN);        //线体
            Date startTime = fse.getDate(CmnConst.START_TIME);    //开始时间
            Date endTime = fse.getDate(CmnConst.END_TIME);        //结束时间
 
            if (!BaseUtil.strIsNull(moNumber)) {
                sqlFilter.append(" AND mo_number = '")
                        .append(moNumber)
                        .append("'");
            }
 
//            if (!BaseUtil.strIsNull(factory)) {
//                sqlFilter.append("");
//            }
 
            if (!BaseUtil.strIsNull(areasn)) {
                String[] areasns = areasn.split(",");
                if (areasns.length > 1) {
                    sqlFilter.append(" AND ");
                    sqlFilter.append(BaseUtil.buildQuestionMarkFilter(CmnConst.AREA_SN, areasns, true));
                } else {
                    sqlFilter.append(" AND area_sn = '")
                            .append(areasn)
                            .append("'");
                }
            }
 
            if (startTime != null) {
                sqlFilter.append(" AND in_station_time >=STR_TO_DATE('")
                        .append(DateUtil.format(startTime, "yyyy-MM-dd HH:mm:ss"))
                        .append("','%Y-%m-%d %H:%i:%s')");
            }
 
            if (endTime != null) {
                //判断结束时间是否为当天的开始时间 00:00:00
                DateTime dateTime = new DateTime(endTime);
                Calendar calendar = dateTime.toCalendar();
                if (calendar.get(Calendar.HOUR_OF_DAY) == 0 && calendar.get(Calendar.MINUTE) == 0 && calendar.get(Calendar.SECOND) == 0) {
                    //设置为23:59:59
                    calendar.set(Calendar.HOUR_OF_DAY, 23);
                    calendar.set(Calendar.MINUTE, 59);
                    calendar.set(Calendar.SECOND, 59);
                    endTime = calendar.getTime();
                }
                sqlFilter.append(" AND in_station_time <=STR_TO_DATE('")
                        .append(DateUtil.format(endTime, "yyyy-MM-dd HH:mm:ss"))
                        .append("','%Y-%m-%d %H:%i:%s')");
            }
        }
 
        return sqlFilter.toString();
    }
 
    /**
     * 生成EXCEL信息
     *
     * @param request
     * @param response
     * @throws IOException
     */
    public void getReportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //获取机号查询信息
        FieldSetEntity fse = BaseUtil.getFieldSetEntity(request);
        Boolean isAll = fse.getBoolean("is_all");
        if (isAll) {
            fse.setValue(CmnConst.CPAGE, 1);
            fse.setValue(CmnConst.PAGESIZE, 999);
        }
        //初始EXCEL信息
        response.setContentType("multipart/form-data");
        response.setCharacterEncoding("utf-8");
        //这里URLEncoder.encode可以防止中文乱码
        String fileName = URLEncoder.encode("SN关联物料" + DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".xlsx", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        ServletOutputStream outputStream = response.getOutputStream();
        ExcelWriter excelWriter = EasyExcel.write(outputStream, SNAssociatedItemEntity.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
 
        DataTableEntity workCenterOperationInfomationSheet;
        try {
            do {
                workCenterOperationInfomationSheet = this.dtSNItemInfo(fse);
                if (DataTableEntity.isEmpty(workCenterOperationInfomationSheet)) {
                    continue;
                }
                List<SNAssociatedItemEntity> traceSNItemEntityList = new ArrayList<>();
                for (int i = 0; i < workCenterOperationInfomationSheet.getRows(); i++) {
                    FieldSetEntity fieldSetEntity = workCenterOperationInfomationSheet.getFieldSetEntity(i);
                    Map<Object, Object> values = fieldSetEntity.getValues();
                    JSONObject jsonObject = new JSONObject((Map) values);
                    SNAssociatedItemEntity manufacturingOrderEntity = jsonObject.toBean(SNAssociatedItemEntity.class);
                    traceSNItemEntityList.add(manufacturingOrderEntity);
                }
 
                WriteSheet writeSheet = EasyExcel.writerSheet(1, "data").build();
                excelWriter.write(traceSNItemEntityList, writeSheet);
 
 
                fse.setValue(CmnConst.CPAGE, fse.getInteger(CmnConst.CPAGE) + 1);
            } while (
                    isAll && workCenterOperationInfomationSheet != null && workCenterOperationInfomationSheet.getSqle().isCountLoad());
        } catch (Exception e) {
            throw e;
        } finally {
            excelWriter.finish();
        }
    }
 
    /**
     * 过站信息
     *
     * @param fse
     * @return
     */
    public DataTableEntity dtSNItemInfo(FieldSetEntity fse) {
 
        String isBakTable = fse.getString(CmnConst.IS_BAK_TABLE);
        boolean isRecentData = fse.getBoolean(CmnConst.IS_RECENT_DATA) == true;//是否近期数据
        Integer pageSize = fse.getInteger(CmnConst.PAGESIZE);    //页数大小
        Integer cpage = fse.getInteger(CmnConst.CPAGE);            //目标页
        SQLEntity sqle = new SQLEntity();
        sqle.setCountLoad(false);
        //创建tracking表SQL,并获取过滤的数据
        String parseTrackingSql = createTrackingSql(fse, isBakTable, isRecentData);
        DataTableEntity dtTracking = baseDao.listTable(parseTrackingSql, new Object[]{}, pageSize, cpage);
        if (!BaseUtil.dataTableIsEmpty(dtTracking)) {
            if (dtTracking.getRows() == pageSize) {
                sqle.setCountLoad(true);
            }
            //获取总条数
            String totalTrackingSql = "SELECT COUNT(*)count_total FROM (" + parseTrackingSql + ")t";
//            FieldSetEntity fseTotalTracking = baseDao.getFieldSetBySQL(totalTrackingSql, new Object[]{}, false);
 
            //通过tracking过滤keyp
            //Method1:使用OR查询
            Object[] serialNumbers = dtTracking.getUuids();
            String keypSql = createKeypSql(serialNumbers, isBakTable, isRecentData);
            DataTableEntity dtKeyp = baseDao.listTable(keypSql, new Object[]{});
 
            if (!BaseUtil.dataTableIsEmpty(dtKeyp)) {
                //将tracking表的数据转为(key,value)形式存储
                JSONObject json = convertDataTableToJson(dtTracking);
                addKeypInfo(json, dtKeyp);
                dtKeyp.setSqle(sqle);
                return dtKeyp;
            }
        }
        DataTableEntity dataTableEntity = new DataTableEntity();
        dataTableEntity.setSqle(sqle);
        return dataTableEntity;
    }
}