package com.nrx.contract.service.impl;
import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicReference;
import cn.hutool.core.convert.Convert;
import com.github.yitter.idgen.YitIdHelper;
import com.nrx.common.core.domain.AjaxResult;
import com.nrx.common.utils.DateUtils;
import com.nrx.common.utils.SecurityUtils;
import com.nrx.common.utils.StringUtils;
import com.nrx.contract.domain.FeeDetail;
import com.nrx.contract.domain.PaymentDto;
import com.nrx.contract.mapper.ContractInfoMapper;
import com.nrx.contract.service.IFeeDetailService;
import com.nrx.contract.utils.*;
import lombok.SneakyThrows;
import lombok.Synchronized;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import com.nrx.contract.mapper.PaymentMapper;
import com.nrx.contract.domain.Payment;
import com.nrx.contract.service.IPaymentService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.util.UriUtils;
/**
* 缂磋垂鍗昐ervice涓氬姟灞傚鐞?
*
* @author ruoyi
* @date 2024-05-15
*/
@Service
public class PaymentServiceImpl implements IPaymentService
{
@Autowired
private PaymentMapper paymentMapper;
@Autowired
private IFeeDetailService feeDetailService;
@Value("${temp.outputPath}")
private String outputPath; // 鏂囨。瀵煎嚭璺緞
@Value("${temp.MODELPATH}")
private String MODELPATH; // 妯℃澘鏂囨。涓存椂瀛樺偍璺緞
@Value("${temp.qrcodeFont}") //浜岀淮鐮佸墠缂?
private String qrcodeFont;
private static final int BATCH_SIZE = 50;
@SneakyThrows
@Override
public ResponseEntity<FileSystemResource> exportword(Long id, Date payDate, Date payDate2) {
//澶氱嚎绋嬬敓鎴愬悇鏂囨。
List<File> targetFiles = this.gettargetFiles(id, payDate, payDate2);
if (targetFiles.size() > BATCH_SIZE) {
return exportBatch(targetFiles, id, payDate, payDate2,false);
} else {
// 鍚堝苟鏂囨。
// 鍚堝苟鍚庢枃妗h矾寰?
File hbfile = new File(outputPath + File.separator +id+File.separator+"output.docx");
DocxMerge.appendDocx(hbfile, targetFiles);
System.out.println("----鍚堝苟鎴愬姛-----");
return createResponseEntity(hbfile,id,false);
}
}
@SneakyThrows
@Override
public ResponseEntity<FileSystemResource> exportwordPdf(Long id,Date payDate,Date payDate2) {
List<File> targetFiles = this.gettargetFiles(id,payDate,payDate2);
//鍚堝苟鏂囨。
if (targetFiles.size() > BATCH_SIZE) {
return exportBatch(targetFiles, id, payDate, payDate2,true);
} else {
// 鍚堝苟鏂囨。
// 鍚堝苟鍚庢枃妗h矾寰?
File hbfile = new File(outputPath + File.separator+id+File.separator+ "output.docx");
DocxMerge.appendDocx(hbfile, targetFiles);
System.out.println("----鍚堝苟鎴愬姛-----");
return createResponseEntity(hbfile,id,true);
}
}
@Override
public Map getExportprogress(Long id) {
//鏍规嵁id鏌ヨ缂磋垂鍗曡鎯呭垪琛?
FeeDetail feeDetail=new FeeDetail();
feeDetail.setPaymentId(id);
List<String> statusList = new ArrayList<>();
statusList.add("1");
statusList.add("2");
feeDetail.setStatusList(statusList);
List<FeeDetail> feeDetailslist = feeDetailService.selectFeeDetailList(feeDetail);
Map map=new HashMap();
map.put("sumlist",feeDetailslist.size());
BigDecimal number1 = new BigDecimal(feeDetailslist.size());
BigDecimal number2 = new BigDecimal("5");
// 璁剧疆绮惧害涓?2锛屽苟鎸夌収鍥涜垗浜斿叆鐨勬柟寮忚繘琛岃垗鍏?
BigDecimal result = number1.divide(number2, 2, RoundingMode.HALF_UP);
map.put("sumtime",result);
return map;
}
/*@SneakyThrows
private ResponseEntity<FileSystemResource> exportBatch(List<File> targetFiles, Long id, Date payDate, Date payDate2,boolean changepdf) {
System.out.println("----澶т簬100鍒嗘壒娆″悎骞朵腑-----");
List<List<File>> batches = new ArrayList<>();
for (int i = 0; i < targetFiles.size(); i += BATCH_SIZE) {
batches.add(new ArrayList<>(targetFiles.subList(i, Math.min(i + BATCH_SIZE, targetFiles.size()))));
}
File finalMergedFile = new File(outputPath + File.separator + "final_output.docx");
for (List<File> batch : batches) {
File intermediateMergedFile = new File(outputPath + File.separator + "intermediate_" + batches.indexOf(batch) + ".docx");
DocxMerge.appendDocx(intermediateMergedFile, batch);
// 濡傛灉涓嶆槸鏈?鍚庝竴涓壒娆★紝鍒欏皢鍚堝苟鍚庣殑鏂囦欢娣诲姞鍒颁笅涓?涓壒娆$殑鍚堝苟涓?
if (batches.indexOf(batch) != batches.size() - 1) {
targetFiles.add(intermediateMergedFile);
} else {
DocxMerge.appendDocx(finalMergedFile, batch);
}
}
// 娓呯悊涓棿鏂囦欢
for (List<File> batch : batches) {
for (File file : batch) {
if (file.getName().startsWith("intermediate_")) {
file.delete();
}
}
}
System.out.println("----鍒嗘壒娆″悎骞舵垚鍔?-----");
return createResponseEntity(finalMergedFile,changepdf);
}*/
@SneakyThrows
private ResponseEntity<FileSystemResource> exportBatch(List<File> targetFiles, Long id, Date payDate, Date payDate2, boolean changePdf) {
System.out.println("----澶т簬"+BATCH_SIZE+"鍒嗘壒娆″悎骞朵腑-----");
List<List<File>> batches = new ArrayList<>();
for (int i = 0; i < targetFiles.size(); i += BATCH_SIZE) {
batches.add(new ArrayList<>(targetFiles.subList(i, Math.min(i + BATCH_SIZE, targetFiles.size()))));
}
File finalMergedFile = new File(outputPath + File.separator +id+File.separator+ "final_output.docx");
List<File> allIntermediateFiles = new ArrayList<>(); // 鐢ㄤ簬瀛樺偍鎵?鏈変腑闂存枃浠?
// 鍒涘缓绗竴涓腑闂存枃浠讹紝骞跺皢鍏朵綔涓轰复鏃舵渶缁堟枃浠剁殑鍩虹
List<File> firstBatch = batches.get(0);
File tempFinalMergedFile = new File(outputPath + File.separator +id+File.separator+ "intermediate_0.docx");
DocxMerge.appendDocx(tempFinalMergedFile, firstBatch);
allIntermediateFiles.add(tempFinalMergedFile);
// 鍚堝苟鍓╀綑鐨勪腑闂存枃浠?
for (int i = 1; i < batches.size(); i++) {
List<File> batch = batches.get(i);
File intermediateMergedFile = new File(outputPath + File.separator +id+File.separator+ "intermediate_" + i + ".docx");
DocxMerge.appendDocx(intermediateMergedFile, batch);
allIntermediateFiles.add(intermediateMergedFile);
}
// 鏈?缁堝悎骞舵墍鏈変腑闂存枃浠跺埌鏈?缁堟枃浠?
DocxMerge.appendDocx(finalMergedFile, allIntermediateFiles);
// 娓呯悊涓棿鏂囦欢
for (File file : allIntermediate