fei
2025-12-14 29d3490e983cadd2b2107486214488e382a72fcc
ruoyi-admin/src/main/java/com/ruoyi/web/controller/archive/archiveAllExportController.java
@@ -8,10 +8,7 @@
import com.itextpdf.text.pdf.PdfWriter;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.poi.ExcelExp;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.poi.ExcelUtilManySheet;
import com.ruoyi.common.utils.poi.ExcelUtilManySheetSecond;
import com.ruoyi.common.utils.poi.*;
import com.ruoyi.domain.ArchiveRecords;
import com.ruoyi.domain.DocumentMaterials;
import com.ruoyi.domain.vo.*;
@@ -44,8 +41,11 @@
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@@ -57,6 +57,8 @@
@RestController
@RequestMapping("/system/archiveAllExport")
public class archiveAllExportController {
    // 存储当天导出序号的Map,键为日期(yyyyMMdd),值为当前序号
    private static Map<String, Integer> dailySequenceMap = new ConcurrentHashMap<>();
    @Autowired
    private pdfGenerateService pdfGenerateService;
@@ -67,6 +69,21 @@
    @Autowired
    private IArchiveRecordsService iArchiveRecordsService;
    // 用于生成当天导出序号的方法
    private String generateDailySequence(String date) {
        // 使用synchronized确保线程安全
        synchronized (dailySequenceMap) {
            // 获取当前日期的序号,如果不存在则初始化为0
            int sequence = dailySequenceMap.getOrDefault(date, 0);
            // 序号递增
            sequence++;
            // 更新Map中的序号
            dailySequenceMap.put(date, sequence);
            // 格式化为三位字符串,不足三位补前导零
            return String.format("%03d", sequence);
        }
    }
@@ -125,6 +142,26 @@
    @PostMapping("/exportChooseArchive/{ids}")
    public void exportChooseArchive(HttpServletResponse response,  @PathVariable Long[] ids)throws Exception
    {
        //计算文件的大小
        Double siz = 0.0;
        for(int i = 0; i < ids.length; i++) {
            // 获取文件的保存位置,读取数据库,
            DocumentMaterials documentMaterials = new DocumentMaterials();
            documentMaterials.setRecordId(ids[i]);
            List<DocumentMaterialsVoLarge> docs = documentMaterialsService.selectDocumentMaterialsAllByRecordId(ids[i]);
            System.out.println(docs.size()+"----009");
            for (DocumentMaterialsVoLarge dc : docs) {
                if(dc!=null)
                    siz += dc.getFileSize()!=null?dc.getFileSize():0;
            }
        }
        System.out.println(siz/1000);
        //判断是否大于4G,是的话,直接抛出异常
        long maxSize = 4L * 1024 * 1024 * 1024; // 4GB in bytes
        if (siz > maxSize) {
            throw new RuntimeException("文件总大小超过4GB,无法导出");
        }
        System.out.println("092939932");
        String zipFileName ="test" +".zip";
        //生成压缩包存储地址(最后会删掉)
@@ -149,7 +186,10 @@
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            String formattedDate = date.format(formatter);
            System.out.println(formattedDate);
            String fna = "GH"+20250908+"/";
            // 生成当天导出序号
            String sequence = generateDailySequence(formattedDate);
            String fna = "GH" + formattedDate + sequence + "/";
            zos.putNextEntry(new ZipEntry(fna));
@@ -158,7 +198,7 @@
            archiveRecords.setIds(ids);
            List<ArchiveRecords> lis = iArchiveRecordsService.selectArchiveRecordsList(archiveRecords);
            //案卷目录导出
            ZipEntry entry = new ZipEntry("案卷目录" + ".xls");
            ZipEntry entry = new ZipEntry(fna + "案卷目录" + ".xls");
            ExcelUtil<ArchiveRecords> util = new ExcelUtil<ArchiveRecords>(ArchiveRecords.class);
            zos.putNextEntry(entry);
@@ -169,13 +209,31 @@
            //移交清单
            List<ArchiveRecordSmall> lrs = iArchiveRecordsService.findByIds(archiveRecords);
            System.out.println(lrs);
            ZipEntry entry1 = new ZipEntry("移交清单" + ".xls");
            System.out.println("99999999990000");
            ZipEntry entry1 = new ZipEntry(fna + "移交清单" + ".xls");
            ExcelUtil<ArchiveRecordSmall> util1 = new ExcelUtil<ArchiveRecordSmall>(ArchiveRecordSmall.class);
            ExcelExp e6 = new ExcelExp("移交清单",lrs, ArchiveRecordSmall.class);
          //  ExcelExp e4 = new ExcelExp("案卷封面",  arsi, recordId1, imgr1,sedcode, ArchiveInfoVo.class);
            List<ExcelExp> mysheet6 = new ArrayList<ExcelExp>();
            mysheet6.add(e6);
         //   mysheet1.add(e4);
            ByteOutputStream bos6 = new ByteOutputStream();
            ExcelUtilManySheetThird<List<ExcelExp>> util6 = new ExcelUtilManySheetThird<List<ExcelExp>>(mysheet6);
            util6.exportExcelManySheet(bos6, mysheet6);
            //  System.out.println(bos2);
            zos.putNextEntry(entry1);
            ByteOutputStream bos1 = new ByteOutputStream();
            util1.byteOutputStreamExcel(bos1, lrs,"移交清单", "");
            bos1.writeTo(zos);
          //  ByteOutputStream bos1 = new ByteOutputStream();
           // util6.byteOutputStreamExcel(bos1, lrs,"移交清单", "");
            bos6.writeTo(zos);
            for(int i = 0; i < ids.length; i++) {
                // 获取文件的保存位置,读取数据库,
@@ -206,7 +264,7 @@
                }
                //添加07  的pdf
                //pdf目录封面
                String pdfPathF = "07-卷面封面.pdf";
                String pdfPathF = "07-案卷封面.pdf";
                pdfGenerateService.generatePdf(pdfPathF, ids[i]);
                // 2. 压缩PDF到ZIP文件
                // 添加PDF文件到ZIP
@@ -221,6 +279,111 @@
                        zos.write(buffer, 0, len);
                    }
                }
                //08-卷内卷内目录的pdf
                String pdf08Path= "08-卷内目录.pdf";
                List<DocumentMaterialsVo> list3 = dsvs;
                if(list3.size()>0) {
                    pdfGenerateService.generateFileDirectoryPdf(pdf08Path, list3);
                    ZipEntry zipEntry3 = new ZipEntry(fna + adir +"/"+pdf08Path);
                    zos.putNextEntry(zipEntry3);
                    // 读取PDF文件内容并写入ZIP
                    try (FileInputStream fis = new FileInputStream(pdf08Path)) {
                        byte[] buffer = new byte[1024];
                        int len;
                        while ((len = fis.read(buffer)) > 0) {
                            zos.write(buffer, 0, len);
                        }
                    }
                }
                //09-备考表.pdf
                String pdf09Path = "09-备考表.pdf";
                pdfGenerateService.generateFileStyleInfo(pdf09Path, aIV.getRecordId(), ids[i]);
                // 2. 压缩PDF到ZIP文件
                // 添加PDF文件到ZIP
                ZipEntry zipEntry4 = new ZipEntry(fna + adir +"/"+pdf09Path);
                zos.putNextEntry(zipEntry4);
                // 读取PDF文件内容并写入ZIP
                try (FileInputStream fis = new FileInputStream(pdf09Path)) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = fis.read(buffer)) > 0) {
                        zos.write(buffer, 0, len);
                    }
                }
                //excel 卷内封面导出zip
                ZipEntry entryiv = new ZipEntry(fna + adir +"/"+"案卷封面" + ".xls");
                List<ArchiveInfoVo> arsi = new ArrayList<>();
                arsi.add(aIV);
                String recordId1 = aIV.getRecordId();
                byte[] imgr1 = barcodeService.generateBarcodeImage(recordId1);
                byte[] sedcode = pdfGenerateService.createQrCodeN(recordId1, 30, 30);
                ExcelExp e3 = new ExcelExp("案卷封面数据",arsi, ArchiveInfoVo.class);
                ExcelExp e4 = new ExcelExp("案卷封面",  arsi, recordId1, imgr1,sedcode, ArchiveInfoVo.class);
                List<ExcelExp> mysheet1 = new ArrayList<ExcelExp>();
                mysheet1.add(e3);
                mysheet1.add(e4);
                ByteOutputStream bos2 = new ByteOutputStream();
                ExcelUtilManySheetSecond<List<ExcelExp>> util3 = new ExcelUtilManySheetSecond<List<ExcelExp>>(mysheet1);
                util3.exportExcelManySheet(bos2, mysheet1);
                //  System.out.println(bos2);
                zos.putNextEntry(entryiv);
