From f7ffd102d8d304ae16ae5f4248af4c131f47f688 Mon Sep 17 00:00:00 2001 From: yangzz <9704.yyds@163.com> Date: Tue, 2 Jun 2026 10:49:14 +0800 Subject: [PATCH] =?UTF-8?q?QC=E5=AD=90=E4=BB=B6=E4=BF=A1=E6=81=AF=E5=BD=95?= =?UTF-8?q?=E5=85=A5-=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QcSubPartQueryController.java | 25 +++ .../qcsubpart/dao/QcSubPartReportDao.java | 2 + .../dao/impl/QcSubPartReportDaoImpl.java | 54 ++++++ .../data/QcSubPartExportRowData.java | 166 ++++++++++++++++++ .../service/QcSubPartReportService.java | 4 + .../impl/QcSubPartReportServiceImpl.java | 57 ++++++ 6 files changed, 308 insertions(+) create mode 100644 src/main/java/com/xujie/sys/modules/report/qcsubpart/data/QcSubPartExportRowData.java diff --git a/src/main/java/com/xujie/sys/modules/report/qcsubpart/controller/QcSubPartQueryController.java b/src/main/java/com/xujie/sys/modules/report/qcsubpart/controller/QcSubPartQueryController.java index e8cd1112..a5fe4343 100644 --- a/src/main/java/com/xujie/sys/modules/report/qcsubpart/controller/QcSubPartQueryController.java +++ b/src/main/java/com/xujie/sys/modules/report/qcsubpart/controller/QcSubPartQueryController.java @@ -1,14 +1,18 @@ package com.xujie.sys.modules.report.qcsubpart.controller; +import com.alibaba.fastjson2.JSON; +import com.xujie.sys.common.exception.XJException; import com.xujie.sys.common.utils.R; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartDetailQueryData; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartHeaderQueryData; import com.xujie.sys.modules.report.qcsubpart.service.QcSubPartReportService; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -37,4 +41,25 @@ public class QcSubPartQueryController { .put("rows", rows) .put("total", rows.size()); } + + @RequestMapping("exportQcSubPart") + public void exportQcSubPart(HttpServletResponse response, @RequestBody QcSubPartHeaderQueryData data) { + try { + qcSubPartReportService.exportQcSubPart(response, data); + } catch (XJException e) { + writeError(response, e.getMessage()); + } catch (IOException e) { + writeError(response, "导出失败"); + } + } + + private void writeError(HttpServletResponse response, String msg) { + try { + response.reset(); + response.setContentType("application/json;charset=UTF-8"); + response.setCharacterEncoding("utf-8"); + response.getWriter().write(JSON.toJSONString(R.error(msg))); + } catch (IOException ignored) { + } + } } diff --git a/src/main/java/com/xujie/sys/modules/report/qcsubpart/dao/QcSubPartReportDao.java b/src/main/java/com/xujie/sys/modules/report/qcsubpart/dao/QcSubPartReportDao.java index 7db83f5b..96381320 100644 --- a/src/main/java/com/xujie/sys/modules/report/qcsubpart/dao/QcSubPartReportDao.java +++ b/src/main/java/com/xujie/sys/modules/report/qcsubpart/dao/QcSubPartReportDao.java @@ -15,6 +15,8 @@ public interface QcSubPartReportDao { List> getDetailList(QcSubPartDetailQueryData data); + List> queryExportRows(QcSubPartHeaderQueryData data); + List> queryAddMainList(QcSubPartAddMainQueryData data); List> queryAddDetailList(QcSubPartAddDetailQueryData data); diff --git a/src/main/java/com/xujie/sys/modules/report/qcsubpart/dao/impl/QcSubPartReportDaoImpl.java b/src/main/java/com/xujie/sys/modules/report/qcsubpart/dao/impl/QcSubPartReportDaoImpl.java index 16d621b4..329ee338 100644 --- a/src/main/java/com/xujie/sys/modules/report/qcsubpart/dao/impl/QcSubPartReportDaoImpl.java +++ b/src/main/java/com/xujie/sys/modules/report/qcsubpart/dao/impl/QcSubPartReportDaoImpl.java @@ -87,6 +87,60 @@ public class QcSubPartReportDaoImpl implements QcSubPartReportDao { return namedParameterJdbcTemplate.queryForList(sql.toString(), new BeanPropertySqlParameterSource(data)); } + @Override + public List> queryExportRows(QcSubPartHeaderQueryData data) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT "); + sql.append("h.record_no AS recordNo, h.seq_no AS seqNo, CONVERT(VARCHAR(10), h.produce_date, 120) AS scheduledDateMain, "); + sql.append("h.resource_id AS resourceId, h.resource_desc AS resourceDesc, "); + sql.append("h.finished_part_no AS partNo, h.finished_part_desc AS partDesc, h.sku AS sku, "); + sql.append("ISNULL(h.qualified_qty, 0) AS qtyApprove, "); + sql.append("ISNULL(d.sub_part_no, '') AS subPartNo, ISNULL(d.sub_part_desc, '') AS subPartDesc, "); + sql.append("ISNULL(d.supplier_id, '') AS supplierId, ISNULL(d.supplier_name, '') AS supplierName, "); + sql.append("ISNULL(d.model_no, '') AS modelNo, ISNULL(d.manufacture_date, '') AS scheduledDateSub, ISNULL(d.remark, '') AS remark "); + sql.append("FROM qc_subpart_record h "); + sql.append("LEFT JOIN qc_subpart_record_detail d ON d.site = h.site AND d.record_no = h.record_no AND d.del_flag = 'N' "); + sql.append("WHERE h.site = :site AND h.del_flag = 'N' "); + + Map params = new HashMap<>(); + params.put("site", data.getSite()); + String rawBu = emptyToBlank(data.getCitemCode()); + String buNo = extractBuNo(rawBu); + params.put("buNo", buNo); + params.put("seqNo", emptyToBlank(data.getSeqNo())); + params.put("partNo", emptyToBlank(data.getPartNo())); + params.put("sku", emptyToBlank(data.getSku())); + Date startDate = parseSqlDate(data.getStartDate()); + Date endDate = parseSqlDate(data.getEndDate()); + params.put("startDate", startDate); + params.put("endDate", endDate); + + if (!rawBu.isEmpty()) { + if (rawBu.contains("_")) { + sql.append("AND h.citem_code = :buNo "); + } else { + sql.append("AND h.citem_code LIKE '%' + :buNo + '%' "); + } + } + if (!emptyToBlank(data.getSeqNo()).isEmpty()) { + sql.append("AND h.seq_no LIKE '%' + :seqNo + '%' "); + } + if (!emptyToBlank(data.getPartNo()).isEmpty()) { + sql.append("AND h.finished_part_no LIKE '%' + :partNo + '%' "); + } + if (!emptyToBlank(data.getSku()).isEmpty()) { + sql.append("AND h.sku LIKE '%' + :sku + '%' "); + } + if (startDate != null) { + sql.append("AND h.produce_date >= :startDate "); + } + if (endDate != null) { + sql.append("AND h.produce_date <= :endDate "); + } + sql.append("ORDER BY h.create_date DESC, h.record_no DESC, ISNULL(d.sort_no, 999999) ASC "); + return namedParameterJdbcTemplate.queryForList(sql.toString(), params); + } + @Override public List> queryAddMainList(QcSubPartAddMainQueryData data) { StringBuilder sql = new StringBuilder(); diff --git a/src/main/java/com/xujie/sys/modules/report/qcsubpart/data/QcSubPartExportRowData.java b/src/main/java/com/xujie/sys/modules/report/qcsubpart/data/QcSubPartExportRowData.java new file mode 100644 index 00000000..a6751e4b --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/report/qcsubpart/data/QcSubPartExportRowData.java @@ -0,0 +1,166 @@ +package com.xujie.sys.modules.report.qcsubpart.data; + +import com.alibaba.excel.annotation.ExcelProperty; + +public class QcSubPartExportRowData { + @ExcelProperty(index = 0, value = "记录号") + private String recordNo; + @ExcelProperty(index = 1, value = "派工单号") + private String seqNo; + @ExcelProperty(index = 2, value = "生产日期(主)") + private String scheduledDateMain; + @ExcelProperty(index = 3, value = "设备编码") + private String resourceId; + @ExcelProperty(index = 4, value = "设备名称") + private String resourceDesc; + @ExcelProperty(index = 5, value = "物料编码") + private String partNo; + @ExcelProperty(index = 6, value = "产品名称") + private String partDesc; + @ExcelProperty(index = 7, value = "SKU") + private String sku; + @ExcelProperty(index = 8, value = "合格数量") + private String qtyApprove; + @ExcelProperty(index = 9, value = "子件编码") + private String subPartNo; + @ExcelProperty(index = 10, value = "子件描述") + private String subPartDesc; + @ExcelProperty(index = 11, value = "供应商编码") + private String supplierId; + @ExcelProperty(index = 12, value = "供应商名称") + private String supplierName; + @ExcelProperty(index = 13, value = "型号") + private String modelNo; + @ExcelProperty(index = 14, value = "生产日期(子件)") + private String scheduledDateSub; + @ExcelProperty(index = 15, value = "备注") + private String remark; + + public String getRecordNo() { + return recordNo; + } + + public void setRecordNo(String recordNo) { + this.recordNo = recordNo; + } + + public String getSeqNo() { + return seqNo; + } + + public void setSeqNo(String seqNo) { + this.seqNo = seqNo; + } + + public String getScheduledDateMain() { + return scheduledDateMain; + } + + public void setScheduledDateMain(String scheduledDateMain) { + this.scheduledDateMain = scheduledDateMain; + } + + public String getResourceId() { + return resourceId; + } + + public void setResourceId(String resourceId) { + this.resourceId = resourceId; + } + + public String getResourceDesc() { + return resourceDesc; + } + + public void setResourceDesc(String resourceDesc) { + this.resourceDesc = resourceDesc; + } + + public String getPartNo() { + return partNo; + } + + public void setPartNo(String partNo) { + this.partNo = partNo; + } + + public String getPartDesc() { + return partDesc; + } + + public void setPartDesc(String partDesc) { + this.partDesc = partDesc; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public String getQtyApprove() { + return qtyApprove; + } + + public void setQtyApprove(String qtyApprove) { + this.qtyApprove = qtyApprove; + } + + public String getSubPartNo() { + return subPartNo; + } + + public void setSubPartNo(String subPartNo) { + this.subPartNo = subPartNo; + } + + public String getSubPartDesc() { + return subPartDesc; + } + + public void setSubPartDesc(String subPartDesc) { + this.subPartDesc = subPartDesc; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getModelNo() { + return modelNo; + } + + public void setModelNo(String modelNo) { + this.modelNo = modelNo; + } + + public String getScheduledDateSub() { + return scheduledDateSub; + } + + public void setScheduledDateSub(String scheduledDateSub) { + this.scheduledDateSub = scheduledDateSub; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} diff --git a/src/main/java/com/xujie/sys/modules/report/qcsubpart/service/QcSubPartReportService.java b/src/main/java/com/xujie/sys/modules/report/qcsubpart/service/QcSubPartReportService.java index 57fce70a..d7db520d 100644 --- a/src/main/java/com/xujie/sys/modules/report/qcsubpart/service/QcSubPartReportService.java +++ b/src/main/java/com/xujie/sys/modules/report/qcsubpart/service/QcSubPartReportService.java @@ -5,7 +5,9 @@ import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartAddMainQueryData; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartDetailQueryData; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartHeaderQueryData; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartSaveData; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -14,6 +16,8 @@ public interface QcSubPartReportService { List> getDetailList(QcSubPartDetailQueryData data); + void exportQcSubPart(HttpServletResponse response, QcSubPartHeaderQueryData data) throws IOException; + List> queryAddMainList(QcSubPartAddMainQueryData data); List> queryAddDetailList(QcSubPartAddDetailQueryData data); diff --git a/src/main/java/com/xujie/sys/modules/report/qcsubpart/service/impl/QcSubPartReportServiceImpl.java b/src/main/java/com/xujie/sys/modules/report/qcsubpart/service/impl/QcSubPartReportServiceImpl.java index 4a799a43..e05543a6 100644 --- a/src/main/java/com/xujie/sys/modules/report/qcsubpart/service/impl/QcSubPartReportServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/report/qcsubpart/service/impl/QcSubPartReportServiceImpl.java @@ -1,17 +1,25 @@ package com.xujie.sys.modules.report.qcsubpart.service.impl; +import com.alibaba.excel.EasyExcel; import com.xujie.sys.common.exception.XJException; import com.xujie.sys.modules.report.qcsubpart.dao.QcSubPartReportDao; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartAddDetailQueryData; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartAddMainQueryData; +import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartExportRowData; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartDetailQueryData; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartHeaderQueryData; import com.xujie.sys.modules.report.qcsubpart.data.QcSubPartSaveData; import com.xujie.sys.modules.report.qcsubpart.service.QcSubPartReportService; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -35,6 +43,51 @@ public class QcSubPartReportServiceImpl implements QcSubPartReportService { return qcSubPartReportDao.getDetailList(data); } + @Override + public void exportQcSubPart(HttpServletResponse response, QcSubPartHeaderQueryData data) throws IOException { + if (data == null) { + throw new XJException("请求体不能为空"); + } + if (emptyToBlank(data.getSite()).isEmpty()) { + throw new XJException("site不能为空"); + } + List> rows = qcSubPartReportDao.queryExportRows(data); + if (rows == null || rows.isEmpty()) { + throw new XJException("无可导出数据"); + } + List exportRows = new ArrayList<>(); + for (Map row : rows) { + QcSubPartExportRowData dto = new QcSubPartExportRowData(); + dto.setRecordNo(toText(row.get("recordNo"))); + dto.setSeqNo(toText(row.get("seqNo"))); + dto.setScheduledDateMain(toText(row.get("scheduledDateMain"))); + dto.setResourceId(toText(row.get("resourceId"))); + dto.setResourceDesc(toText(row.get("resourceDesc"))); + dto.setPartNo(toText(row.get("partNo"))); + dto.setPartDesc(toText(row.get("partDesc"))); + dto.setSku(toText(row.get("sku"))); + dto.setQtyApprove(toText(row.get("qtyApprove"))); + dto.setSubPartNo(toText(row.get("subPartNo"))); + dto.setSubPartDesc(toText(row.get("subPartDesc"))); + dto.setSupplierId(toText(row.get("supplierId"))); + dto.setSupplierName(toText(row.get("supplierName"))); + dto.setModelNo(toText(row.get("modelNo"))); + dto.setScheduledDateSub(toText(row.get("scheduledDateSub"))); + dto.setRemark(toText(row.get("remark"))); + exportRows.add(dto); + } + + String suffix = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + String fileName = URLEncoder.encode("QC子件报表_" + suffix, StandardCharsets.UTF_8).replaceAll("\\+", "%20"); + response.reset(); + response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + fileName + ".xlsx"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + EasyExcel.write(response.getOutputStream(), QcSubPartExportRowData.class) + .sheet("QC子件报表") + .doWrite(exportRows); + } + @Override public List> queryAddMainList(QcSubPartAddMainQueryData data) { if ("N".equalsIgnoreCase(emptyToBlank(data.getSearchFlag()))) { @@ -119,4 +172,8 @@ public class QcSubPartReportServiceImpl implements QcSubPartReportService { private String emptyToBlank(String value) { return value == null ? "" : value.trim(); } + + private String toText(Object value) { + return value == null ? "" : String.valueOf(value); + } }