From a4234eabbb847dd491a28d50bc0a7069c507c267 Mon Sep 17 00:00:00 2001 From: hayu <1604366271@qq.com> Date: Thu, 30 Oct 2025 10:10:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E5=91=8A=E6=9F=A5=E8=AF=A2=E3=80=81?= =?UTF-8?q?=E7=9B=B4=E8=BD=AC=E5=8D=95=E5=8F=B7=E5=8C=BA=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/controller/BmReportController.java | 175 +++++++++++- .../basic/domain/report/DownloadRequest.java | 66 +++++ .../basic/domain/report/ReportQuery.java | 144 ++++++++++ .../material/basic/mapper/BmReportMapper.java | 7 + .../basic/service/BmReportService.java | 7 + .../service/impl/BmReportServiceImpl.java | 11 + .../bonus/material/common/utils/DocxUtil.java | 256 ++++++++++++++++++ .../material/common/utils/HttpFileUtil.java | 23 ++ .../com/bonus/material/ma/domain/Type.java | 42 +++ .../ma/service/impl/DirectRotationImpl.java | 24 +- .../impl/PurchaseCheckInfoServiceImpl.java | 29 ++ .../material/task/mapper/TmTaskMapper.java | 3 + .../SysWorkflowRecordHistoryServiceImpl.java | 24 +- .../mapper/material/basic/BmReportMapper.xml | 84 ++++++ .../mapper/material/ma/TypeMapper.xml | 10 + .../mapper/material/task/TmTaskMapper.xml | 20 ++ .../src/main/resources/template/gaizhang.png | Bin 0 -> 33769 bytes 17 files changed, 913 insertions(+), 12 deletions(-) create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/report/DownloadRequest.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/report/ReportQuery.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/common/utils/DocxUtil.java create mode 100644 bonus-modules/bonus-material/src/main/java/com/bonus/material/common/utils/HttpFileUtil.java create mode 100644 bonus-modules/bonus-material/src/main/resources/template/gaizhang.png diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/controller/BmReportController.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/controller/BmReportController.java index 6d126922..52a7fd9a 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/controller/BmReportController.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/controller/BmReportController.java @@ -9,16 +9,34 @@ import com.bonus.common.core.web.controller.BaseController; import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.material.basic.domain.report.*; import com.bonus.material.basic.service.BmReportService; +import com.bonus.material.common.utils.DocxUtil; +import com.bonus.material.common.utils.HttpFileUtil; +import com.bonus.material.part.domain.PartTypeCheckInfo; +import com.bonus.material.part.domain.PartTypeQueryDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; +import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; +import org.apache.poi.util.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.URLEncoder; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.LinkedHashMap; + +import static com.bonus.common.core.web.page.TableSupport.PAGE_NUM; +import static com.bonus.common.core.web.page.TableSupport.PAGE_SIZE; /** * @Author ma_sh @@ -568,4 +586,153 @@ public class BmReportController extends BaseController { ExcelUtil util = new ExcelUtil<>(ScrapDetailsInfo.class); util.exportExcel(response, list, "设备追溯查询-报废报表详情查询"); } + + + /** + * 报告查询 + */ + @ApiOperation("报告查询") + @GetMapping("/reportList") + public AjaxResult reportList(ReportQuery bean) { + final List list = bmReportService.getReportList(bean); + final Integer pageIndex = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); + final Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); + return AjaxResult.success(ListPagingUtil.paging(pageIndex, pageSize, list)); + } + + @PostMapping("/downloadSingle") + public void downloadSingle(@RequestBody DownloadRequest request, HttpServletResponse response) throws IOException { + handleDownload(request, response); + } + + @PostMapping("/downloadBulk") + public void downloadBulk(@RequestBody DownloadRequest request, HttpServletResponse response) throws IOException { + String zipName = request.getZipName() != null ? request.getZipName() : "报告下载_" + LocalDate.now(); + String encoded = URLEncoder.encode(zipName + ".zip", "UTF-8"); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encoded); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + + try (ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(response.getOutputStream())) { + + // 按工程 + 领用日期分组 + Map>> grouped = request.getItems().stream() + .collect(Collectors.groupingBy( + item -> sanitize(item.getProName()), // 工程 + LinkedHashMap::new, + Collectors.groupingBy(item -> sanitize(item.getTestTime()), LinkedHashMap::new, Collectors.toList()) // 日期 + )); + + for (Map.Entry>> projectEntry : grouped.entrySet()) { + String projectFolder = projectEntry.getKey(); + Map> dateMap = projectEntry.getValue(); + + for (Map.Entry> dateEntry : dateMap.entrySet()) { + String dateFolder = dateEntry.getKey(); + List items = dateEntry.getValue(); + String baseDatePath = projectFolder + "/" + dateFolder + "/"; + + // 1. 生成合并的出库检验报告 + byte[] mergedReport = DocxUtil.generateReportByList(items); + addToZip(zipOut, baseDatePath + "出库检验报告.docx", mergedReport); + + // 2. 遍历每个类型-规格,创建文件夹并添加附加文件 + Map> typeMap = items.stream() + .collect(Collectors.groupingBy(item -> sanitize(item.getTypeName() + "-" + item.getTypeModelName()))); + + for (Map.Entry> typeEntry : typeMap.entrySet()) { + String typeFolder = typeEntry.getKey(); + String typePath = baseDatePath + typeFolder + "/"; + + // **先创建空文件夹** + ZipArchiveEntry folderEntry = new ZipArchiveEntry(typePath); + zipOut.putArchiveEntry(folderEntry); + zipOut.closeArchiveEntry(); + + // 再添加附加文件(如果存在) + for (DownloadRequest.ItemInfo item : typeEntry.getValue()) { + addFileIfExists(zipOut, typePath, "合格证", item.getQualifiedUrl()); + addFileIfExists(zipOut, typePath, "型式试验报告", item.getTestReportUrl()); + addFileIfExists(zipOut, typePath, "第三方检测报告", item.getThirdReportUrl()); + addFileIfExists(zipOut, typePath, "出厂检测报告", item.getFactoryReportUrl()); + addFileIfExists(zipOut, typePath, "其他文件", item.getOtherReportUrl()); + } + } + } + } + + zipOut.finish(); + } + } + + + /** 将多条 ItemInfo 转成生成报告需要的列表 */ + private static List flattenItemMap(Map> typeMap) { + List list = new ArrayList<>(); + typeMap.values().forEach(list::addAll); + return list; + } + + + + private void handleDownload(DownloadRequest request, HttpServletResponse response) throws IOException { + String zipName = request.getZipName() != null ? request.getZipName() : "报告下载"; + String encoded = URLEncoder.encode(zipName + ".zip", "UTF-8"); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encoded); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + + try (ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(response.getOutputStream())) { + for (DownloadRequest.ItemInfo item : request.getItems()) { + String projectFolder = sanitize(item.getProName()); + String matFolder = sanitize(item.getTypeName() + "-" + item.getTypeModelName()); + String basePath = projectFolder + "/" + matFolder + "/"; + + // 1. 生成出库检验报告.docx + byte[] docBytes = DocxUtil.generateReport(item); + addToZip(zipOut, basePath + "出库检验报告.docx", docBytes); + + // 2. 附加各类报告文件 + addFileIfExists(zipOut, basePath, "合格证", item.getQualifiedUrl()); + addFileIfExists(zipOut, basePath, "型式试验报告", item.getTestReportUrl()); + addFileIfExists(zipOut, basePath, "第三方检测报告", item.getThirdReportUrl()); + addFileIfExists(zipOut, basePath, "出厂检测报告", item.getFactoryReportUrl()); + addFileIfExists(zipOut, basePath, "其他文件", item.getOtherReportUrl()); + } + zipOut.finish(); + } + } + + private void addFileIfExists(ZipArchiveOutputStream zipOut, String base, String name, String url) { + if (url == null || url.isEmpty()) { + return; + } + try { + byte[] bytes = HttpFileUtil.downloadFile(url); + if (bytes != null) { + addToZip(zipOut, base + name + getFileExtension(url), bytes); + } + } catch (Exception e) { + System.err.println("跳过文件:" + url + " -> " + e.getMessage()); + } + } + + private void addToZip(ZipArchiveOutputStream zipOut, String path, byte[] bytes) throws IOException { + ZipArchiveEntry entry = new ZipArchiveEntry(path); + zipOut.putArchiveEntry(entry); + try (ByteArrayInputStream in = new ByteArrayInputStream(bytes)) { + IOUtils.copy(in, zipOut); + } + zipOut.closeArchiveEntry(); + } + + private String sanitize(String name) { + if (name == null) { + return "未知"; + } + return name.replaceAll("[\\\\/:*?\"<>|]", "_"); + } + + private String getFileExtension(String url) { + int idx = url.lastIndexOf('.'); + return (idx > 0 && idx < url.length() - 1) ? url.substring(idx) : ""; + } } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/report/DownloadRequest.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/report/DownloadRequest.java new file mode 100644 index 00000000..39849a7f --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/report/DownloadRequest.java @@ -0,0 +1,66 @@ +package com.bonus.material.basic.domain.report; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class DownloadRequest { + private String zipName; + private List items; + + @Data + public static class ItemInfo { + private String taskId; + private String id; + private String proName; + private String typeName; + private String typeModelName; + private String qualifiedUrl; + private String testReportUrl; + private String thirdReportUrl; + private String factoryReportUrl; + private String otherReportUrl; + /** + * 分公司 + */ + private String impUnitName; + + /** + * 项目部 + */ + private String departName; + @ApiModelProperty(value = "计量单位") + private String unit; + + @ApiModelProperty(value = "数量") + private BigDecimal num; + + @ApiModelProperty(value = "编码") + private String maCode; + + @ApiModelProperty("额定载荷") + private String ratedLoad; + + @ApiModelProperty("试验载荷") + private String testLoad; + + @ApiModelProperty("持荷时间") + private String holdingTime; + + @ApiModelProperty("试验日期") + private String testTime; + + @ApiModelProperty("下次试验日期") + private String nextTestTime; + + @ApiModelProperty("验收结论") + private String checkResult; + + @ApiModelProperty("备注") + private String remark; + + } +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/report/ReportQuery.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/report/ReportQuery.java new file mode 100644 index 00000000..f450bf30 --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/domain/report/ReportQuery.java @@ -0,0 +1,144 @@ +package com.bonus.material.basic.domain.report; + +import com.bonus.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class ReportQuery { + + private Long id; + + /** + * 分公司 + */ + private String impUnitName; + + /** + * 项目部 + */ + private String departName; + + /** + * 工程 + */ + private String proName; + + @ApiModelProperty(value = "物资名称") + private String typeName; + + @ApiModelProperty(value = "规格型号") + private String typeModelName; + + @ApiModelProperty(value = "计量单位") + private String unit; + + @ApiModelProperty(value = "数量") + private BigDecimal num; + + @ApiModelProperty(value = "编码") + private String maCode; + + @ApiModelProperty(value="二维码") + private String qrCode; + + /** + * 领用日期 + */ + private String leaseTime; + + /** + * 合格证文件名称 + */ + private String qualifiedName; + /** + * 合格证文件路径 + */ + private String qualifiedUrl; + /** + * 型式试验报告文件名称 + */ + private String testReportName; + /** + * 型式试验报告文件路径 + */ + private String testReportUrl; + /** + * 出厂检测报告名称 + */ + private String factoryReportName; + /** + * 出厂检测报告路径 + */ + private String factoryReportUrl; + /** + * 第三方检测报告名称 + */ + private String thirdReportName; + /** + * 第三方检测报告路径 + */ + private String thirdReportUrl; + /** + * 其他报告名称 + */ + private String otherReportName; + /** + * 其他报告路径 + */ + private String otherReportUrl; + + @ApiModelProperty(value="开始时间") + private String startTime; + + @ApiModelProperty(value="结束时间") + private String endTime; + + private String keyword; + + @ApiModelProperty(value = "设备ID") + private Long maId; + + /** 类型ID */ + @ApiModelProperty(value = "类型ID") + private Long typeId; + + @ApiModelProperty(value = "任务ID") + private Long taskId; + + /** + * i8工程id集合 + */ + private List projectIdList; + + @ApiModelProperty(value = "实施单位id") + private String impUnit; + + @ApiModelProperty("机具类型(1机具,2安全工器具)") + private String jiJuType; + + @ApiModelProperty("额定载荷") + private String ratedLoad; + + @ApiModelProperty("试验载荷") + private String testLoad; + + @ApiModelProperty("持荷时间") + private String holdingTime; + + @ApiModelProperty("试验日期") + private String testTime; + + @ApiModelProperty("下次试验日期") + private String nextTestTime; + + @ApiModelProperty("验收结论") + private String checkResult; + + @ApiModelProperty("备注") + private String remark; + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/mapper/BmReportMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/mapper/BmReportMapper.java index a6bce0ce..600e8f75 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/mapper/BmReportMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/mapper/BmReportMapper.java @@ -124,4 +124,11 @@ public interface BmReportMapper { * @return */ String selectUserNameById(String repairPersonName); + + /** + * 报表查询 + * @param bean + * @return + */ + List getReportList(ReportQuery bean); } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/BmReportService.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/BmReportService.java index 01187019..eb02ff41 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/BmReportService.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/BmReportService.java @@ -116,4 +116,11 @@ public interface BmReportService { * @return */ List getScrapDetailsList(ScrapInfo bean); + + /** + * 报表查询 + * @param bean + * @return + */ + List getReportList(ReportQuery bean); } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/impl/BmReportServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/impl/BmReportServiceImpl.java index 231927f0..079525f4 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/impl/BmReportServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/basic/service/impl/BmReportServiceImpl.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -389,6 +390,16 @@ public class BmReportServiceImpl implements BmReportService { return bmReportMapper.getScrapDetailsList(bean); } + @Override + public List getReportList(ReportQuery bean) { + try { + return bmReportMapper.getReportList(bean); + } catch (Exception e) { + e.printStackTrace(); + return new ArrayList<>(); + } + } + /** * 判断字符串是否为纯数字(可用于判断是否为用户ID) */ diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/common/utils/DocxUtil.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/common/utils/DocxUtil.java new file mode 100644 index 00000000..96acf0ab --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/common/utils/DocxUtil.java @@ -0,0 +1,256 @@ +package com.bonus.material.common.utils; + +import com.bonus.material.basic.domain.report.DownloadRequest; +import org.apache.poi.xwpf.usermodel.*; +import org.apache.poi.util.Units; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; + +import java.io.*; +import java.math.BigInteger; +import java.util.List; + +/** + * 出库检验报告生成工具类(横向 A4) + * 格式与模板一致,页面为横向,且带印章 + */ +public class DocxUtil { + + public static byte[] generateReport(DownloadRequest.ItemInfo item) { + try (XWPFDocument doc = new XWPFDocument(); ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + + // ===== 页面方向设为横向 ===== + CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr(); + CTPageSz pageSize = sectPr.addNewPgSz(); + pageSize.setOrient(STPageOrientation.LANDSCAPE); + pageSize.setW(BigInteger.valueOf(16840)); // A4横向宽 + pageSize.setH(BigInteger.valueOf(11900)); // A4横向高 + + // ===== 标题 ===== + XWPFParagraph title = doc.createParagraph(); + title.setAlignment(ParagraphAlignment.CENTER); + XWPFRun runTitle = title.createRun(); + runTitle.setText("施工机具设备出库检验记录表"); + runTitle.setBold(true); + runTitle.setFontFamily("宋体"); + runTitle.setFontSize(16); + + // ===== 工程、单位信息 ===== + XWPFParagraph info = doc.createParagraph(); + info.setAlignment(ParagraphAlignment.LEFT); + XWPFRun runInfo = info.createRun(); + runInfo.setFontFamily("宋体"); + runInfo.setFontSize(12); + runInfo.setText("领用工程:" + safe(item.getProName()) + " 使用单位:" + safe(item.getDepartName())); + runInfo.addBreak(); + + // ===== 表格(1标题行 + 数据行) ===== + int colNum = 12; + XWPFTable table = doc.createTable(1, colNum); + table.setWidth("100%"); + + // 表头文字 + String[] headers = { + "机具名称", "规格型号", "单位", "数量", "设备编码", + "额定载荷KN", "试验载荷KN", "持荷时间min", + "试验日期", "下次试验日期", "检验结论", "备注" + }; + + // 设置表头样式 + XWPFTableRow headerRow = table.getRow(0); + for (int i = 0; i < headers.length; i++) { + XWPFTableCell cell = headerRow.getCell(i); + setCellText(cell, headers[i], true); + } + + // 数据行 + XWPFTableRow dataRow = table.createRow(); + String[] values = { + safe(item.getTypeName()), + safe(item.getTypeModelName()), + safe(item.getUnit()), + safe(String.valueOf(item.getNum())), + safe(item.getMaCode()), + safe(item.getRatedLoad()), + safe(item.getTestLoad()), + safe(item.getHoldingTime()), + safe(item.getTestTime()), + safe(item.getNextTestTime()), + safe(item.getCheckResult()), + safe(item.getRemark()) + }; + + for (int i = 0; i < colNum; i++) { + XWPFTableCell cell = dataRow.getCell(i); + setCellText(cell, values[i], false); + } + + // ===== 检验单位 ===== + XWPFParagraph footer = doc.createParagraph(); + footer.setAlignment(ParagraphAlignment.LEFT); + footer.setSpacingBefore(400); + XWPFRun runFooter = footer.createRun(); + runFooter.setFontFamily("宋体"); + runFooter.setFontSize(12); + runFooter.setText("检验单位:"); + + // ===== 插入印章图片 ===== + // 使用类路径读取图片 + InputStream is = DocxUtil.class.getClassLoader().getResourceAsStream("template/gaizhang.png"); + if (is == null) { + throw new FileNotFoundException("找不到资源:template/gaizhang.png"); + } + + // 在同一个 Run 后面插入图片 + runFooter.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, "gaizhang.png", Units.toEMU(80), Units.toEMU(80)); + is.close(); + + + doc.write(bos); + return bos.toByteArray(); + + } catch (Exception e) { + e.printStackTrace(); + return new byte[0]; + } + } + + /** 单元格通用设置 */ + private static void setCellText(XWPFTableCell cell, String text, boolean isHeader) { + XWPFParagraph p = cell.getParagraphs().get(0); + p.setAlignment(ParagraphAlignment.CENTER); + XWPFRun run = p.createRun(); + run.setFontFamily("宋体"); + run.setFontSize(10); + run.setText(text == null ? "" : text); + if (isHeader) { + run.setBold(true); + } + // 设置单元格宽度 + cell.getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(1200)); + } + + private static String safe(String s) { + return s == null ? "" : s; + } + + /** + * 读取图片文件为 byte 数组 + * @param file 图片文件 + * @return 图片的字节数据 + */ + private static byte[] getImageBytes(File file) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + try (FileInputStream fileInputStream = new FileInputStream(file)) { + byte[] buffer = new byte[1024]; + int length; + while ((length = fileInputStream.read(buffer)) != -1) { + byteArrayOutputStream.write(buffer, 0, length); + } + } + return byteArrayOutputStream.toByteArray(); + } + + /** + * 根据文件扩展名获取图片类型 + * @param fileName 文件名 + * @return 图片类型 + */ + private static int getPictureType(String fileName) { + String ext = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase(); + switch (ext) { + case "png": + return XWPFDocument.PICTURE_TYPE_PNG; + case "jpeg": + case "jpg": + return XWPFDocument.PICTURE_TYPE_JPEG; + case "gif": + return XWPFDocument.PICTURE_TYPE_GIF; + default: + throw new IllegalArgumentException("Unsupported image type: " + ext); + } + } + + public static byte[] generateReportByList(List items) { + if (items == null || items.isEmpty()) { + return new byte[0]; + } + + DownloadRequest.ItemInfo first = items.get(0); + + try (XWPFDocument doc = new XWPFDocument(); ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + // 页面横向 + CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr(); + CTPageSz pageSize = sectPr.addNewPgSz(); + pageSize.setOrient(STPageOrientation.LANDSCAPE); + pageSize.setW(BigInteger.valueOf(16840)); + pageSize.setH(BigInteger.valueOf(11900)); + + // 标题 + XWPFParagraph title = doc.createParagraph(); + title.setAlignment(ParagraphAlignment.CENTER); + XWPFRun runTitle = title.createRun(); + runTitle.setText("施工机具设备出库检验记录表"); + runTitle.setBold(true); + runTitle.setFontFamily("宋体"); + runTitle.setFontSize(16); + + // 工程、单位 + XWPFParagraph info = doc.createParagraph(); + info.setAlignment(ParagraphAlignment.LEFT); + XWPFRun runInfo = info.createRun(); + runInfo.setFontFamily("宋体"); + runInfo.setFontSize(12); + runInfo.setText("领用工程:" + safe(first.getProName()) + " 使用单位:" + safe(first.getDepartName())); + runInfo.addBreak(); + + // 表格 + int colNum = 12; + XWPFTable table = doc.createTable(1, colNum); + table.setWidth("100%"); + + String[] headers = { + "机具名称", "规格型号", "单位", "数量", "设备编码", + "额定载荷KN", "试验载荷KN", "持荷时间min", + "试验日期", "下次试验日期", "检验结论", "备注" + }; + XWPFTableRow headerRow = table.getRow(0); + for (int i = 0; i < headers.length; i++) { + setCellText(headerRow.getCell(i), headers[i], true); + } + + for (DownloadRequest.ItemInfo item : items) { + XWPFTableRow row = table.createRow(); + String[] values = { + safe(item.getTypeName()), safe(item.getTypeModelName()), safe(item.getUnit()), safe(String.valueOf(item.getNum())), + safe(item.getMaCode()), safe(item.getRatedLoad()), safe(item.getTestLoad()), safe(item.getHoldingTime()), + safe(item.getTestTime()), safe(item.getNextTestTime()), safe(item.getCheckResult()), safe(item.getRemark()) + }; + for (int i = 0; i < colNum; i++) { + setCellText(row.getCell(i), values[i], false); + } + } + + // 检验单位 + 印章 + XWPFParagraph footer = doc.createParagraph(); + footer.setAlignment(ParagraphAlignment.LEFT); + footer.setSpacingBefore(400); + XWPFRun runFooter = footer.createRun(); + runFooter.setFontFamily("宋体"); + runFooter.setFontSize(12); + runFooter.setText("检验单位:"); + + InputStream is = DocxUtil.class.getClassLoader().getResourceAsStream("template/gaizhang.png"); + if (is != null) { + runFooter.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, "gaizhang.png", Units.toEMU(80), Units.toEMU(80)); + } + + doc.write(bos); + return bos.toByteArray(); + + } catch (Exception e) { + e.printStackTrace(); + return new byte[0]; + } + } + +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/common/utils/HttpFileUtil.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/common/utils/HttpFileUtil.java new file mode 100644 index 00000000..0ed5954d --- /dev/null +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/common/utils/HttpFileUtil.java @@ -0,0 +1,23 @@ +package com.bonus.material.common.utils; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; + +public class HttpFileUtil { + + public static byte[] downloadFile(String url) throws IOException { + try (CloseableHttpClient client = HttpClients.createDefault()) { + HttpGet get = new HttpGet(url); + try (CloseableHttpResponse response = client.execute(get)) { + HttpEntity entity = response.getEntity(); + return entity != null ? EntityUtils.toByteArray(entity) : null; + } + } + } +} diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/ma/domain/Type.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/ma/domain/Type.java index 47a00f84..c4060e74 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/ma/domain/Type.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/ma/domain/Type.java @@ -308,4 +308,46 @@ public class Type extends BaseEntity { private String resultMsg; private Integer inputType; + + /** + * 合格证文件名称 + */ + private String qualifiedName; + /** + * 合格证文件路径 + */ + private String qualifiedUrl; + /** + * 型式试验报告文件名称 + */ + private String testReportName; + /** + * 型式试验报告文件路径 + */ + private String testReportUrl; + /** + * 出厂检测报告名称 + */ + private String factoryReportName; + /** + * 出厂检测报告路径 + */ + private String factoryReportUrl; + /** + * 第三方检测报告名称 + */ + private String thirdReportName; + /** + * 第三方检测报告路径 + */ + private String thirdReportUrl; + /** + * 其他报告名称 + */ + private String otherReportName; + /** + * 其他报告路径 + */ + private String otherReportUrl; + } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/ma/service/impl/DirectRotationImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/ma/service/impl/DirectRotationImpl.java index 6769fb14..01179450 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/ma/service/impl/DirectRotationImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/ma/service/impl/DirectRotationImpl.java @@ -372,8 +372,8 @@ public class DirectRotationImpl implements DirectRotationService { } List detailById = mapper.getDetailById(sltAgreementInfo); List list = mapper.selectDetails(sltAgreementInfo); - int thisMonthMaxOrder = taskMapper.getMonthMaxOrderByDate(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_BACK.getTaskTypeId()); - String codes = genderTaskCode(thisMonthMaxOrder); + int thisMonthMaxOrder = taskMapper.getMonthMaxOrderByDateTwo(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_BACK.getTaskTypeId()); + String codes = genderZzBackTaskCode(thisMonthMaxOrder); TmTask task = new TmTask(null, TmTaskTypeEnum.TM_TASK_BACK.getTaskTypeId(), BackTaskStatusEnum.BACK_TASK_IN_FINISHED.getStatus(), null,thisMonthMaxOrder + 1, codes); @@ -395,8 +395,8 @@ public class DirectRotationImpl implements DirectRotationService { extractedCheckDetails(backApplyInfo, detailById, result); } // 审核通过,处理转入单位领料逻辑 - int maxOrderByDate = tmTaskMapper.getMonthMaxOrderByDate(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_LEASE.getTaskTypeId()); - String taskCode = genderLeaseTaskCode(maxOrderByDate); + int maxOrderByDate = tmTaskMapper.getMonthMaxOrderByDateTwo(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_LEASE.getTaskTypeId()); + String taskCode = genderZzLeaseTaskCode(maxOrderByDate); TmTask tmTask1 = new TmTask(null, TmTaskTypeEnum.TM_TASK_LEASE.getTaskTypeId(), LeaseTaskStatusEnum.LEASE_TASK_FINISHED.getStatus(),null ,maxOrderByDate + 1, taskCode); @@ -616,6 +616,14 @@ public class DirectRotationImpl implements DirectRotationService { return MaterialConstants.BACK_TASK_TYPE_LABEL + result + String.format("-%03d", thisMonthMaxOrder + 1); } + private String genderZzBackTaskCode(int thisMonthMaxOrder) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date nowDate = DateUtils.getNowDate(); + String format = dateFormat.format(nowDate); + String result = format.replace("-", ""); + return "ZT" + result + String.format("-%03d", thisMonthMaxOrder + 1); + } + /** * 新增退料信息 * @param info @@ -732,6 +740,14 @@ public class DirectRotationImpl implements DirectRotationService { return MaterialConstants.LEASE_TASK_TYPE_LABEL + result + String.format("-%03d", thisMonthMaxOrder + 1); } + private static String genderZzLeaseTaskCode(Integer thisMonthMaxOrder) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date nowDate = DateUtils.getNowDate(); + String format = dateFormat.format(nowDate); + String result = format.replace("-", ""); + return "ZL" + result + String.format("-%03d", thisMonthMaxOrder + 1); + } + /** * 新增lease_apply_details表数据 * @param list diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java index b38357c2..fef60d29 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/purchase/service/impl/PurchaseCheckInfoServiceImpl.java @@ -705,6 +705,35 @@ public class PurchaseCheckInfoServiceImpl implements IPurchaseCheckInfoService { o.setCreateTime(DateUtils.getNowDate()); }); bmFileInfoMapper.insertBmFileInfos(bmFileInfos); + Type type = new Type(); + for (BmFileInfo bmFileInfo : bmFileInfos){ + //将对应数据插入ma_type表 + if (bmFileInfo.getFileType()!=null){ + if (bmFileInfo.getFileType()==0){ + type.setQualifiedName(bmFileInfo.getName()); + type.setQualifiedUrl(bmFileInfo.getUrl()); + } + if (bmFileInfo.getFileType()==1){ + type.setTestReportName(bmFileInfo.getName()); + type.setTestReportUrl(bmFileInfo.getUrl()); + } + if (bmFileInfo.getFileType()==2){ + type.setFactoryReportName(bmFileInfo.getName()); + type.setFactoryReportUrl(bmFileInfo.getUrl()); + } + if (bmFileInfo.getFileType()==3){ + type.setThirdReportName(bmFileInfo.getName()); + type.setThirdReportUrl(bmFileInfo.getUrl()); + } + if (bmFileInfo.getFileType()==4){ + type.setOtherReportName(bmFileInfo.getName()); + type.setOtherReportUrl(bmFileInfo.getUrl()); + } + } + } + type.setTypeId(bmFileInfos.get(0).getModelId()); + //更新ma_type表 + int res = typeMapper.updateType(type); } Type type = new Type(); type.setTypeId(details.getTypeId()); diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java index cfd5d572..56ed6618 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/task/mapper/TmTaskMapper.java @@ -43,6 +43,8 @@ public interface TmTaskMapper { */ int getMonthMaxOrderByDate(@Param("year") String year, @Param("month") String month, @Param("taskType") Integer taskType); + int getMonthMaxOrderByDateTwo(@Param("year") String year, @Param("month") String month, @Param("taskType") Integer taskType); + /** * 查询任务列表 * @@ -211,4 +213,5 @@ public interface TmTaskMapper { * @return */ List selectRepairInfo(TmTask info); + } diff --git a/bonus-modules/bonus-material/src/main/java/com/bonus/material/work/service/impl/SysWorkflowRecordHistoryServiceImpl.java b/bonus-modules/bonus-material/src/main/java/com/bonus/material/work/service/impl/SysWorkflowRecordHistoryServiceImpl.java index 70b3e020..f2b6787b 100644 --- a/bonus-modules/bonus-material/src/main/java/com/bonus/material/work/service/impl/SysWorkflowRecordHistoryServiceImpl.java +++ b/bonus-modules/bonus-material/src/main/java/com/bonus/material/work/service/impl/SysWorkflowRecordHistoryServiceImpl.java @@ -579,8 +579,8 @@ public class SysWorkflowRecordHistoryServiceImpl implements SysWorkflowRecordHis } List detailById = mapper.getDetailById(sltAgreementInfo); List list = mapper.selectDetails(sltAgreementInfo); - int thisMonthMaxOrder = taskMapper.getMonthMaxOrderByDate(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_BACK.getTaskTypeId()); - String codes = genderTaskCode(thisMonthMaxOrder); + int thisMonthMaxOrder = taskMapper.getMonthMaxOrderByDateTwo(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_BACK.getTaskTypeId()); + String codes = genderZzBackTaskCode(thisMonthMaxOrder); TmTask task = new TmTask(null, TmTaskTypeEnum.TM_TASK_BACK.getTaskTypeId(), BackTaskStatusEnum.BACK_TASK_IN_FINISHED.getStatus(), null,thisMonthMaxOrder + 1, codes); @@ -601,8 +601,8 @@ public class SysWorkflowRecordHistoryServiceImpl implements SysWorkflowRecordHis extractedCheckDetails(backApplyInfo, detailById, result); } // 审核通过,处理转入单位领料逻辑 - int maxOrderByDate = tmTaskMapper.getMonthMaxOrderByDate(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_LEASE.getTaskTypeId()); - String taskCode = genderLeaseTaskCode(maxOrderByDate); + int maxOrderByDate = tmTaskMapper.getMonthMaxOrderByDateTwo(DateUtils.getCurrentYear(), DateUtils.getCurrentMonth(), TmTaskTypeEnum.TM_TASK_LEASE.getTaskTypeId()); + String taskCode = genderZzLeaseTaskCode(maxOrderByDate); TmTask tmTask1 = new TmTask(null, TmTaskTypeEnum.TM_TASK_LEASE.getTaskTypeId(), LeaseTaskStatusEnum.LEASE_TASK_FINISHED.getStatus(),null ,maxOrderByDate + 1, taskCode); @@ -1367,6 +1367,14 @@ public class SysWorkflowRecordHistoryServiceImpl implements SysWorkflowRecordHis return MaterialConstants.LEASE_TASK_TYPE_LABEL + result + String.format("-%03d", thisMonthMaxOrder + 1); } + private static String genderZzLeaseTaskCode(Integer thisMonthMaxOrder) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date nowDate = DateUtils.getNowDate(); + String format = dateFormat.format(nowDate); + String result = format.replace("-", ""); + return "ZL" + result + String.format("-%03d", thisMonthMaxOrder + 1); + } + /** * 保存退料详情数据 back_check_details * @param backApplyInfo @@ -1483,6 +1491,14 @@ public class SysWorkflowRecordHistoryServiceImpl implements SysWorkflowRecordHis return MaterialConstants.BACK_TASK_TYPE_LABEL + result + String.format("-%03d", thisMonthMaxOrder + 1); } + private String genderZzBackTaskCode(int thisMonthMaxOrder) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date nowDate = DateUtils.getNowDate(); + String format = dateFormat.format(nowDate); + String result = format.replace("-", ""); + return "ZT" + result + String.format("-%03d", thisMonthMaxOrder + 1); + } + /** * 过滤字符串,保留 sourceStr 中在 referenceStr 里也存在的元素(都用逗号分隔) * diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/basic/BmReportMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/basic/BmReportMapper.xml index fb3addcb..6eecb34e 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/basic/BmReportMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/basic/BmReportMapper.xml @@ -613,5 +613,89 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE u.user_id = #{repairPersonName} + diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/ma/TypeMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/ma/TypeMapper.xml index 86d9d0de..b91920b4 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/ma/TypeMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/ma/TypeMapper.xml @@ -341,6 +341,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" keep_user_id = #{keeperUserId}, is_check = #{isCheck}, jiJu_type = #{jiJuType}, + qualified_name = #{qualifiedName}, + qualified_url = #{qualifiedUrl}, + test_report_name = #{testReportName}, + test_report_url = #{testReportUrl}, + factory_report_name = #{factoryReportName}, + factory_report_url = #{factoryReportUrl}, + third_report_name = #{thirdReportName}, + third_report_url = #{thirdReportUrl}, + other_report_name = #{otherReportName}, + other_report_url = #{otherReportUrl}, where type_id = #{typeId} diff --git a/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml b/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml index 423e691d..a16cd9fa 100644 --- a/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml +++ b/bonus-modules/bonus-material/src/main/resources/mapper/material/task/TmTaskMapper.xml @@ -126,6 +126,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" month(create_time) = #{month} and year(create_time) = #{year} and task_type = #{taskType} + + and `code` NOT LIKE concat('%', 'ZL', '%') + + + and `code` NOT LIKE concat('%', 'ZT', '%') + @@ -334,5 +340,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY type_id + diff --git a/bonus-modules/bonus-material/src/main/resources/template/gaizhang.png b/bonus-modules/bonus-material/src/main/resources/template/gaizhang.png new file mode 100644 index 0000000000000000000000000000000000000000..f751e5b8d8e270c7eb6dfebcb95376afbb524f83 GIT binary patch literal 33769 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 literal 0 HcmV?d00001