//            ExcelUtil<ArchiveInfoVo> utilsv = new ExcelUtil<ArchiveInfoVo>(ArchiveInfoVo.class);
//
//
//            ByteOutputStream boss = new ByteOutputStream();
//            List<ArchiveInfoVo> aivs = new ArrayList<>();
//            aivs.add(aIV);
//            utilsv.byteOutputStreamExcel(boss, aivs,"Date List", "");
                bos2.writeTo(zos);
                //写入电子目录  xsxl
                ZipEntry entry5 = new ZipEntry(fna + adir +"/"+"电子文件目录" + ".xls");
                ExcelUtil<DocumentMaterialsVoLarge> util5 = new ExcelUtil<DocumentMaterialsVoLarge>(DocumentMaterialsVoLarge.class);
                zos.putNextEntry(entry5);
                ByteOutputStream bos5 = new ByteOutputStream();
                util5.byteOutputStreamExcel(bos5, docs,"电子文件目录", "");
                bos5.writeTo(zos);
                //拿到卷内目录的excel
                List<DocumentMaterialsVoSmall> 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<ExcelExp> mysheet = new ArrayList<ExcelExp>();
                    mysheet.add(e1);
                    mysheet.add(e2);
                    ExcelUtilManySheet<List<ExcelExp>> util2 = new ExcelUtilManySheet<List<ExcelExp>>(mysheet);
                    ZipEntry entr = new ZipEntry(fna + adir + "/" + "卷内目录" + ".xls");
                    // ExcelUtil<DocumentMaterialsVo> util1 = new ExcelUtil<DocumentMaterialsVo>(DocumentMaterialsVo.class);
                    System.out.println(dsvs);
                    zos.putNextEntry(entr);
                    ByteOutputStream bos8 = new ByteOutputStream();
                    util2.exportExcelManySheet(bos6, mysheet);
                    //   util1.byteOutputStreamExcel(bos1, dsvs,"Date List", "");
                    bos8.writeTo(zos);
                }
                //把excel转为pdf
                byte[] buf = new byte[1024];
                for (DocumentMaterialsVoLarge dc : docs) {
                    String filePath = dc.getUrl();
@@ -264,8 +427,11 @@
                    in.close();
                }
            }
            System.out.println(file.getName());
            writeFileToRes(response, file.getName(), file);
            //删除压缩包
