|
|
@@ -1,23 +1,37 @@
|
|
|
package org.sky.scientific.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import jakarta.servlet.http.HttpServletRequest;
|
|
|
import jakarta.servlet.http.HttpServletResponse;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
|
|
|
import org.sky.core.log.exception.ServiceException;
|
|
|
import org.sky.core.secure.utils.SecureUtil;
|
|
|
import org.sky.core.tool.utils.Func;
|
|
|
import org.sky.scientific.mapper.ArchiveAttachMapper;
|
|
|
+import org.sky.scientific.mapper.SettingMapper;
|
|
|
import org.sky.scientific.pojo.entity.ArchiveAttachEntity;
|
|
|
import org.sky.scientific.service.IArchiveService;
|
|
|
+import org.sky.scientific.utils.ZipDir;
|
|
|
+import org.sky.scientific.utils.ZipDownloadUtils;
|
|
|
+import org.sky.scientific.utils.ZipFileRef;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.io.BufferedOutputStream;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.zip.Deflater;
|
|
|
+
|
|
|
@Service
|
|
|
@AllArgsConstructor
|
|
|
public class ArchiveServiceImpl implements IArchiveService {
|
|
|
|
|
|
private final ArchiveAttachMapper attachMapper;
|
|
|
+ private final SettingMapper settingMapper;
|
|
|
|
|
|
@Override
|
|
|
public ArchiveAttachEntity fjbczl(String year) {
|
|
|
@@ -55,30 +69,398 @@ public class ArchiveServiceImpl implements IArchiveService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void exportFjbczl(HttpServletResponse response, String year) {
|
|
|
- ArchiveAttachEntity fjbczl = this.fjbczl(year);
|
|
|
-
|
|
|
+ public void configZipDir(ZipDir dir, String content) {
|
|
|
+ if (Func.notNull(content)) {
|
|
|
+ List<JSONObject> files = JSON.parseArray(content, JSONObject.class);
|
|
|
+ List<ZipFileRef> fileRefs = new ArrayList<>();
|
|
|
+ for (JSONObject file : files) {
|
|
|
+ fileRefs.add(new ZipFileRef(file.getString("label"), null, file.getString("value")));
|
|
|
+ }
|
|
|
+ dir.setFileRefs(fileRefs);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void downloadFjbczlZipFiles(HttpServletRequest request, HttpServletResponse response, String year) {
|
|
|
+ List<ZipDir> data = new ArrayList<>();
|
|
|
+
|
|
|
+ ArchiveAttachEntity attach = fjbczl(year);
|
|
|
+
|
|
|
+ ZipDir d = new ZipDir();
|
|
|
+ d.setDirName("高新项目技术鉴定资料");
|
|
|
+ configZipDir(d, attach.getD1());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("加计扣除项目技术鉴定资料");
|
|
|
+ configZipDir(d, attach.getD2());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("高新技术企业认定资料");
|
|
|
+ configZipDir(d, attach.getD3());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("年度主要产品(服务)发挥核心支持作用的技术属于《国家重点支持的高新技术领域》规定范围的说明");
|
|
|
+ configZipDir(d, attach.getD4());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("高新技术产品(服务)及对应收入资料");
|
|
|
+ configZipDir(d, attach.getD5());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("年度职工和科技人员情况说明");
|
|
|
+ configZipDir(d, attach.getD6());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("当年和前两个会计年度研发费用总额及占同期销售收入比例的说明");
|
|
|
+ configZipDir(d, attach.getD7());
|
|
|
+ data.add(d);
|
|
|
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("研发管理制度");
|
|
|
+ configZipDir(d, attach.getD8());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("研发费用结构明细表");
|
|
|
+ configZipDir(d, attach.getD9());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("加计扣除情况说明");
|
|
|
+ configZipDir(d, attach.getD10());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("其他高新备查资料");
|
|
|
+ configZipDir(d, attach.getD11());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+ d = new ZipDir();
|
|
|
+ d.setDirName("其他加计扣除备查资料");
|
|
|
+ configZipDir(d, attach.getD12());
|
|
|
+ data.add(d);
|
|
|
+
|
|
|
+
|
|
|
+ try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(bos)) {
|
|
|
+ String fileName = year + "年附件补充" + ".zip";
|
|
|
+ ZipDownloadUtils.setResponse(request, response, fileName);
|
|
|
+ // 快速压缩
|
|
|
+ zipOut.setLevel(Deflater.BEST_SPEED);
|
|
|
+ for (ZipDir group : data) {
|
|
|
+ String dir = ZipDownloadUtils.safeName(group.getDirName()) + "/";
|
|
|
+ if(Func.isEmpty(group.getFileRefs())){
|
|
|
+ ZipDownloadUtils.writeEmptyDirToZip(zipOut, dir);
|
|
|
+ }else {
|
|
|
+ for (ZipFileRef fileRef : group.getFileRefs()) {
|
|
|
+ if (fileRef.getLocalPath() != null && !fileRef.getLocalPath().isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeLocalFileToZip(zipOut, fileRef.getLocalPath(), dir + ZipDownloadUtils.safeName(fileRef.getName()));
|
|
|
+ } else if (fileRef.getHttpUrl() != null && !fileRef.getHttpUrl().isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeHttpFileToZip(zipOut, fileRef.getHttpUrl(), dir + ZipDownloadUtils.safeName(fileRef.getName()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ zipOut.finish();
|
|
|
+ zipOut.flush();
|
|
|
+ response.flushBuffer();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException("打包下载失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD1(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新技术企业资格证书");
|
|
|
+
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD2(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新技术企业认定资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD3(String year) {
|
|
|
+ ZipDir dir = new ZipDir("加计扣除情况说明");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD4(String year) {
|
|
|
+ ZipDir dir = new ZipDir("研发立项决议文件");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD5(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新研发项目汇总表");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD6(String year) {
|
|
|
+ ZipDir dir = new ZipDir("加计扣除研发项目汇总表");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD7(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新研发项目全套技术资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD8(String year) {
|
|
|
+ ZipDir dir = new ZipDir("加计扣除研发项目全套技术资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD9(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新研发人员与科技人员资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD10(String year) {
|
|
|
+ ZipDir dir = new ZipDir("加计扣除研发人员与科技人员资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD11(String year) {
|
|
|
+ ZipDir dir = new ZipDir("全部知识产权资料(汇总表、证书)");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD12(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新项目知识产权资料(汇总表、证书)");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD13(String year) {
|
|
|
+ ZipDir dir = new ZipDir("加计扣除项目知识产权资料(汇总表、证书)");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD14(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新口径研发费用辅助账");
|
|
|
+
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD15(String year) {
|
|
|
+ ZipDir dir = new ZipDir("加计扣除口径研发费用辅助账");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD16(String year) {
|
|
|
+ ZipDir dir = new ZipDir("会计口径研发费用辅助账");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD17(String year) {
|
|
|
+ ZipDir dir = new ZipDir("会计口径研发费用附件凭证资料及相关说明(二级菜单列表需财务提供)");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD18(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新研发费用附件凭证资料及相关说明(二级菜单列表需财务提供)");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD19(String year) {
|
|
|
+ ZipDir dir = new ZipDir("加计扣除研发费用附件凭证资料及相关说明(二级菜单列表需财务提供)");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD20(String year) {
|
|
|
+ ZipDir dir = new ZipDir("A107012研发费用加计扣除优惠明细表");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD21(String year) {
|
|
|
+ ZipDir dir = new ZipDir("当年和前两个会计年度研发费用总额及占同期销售收入比例的说明");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD22(String year) {
|
|
|
+ ZipDir dir = new ZipDir("年度主要产品(服务)发挥核心支持作用的技术属于《国家重点支持的高新技术领域》规定范围的说明");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD23(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新技术产品(服务)及对应收入资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD24(String year) {
|
|
|
+ ZipDir dir = new ZipDir("研发管理制度");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD25(String year) {
|
|
|
+ ZipDir dir = new ZipDir("高新项目技术鉴定资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD26(String year) {
|
|
|
+ ZipDir dir = new ZipDir("加计扣除项目技术鉴定资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD27(String year) {
|
|
|
+ ZipDir dir = new ZipDir("其他高新备查资料");
|
|
|
+ return dir;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ZipDir generateD28(String year) {
|
|
|
+ ZipDir dir = new ZipDir("其他加计扣除备查资料");
|
|
|
+ return dir;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void downloadCenterZipFiles(HttpServletRequest request, HttpServletResponse response, String year) {
|
|
|
+ if (Func.isBlank(year)) {
|
|
|
+ throw new ServiceException("参数year不能为空");
|
|
|
+ }
|
|
|
+ List<ZipDir> data = new ArrayList<>();
|
|
|
+
|
|
|
+ data.add(generateD1(year));
|
|
|
+ data.add(generateD2(year));
|
|
|
+ data.add(generateD3(year));
|
|
|
+ data.add(generateD4(year));
|
|
|
+ data.add(generateD5(year));
|
|
|
+ data.add(generateD6(year));
|
|
|
+ data.add(generateD7(year));
|
|
|
+ data.add(generateD8(year));
|
|
|
+ data.add(generateD9(year));
|
|
|
+ data.add(generateD10(year));
|
|
|
+ data.add(generateD11(year));
|
|
|
+ data.add(generateD12(year));
|
|
|
+ data.add(generateD13(year));
|
|
|
+ data.add(generateD14(year));
|
|
|
+ data.add(generateD15(year));
|
|
|
+ data.add(generateD16(year));
|
|
|
+ data.add(generateD17(year));
|
|
|
+ data.add(generateD18(year));
|
|
|
+ data.add(generateD19(year));
|
|
|
+ data.add(generateD20(year));
|
|
|
+ data.add(generateD21(year));
|
|
|
+ data.add(generateD22(year));
|
|
|
+ data.add(generateD23(year));
|
|
|
+ data.add(generateD24(year));
|
|
|
+ data.add(generateD25(year));
|
|
|
+ data.add(generateD26(year));
|
|
|
+ data.add(generateD27(year));
|
|
|
+ data.add(generateD28(year));
|
|
|
|
|
|
+ try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(bos)) {
|
|
|
+ String fileName = year + "年档案中心" + ".zip";
|
|
|
+ ZipDownloadUtils.setResponse(request, response, fileName);
|
|
|
+ // 快速压缩
|
|
|
+ zipOut.setLevel(Deflater.BEST_SPEED);
|
|
|
+ for (ZipDir group : data) {
|
|
|
+ String dir = ZipDownloadUtils.safeName(group.getDirName()) + "/";
|
|
|
+ List<ZipDir> subDirs = group.getSubDirs();
|
|
|
+ if (subDirs == null || subDirs.isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeEmptyDirToZip(zipOut, dir);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ for (ZipFileRef fileRef : group.getFileRefs()) {
|
|
|
+ if (fileRef.getLocalPath() != null && !fileRef.getLocalPath().isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeLocalFileToZip(zipOut, fileRef.getLocalPath(), dir + ZipDownloadUtils.safeName(fileRef.getName()));
|
|
|
+ } else if (fileRef.getHttpUrl() != null && !fileRef.getHttpUrl().isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeHttpFileToZip(zipOut, fileRef.getHttpUrl(), dir + ZipDownloadUtils.safeName(fileRef.getName()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ zipOut.finish();
|
|
|
+ zipOut.flush();
|
|
|
+ response.flushBuffer();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException("打包下载失败", e);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void downloadHighTechZipFiles(HttpServletRequest request, HttpServletResponse response, String year) {
|
|
|
+ if (Func.isBlank(year)) {
|
|
|
+ throw new ServiceException("参数year不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ZipDir> data = new ArrayList<>(Arrays.asList(generateD1(year), generateD2(year), generateD4(year), generateD5(year), generateD7(year), generateD9(year), generateD11(year), generateD14(year), generateD21(year), generateD22(year), generateD23(year), generateD25(year), generateD27(year)));
|
|
|
|
|
|
+ try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(bos)) {
|
|
|
+ String fileName = year + "年档案中心高新备查" + ".zip";
|
|
|
+ ZipDownloadUtils.setResponse(request, response, fileName);
|
|
|
+ // 快速压缩
|
|
|
+ zipOut.setLevel(Deflater.BEST_SPEED);
|
|
|
+ for (ZipDir group : data) {
|
|
|
+ String dir = ZipDownloadUtils.safeName(group.getDirName()) + "/";
|
|
|
+ List<ZipDir> subDirs = group.getSubDirs();
|
|
|
+ if (subDirs == null || subDirs.isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeEmptyDirToZip(zipOut, dir);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ for (ZipFileRef fileRef : group.getFileRefs()) {
|
|
|
+ if (fileRef.getLocalPath() != null && !fileRef.getLocalPath().isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeLocalFileToZip(zipOut, fileRef.getLocalPath(), dir + ZipDownloadUtils.safeName(fileRef.getName()));
|
|
|
+ } else if (fileRef.getHttpUrl() != null && !fileRef.getHttpUrl().isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeHttpFileToZip(zipOut, fileRef.getHttpUrl(), dir + ZipDownloadUtils.safeName(fileRef.getName()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ zipOut.finish();
|
|
|
+ zipOut.flush();
|
|
|
+ response.flushBuffer();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException("打包下载失败", e);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void downloadDeductionZipFiles(HttpServletRequest request, HttpServletResponse response, String year) {
|
|
|
+ if (Func.isBlank(year)) {
|
|
|
+ throw new ServiceException("参数year不能为空");
|
|
|
+ }
|
|
|
+ List<ZipDir> data = new ArrayList<>();
|
|
|
|
|
|
+ data.add(generateD3(year));
|
|
|
+ data.add(generateD4(year));
|
|
|
+ data.add(generateD6(year));
|
|
|
+ data.add(generateD8(year));
|
|
|
+ data.add(generateD10(year));
|
|
|
+ data.add(generateD13(year));
|
|
|
+ data.add(generateD15(year));
|
|
|
+ data.add(generateD19(year));
|
|
|
+ data.add(generateD20(year));
|
|
|
+ data.add(generateD26(year));
|
|
|
+ data.add(generateD28(year));
|
|
|
+
|
|
|
+ try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(bos)) {
|
|
|
+ String fileName = year + "年档案中心加计备查" + ".zip";
|
|
|
+ ZipDownloadUtils.setResponse(request, response, fileName);
|
|
|
+ // 快速压缩
|
|
|
+ zipOut.setLevel(Deflater.BEST_SPEED);
|
|
|
+ for (ZipDir group : data) {
|
|
|
+ String dir = ZipDownloadUtils.safeName(group.getDirName()) + "/";
|
|
|
+ List<ZipDir> subDirs = group.getSubDirs();
|
|
|
+ if (subDirs == null || subDirs.isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeEmptyDirToZip(zipOut, dir);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ for (ZipFileRef fileRef : group.getFileRefs()) {
|
|
|
+ if (fileRef.getLocalPath() != null && !fileRef.getLocalPath().isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeLocalFileToZip(zipOut, fileRef.getLocalPath(), dir + ZipDownloadUtils.safeName(fileRef.getName()));
|
|
|
+ } else if (fileRef.getHttpUrl() != null && !fileRef.getHttpUrl().isEmpty()) {
|
|
|
+ ZipDownloadUtils.writeHttpFileToZip(zipOut, fileRef.getHttpUrl(), dir + ZipDownloadUtils.safeName(fileRef.getName()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ zipOut.finish();
|
|
|
+ zipOut.flush();
|
|
|
+ response.flushBuffer();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException("打包下载失败", e);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
}
|