package com.ruoyi.web.controller.archive; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDate; import java.util.*; import java.util.List; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import com.aspose.words.License; import com.deepoove.poi.XWPFTemplate; import com.drew.imaging.ImageMetadataReader; import com.drew.metadata.Metadata; import com.drew.metadata.exif.ExifIFD0Directory; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.poi.ExcelExp; import com.ruoyi.common.utils.poi.ExcelUtilManySheet; import com.ruoyi.common.utils.poi.ExcelUtilManySheetSecond; import com.ruoyi.domain.ArchiveCategory; import com.ruoyi.domain.ArchiveRecords; import com.ruoyi.domain.DocumentMaterials; import com.ruoyi.domain.vo.*; import com.ruoyi.framework.config.ServerConfig; import com.ruoyi.framework.web.domain.server.Sys; import com.ruoyi.service.IArchiveRecordsService; import com.ruoyi.service.IDocumentMaterialsService; import com.ruoyi.service.impl.BarcodeService; import com.ruoyi.service.impl.pdfGenerateService; import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; import com.sun.xml.internal.ws.api.addressing.WSEndpointReference; import org.apache.commons.imaging.ImageInfo; import org.apache.commons.imaging.Imaging; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import org.springframework.web.multipart.MultipartFile; import static com.ruoyi.common.core.page.TableSupport.PAGE_NUM; import static com.ruoyi.common.core.page.TableSupport.PAGE_SIZE; /** * 【文件材料综合信息】Controller * * @author ruoyi * @date 2025-07-28 */ @RestController @RequestMapping("/system/materials") public class DocumentMaterialsController extends BaseController { @Autowired private BarcodeService barcodeService; @Autowired private ServerConfig serverConfig; @Autowired private pdfGenerateService pdfGenerateService; @Autowired private IDocumentMaterialsService documentMaterialsService; @Autowired private IArchiveRecordsService iArchiveRecordsService; /** * 判断PageNumber是否连续 */ @PreAuthorize("@ss.hasPermi('system:materials:list')") @GetMapping("/isPageNubLegal/{recordId}") public AjaxResult judgePageLegal(@PathVariable("recordId") Integer recordId) { boolean res = documentMaterialsService.isPageNumberIslegal(recordId); int cnt = documentMaterialsService.getFileCount(recordId); HashMap data = new HashMap<>(); data.put("res",res); data.put("total",cnt); return AjaxResult.success(data); } /** * 拿到对应的案卷材料个数 */ @PreAuthorize("@ss.hasPermi('system:materials:list')") @GetMapping("/getFileCount/{recordId}") public AjaxResult getFileCount(@PathVariable("recordId") Integer recordId) { int cnt = documentMaterialsService.getFileCount(recordId); return AjaxResult.success(cnt); } /** * 判断卷内目录是否上传了附件 */ @PreAuthorize("@ss.hasPermi('system:materials:list')") @GetMapping("/judge/{recordId}") public AjaxResult judge(@PathVariable("recordId") Integer recordId) { Boolean cnt = documentMaterialsService.judgeInfo(recordId); return AjaxResult.success(cnt); } /** * 根据页号添加中间记录的接口 * 例如页号1,5,7,则添加页号为2,3,4(信息与1保持一致),6(信息与5保持一致) */ @PreAuthorize("@ss.hasPermi('system:materials:edit')") @GetMapping("/addMiddleRecords/{recordId}/{maxPageNumber}") public AjaxResult addMiddleRecords(@PathVariable("recordId") Long recordId,@PathVariable("maxPageNumber") Long maxPageNumber) { return documentMaterialsService.addMiddleRecordsByPageNumbers(recordId, maxPageNumber); } /** * 查询【文件材料综合信息】列表 */ @PreAuthorize("@ss.hasPermi('system:materials:list')") @GetMapping("/list") public AjaxResult list(DocumentMaterials documentMaterials) { Integer pageNum = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); return documentMaterialsService.selectDataList(documentMaterials, pageNum, pageSize); } /** * 导出【文件材料综合信息】列表 */ @PreAuthorize("@ss.hasPermi('system:materials:export')") @Log(title = "【文件材料综合信息】", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, DocumentMaterials documentMaterials, @RequestParam(value = "ids", required = false) Long[] ids) { List list; System.out.println(ids); // 如果提供了ids参数,则根据ids导出指定记录 if (ids != null && ids.length > 0) { list = documentMaterialsService.selectDocumentMaterialsByIds(ids); } else { list = documentMaterialsService.selectDocumentMaterialsList(documentMaterials); } ExcelUtil util = new ExcelUtil(DocumentMaterials.class); util.exportExcel(response, list, "电子文件目录"); } @PreAuthorize("@ss.hasPermi('system:materials:export')") @Log(title = "【导出卷内目录】", businessType = BusinessType.EXPORT) @PostMapping("/exportDir") public void exportDir(HttpServletResponse response, DocumentMaterials documentMaterials, @RequestParam(value = "ids", required = false) Long[] ids) { List list; System.out.println(ids); // 如果提供了ids参数,则根据ids导出指定记录 if (ids != null && ids.length > 0) { list = documentMaterialsService.selectDocumentMaterialsByIds(ids); } else { list = documentMaterialsService.selectDocumentMaterialsList(documentMaterials); } // 根据visible字段筛选,只保留visible为1的记录 List filteredList = list.stream() .filter(doc -> doc.getVisible() != null && doc.getVisible() == 1 && !Objects.equals(doc.getFileStyle(), "其他材料")) .collect(Collectors.toList()); // 使用AtomicLong实现序号的递增 AtomicLong nm = new AtomicLong(1L); // 将筛选后的DocumentMaterials转换为DocumentMaterialsVo List list1 = filteredList.stream().map(doc -> { DocumentMaterialsVoSmall vo = new DocumentMaterialsVoSmall(); // 手动映射字段,使用getAndIncrement()方法获取当前值并递增 vo.setNum(nm.getAndIncrement()); vo.setDocumentNumber(doc.getDocumentNumber()); vo.setCreator(doc.getCreator()); vo.setTitle(doc.getTitle()); vo.setDate(doc.getDate()); vo.setPageNumber(doc.getPageNumber()); vo.setRemarks(doc.getRemarks()); // vo.setRecordId(doc.getRecordId() != null ? doc.getRecordId().toString() : null); // vo.setPublicity(doc.getPublicity()); return vo; }).collect(Collectors.toList()); ExcelUtil util = new ExcelUtil(DocumentMaterialsVoSmall.class); util.exportExcel(response, list1, "卷内目录"); } // List dsvs = documentMaterialsService.findArchMInfo(id.toString()); /** * 获取【文件材料综合信息】详细信息 */ @PreAuthorize("@ss.hasPermi('system:materials:query')") @GetMapping(value = "/{materialId}") public AjaxResult getInfo(@PathVariable("materialId") String materialId) { return success(documentMaterialsService.selectDocumentMaterialsByMaterialId(materialId)); } /** * 新增【文件材料综合信息】 */ @PreAuthorize("@ss.hasPermi('system:materials:add')") @Log(title = "【文件材料综合信息】", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody DocumentMaterials documentMaterials) { documentMaterials.setVisible(1); int res = documentMaterialsService.insertDocumentMaterials(documentMaterials); System.out.println(res+"][[[[[[[[[[[[[[[[[["); return toAjax(res); } /** * 修改【文件材料综合信息】 * * system:materials:edit */ @PreAuthorize("@ss.hasPermi('system:materials:edit')") @Log(title = "【文件材料综合信息】", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody DocumentMaterials documentMaterials) { return toAjax(documentMaterialsService.updateDocumentMaterials(documentMaterials)); } /** * 删除【文件材料综合信息】 */ @PreAuthorize("@ss.hasPermi('system:materials:remove')") @Log(title = "【文件材料综合信息】", businessType = BusinessType.DELETE) @DeleteMapping("/{materialIds}") public AjaxResult remove(@PathVariable String[] materialIds) { return toAjax(documentMaterialsService.deleteDocumentMaterialsByMaterialIds(materialIds)); } public String getPageSize(double du) { if(du <= 8699840) return "A4"; else if(du <= 17403188) return "A3"; else if(du <= 34811347) return "A2"; else if(du <= 69622674) return "A1"; else return "A0"; } @PostMapping("/upload/{recordId}") public AjaxResult uploadFile(MultipartFile file, @PathVariable Long recordId) throws Exception { // System.out.println("sdfd9999999999999999999999999999999"); try { //根据文件名称,然后修改对应数据的url String fname = file.getOriginalFilename(); // System.out.println(fname); // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); // System.out.println(filePath); // 上传并返回新文件名称 String fileName = FileUploadUtils.upload(filePath, file); String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); //分割文件名 String [] nams = fname.split("\\."); System.out.println(fname); Long nam = Long.parseLong(nams[0]); //根据页号拿到案卷的详细信息 System.out.println(recordId); System.out.println("0-------------"); DocumentMaterials doc = documentMaterialsService.selectByPageNumber(nam, Math.toIntExact(recordId)); if(doc==null) return AjaxResult.error("无对应页号,请检查清楚附件以及对应的输入!"); else{ if(doc.getSecurityLevel()!=null&&doc.getSecurityLevel().equals("该页另存")) { //替换为了准备好的图像 //读取服务器上的图像 // new InputStream(); String fp = filePath + "\\glc.jpg"; Path path = Paths.get(fp); File fil = new File(fp); //拿到图像属性 BufferedImage bufferedImage = ImageIO.read(Files.newInputStream(path)); int wid = bufferedImage.getWidth(); int hei = bufferedImage.getHeight(); double sz = Double.parseDouble(String.format("%.2f", Files.size(path)*1.0/1024)); System.out.println("ddsdsdsd"); System.out.println(wid+":"+hei+":"+sz); //拿到图像的dpi信息 ImageInfo info = Imaging.getImageInfo(Files.readAllBytes(path)); int wdpi = info.getPhysicalWidthDpi() ; int hdpi = info.getPhysicalHeightDpi(); System.out.println("DPI: " + info.getPhysicalWidthDpi()); //计算fileNumber Long fileNumber = documentMaterialsService.getFiNum(nam,recordId); //计算sizeType String sizeType = getPageSize(wid*hei); Graphics2D g2d = bufferedImage.createGraphics(); // 获取Graphics2D对象用于绘制 g2d.setFont(new Font("Arial", Font.BOLD, 80)); // 设置字体样式和大小 g2d.setColor(Color.black); // 设置字体颜色为白色,可根据需要调整颜色和字体样式 String pageNumber = doc.getPageNumber()+""; // 页码字符串,可以根据需要修改或动态生成 int fontHeight = g2d.getFontMetrics().getHeight(); // 获取字体高度,用于定位文本位置 int x = bufferedImage.getWidth() - g2d.getFontMetrics().stringWidth(pageNumber) - 80; // 计算文本X坐标位置,确保在右下角附近 int y = bufferedImage.getHeight() - fontHeight / 2 - 100; // 计算文本Y坐标位置,垂直居中显示文本 g2d.drawString(pageNumber, x, y); // 在图片上绘制页码文本 System.out.println(pageNumber+"[[[[[[[[[[[[[[["); g2d.dispose(); // 释放Graphics2D资源 // File outputFile = new File(filePath+"/output_image.jpg"); // 输出文件路径 // ImageIO.write(bufferedImage, "jpg", outputFile); // 保 //得到BufferedImage对象 MultipartFile multipartFile = null; try { //创建一个ByteArrayOutputStream ByteArrayOutputStream os = new ByteArrayOutputStream(); //把BufferedImage写入ByteArrayOutputStream ImageIO.write(bufferedImage, "jpg", os); //ByteArrayOutputStream转成InputStream InputStream input = new ByteArrayInputStream(os.toByteArray()); //InputStream转成MultipartFile multipartFile = new MockMultipartFile(pageNumber, pageNumber+".jpg", "text/plain", input); } catch (IOException e) { e.printStackTrace(); } // 上传并返回新文件名称 String fileName1 = FileUploadUtils.upload(filePath, multipartFile); String url1 = serverConfig.getUrl() + fileName; String us = "/profile/upload/0071.jpg"; documentMaterialsService.updateByPageNumber(nam, sizeType, fileNumber,wid, hei,wdpi, hdpi, sz, fileName1, "jpg", recordId); } else { //文件名称 String pname = nams[1]; ajax.put("url", url); //拿到图像属性 BufferedImage bufferedImage = ImageIO.read(file.getInputStream()); int wid = bufferedImage.getWidth(); int hei = bufferedImage.getHeight(); double sz = Double.parseDouble(String.format("%.2f", file.getSize()*1.0/1024)); System.out.println(wid+":"+hei+":"+sz); //拿到图像的dpi信息 ImageInfo info = Imaging.getImageInfo(file.getBytes()); int wdpi = info.getPhysicalWidthDpi() ; int hdpi = info.getPhysicalHeightDpi(); System.out.println("DPI: " + info.getPhysicalWidthDpi()+nam+"dds"); //计算fileNumber Long fileNumber = documentMaterialsService.getFiNum(nam, recordId); //计算sizeType String sizeType = getPageSize(wid*hei); //插入数据库对应的url当中 documentMaterialsService.updateByPageNumber(nam, sizeType, fileNumber,wid, hei,wdpi, hdpi, sz, fileName, pname, recordId); // } } System.out.println(url); // System.out.println(fileName); ajax.put("fileName", fileName); // System.out.println(FileUtils.getName(fileName)); ajax.put("newFileName", FileUtils.getName(fileName)); ajax.put("originalFilename", file.getOriginalFilename()); return ajax; } catch (Exception e) { System.out.println("88888888882222222222222"); System.out.println(e); return AjaxResult.error(e.getMessage()); } } @Log(title = "档案详细信息记录导入", businessType = BusinessType.IMPORT) @PostMapping("/importData") public AjaxResult importData(@RequestParam("file") MultipartFile file, @RequestParam("recordId")String recordId) throws Exception { System.out.println(file); return documentMaterialsService.importExcel(file, recordId); } @PostMapping("/model") public void getExportModel(HttpServletResponse response){ List list = Collections.singletonList(new DocumentMaterialFileSmallVo()); ExcelUtil util = new ExcelUtil<>(DocumentMaterialFileSmallVo.class); util.exportExcel(response,list,"档案详细信息导入模板"); } public boolean getLicense() { boolean result = false; try { InputStream is = null; ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); org.springframework.core.io.Resource[] resources = resolver.getResources("classpath:words.xml"); is = resources[0].getInputStream(); // ��Ŀ��lincense.xml��·�� License aposeLic = new License(); aposeLic.setLicense(is); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } //导出备考表 @PostMapping("/exportBack/{id}/{recordId}") public void exportBackInfo(HttpServletResponse response, @PathVariable Long id, @PathVariable String recordId) { //09-备考表.pdf String pdf09Path = "09-备考表.pdf"; // pdfGenerateService.generateFileStyleInfo(pdf09Path, aIV.getRecordId(), id); //拿到相关数据 List dmfs = documentMaterialsService.findFileStyleInfo(Math.toIntExact(id)); LocalDate currentDate = LocalDate.now(); String cdt = currentDate.getYear()+"年"+currentDate.getMonthValue()+"月"+currentDate.getDayOfMonth()+"日"; HashMap hs = new HashMap(); int allPages = 0; int texPages = 0; int picPages = 0; int patPages = 0; if(!dmfs.isEmpty()) { for(DocumentMaterialFileStyle documentMaterialFileStyle:dmfs) { if(documentMaterialFileStyle.getFileStyle()!=null&&documentMaterialFileStyle.getFileStyle().equals("文字材料")) texPages = documentMaterialFileStyle.getCnt(); if(documentMaterialFileStyle.getFileStyle()!=null&&documentMaterialFileStyle.getFileStyle().equals("图样材料")) patPages = documentMaterialFileStyle.getCnt(); if(documentMaterialFileStyle.getFileStyle()!=null&&documentMaterialFileStyle.getFileStyle().equals("照片材料")) picPages = documentMaterialFileStyle.getCnt(); } } allPages = texPages + picPages + patPages; hs.put("pages", allPages); hs.put("patPages", patPages); hs.put("picPages", picPages); hs.put("texPages", texPages); hs.put("volumeNumber", recordId); hs.put("time", cdt); if (!getLicense()) { System.out.println("没有相关证书!"); } try { // 获取 Word 模板所在路径 String filepath = "09-备考表.docx"; // 通过 XWPFTemplate 编译文件并渲染数据到模板中 XWPFTemplate template = XWPFTemplate.compile(filepath).render(hs ); String renderedDocPath = "rendered_output.docx"; File renderedFile = new File(renderedDocPath); try { // 将完成数据渲染的文档写出 template.writeAndClose(new FileOutputStream(renderedFile)); } catch (IOException e) { e.printStackTrace(); } com.aspose.words.Document doc = new com.aspose.words.Document("rendered_output.docx"); // 创建临时字节输出流 ByteArrayOutputStream baobk = new ByteArrayOutputStream(); // 将Word文档转换为PDF字节数组 doc.save(response.getOutputStream(), com.aspose.words.SaveFormat.PDF);//ȫ��֧��DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF �໥ת�� } catch (Exception e) { e.printStackTrace(); } } //导出卷内目录 @PostMapping("/exportJuan/{id}") public void exportJuanInfo(HttpServletResponse response, @PathVariable Long id) throws IOException { List dsvs = documentMaterialsService.findArchMInfo(id.toString()); //拿到卷内目录的excel List list2 = dsvs.stream().map(res1 -> new DocumentMaterialsVoSmall(res1.getNum(), res1.getDocumentNumber(),res1.getCreator(), res1.getTitle(), res1.getDate(), res1.getPageNumber(), res1.getRemarks())).collect(Collectors.toList()); if(!dsvs.isEmpty()) { String recordId = dsvs.get(0).getRecordId(); byte[] imgr = barcodeService.generateBarcodeImage(recordId); ExcelExp e1 = new ExcelExp("卷内目录数据", dsvs, DocumentMaterialsVo.class); ExcelExp e2 = new ExcelExp("卷内数据", list2, recordId, imgr, DocumentMaterialsVoSmall.class); List mysheet = new ArrayList(); mysheet.add(e1); mysheet.add(e2); ExcelUtilManySheet> util2 = new ExcelUtilManySheet>(mysheet); // ZipEntry entr = new ZipEntry(fna + adir + "/" + "卷内目录" + ".xls"); // ExcelUtil util1 = new ExcelUtil(DocumentMaterialsVo.class); // System.out.println(dsvs); // zos.putNextEntry(entr); ByteOutputStream bos8 = new ByteOutputStream(); util2.exportExcelManySheet(bos8, mysheet); bos8.writeTo( response.getOutputStream()); } } //导出案卷封面 @PostMapping("/exportPageInfo/{id}/{recordId}") public void exportPageInfo(HttpServletResponse response, @PathVariable Long id, @PathVariable String recordId) throws IOException { ArchiveInfoVo aIV = iArchiveRecordsService.selectByRecordId(id); List arsi = new ArrayList<>(); arsi.add(aIV); String recordId1 = recordId; byte[] imgr1 = barcodeService.generateBarcodeImage(recordId1); byte[] sedcode = pdfGenerateService.createQrCodeN(recordId1, 200, 200); ExcelExp e3 = new ExcelExp("案卷封面数据",arsi, ArchiveInfoVo.class); ExcelExp e4 = new ExcelExp("案卷封面", arsi, recordId1, imgr1,sedcode, ArchiveInfoVo.class); List mysheet1 = new ArrayList(); mysheet1.add(e3); mysheet1.add(e4); ByteOutputStream bos2 = new ByteOutputStream(); ExcelUtilManySheetSecond> util3 = new ExcelUtilManySheetSecond>(mysheet1); util3.exportExcelManySheet(bos2, mysheet1); // System.out.println(bos2); bos2.writeTo(response.getOutputStream()); } }