package com.xujie.modules.inspection.controller; import com.xujie.common.utils.PageUtils; import com.xujie.common.utils.R; import com.xujie.modules.inspection.data.*; import com.xujie.modules.inspection.entity.InspectionRequestDetail; import com.xujie.modules.inspection.entity.InspectionRequestDetailSub; import com.xujie.modules.inspection.entity.InspectionRequestHeader; import com.xujie.modules.inspection.entity.QcPersonList; import com.xujie.modules.inspection.service.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayOutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @RestController @RequestMapping("/inspection") public class InspectionController { @Autowired private InspectionRequestService inspectionRequestService; @Autowired private InspectionRequestDetailService inspectionRequestDetailService; @Autowired private InspectionRequestDetailSubService inspectionRequestDetailSubService; /** * 检验申请单头表分页查询 */ @PostMapping(value = "/searchInspectionRequestHeaderList") public R searchInspectionRequestHeaderList(@RequestBody InspectionRequestHeader data) { PageUtils page = inspectionRequestService.myPage(data); return R.ok().put("page", page); } /** * 根据申请单号查询明细列表(分页) */ @PostMapping(value = "/getInspectionRequestDetailList") public R getInspectionRequestDetailList(@RequestBody InspectionRequestDetail data) { PageUtils page = new PageUtils(inspectionRequestDetailService.getPageList(data)); return R.ok().put("page", page); } /** * 根据申请单号查询子表明细列表(分页) */ @PostMapping(value = "/getInspectionRequestDetailSubList") public R getInspectionRequestDetailSubList(@RequestBody InspectionRequestDetailSub data) { PageUtils page = new PageUtils(inspectionRequestDetailSubService.getPageList(data)); return R.ok().put("page", page); } /** * 查询验货结果 */ @PostMapping(value = "/getInspectionResultList") public R getInspectionResultList(@RequestBody Map params) { String requestNo = params.get("requestNo"); String site = params.get("site"); List list = inspectionRequestDetailService.getInspectionResultList(requestNo, site); return R.ok().put("list", list); } /** * 查询可申请验货PO */ @PostMapping("/queryPoPage") public R queryPoPage(@RequestBody InspectionRequestItemVO vo){ PageUtils page = inspectionRequestService.queryPoPage(vo); return R.ok().put("page", page); } /** * 保存验货申请 */ @PostMapping("/save") public R save(@RequestBody InspectionRequestSaveVO vo){ inspectionRequestService.saveRequest(vo); return R.ok(); } /** * 修改验货申请(仅允许修改建议验货日期、验货地址和联系人) */ @PostMapping("/update") public R update(@RequestBody InspectionRequestHeader header){ inspectionRequestService.updateRequest(header); return R.ok(); } /** * 取消验货申请 */ @PostMapping("/cancel/{requestNo}") public R cancel(@PathVariable String requestNo){ inspectionRequestService.cancel(requestNo); return R.ok(); } /** * 确认验货申请 */ @PostMapping("/confirm/{requestNo}") public R confirm(@PathVariable String requestNo){ inspectionRequestService.confirm(requestNo); return R.ok(); } /** * 审核验货申请 */ @PostMapping("/audit/{requestNo}") public R audit(@PathVariable String requestNo){ inspectionRequestService.audit(requestNo); return R.ok(); } /** * 删除验货申请 */ @PostMapping("/delete/{requestNo}") public R delete(@PathVariable String requestNo){ inspectionRequestService.delete(requestNo); return R.ok(); } /** * 查询qc人员 */ @PostMapping("/getQcPersonList") public R getQcPersonList(@RequestBody QcPersonList qc ){ PageUtils page = inspectionRequestService.getQcPersonList(qc); return R.ok().put("page", page); } /** * 验货排程 */ @PostMapping("/schedule") public R schedule(@RequestBody InspectionScheduleVO vo){ inspectionRequestService.schedule(vo); return R.ok(); } /** * 排程视图查询 */ @GetMapping("/scheduleView") public R scheduleView(@RequestParam String qcOperator){ List list = inspectionRequestService.queryScheduleView(qcOperator); return R.ok().put("list", list); } /** * 下载验货申请导入模板 */ @PostMapping("/downloadTemplate") public ResponseEntity downloadTemplate() { try { // 直接在内存中生成 Excel 模板 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("验货申请数据"); // 创建表头样式 CellStyle headerStyle = workbook.createCellStyle(); Font headerFont = workbook.createFont(); headerFont.setBold(true); headerStyle.setFont(headerFont); headerStyle.setAlignment(HorizontalAlignment.CENTER); headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 设置边框 headerStyle.setBorderTop(BorderStyle.THIN); headerStyle.setBorderBottom(BorderStyle.THIN); headerStyle.setBorderLeft(BorderStyle.THIN); headerStyle.setBorderRight(BorderStyle.THIN); // 设置背景色 headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 创建表头行 Row headerRow = sheet.createRow(0); String[] headers = { "PO号", "PO行号","产品编码", "验货数量", "运输方式", "CRD", "建议验货日期" }; for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); cell.setCellStyle(headerStyle); } // 添加示例数据行 Row dataRow1 = sheet.createRow(1); dataRow1.createCell(0).setCellValue("PO20260522001"); // PO号 dataRow1.createCell(1).setCellValue(1); // PO行号 dataRow1.createCell(2).setCellValue("TESTFX"); // 产品编码 dataRow1.createCell(3).setCellValue(200); // 验货数量 dataRow1.createCell(4).setCellValue("海运"); // 运输方式 dataRow1.createCell(5).setCellValue("2026-06-30"); // CRD dataRow1.createCell(6).setCellValue("2026-05-29"); // 建议验货日期 // 设置列宽 sheet.setColumnWidth(0, 18 * 256); // PO号 sheet.setColumnWidth(1, 15 * 256); // 产品编码 sheet.setColumnWidth(2, 10 * 256); // PO行号 sheet.setColumnWidth(3, 12 * 256); // 验货数量 sheet.setColumnWidth(4, 12 * 256); // 运输方式 sheet.setColumnWidth(5, 15 * 256); // CRD sheet.setColumnWidth(6, 18 * 256); // 建议验货日期 // 写入到字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); workbook.write(outputStream); workbook.close(); byte[] bytes = outputStream.toByteArray(); ByteArrayResource resource = new ByteArrayResource(bytes); String fileName = "验货申请导入模板.xlsx"; String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()) .replaceAll("\\+", "%20"); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName) .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(bytes.length)) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); } catch (Exception e) { e.printStackTrace(); return ResponseEntity.internalServerError().build(); } } /** * 预览上传的 Excel 数据 */ @PostMapping("/previewUpload") public R previewUpload(@RequestParam("file") MultipartFile file) throws Exception { List list = inspectionRequestService.previewUpload(file); return R.ok().put("data", list); } /** * 批量保存上传的数据 */ @PostMapping("/batchSave") public R batchSave(@RequestParam("file") MultipartFile file) { try { inspectionRequestService.batchSave(file); return R.ok(); } catch (Exception e) { return R.error(e.getMessage()); } } }