buhuazhen
4 天以前 c78984f3aea4505971dc12f8acd41e30cf4fdbea
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
package com.ruoyi.quality.service.impl;
 
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.quality.dto.QualityInspectExportDTO;
import com.ruoyi.quality.dto.QualityInspectExportVO;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.service.IQualityInspectParamService;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 
/**
 * 质量检验导出处理类
 */
@Component
public class QualityInspectExportHandle {
 
    @Resource
    private QualityInspectMapper qualityInspectMapper;
 
    @Resource
    private IQualityInspectParamService qualityInspectParamService;
 
    /**
     * 查询检验记录(支持选中导出和全部导出)
     * @param exportDTO 导出参数
     * @return 检验记录列表
     */
    public List<QualityInspect> queryInspectList(QualityInspectExportDTO exportDTO) {
        QualityInspect qualityInspect = new QualityInspect();
        qualityInspect.setInspectType(exportDTO.getInspectType());
        qualityInspect.setSupplier(exportDTO.getSupplier());
        qualityInspect.setProcess(exportDTO.getProcess());
        qualityInspect.setProductName(exportDTO.getProductName());
        qualityInspect.setEntryDateStart(exportDTO.getEntryDateStart());
        qualityInspect.setEntryDateEnd(exportDTO.getEntryDateEnd());
 
        if (!CollectionUtils.isEmpty(exportDTO.getIds())) {
            return qualityInspectMapper.qualityInspectExportByIds(exportDTO.getIds(), qualityInspect);
        } else {
            return qualityInspectMapper.qualityInspectExportByIds(null, qualityInspect);
        }
    }
 
    /**
     * 构建导出数据(每个检验参数一行)
     * 同一检验记录的多个参数行,只在第一行显示左侧基础信息,后续行留空
     * @param qualityInspects 检验记录列表
     * @param inspectType 检验类型
     * @return 导出数据列表
     */
    public List<QualityInspectExportVO> buildExportData(List<QualityInspect> qualityInspects, Integer inspectType) {
        if (CollectionUtils.isEmpty(qualityInspects)) {
            return new ArrayList<>();
        }
 
        // 获取所有检验记录的ID,批量查询检验参数
        List<Long> inspectIds = qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList());
        List<QualityInspectParam> allParams = qualityInspectParamService.list(
            Wrappers.<QualityInspectParam>lambdaQuery().in(QualityInspectParam::getInspectId, inspectIds)
        );
 
        // 按inspectId分组
        Map<Long, List<QualityInspectParam>> paramMap = allParams.stream()
            .collect(Collectors.groupingBy(QualityInspectParam::getInspectId));
 
        // 构建导出数据:每个检验参数一行
        List<QualityInspectExportVO> exportList = new ArrayList<>();
        for (QualityInspect inspect : qualityInspects) {
            List<QualityInspectParam> params = paramMap.getOrDefault(inspect.getId(), new ArrayList<>());
 
            if (params.isEmpty()) {
                // 没有检验参数,也输出一行
                QualityInspectExportVO vo = buildVO(inspect, null, inspectType, true);
                exportList.add(vo);
            } else {
                // 有检验参数,每个参数一行,第一行显示基础信息,后续行左侧留空
                boolean isFirst = true;
                for (QualityInspectParam param : params) {
                    QualityInspectExportVO vo = buildVO(inspect, param, inspectType, isFirst);
                    exportList.add(vo);
                    isFirst = false;
                }
            }
        }
 