//            if(file.exists()){
//                file.delete();
//            }
        } catch (Exception e) {
            throw new RuntimeException(e);
@@ -287,6 +453,11 @@
                }
            }
        }
        System.out.println(file.getName());
        System.out.println(file.getTotalSpace());
        //    file.
        writeFileToRes(response, file.getName(), file);
    }
@@ -312,8 +483,12 @@
                //.selectDocumentMaterialsList(documentMaterials);
        List<DocumentMaterialsVo> dsvs = documentMaterialsService.findArchMInfo(id.toString());
        if(dsvs==null||dsvs.isEmpty())
        {
            throw new RuntimeException("电子文件信息没有上传,请补充!");
        }
        ArchiveInfoVo aIV = iArchiveRecordsService.selectByRecordId(id);
        System.out.println(dsvs.size());
        List<String> paths = new ArrayList<>();
//        System.out.println(docs);
        if (docs.size() == 1) {  // 直接下载
@@ -352,10 +527,13 @@
        String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
        String filePath = RuoYiConfig.getDownloadPath() + fileName;
        if(file.exists())
            System.out.println("322329323232323");
        System.out.println(filePath+"0009999999999");
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        FileUtils.setAttachmentResponseHeader(response, realFileName);
     //   response.addHeader("Content-Disposition", "attachment;filename=fileName" + ".xls");
        FileUtils.writeBytes(filePath, response.getOutputStream());
    }
@@ -420,7 +598,7 @@
            zos = new ZipOutputStream(os);
            //pdf目录封面
            String pdfPathF = "07-卷面封面.pdf";
            String pdfPathF = "07-案卷封面.pdf";
            pdfGenerateService.generatePdf(pdfPathF, 55L);
            // 2. 压缩PDF到ZIP文件
                // 添加PDF文件到ZIP
@@ -471,7 +649,7 @@
                //excel 卷内封面导出zip
            ZipEntry entryiv = new ZipEntry("卷内封面" + ".xls");
            ZipEntry entryiv = new ZipEntry("案卷封面" + ".xls");
            List<ArchiveInfoVo> arsi = new ArrayList<>();
            arsi.add(aIV);