zhoulisky 8 months ago
parent
commit
70beb9e486

+ 6 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/entity/DownloadTask.java

@@ -4,6 +4,9 @@ package org.sky.scientific.pojo.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.sky.core.tenant.mp.TenantEntity;
@@ -29,6 +32,8 @@ public class DownloadTask extends TenantEntity {
 	private static final long serialVersionUID = 1L;
 
 	@Schema(description = "年份")
+	@NotBlank(message = "参数yearAndMonth不能为空")
+	@Size(min = 4, max = 4, message = "参数yearAndMonth格式错误,YYYY")
 	private String yearAndMonth;
 
 	@Schema(description = "过期时间")
@@ -46,5 +51,6 @@ public class DownloadTask extends TenantEntity {
 	private Long fileSize;
 
 	@Schema(description = "类型,0:一键下载,1:一键导出高新被查,2:一键导出加计被查")
+	@NotNull(message = "参数type不能为空")
 	private Integer type;
 }

+ 49 - 103
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/ArchiveCenterController.java

@@ -2,7 +2,6 @@
 package org.sky.scientific.controller;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -14,20 +13,18 @@ import lombok.SneakyThrows;
 import org.sky.core.boot.ctrl.KdController;
 import org.sky.core.secure.utils.SecureUtil;
 import org.sky.core.tool.api.R;
-import org.sky.core.tool.utils.FileUtil;
 import org.sky.scientific.mapper.DownloadTaskMapper;
 import org.sky.scientific.pojo.entity.ArchiveAttachEntity;
 import org.sky.scientific.pojo.entity.DownloadTask;
 import org.sky.scientific.service.IArchiveService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
 
 import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.Date;
 
 /**
  * 科研档案管理 控制器
@@ -66,128 +63,77 @@ public class ArchiveCenterController extends KdController {
 		service.downloadFjbczlZipFiles(request, response, year);
 	}
 
-	@GetMapping("generate")
+	@PostMapping("generate")
 	@ApiOperationSupport(order = 6)
-	@Operation(summary = "档案中心-一键下载-生成", description = "返回任务Id,后端生产待下载的文件")
-	public R generateCenterZipFiles(DownloadTask task) {
+	@Operation(summary = "档案中心-一键下载/一键导出高新备查/一键导出加计备查-生成", description = "返回任务Id,后端生产待下载的文件")
+	public R generateCenterZipFiles(@Valid @RequestBody DownloadTask task) {
 		if (task.getId() != null) {
 			DownloadTask dbTask = downloadTaskMapper.selectById(task.getId());
 			if (dbTask == null) {
 				return R.fail("下载任务不存在,请联系管理员");
 			}
-			if (dbTask.getStatus() == 2) {
-				//todo 后续考虑过期需要删除已生成的文件
-				return R.success("下载任务已完成");
-			} else {
-				return R.fail("下载任务进行中,请耐心等待");
-			}
+			return R.data(dbTask);
+//			if (dbTask.getStatus() == 2) {
+//				//todo 后续考虑过期需要删除已生成的文件
+//				return R.success("下载任务已完成");
+//			} else {
+//				return R.fail("下载任务进行中,请耐心等待");
+//			}
 		} else {
- 			task.setYearAndMonth(task.getYearAndMonth());
+			task.setYearAndMonth(task.getYearAndMonth());
 			task.setTenantId(SecureUtil.getTenantId());
-			int result = downloadTaskMapper.insert(task);
+			int result = downloadTaskMapper.insertDownloadTask( task);
 			RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
 			if (result == 1) {
 				new Thread(() -> {
 					RequestContextHolder.setRequestAttributes(requestAttributes);
-					service.downloadCenterZipFiles(task.getYearAndMonth(), task.getId());
+					service.downloadCenterZipFiles(task.getYearAndMonth(), task);
 				}).start();
 				return R.data(task);
 			}
 		}
 		return R.success();
- 	}
+	}
 
 	@SneakyThrows
 	@GetMapping("center/download")
 	@ApiOperationSupport(order = 6)
-	@Operation(summary = "档案中心-一键下载")
-	public void downloadCenterZipFiles(HttpServletResponse response, String year, Long taskId) {
-		System.out.println("---------------------"+Thread.currentThread().getName());
-		if (taskId != null) {
-			DownloadTask task = downloadTaskMapper.selectById(taskId);
-			if (task == null) {
-				response.setContentType("application/json;charset=UTF-8");
-				PrintWriter writer = response.getWriter();
-				writer.write(JSON.toJSONString(R.fail("下载任务不存在,请联系管理员")));
-				writer.flush();
-			} else if (task.getStatus() == 2) {
-				if (task.getExpireTime() != null && new Date().compareTo(task.getExpireTime()) > 0) {
-					FileUtil.deleteQuietly(new File(task.getZipUrl()));
-					downloadTaskMapper.deleteById(taskId);
-					//24小时后需重新生成
-					response.setContentType("application/json;charset=UTF-8");
-					PrintWriter writer = response.getWriter();
-					writer.write(JSON.toJSONString(R.fail("文件已是24小时前生成的,请重新生成")));
-					writer.flush();
-				} else {
-					//将磁盘生成的目录及文件压缩成zip
-					OutputStream toClient = null;
-					try {
-						BufferedInputStream fis = new BufferedInputStream(new FileInputStream(task.getZipUrl()));
-						byte[] buffer = new byte[fis.available()];
-						fis.read(buffer);
-						fis.close();
-						response.reset();
-						toClient = new BufferedOutputStream(response.getOutputStream());
-						response.setCharacterEncoding(StandardCharsets.UTF_8.name());
-						response.setContentType("application/octet-stream");
-						response.setHeader("content-disposition", "attachment; filename=" + task.getZipUrl());
-						toClient.write(buffer);
-						toClient.flush();
-					} catch (Exception e) {
-						response.setContentType("application/json;charset=UTF-8");
-						PrintWriter writer = response.getWriter();
-						writer.write(JSON.toJSONString(R.fail("下载zip压缩包过程发生异常,请联系管理员")));
-						log.error("下载zip压缩包过程发生异常,{}", e.getLocalizedMessage());
-						writer.flush();
-					} finally {
-						if (toClient != null) {
-							try {
-								toClient.close();
-							} catch (IOException e) {
-								log.error("zip下载关流失败");
-							}
-						}
-					}
-				}
-			} else {
-				response.setContentType("application/json;charset=UTF-8");
-				PrintWriter writer = response.getWriter();
-				writer.write(JSON.toJSONString(R.fail("下载任务进行中,请耐心等待")));
-				writer.flush();
-			}
-		} else {
-			DownloadTask task = new DownloadTask();
-			task.setYearAndMonth(year);
-			int result = downloadTaskMapper.insert(task);
-			if (result == 1) {
-				response.setContentType("application/json;charset=UTF-8");
-				PrintWriter writer = response.getWriter();
-				JSONObject data = new JSONObject();
-				data.put("taskId", task.getId());
-				writer.write(JSON.toJSONString(R.data(data)));
-				RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
-				new Thread(() -> {
-					RequestContextHolder.setRequestAttributes(requestAttributes);
-					service.downloadCenterZipFiles(year, task.getId());
-				}).start();
-				writer.flush();
+	@Operation(summary = "档案中心-一键下载/一键导出高新备查/一键导出加计备查")
+	public void downloadCenterZipFiles(HttpServletResponse response, Long taskId) {
+		DownloadTask task = downloadTaskMapper.selectById(taskId);
+		if (task == null) {
+			response.setContentType("application/json;charset=UTF-8");
+			PrintWriter writer = response.getWriter();
+			writer.write(JSON.toJSONString(R.fail("下载任务不存在,请联系管理员")));
+			writer.flush();
+		} else if (task.getStatus() == 2) {
+			// 指定磁盘上已存在的ZIP文件路径
+			File zipFile = new File(task.getZipUrl());
+
+			// 检查文件是否存在
+			if (!zipFile.exists()) {
+				response.sendError(HttpStatus.NOT_FOUND.value(), "ZIP文件未找到");
+				return;
 			}
-		}
-	}
 
-	@GetMapping("center/high-tech/download")
-	@ApiOperationSupport(order = 8)
-	@Operation(summary = "档案中心-一键导出高新备查")
-	public void downloadCenterHighTechZipFiles(HttpServletRequest request, HttpServletResponse response, String year) {
-		service.downloadHighTechZipFiles(request, response, year);
-	}
+			// 设置响应头
+			response.setContentType("application/zip");
+			response.setHeader("Content-Disposition",
+				"attachment; filename=\"" + zipFile.getName() + "\"");
+			response.setContentLengthLong(zipFile.length());
 
-	@GetMapping("center/deduction/download")
-	@ApiOperationSupport(order = 10)
-	@Operation(summary = "档案中心-一键导出加计备查")
-	public void downloadCenterDeductionZipFiles(HttpServletRequest request, HttpServletResponse response, String year) {
-		service.downloadDeductionZipFiles(request, response, year);
-	}
+			// 将文件写入响应输出流
+			try (InputStream fileInputStream = new FileInputStream(zipFile);
+				 OutputStream responseOutputStream = response.getOutputStream()) {
 
+				byte[] buffer = new byte[4096];
+				int bytesRead;
+				while ((bytesRead = fileInputStream.read(buffer)) != -1) {
+					responseOutputStream.write(buffer, 0, bytesRead);
+				}
+				responseOutputStream.flush();
+			}
+
+		}
+	}
 }

+ 1 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/DownloadTaskMapper.java

@@ -12,4 +12,5 @@ import org.sky.scientific.pojo.entity.DownloadTask;
  */
 public interface DownloadTaskMapper extends BaseMapper<DownloadTask> {
 
+	int insertDownloadTask(DownloadTask downloadTask);
 }

+ 6 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/DownloadTaskMapper.xml

@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
 <mapper namespace="org.sky.scientific.mapper.DownloadTaskMapper">
 
+    <insert id="insertDownloadTask" useGeneratedKeys="true" keyProperty="id" parameterType="org.sky.scientific.pojo.entity.DownloadTask">
+        insert into kd_download_task(tenant_id, year_and_month, type)
+            values
+            (#{tenantId}, #{yearAndMonth}, #{type})
+    </insert>
 </mapper>

+ 2 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IArchiveService.java

@@ -3,6 +3,7 @@ package org.sky.scientific.service;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import org.sky.scientific.pojo.entity.ArchiveAttachEntity;
+import org.sky.scientific.pojo.entity.DownloadTask;
 
 public interface IArchiveService {
 
@@ -22,7 +23,7 @@ public interface IArchiveService {
 
 	void downloadFjbczlZipFiles(HttpServletRequest request, HttpServletResponse response, String year);
 
-	void downloadCenterZipFiles(String year,Long taskId);
+	void downloadCenterZipFiles(String year, DownloadTask task);
 
 	void downloadHighTechZipFiles(HttpServletRequest request, HttpServletResponse response, String year);
 

File diff suppressed because it is too large
+ 516 - 439
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/ArchiveServiceImpl.java


+ 6 - 0
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmGoodsServiceImpl.java

@@ -64,6 +64,12 @@ public class XmGoodsServiceImpl extends BaseServiceImpl<XmGoodsMapper, XmGoodsEn
 			XmGoodsExcel excel = BeanUtil.copyProperties(vo, XmGoodsExcel.class);
 			assert excel != null;
 			excel.setXh(index.getAndIncrement() + "");
+			if(excel.getUnitPrice()==null){
+				excel.setUnitPrice(BigDecimal.ZERO);
+			}
+			if(excel.getUseQuantity()==null){
+				excel.setUseQuantity(0);
+			}
 			excel.setAmount(excel.getUnitPrice().multiply(new BigDecimal(excel.getUseQuantity())));
 			excel.setUseDateStr(Func.notNull(excel.getUseDate()) ? DateUtil.format(excel.getUseDate(), DateUtil.PATTERN_DATE) : null);
 			resultList.add(excel);

+ 11 - 7
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmIntangibleAssetServiceImpl.java

@@ -8,8 +8,8 @@ import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.excel.write.metadata.fill.FillConfig;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.sky.core.excel.util.ExcelUtil;
@@ -31,6 +31,7 @@ import org.sky.scientific.pojo.entity.XmIntangibleAsset;
 import org.sky.scientific.pojo.vo.XmIntangibleAssetCostVo;
 import org.sky.scientific.pojo.vo.YsWxzctxfyVO;
 import org.sky.scientific.service.IXmIntangibleAssetService;
+import org.sky.scientific.service.IXmService;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -49,14 +50,13 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 @Service
+@AllArgsConstructor
 public class XmIntangibleAssetServiceImpl extends BaseServiceImpl<XmIntangibleAssetMapper, XmIntangibleAsset> implements IXmIntangibleAssetService {
 
-	@Resource
-	private YsWxzctxfyMapper ysWxzctxfyMapper;
-	@Resource
-	private XmMapper xmMapper;
-	@Resource
-	private AssetMapper assetMapper;
+	private final YsWxzctxfyMapper ysWxzctxfyMapper;
+ 	private final XmMapper xmMapper;
+ 	private final AssetMapper assetMapper;
+ 	private final IXmService xmService;
 
 	@Override
 	public IPage<XmIntangibleAsset> selectPage(IPage<XmIntangibleAsset> page, XmAssetQueryParam param) {
@@ -80,6 +80,10 @@ public class XmIntangibleAssetServiceImpl extends BaseServiceImpl<XmIntangibleAs
 		if (StringUtil.isBlank(yearAndMonth)) {
 			throw new ServiceException("参数yearAndMonth不能为空");
 		}
+		//查询项目周期包含yearAndMonth的项目
+		//查询每个项目上个月数据,有则引入,无则引入预算表数据,都没数据,则提示:无数据可引入。否则提示:引入成功
+
+
 		//获取本月数据
 		List<XmIntangibleAsset> thisMonthList = baseMapper.selectListByYearAndMonth(yearAndMonth);
 //		if(Func.isNotEmpty(thisMonthList)){