        return exportList;
    }
 
    /**
     * 构建单行导出数据
     * @param inspect 检验记录
     * @param param 检验参数(可为null)
     * @param inspectType 检验类型
     * @param showBaseInfo 是否显示左侧基础信息(同一检验记录的多行,只在第一行显示)
     */
    private QualityInspectExportVO buildVO(QualityInspect inspect, QualityInspectParam param, Integer inspectType, boolean showBaseInfo) {
        QualityInspectExportVO vo = new QualityInspectExportVO();
 
        // 只有第一行显示左侧基础信息,后续行留空
        if (showBaseInfo) {
            vo.setCheckTime(inspect.getCheckTime());
            vo.setCheckName(inspect.getCheckName());
            vo.setProductName(inspect.getProductName());
            vo.setModel(inspect.getModel());
            vo.setUnit(inspect.getUnit());
            vo.setQuantity(inspect.getQuantity());
            vo.setCheckCompany(inspect.getCheckCompany());
            vo.setCheckResult(inspect.getCheckResult());
 
            // 设置订单号和供应商/工序
            if (inspectType == 0) {
                vo.setOrderNo(inspect.getPurchaseContractNo());
                vo.setSupplierOrProcess(inspect.getSupplier());
            } else if (inspectType == 1) {
                vo.setOrderNo(inspect.getWorkOrderNo());
                vo.setSupplierOrProcess(inspect.getProcess());
            } else {
                vo.setOrderNo(inspect.getWorkOrderNo());
                vo.setSupplierOrProcess("");
            }
        }
 
        // 设置检验参数(每行都要显示)
        if (param != null) {
            vo.setParameterItem(param.getParameterItem());
            vo.setParamUnit(param.getUnit());
            vo.setStandardValue(param.getStandardValue());
            vo.setControlValue(param.getControlValue());
            vo.setTestValue(param.getTestValue());
        }
 
        return vo;
    }
 
    /**
     * 导出Excel
     * @param response 响应
     * @param exportList 导出数据
     * @param inspectType 检验类型
     */
    public void exportExcel(HttpServletResponse response, List<QualityInspectExportVO> exportList, Integer inspectType) {
        try {
            Workbook workbook = new XSSFWorkbook();
            Sheet sheet = workbook.createSheet();
 
            // 创建样式
            CellStyle headerStyle = createHeaderStyle(workbook);
            CellStyle dataStyle = createDataStyle(workbook);
 
            // 构建表头
            Row headerRow = sheet.createRow(0);
            String[] headers = {"检测日期", "订单号", "供应商/工序", "检验员", "产品名称", "规格型号", "单位", "数量", "检测单位", "检测结果", "指标", "指标单位", "标准值", "内控值", "检验值"};
            for (int i = 0; i < headers.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(headers[i]);
                cell.setCellStyle(headerStyle);
            }
 
            // 填充数据
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            int rowIndex = 1;
            for (QualityInspectExportVO vo : exportList) {
                Row dataRow = sheet.createRow(rowIndex++);
 
                createCell(dataRow, 0, vo.getCheckTime() != null ? sdf.format(vo.getCheckTime()) : "", dataStyle);
                createCell(dataRow, 1, vo.getOrderNo() != null ? vo.getOrderNo() : "", dataStyle);
                createCell(dataRow, 2, vo.getSupplierOrProcess() != null ? vo.getSupplierOrProcess() : "", dataStyle);
                createCell(dataRow, 3, vo.getCheckName() != null ? vo.getCheckName() : "", dataStyle);
                createCell(dataRow, 4, vo.getProductName() != null ? vo.getProductName() : "", dataStyle);
                createCell(dataRow, 5, vo.getModel() != null ? vo.getModel() : "", dataStyle);
                createCell(dataRow, 6, vo.getUnit() != null ? vo.getUnit() : "", dataStyle);
                createCell(dataRow, 7, vo.getQuantity() != null ? vo.getQuantity().toString() : "", dataStyle);
                createCell(dataRow, 8, vo.getCheckCompany() != null ? vo.getCheckCompany() : "", dataStyle);
                createCell(dataRow, 9, vo.getCheckResult() != null ? vo.getCheckResult() : "", dataStyle);
                createCell(dataRow, 10, vo.getParameterItem() != null ? vo.getParameterItem() : "", dataStyle);
                createCell(dataRow, 11, vo.getParamUnit() != null ? vo.getParamUnit() : "", dataStyle);
                createCell(dataRow, 12, vo.getStandardValue() != null ? vo.getStandardValue() : "", dataStyle);
                createCell(dataRow, 13, vo.getControlValue() != null ? vo.getControlValue() : "", dataStyle);
                createCell(dataRow, 14, vo.getTestValue() != null ? vo.getTestValue() : "", dataStyle);
            }
 
            // 设置列宽
            for (int i = 0; i < headers.length; i++) {
                sheet.setColumnWidth(i, 15 * 256);
            }
 
            // 导出文件名
            String fileName = getFileName(inspectType);
 
            // 输出
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
            OutputStream os = response.getOutputStream();
            workbook.write(os);
            os.flush();
            os.close();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败: " + e.getMessage());
        }
    }
 
    /**
     * 创建表头样式
     */
    private CellStyle createHeaderStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
        return style;
    }
 
    /**
     * 创建数据样式
     */
    private CellStyle createDataStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        return style;
    }
 
    /**
     * 创建单元格并设置值
     */
    private void createCell(Row row, int colIndex, String value, CellStyle style) {
        Cell cell = row.createCell(colIndex);
        cell.setCellValue(value);
        cell.setCellStyle(style);
    }
 
    /**
     * 获取导出文件名
     */
    private String getFileName(Integer inspectType) {
        if (inspectType == null) {
            return "检验导出";
        }
        switch (inspectType) {
            case 0:
                return "原材料检验导出";
            case 1:
                return "过程检验导出";
            case 2:
                return "出厂检验导出";
            default:
                return "检验导出";
        }
    }
}