zhoulisky 8 months ago
parent
commit
c8dd5b8050
46 changed files with 428 additions and 194 deletions
  1. 4 0
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/TechnicianDTO.java
  2. 3 0
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/XmAssetQueryParam.java
  3. 0 30
      kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/vo/XmVO.java
  4. 18 3
      kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/AssetController.java
  5. 5 2
      kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/TechnicianController.java
  6. 23 17
      kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmController.java
  7. 21 9
      kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmGoodsController.java
  8. 10 2
      kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmLeaseController.java
  9. 1 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/handle/AssetWorkMergeStrategy.java
  10. 7 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/TechnicianMapper.xml
  11. 5 10
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmAssetHoursMapper.xml
  12. 1 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmFinanceMapper.xml
  13. 1 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmFixedAssetMapper.xml
  14. 1 0
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmIntangibleAssetMapper.xml
  15. 2 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmTechnicianMapper.xml
  16. 1 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/ITechnicianService.java
  17. 4 3
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmAssetHoursService.java
  18. 2 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmFixedAssetService.java
  19. 4 3
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmGoodsService.java
  20. 2 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmIntangibleAssetService.java
  21. 2 1
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmLeaseService.java
  22. 3 3
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmService.java
  23. 207 47
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/ArchiveServiceImpl.java
  24. 2 6
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/TechnicianServiceImpl.java
  25. 3 10
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmAssetHoursServiceImpl.java
  26. 4 5
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmFixedAssetServiceImpl.java
  27. 22 13
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmGoodsServiceImpl.java
  28. 4 5
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmIntangibleAssetServiceImpl.java
  29. 4 5
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmLeaseServiceImpl.java
  30. 38 8
      kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmServiceImpl.java
  31. BIN
      kd-service/kd-scientific/src/main/resources/templates/1-项目立项-立项申请资料.doc
  32. 0 3
      kd-service/kd-scientific/src/main/resources/templates/1-项目立项-立项申请资料.ftl
  33. 0 3
      kd-service/kd-scientific/src/main/resources/templates/1-项目立项-立项申请资料.xml
  34. BIN
      kd-service/kd-scientific/src/main/resources/templates/3-项目实施-阶段性报告.doc
  35. BIN
      kd-service/kd-scientific/src/main/resources/templates/项目变更表.doc
  36. 3 0
      kd-service/kd-scientific/src/main/resources/templates/项目变更表.ftl
  37. 3 0
      kd-service/kd-scientific/src/main/resources/templates/项目变更表.xml
  38. BIN
      kd-service/kd-scientific/src/main/resources/templates/项目实施表.doc
  39. 3 0
      kd-service/kd-scientific/src/main/resources/templates/项目实施表.ftl
  40. 3 0
      kd-service/kd-scientific/src/main/resources/templates/项目实施表.xml
  41. BIN
      kd-service/kd-scientific/src/main/resources/templates/项目立项表.doc
  42. 3 0
      kd-service/kd-scientific/src/main/resources/templates/项目立项表.ftl
  43. 3 0
      kd-service/kd-scientific/src/main/resources/templates/项目立项表.xml
  44. BIN
      kd-service/kd-scientific/src/main/resources/templates/项目结题表.doc
  45. 3 0
      kd-service/kd-scientific/src/main/resources/templates/项目结题表.ftl
  46. 3 0
      kd-service/kd-scientific/src/main/resources/templates/项目结题表.xml

+ 4 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/TechnicianDTO.java

@@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
 import org.sky.scientific.pojo.entity.TechnicianEntity;
 
 import java.io.Serial;
+import java.util.List;
 
 /**
  * 技术人员花名册 数据传输对象实体类
@@ -25,4 +26,7 @@ public class TechnicianDTO extends TechnicianEntity {
 
 	@Schema(description = "入职时间-结束")
 	private String hireDateMax;
+
+	@Schema(description = "研发项目id数组")
+	private List<Long> xmIdList;
 }

+ 3 - 0
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/dto/XmAssetQueryParam.java

@@ -12,6 +12,9 @@ public class XmAssetQueryParam {
 	@Schema(description = "租户id", hidden = true)
 	private String tenantId;
 
+	@Schema(description = "项目id")
+	private Long xmId;
+
 	@Schema(description = "项目名称")
 	private String xmmc;
 

+ 0 - 30
kd-service-api/kd-scientific-api/src/main/java/org/sky/scientific/pojo/vo/XmVO.java

@@ -18,34 +18,4 @@ import java.io.Serial;
 public class XmVO extends XmEntity {
 	@Serial
 	private static final long serialVersionUID = 1L;
-
-//	@Schema(description = "项目负责人信息")
-//	private TechnicianEntity technicianEntity;
-
-//	@Schema(description = "立项报告")
-//	private List<String> xmlxbgEntityList;
-//
-//	@Schema(description = "阶段性报告")
-//	private List<XmJdxbgEntity> xmJdxbgEntityList;
-//
-//	@Schema(description = "验收报告")
-//	private List<XmJtbEntity> xmYsbgList;
-//
-//	@Schema(description = "发明专利")
-//	private List<CgZlEntity> fmzlEntityList;
-//
-//	@Schema(description = "实用新型专利")
-//	private List<CgZlEntity> syxxzlEntityList;
-//
-//	@Schema(description = "软著")
-//	private List<CgRjzzqEntity> rjzzqEntityList;
-//
-//	@Schema(description = "标准")
-//	private List<CgJsbzEntity> jsbzEntityList;
-//
-//	@Schema(description = "论文")
-//	private List<CgKylwEntity> kylwEntityList;
-//
-//	@Schema(description = "其他")
-//	private List<CgQtEntity> qtEntityList;
 }

+ 18 - 3
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/AssetController.java

@@ -10,10 +10,12 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import org.sky.core.boot.ctrl.KdController;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
 import org.sky.core.tool.api.R;
+import org.sky.core.tool.utils.Charsets;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.pojo.dto.*;
 import org.sky.scientific.pojo.entity.AssetEntity;
@@ -28,6 +30,7 @@ import org.sky.scientific.wrapper.ZcWrapper;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.net.URLEncoder;
 import java.util.List;
 
 /**
@@ -201,11 +204,15 @@ public class AssetController extends KdController {
 		return R.status(hoursService.clearXmAssetHours(dto));
 	}
 
+	@SneakyThrows
 	@GetMapping("/hours/export")
 	@ApiOperationSupport(order = 34)
 	@Operation(summary = "科研仪器设备工时登记表-导出")
 	public void exportXmAssetHours(HttpServletResponse response, XmAssetHoursDto dto) {
-		hoursService.exportXmAssetHours(response, dto);
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("每月仪器设备工时打卡.xls", Charsets.UTF_8));
+		hoursService.exportXmAssetHours(response.getOutputStream(), dto);
 	}
 
 	@GetMapping("/kyyqsbzjfyfpb")
@@ -215,11 +222,15 @@ public class AssetController extends KdController {
 		return R.data(fixedAssetService.keyanyiqishebeizhejiufeiyongfenpeibiao(Condition.getPage(query), dto));
 	}
 
+	@SneakyThrows
 	@PostMapping("/kyyqsbzjfyfpb/export")
 	@ApiOperationSupport(order = 36)
 	@Operation(summary = "科研仪器设备折旧费用分配表-导出")
 	public void exportKeyanyiqishebeizhejiufeiyongfenpeibiao(HttpServletResponse response,@RequestBody XmAssetQueryParam dto) {
-		fixedAssetService.exportKeyanyiqishebeizhejiufeiyongfenpeibiao(response, dto);
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("仪器设备折旧费用分配表.xls", Charsets.UTF_8));
+		fixedAssetService.exportKeyanyiqishebeizhejiufeiyongfenpeibiao(response.getOutputStream(), dto);
 	}
 
 	@GetMapping("/fangwujianzhuwu/page")
@@ -345,11 +356,15 @@ public class AssetController extends KdController {
 		return R.data(intangibleAssetService.keyanwuxingzichantanxiaofeiyongfenpeibiao(Condition.getPage(query), dto));
 	}
 
+	@SneakyThrows
 	@PostMapping("/kywxzctxfyfpb/export")
 	@ApiOperationSupport(order = 59)
 	@Operation(summary = "科研无形资产摊销费用分配表-导出")
 	public void exportKeyanwuxingzichanfenpeibiao(HttpServletResponse response,@RequestBody XmAssetQueryParam dto) {
-		intangibleAssetService.exportKeyanwuxingzichanfenpeibiao(response, dto);
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("无形资产摊销费用分配表.xls", Charsets.UTF_8));
+		intangibleAssetService.exportKeyanwuxingzichanfenpeibiao(response.getOutputStream(), dto);
 	}
 
 	@GetMapping("/zj-cqdt-wxzctx-fy-hzb")

+ 5 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/TechnicianController.java

@@ -186,8 +186,11 @@ public class TechnicianController extends KdController {
 	@PostMapping("ndgkjryhzb-export")
 	@ApiOperationSupport(order = 29)
 	@Operation(summary = "年度科技人员汇总表-导出")
-	public void exportNdgkjryhzb(@RequestBody TechnicianDTO dto, HttpServletResponse response) {
-		technicianService.exportNdgkjryhzb(response, dto);
+	public void exportNdgkjryhzb(@RequestBody TechnicianDTO dto, HttpServletResponse response) throws IOException {
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("年度高新科技人员汇总表.xls", Charsets.UTF_8));
+		technicianService.exportNdgkjryhzb(response.getOutputStream(), dto);
 	}
 
 	@GetMapping("myyfryrgfyfpb")

+ 23 - 17
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmController.java

@@ -10,6 +10,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import org.sky.core.boot.ctrl.KdController;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
@@ -29,6 +30,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -48,7 +50,7 @@ public class XmController extends KdController {
 
 	@GetMapping("/list")
 	@ApiOperationSupport(order = 1)
-	@Operation(summary = "科研项目-列表", description  = "传入xm")
+	@Operation(summary = "科研项目-列表", description = "传入xm")
 	public R<IPage<XmEntity>> list(XmDTO xm, Query query) {
 		IPage<XmEntity> pages = service.selectXmList(Condition.getPage(query), xm);
 		return R.data(pages);
@@ -56,7 +58,7 @@ public class XmController extends KdController {
 
 	@GetMapping("/list-year")
 	@ApiOperationSupport(order = 1)
-	@Operation(summary = "年度科研项目-列表", description  = "传入xm")
+	@Operation(summary = "年度科研项目-列表", description = "传入xm")
 	public R<List<XmEntity>> list(String year) {
 		List<XmEntity> list = service.selectXmListByYear(year);
 		return R.data(list);
@@ -64,7 +66,7 @@ public class XmController extends KdController {
 
 	@GetMapping("/assist/list")
 	@ApiOperationSupport(order = 1)
-	@Operation(summary = "辅助核算-列表", description  = "yearAndMonth:2025")
+	@Operation(summary = "辅助核算-列表", description = "yearAndMonth:2025")
 	public R<IPage<JSONObject>> selectAssistXmList(XmDTO xm, Query query) {
 		IPage<JSONObject> pages = service.selectAssistList(Condition.getPage(query), xm);
 		return R.data(pages);
@@ -73,13 +75,13 @@ public class XmController extends KdController {
 	@GetMapping("assist/export")
 	@ApiOperationSupport(order = 1)
 	@Operation(summary = "辅助核算-导出")
-	public void exportAssistXmList(HttpServletResponse response,XmDTO dto) {
+	public void exportAssistXmList(HttpServletResponse response, XmDTO dto) {
 		service.exportAssistXmList(response, dto);
 	}
 
 	@GetMapping("/detail")
 	@ApiOperationSupport(order = 2)
-	@Operation(summary = "科研项目-详情", description  = "传入xm")
+	@Operation(summary = "科研项目-详情", description = "传入xm")
 	public R<XmVO> detail(XmEntity xm) {
 		XmVO xmVO = service.selectByXmId(xm.getId());
 		return R.data(xmVO);
@@ -87,9 +89,9 @@ public class XmController extends KdController {
 
 	@GetMapping("/summary")
 	@ApiOperationSupport(order = 3)
-	@Operation(summary = "研发项目汇总表", description  = "传入xm")
+	@Operation(summary = "研发项目汇总表", description = "传入xm")
 	public R<IPage<XmSummary>> summary(XmDTO xm, Query query) {
-		IPage<XmSummary> pages = service.summaryPage(Condition.getPage(query),xm);
+		IPage<XmSummary> pages = service.summaryPage(Condition.getPage(query), xm);
 		return R.data(pages);
 	}
 
@@ -109,7 +111,7 @@ public class XmController extends KdController {
 
 	@PostMapping("/save")
 	@ApiOperationSupport(order = 4)
-	@Operation(summary = "项目立项", description  = "传入xm")
+	@Operation(summary = "项目立项", description = "传入xm")
 	public R<JSONObject> save(@Valid @RequestBody XmDTO xm) {
 		Long xmId = service.approval(xm);
 		JSONObject result = new JSONObject();
@@ -119,7 +121,7 @@ public class XmController extends KdController {
 
 	@PostMapping("/update")
 	@ApiOperationSupport(order = 5)
-	@Operation(summary = "项目立项-修改", description  = "传入xm")
+	@Operation(summary = "项目立项-修改", description = "传入xm")
 	public R<Boolean> update(@Valid @RequestBody XmUpdateDto xm) {
 		return R.status(service.updateXm(xm));
 	}
@@ -127,20 +129,24 @@ public class XmController extends KdController {
 	@GetMapping("/approval")
 	@ApiOperationSupport(order = 6)
 	@Operation(summary = "立项信息-查询")
-	public R<XmVO> selectApprovalInfo(Long xmId){
+	public R<XmVO> selectApprovalInfo(Long xmId) {
 		return R.data(service.selectApprovalInfo(xmId));
 	}
 
-	@GetMapping("/approval/print")
+	@SneakyThrows
+	@GetMapping("/approval/export")
 	@ApiOperationSupport(order = 7)
-	@Operation(summary = "立项信息-打印")
-	public void printApprovalInfo(HttpServletResponse response,Long xmId){
-		service.printApprovalInfo(response,xmId);
+	@Operation(summary = "项目立项表-导出")
+	public void exportApprovalInfo(HttpServletResponse response, Long xmId) {
+		response.setHeader("Content-disposition",
+			"attachment;filename=" + URLEncoder.encode("项目立项表.doc", StandardCharsets.UTF_8));
+		response.setContentType("application/msword");
+		service.exportApprovalInfo(response.getOutputStream(), xmId);
 	}
 
 	@GetMapping("yszb")
 	@ApiOperationSupport(order = 10)
-	@Operation(summary = "项目预算-预算总表", description  = "传入项目id")
+	@Operation(summary = "项目预算-预算总表", description = "传入项目id")
 	public R<XmYszbVO> selectYszb(@RequestParam("xmId") Long xmId) {
 		XmYszbVO xmYszbVO = service.selectYszb(xmId);
 		return R.data(xmYszbVO);
@@ -156,14 +162,14 @@ public class XmController extends KdController {
 	@PostMapping("finance/fetch")
 	@ApiOperationSupport(order = 21)
 	@Operation(summary = "会计/加计扣除/高新-研发项目清单-引入", description = "传入yearAndMonth、type即可")
-	public R<Boolean> fetchFinance(XmFinanceEntity entity){
+	public R<Boolean> fetchFinance(XmFinanceEntity entity) {
 		return R.status(xmFinanceService.fetchFinance(entity));
 	}
 
 	@PostMapping("finance/save")
 	@ApiOperationSupport(order = 21)
 	@Operation(summary = "会计/加计扣除/高新-研发项目清单-新增")
-	public R<Boolean> saveFinance(@Valid @RequestBody XmFinanceEntity entity){
+	public R<Boolean> saveFinance(@Valid @RequestBody XmFinanceEntity entity) {
 		return R.status(xmFinanceService.saveFinance(entity));
 	}
 

+ 21 - 9
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmGoodsController.java

@@ -10,10 +10,12 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import org.sky.core.boot.ctrl.KdController;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
 import org.sky.core.tool.api.R;
+import org.sky.core.tool.utils.Charsets;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.pojo.dto.XmGoodsDTO;
 import org.sky.scientific.pojo.entity.XmGoodsEntity;
@@ -22,6 +24,7 @@ import org.sky.scientific.service.IXmGoodsService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.net.URLEncoder;
 import java.util.List;
 
 /**
@@ -81,28 +84,37 @@ public class XmGoodsController extends KdController {
 		return R.data(service.yanfalingliaodan(dto));
 	}
 
+	@SneakyThrows
 	@PostMapping("/yanfalingliaodan/export")
 	@ApiOperationSupport(order = 21)
-	@Operation(summary = "材料燃料动力费用-研发领料单/研发燃料耗用单/研发动力耗用单-导出数据")
+	@Operation(summary = "材料燃料动力费用-研发领料单-导出")
 	public void exportYanfalingliaodan(HttpServletResponse response,@RequestBody XmGoodsDTO dto) {
-		dto.setType("材料");
-		service.exportYanfalingliaodan(response, dto);
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("研发领料单.xlsx", Charsets.UTF_8));
+		service.exportYanfalingliaodan(response.getOutputStream(), dto);
 	}
 
+	@SneakyThrows
 	@PostMapping("/yanfadonglihaoyongdan/export")
 	@ApiOperationSupport(order = 21)
-	@Operation(summary = "材料燃料动力费用-研发动力耗用单-导出数据")
+	@Operation(summary = "材料燃料动力费用-研发动力耗用单-导出")
 	public void exportYanfadonglihaoyongdan(HttpServletResponse response,@RequestBody XmGoodsDTO dto) {
-		dto.setType("动力");
-		service.exportYanfadonglihaoyongdan(response, dto);
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("研发动力消耗单.xlsx", Charsets.UTF_8));
+		service.exportYanfadonglihaoyongdan(response.getOutputStream(), dto);
 	}
 
+	@SneakyThrows
 	@PostMapping("/yanfaranliaohaoyongdan/export")
 	@ApiOperationSupport(order = 21)
-	@Operation(summary = "材料燃料动力费用-研发燃料耗用单-导出数据")
+	@Operation(summary = "材料燃料动力费用-研发燃料耗用单-导出")
 	public void exportYanfaranliaohaoyongdan(HttpServletResponse response,@RequestBody XmGoodsDTO dto) {
-		dto.setType("燃料");
-		service.exportYanfaranliaohaoyongdan(response, dto);
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("研发燃料消耗单.xlsx", Charsets.UTF_8));
+		service.exportYanfaranliaohaoyongdan(response.getOutputStream(), dto);
 	}
 
 }

+ 10 - 2
kd-service/kd-scientific/src/main/java/org/sky/scientific/controller/XmLeaseController.java

@@ -10,16 +10,19 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
 import org.sky.core.boot.ctrl.KdController;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
 import org.sky.core.tool.api.R;
+import org.sky.core.tool.utils.Charsets;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.pojo.entity.XmLeaseEntity;
 import org.sky.scientific.service.IXmLeaseService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.net.URLEncoder;
 import java.util.List;
 
 /**
@@ -69,6 +72,7 @@ public class XmLeaseController extends KdController {
 	@ApiOperationSupport(order = 9)
 	@Operation(summary = "研发租赁资产使用记录和费用汇总表-导出数据")
 	public void export(HttpServletResponse response,XmLeaseEntity dto) {
+
  		 service.exportXmLease(response, dto);
  	}
 
@@ -79,11 +83,15 @@ public class XmLeaseController extends KdController {
 		return R.data(service.yanfazulinzichanfeiyongfenpeibiao(dto));
 	}
 
+	@SneakyThrows
 	@PostMapping("/yfzlzcfyfpb/export")
 	@ApiOperationSupport(order = 16)
-	@Operation(summary = "研发租赁资产费用分配表-导出数据")
+	@Operation(summary = "研发租赁资产费用分配表-导出")
 	public void exportYanfazulinzichanfeiyongfenpeibiao(HttpServletResponse response, @RequestBody XmLeaseEntity dto) {
- 		 service.exportYanfazulinzichanfeiyongfenpeibiao(response, dto);
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("每月租赁资产费用分配表.xls", Charsets.UTF_8));
+ 		 service.exportYanfazulinzichanfeiyongfenpeibiao(response.getOutputStream(), dto);
  	}
 
 }

+ 1 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/excel/handle/AssetWorkMergeStrategy.java

@@ -32,7 +32,7 @@ public class AssetWorkMergeStrategy implements SheetWriteHandler {
 
 		LocalDate startDate = LocalDate.of(year, month, 1);
 		int daysInMonth = startDate.lengthOfMonth();
-		int totalColumns = daysInMonth + 8; // 天数 + 8个固定列
+		int totalColumns = daysInMonth + 9; // 天数 + 9个固定列
 
 		// 1. 合并标题行(第一行合并所有列)
 		CellRangeAddress titleMerge = new CellRangeAddress(0, 0, 0, totalColumns - 1);

+ 7 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/TechnicianMapper.xml

@@ -152,7 +152,7 @@
         <if test="ew.name!=null and ew.name!=''">and t.name like concat('%', #{ew.name},'%')</if>
         <if test="ew.number!=null and ew.number!=''">and t.number like concat('%',#{ew.number}, '%')</if>
         <if test="ew.idCard!=null and ew.idCard!=''">and t.id_card like concat('%', #{ew.idCard}, '%')</if>
-         <if test="ew.department!=null and ew.department!=''">and t.department like concat('%',#{ew.department}, '%')</if>
+        <if test="ew.department!=null and ew.department!=''">and t.department like concat('%',#{ew.department}, '%')</if>
         <if test="ew.post!=null and ew.post!=''">and t.post like concat('%', #{ew.post},'%')</if>
         <if test="ew.nature!=null and ew.nature!=''">and t.nature = #{ew.nature}</if>
         <if test="ew.personnelType!=null and ew.personnelType!=''">and t.personnel_type = #{ew.personnelType}</if>
@@ -162,6 +162,12 @@
         <if test="ew.rank !=null and ew.rank!=''">and t.rank like concat('%',#{ew.rank}, '%')</if>
         <if test="ew.practicingRequirement !=null and ew.practicingRequirement!=''">and t.practicing_requirement like concat('%',#{ew.practicingRequirement}, '%')</if>
         <if test="ew.hireDateMin!=null and ew.hireDateMax!=''">and hire_Date between #{ew.hireDateMin} and #{ew.hireDateMax}</if>
+        <if test="ew.xmIdList!=null and ew.xmIdList.size()>0">
+            and h.xm_id in
+            <foreach item="item" index="index" collection="ew.xmIdList" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
         GROUP BY h.unicode
         HAVING workDaysByYear > 183
     </select>

+ 5 - 10
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmAssetHoursMapper.xml

@@ -35,7 +35,7 @@
         </collection>
     </resultMap>
 
-    <select id="selectXmAssetHoursPage" resultMap="ResultVoMap">
+    <select id="selectXmAssetHoursPage" resultMap="ResultVoMap" parameterType="org.sky.scientific.pojo.dto.XmAssetHoursDto">
         SELECT xa.xm_id,xm.xmbh,xm.xmmc,xa.asset_id,asset.zcbm,asset.zcmc,asset.zclb,asset.yt,asset.ZGS,kxah.monthly_hours
         FROM kd_xm_fixed_asset xa
         LEFT JOIN kd_asset asset ON xa.asset_id = asset.id
@@ -56,15 +56,10 @@
             WHERE xm.is_deleted = 0 and DATE_FORMAT(XMKSSJ, '%Y%m') <![CDATA[<=]]> #{ew.yearAndMonth}
         ) xm on xm.id = xa.xm_id
         WHERE xa.year_and_month = #{ew.yearAndMonth} and asset.ZCLB = '仪器设备'
-        <if test="ew.zcmc != null">
-            and asset.zcmc like concat('%',#{ew.zcmc},'%')
-        </if>
-        <if test="ew.xmmc != null">
-            and xm.xmmc like concat('%',#{ew.xmmc},'%')
-        </if>
-        <if test="ew.yt != null">
-            and asset.yt = #{ew.yt}
-        </if>
+        <if test="ew.xmId !=null">and xa.xm_id = #{ew.xmId}</if>
+        <if test="ew.zcmc != null">and asset.zcmc like concat('%',#{ew.zcmc},'%')</if>
+        <if test="ew.xmmc != null">and xm.xmmc like concat('%',#{ew.xmmc},'%')</if>
+        <if test="ew.yt != null">and asset.yt = #{ew.yt}</if>
         <if test="ew.monthlyHoursStart!=null and ew.monthlyHoursEnd!=null">
             and kxah.monthly_hours between #{ew.monthlyHoursStart} and #{ew.monthlyHoursEnd}
         </if>

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

@@ -41,5 +41,6 @@
         ) xm ON xm.id = kxf.xm_id
         WHERE kxf.year_and_month = #{ew.yearAndMonth} and kxf.type = #{ew.type}
         <if test="ew.xmmc!=null and ew.xmmc!=''">and xm.XMMC like concat('%',#{ew.xmmc},'%')</if>
+        order by xm.XMKSSJ asc
     </select>
 </mapper>

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

@@ -107,6 +107,7 @@
             WHERE xm.is_deleted = 0
         ) xm on xm.id = v1.xm_id
         WHERE v1.tenant_id = #{ew.tenantId} AND v1.year_and_month = #{ew.yearAndMonth}
+        <if test="ew.xmId!=null">and v1.xm_id=#{ew.xmId}</if>
         <if test="ew.xmmc!=null and ew.xmmc!=''">and xm.xmmc like concat('%',#{ew.xmmc},'%')</if>
         <if test="ew.zcmc!=null and ew.zcmc!=''">and zcmc like concat('%',#{ew.zcmc},'%')</if>
         <if test="ew.zclb!=null and ew.zclb!=''">and zclb like concat('%',#{ew.zclb},'%')</if>

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

@@ -107,6 +107,7 @@
             FROM kd_xm xm
         ) xm ON xm.id = v1.xm_id
         WHERE v1.tenant_id = #{ew.tenantId} AND v1.year_and_month = #{ew.yearAndMonth}
+        <if test="ew.xmId!=null">and v1.xm_id = #{ew.xmId}</if>
         <if test="ew.xmmc!=null and ew.xmmc!=''">and xm.xmmc like concat('%',#{ew.xmmc},'%')</if>
         <if test="ew.zcmc!=null and ew.zcmc!=''">and v1.zcmc like concat('%',#{ew.zcmc},'%')</if>
         <if test="ew.zclb!=null and ew.zclb!=''">and v1.zclb like concat('%',#{ew.zclb},'%')</if>

+ 2 - 1
kd-service/kd-scientific/src/main/java/org/sky/scientific/mapper/XmTechnicianMapper.xml

@@ -226,7 +226,7 @@
         <result column="pension_insurance_bc" property="pensionInsuranceBc"/>
         <result column="medical_insurance_bc" property="medicalInsuranceBc"/>
     </resultMap>
-    <select id="meiyueyanfarengongfeiyongfeifenpeibiao" resultMap="XmTechnicianSalaryVOMap">
+    <select id="meiyueyanfarengongfeiyongfeifenpeibiao" resultMap="XmTechnicianSalaryVOMap" parameterType="org.sky.scientific.pojo.dto.XmTechnicianDto">
         SELECT
             xm.id as xm_id,xm.XMBH,xm.XMMC,
             t.unicode,t.name, t.number,t.id_card, t.personnel_type,t.year_and_month,
@@ -252,6 +252,7 @@
             FROM kd_xm as  temp
         ) xm ON m.xm_id = xm.id
         WHERE m.tenant_id = #{ew.tenantId} and m.year_and_month = #{ew.yearAndMonth}
+        <if test="ew.xmId!=null">and xm.id = #{ew.xmId}</if>
         <if test="ew.xmmc!=null and ew.xmmc!=''">and xm.XMMC like concat('%',#{ew.xmmc},'%')</if>
         <if test="ew.name!=null and ew.name!=''">and t.name like concat('%', #{ew.name},'%')</if>
         <if test="ew.number!=null and ew.number!=''">and t.number like concat('%',#{ew.number}, '%')</if>

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

@@ -164,6 +164,6 @@ public interface ITechnicianService extends BaseService<TechnicianEntity> {
 
 	void exportXmcyryhzb(HttpServletResponse response, XmTechnicianEntity dto);
 
-	void exportNdgkjryhzb(HttpServletResponse response, TechnicianDTO dto);
+	void exportNdgkjryhzb(OutputStream os, TechnicianDTO dto);
 
 }

+ 4 - 3
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmAssetHoursService.java

@@ -3,13 +3,14 @@ package org.sky.scientific.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import jakarta.servlet.http.HttpServletResponse;
 import org.sky.core.mp.base.BaseService;
 import org.sky.scientific.pojo.dto.XmAssetHoursDto;
 import org.sky.scientific.pojo.entity.XmAssetHoursEntity;
 import org.sky.scientific.pojo.vo.XmAssetHoursVO;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.OutputStream;
+
 /**
  * 科研仪器设备工时 服务类
  *
@@ -49,8 +50,8 @@ public interface IXmAssetHoursService extends BaseService<XmAssetHoursEntity> {
 
 	/**
 	 * 科研仪器设备工时登记表-导出
-	 * @param response
+	 * @param os
 	 * @param dto
 	 */
-	void exportXmAssetHours(HttpServletResponse response, XmAssetHoursDto dto);
+	void exportXmAssetHours(OutputStream os, XmAssetHoursDto dto);
 }

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

@@ -9,6 +9,7 @@ import org.sky.scientific.pojo.entity.XmFixedAsset;
 import org.sky.scientific.pojo.vo.XmFixedAssetCostVo;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.OutputStream;
 import java.util.List;
 
 /**
@@ -74,7 +75,7 @@ public interface IXmFixedAssetService extends BaseService<XmFixedAsset> {
 	 * @param dto
 	 */
 
-	void exportKeyanyiqishebeizhejiufeiyongfenpeibiao(HttpServletResponse response, XmAssetQueryParam dto);
+	void exportKeyanyiqishebeizhejiufeiyongfenpeibiao(OutputStream os, XmAssetQueryParam dto);
 	/**
 	 * 科研房屋建筑物折旧费用分配表
 	 * @param page

+ 4 - 3
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmGoodsService.java

@@ -10,6 +10,7 @@ import org.sky.scientific.pojo.entity.XmGoodsEntity;
 import org.sky.scientific.pojo.vo.XmGoodsVO;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.OutputStream;
 import java.util.List;
 
 /**
@@ -63,9 +64,9 @@ public interface IXmGoodsService extends BaseService<XmGoodsEntity> {
 	 */
 	List<JSONObject> yanfalingliaodan(XmGoodsDTO dto);
 
-	void exportYanfalingliaodan(HttpServletResponse response, XmGoodsDTO dto);
+	void exportYanfalingliaodan(OutputStream os, XmGoodsDTO dto);
 
-	void exportYanfadonglihaoyongdan(HttpServletResponse response, XmGoodsDTO dto);
+	void exportYanfadonglihaoyongdan(OutputStream os, XmGoodsDTO dto);
 
-	void exportYanfaranliaohaoyongdan(HttpServletResponse response, XmGoodsDTO dto);
+	void exportYanfaranliaohaoyongdan(OutputStream os, XmGoodsDTO dto);
 }

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

@@ -9,6 +9,7 @@ import org.sky.scientific.pojo.entity.XmIntangibleAsset;
 import org.sky.scientific.pojo.vo.XmIntangibleAssetCostVo;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.OutputStream;
 import java.util.List;
 
 /**
@@ -60,5 +61,5 @@ public interface IXmIntangibleAssetService extends BaseService<XmIntangibleAsset
 	 * @param response
 	 * @param dto
 	 */
-	void exportKeyanwuxingzichanfenpeibiao(HttpServletResponse response, XmAssetQueryParam dto);
+	void exportKeyanwuxingzichanfenpeibiao(OutputStream os, XmAssetQueryParam dto);
 }

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

@@ -8,6 +8,7 @@ import org.sky.core.mp.base.BaseService;
 import org.sky.scientific.pojo.entity.XmLeaseEntity;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.OutputStream;
 import java.util.List;
 
 /**
@@ -64,5 +65,5 @@ public interface IXmLeaseService extends BaseService<XmLeaseEntity> {
 	/**
 	 * 研发租赁资产费用分配表-导出数据
 	 */
-	void exportYanfazulinzichanfeiyongfenpeibiao(HttpServletResponse response, XmLeaseEntity dto);
+	void exportYanfazulinzichanfeiyongfenpeibiao(OutputStream os, XmLeaseEntity dto);
 }

+ 3 - 3
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/IXmService.java

@@ -100,9 +100,9 @@ public interface IXmService extends BaseService<XmEntity> {
 	XmVO selectApprovalInfo(Long xmId);
 
 	/**
-	 * 立项信息-打印
-	 * @param response
+	 * 立项信息-导出
+	 * @param os
 	 * @param xmId
 	 */
-	void printApprovalInfo(HttpServletResponse response, Long xmId);
+	void exportApprovalInfo(OutputStream os, Long xmId);
 }

+ 207 - 47
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/ArchiveServiceImpl.java

@@ -9,16 +9,19 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.SneakyThrows;
 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.DateUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.scientific.mapper.ArchiveAttachMapper;
 import org.sky.scientific.mapper.SettingMapper;
-import org.sky.scientific.pojo.dto.XmTechnicianDto;
+import org.sky.scientific.pojo.dto.*;
 import org.sky.scientific.pojo.entity.ArchiveAttachEntity;
 import org.sky.scientific.pojo.entity.SettingEntity;
 import org.sky.scientific.pojo.entity.XmFinanceEntity;
+import org.sky.scientific.pojo.entity.XmLeaseEntity;
 import org.sky.scientific.pojo.vo.XmTechnicianHoursVO;
 import org.sky.scientific.service.*;
 import org.sky.scientific.utils.ZipDir;
@@ -34,6 +37,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.zip.Deflater;
 
 @Service
@@ -53,6 +57,18 @@ public class ArchiveServiceImpl implements IArchiveService {
 	private IXmTechnicianHoursService xmTechnicianHoursService;
 	@Resource
 	private ITechnicianService technicianService;
+	@Resource
+	private IXmGoodsService xmGoodsService;
+	@Resource
+	private IXmLeaseService xmLeaseService;
+	@Resource
+	private IXmAssetHoursService hoursService;
+	@Resource
+	private IXmFixedAssetService xmFixedAssetService;
+	@Resource
+	private IXmIntangibleAssetService xmIntangibleAssetService;
+	@Resource
+	private IXmService xmService;
 
 	@Value("${archive.dir}")
 	private String archiveDir;
@@ -202,42 +218,64 @@ public class ArchiveServiceImpl implements IArchiveService {
 		if (Func.isBlank(year)) {
 			throw new ServiceException("参数year不能为空");
 		}
-//		try {
-//
-//			Files.deleteIfExists(Paths.get(archiveDir, SecureUtil.getTenantId(), year));
-//		} catch (IOException e) {
-//			throw new RuntimeException(e);
-//		}
 
 		ArchiveAttachEntity archiveAttach = attachMapper.selectOne(Wrappers.<ArchiveAttachEntity>lambdaQuery().eq(ArchiveAttachEntity::getYearAndMonth, year));
 		if (archiveAttach == null) {
 			archiveAttach = new ArchiveAttachEntity();
 		}
+		//1 高新技术企业资格证书:基础资源管理-企业基本信息-高企证书上传(按年度)。未上传则为空
 		generateD1(year);
-		generateD2(archiveAttach.getD3(), year, "高新技术企业认定资料");
-		generateD2(archiveAttach.getD10(), year, "加计扣除情况说明");
-		generateD2(archiveAttach.getD13(), year, "研发立项决议文件");
-		generateD5(year, 2, "高新-研发项目清单表");
-		generateD5(year, 3, "加计扣除研发项目汇总表");
-		generateD7(year, 2, "高新研发项目全套技术资料");
-		generateD7(year, 3, "加计扣除研发项目全套技术资料");
-		generateD11(year, 0, "全部知识产权资料");
-		generateD11(year, 2, "高新项目知识产权资料");
-		generateD11(year, 3, "加计扣除项目知识产权资料");
-		generateD14(year, "高新口径研发费用辅助账");
-		generateD15(year, "加计扣除口径研发费用辅助账");
-		generateD16(year, "会计口径研发费用辅助账");
-
-		generateD17(year, 1, "会计口径研发费用附件凭证资料及相关说明");
-		generateD17(year, 2, "高新研发费用附件凭证资料及相关说明");
-		generateD17(year, 3, "加计扣除研发费用附件凭证资料及相关说明");
-		generateD20(year, "A107012研发费用加计扣除优惠明细表");
-
+		//2 高新技术企业认定资料:附件补充
+		generateD2(archiveAttach.getD3(), year, "2.高新技术企业认定资料");
+		//3 加计扣除情况说明:附件补充
+		generateD2(archiveAttach.getD10(), year, "3.加计扣除情况说明");
+		//4 研发立项决议文件:附件补充
+		generateD2(archiveAttach.getD13(), year, "4.研发立项决议文件");
+		//5 高新研发项目汇总表:对外报表-高新口径研发费用报表-高新-研发项目清单表
+		generateD5(year, 2, "5.高新研发项目汇总表");
+		//6 加计扣除研发项目汇总表:对外报表-加计扣除口径研发费用报表-加计扣除-研发项目清单表
+		generateD5(year, 3, "6.加计扣除研发项目汇总表");
+		//7.高新研发项目全套技术资料:对外报表-高新口径研发费用报表-高新-研发项目清单中的所有研发项目的全套技术资料,每一个项目,都包括:项目立项表+上传的所有附件;项目实施表(含多个表)+所有附件;项目变更(多个表)+所有附件;项目结题(多个表)+所有附件;委外项目表+所有附件。
+		generateD7(year, 2, "7.高新研发项目全套技术资料");
+		//8 加计扣除研发项目全套技术资料:对外报表-加计扣除口径研发费用报表-加计扣除-研发项目清单中的所有研发项目的全套技术资料,每一个项目,都包括:项目立项表+上传的所有附件;项目实施表(含多个表)+所有附件;项目变更(多个表)+所有附件;项目结题(多个表)+所有附件;委外项目表+所有附件。
+		generateD7(year, 3, "8.加计扣除研发项目全套技术资料");
+		//9 高新研发人员与科技人员资料:改成高新科技人员资料:即科技人员管理-年高新科技人员汇总表资料表,选出:对外报表-高新口径研发费用报表-高新-研发项目清单中项目人员汇总
+		generateD9(year, 2);
+		//10 加计扣除研发人员与科技人员资料:改成加计扣除项目科研人员资料:即科技人员管理-项目人员汇总表,选出:对外报表-加计扣除口径研发费用报表-加计扣除-研发项目清单中项目人员汇总
+		generateD9(year, 3);
+		//11 11.全部知识产权资料(汇总表、附件):当年度所有科研成果列表导出,及所有附件资料的下载
+		generateD11(year, 0, "11.全部知识产权资料");
+		//12 高新项目知识产权资料(汇总表、附件):对外报表-高新口径研发费用报表-高新-研发项目清单中的科研成果列表及所有附件资料的下载
+		generateD11(year, 2, "12.高新项目知识产权资料");
+		//13 加计扣除项目知识产权资料(汇总表、附件):对外报表-加计扣除口径研发费用报表-加计扣除-研发项目清单中的科研成果列表及所有附件资料的下载
+		generateD11(year, 3, "13.加计扣除项目知识产权资料");
+		//14 高新口径研发费用辅助账:对外报表-高新口径研发费用报表-高新-研发支出辅助账
+		generateD14(year, "14.高新口径研发费用辅助账");
+		//15 加计扣除口径研发费用辅助账:对外报表-加计扣除口径研发费用报表-加计扣除-研发支出辅助账
+		generateD15(year, "15.加计扣除口径研发费用辅助账");
+		//16 会计口径研发费用辅助账:对外报表-会计加计扣除口径研发费用报表-会计-研发支出辅助账
+		generateD16(year, "16.会计口径研发费用辅助账");
+		//17.会计口径研发费用附件凭证资料及相关说明:对外报表-会计加计扣除口径研发费用报表-会计-研发项目(见列表详细)
+		generateD17(year, 1, "17.会计口径研发费用附件支撑资料及相关说明");
+		//18.高新研发费用附件凭证资料及相关说明:对外报表-高新口径研发费用报表-高新-研发项目(见列表详细)
+		generateD17(year, 2, "18.高新研发费用附件支持资料及相关说明");
+		//19.加计扣除研发费用附件凭证资料及相关说明:对外报表-加计扣除口径研发费用报表-加计扣除-研发项目(见列表详细)
+		generateD17(year, 3, "19.加计扣除研发费用附件支撑资料及相关说明");
+		//20.A107012研发费用加计扣除优惠明细表:A107012导出表
+		generateD20(year, "20.A107012研发费用加计扣除优惠明细表");
+		//21.当年和前两个会计年度研发费用总额及占同期销售收入比例的说明:附件补充
+		//22.年度主要产品(服务)发挥核心支持作用的技术属于《国家重点支持的高新技术领域》规定范围的说明:附件补充
+		//23.高新技术产品(服务)及对应收入资料:附件补充
+		//24.研发管理制度:附件补充
+		//25.高新项目技术鉴定资料:附件补充
+		//26.加计扣除项目技术鉴定资料:附件补充
+		//27.其他高新备查资料:附件补充
+		//28.其他加计扣除备查资料:附件补充
 	}
 
 	private boolean generateD1(String year) {
 		try {
-			Path path = Paths.get(archiveDir, SecureUtil.getTenantId(), year, "高新技术企业资格证书");
+			Path path = Paths.get(archiveDir, SecureUtil.getTenantId(), year, "1.高新技术企业资格证书");
 			FileUtil.mkdir(path);
 			SettingEntity one = settingMapper.selectOne(Wrappers.<SettingEntity>lambdaQuery().eq(SettingEntity::getYearAndMonth, year));
 			if (Func.notNull(one) && Func.isNotBlank(one.getHighTechUrl())) {
@@ -295,31 +333,55 @@ public class ArchiveServiceImpl implements IArchiveService {
 			dto.setYearAndMonth(year);
 			dto.setType(type);
 			List<XmFinanceEntity> list = xmFinanceService.selectXmFinanceList(dto);
+			AtomicInteger index = new AtomicInteger(1);
 			for (XmFinanceEntity xm : list) {
 				//创建项目文件夹
-				Path xmmcPath = FileUtil.mkdir(Paths.get(path.toString(), xm.getXmmc()));
-				//项目立项表\附件
-
-				//项目实施表\附件
-				//项目变更表\附件
-				//项目结题表\\附件
-				//委外项目表\\附件
+				Path xmmcPath = FileUtil.mkdir(Paths.get(path.toString(), index.get() + "." + xm.getXmmc()));
+				//1.项目立项
+				Path path1 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "1.项目立项"));
+				FileOutputStream os = new FileOutputStream(path1 + "/" + xm.getXmmc() + "项目立项表.doc");
+				xmService.exportApprovalInfo(os, xm.getXmId());
+				//2.研发预算编制
+				Path path2 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "2.研发预算编制"));
+				//3.项目实施
+				Path path3 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "3.项目实施"));
+				//4.项目变更
+				Path path4 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "4.项目变更"));
+				//5.项目结题
+				Path path5 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "5.项目结题"));
+				//6.项目成果
+				Path path6 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "6.项目成果"));
+				//7.委外项目
+				Path path7 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "7.委外项目"));
 			}
 		} catch (Exception e) {
 			throw new RuntimeException(e);
 		}
-
 		return true;
 	}
 
-	private ZipDir generateD8(String year) {
-		ZipDir dir = new ZipDir("加计扣除研发项目全套技术资料");
-		return dir;
-	}
-
-	private ZipDir generateD9(String year) {
-		ZipDir dir = new ZipDir("高新研发人员与科技人员资料");
-		return dir;
+	private boolean generateD9(String year, Integer type) {
+		//type,2:高科技人员资料,3:加计扣除人员资料
+		String title = type == 2 ? "9.高新科技人员资料" : "10.加计扣除项目科研人员资料";
+		Path path = Paths.get(archiveDir, SecureUtil.getTenantId(), year, title);
+		try {
+			FileUtil.mkdir(path);
+			XmFinanceEntity dto = new XmFinanceEntity();
+			dto.setYearAndMonth(year);
+			dto.setType(type);
+			List<XmFinanceEntity> list = xmFinanceService.selectXmFinanceList(dto);
+			List<Long> xmIdList = list.stream().map(XmFinanceEntity::getXmId).toList();
+			if (Func.isNotEmpty(xmIdList)) {
+				FileOutputStream out = new FileOutputStream(path + "/" + title + ".xlsx");
+				TechnicianDTO param = new TechnicianDTO();
+				param.setYearAndMonth(year);
+				param.setXmIdList(xmIdList);
+				technicianService.exportNdgkjryhzb(out, param);
+			}
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+		return true;
 	}
 
 	private ZipDir generateD10(String year) {
@@ -370,9 +432,9 @@ public class ArchiveServiceImpl implements IArchiveService {
 	}
 
 	private boolean generateD17(String year, Integer type, String title) {
-		//会计口径研发费用附件凭证资料及相关说明
-		//高新研发费用附件凭证资料及相关说明
-		//加计扣除研发费用附件凭证资料及相关说明
+		//17 会计口径研发费用附件凭证资料及相关说明
+		//18 高新研发费用附件凭证资料及相关说明
+		//19 加计扣除研发费用附件凭证资料及相关说明
 		Path path = Paths.get(archiveDir, SecureUtil.getTenantId(), year, title);
 
 		try {
@@ -382,7 +444,6 @@ public class ArchiveServiceImpl implements IArchiveService {
 			dto.setYearAndMonth(year);
 			dto.setType(type);
 			List<XmFinanceEntity> list = xmFinanceService.selectXmFinanceList(dto);
-
 			for (XmFinanceEntity xm : list) {
 				//创建项目文件夹
 				Path xmmcPath = FileUtil.mkdir(Paths.get(path.toString(), xm.getXmmc()));
@@ -400,28 +461,37 @@ public class ArchiveServiceImpl implements IArchiveService {
 				}
 				//2 每月研发人员人工分配表
 				Path path2 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "每月研发人员人工分配表"));
+
 				for (int i = 1; i <= 12; i++) {
 					String yearAndMonth = year + (i < 10 ? "0" + i : i);
 					FileOutputStream fos = new FileOutputStream(path2 + "/" + yearAndMonth + "每月研发人员人工分配表.xlsx");
 					XmTechnicianDto param = new XmTechnicianDto();
 					param.setTenantId(SecureUtil.getTenantId());
 					param.setYearAndMonth(yearAndMonth);
+					param.setXmId(xm.getXmId());
 					technicianService.exportMeiyueyanfarengongfeiyongfeifenpeibiao(fos, param);
 				}
 				//3 研发领料单
 				Path path3 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "研发领料单"));
+				this.generateLinliaodan(year, path3, xm.getXmId(), "材料");
 				//4 研发动力消耗单
 				Path path4 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "研发动力消耗单"));
+				this.generateLinliaodan(year, path4, xm.getXmId(), "动力");
 				//5 研发燃料消耗单
 				Path path5 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "研发燃料消耗单"));
+				this.generateLinliaodan(year, path5, xm.getXmId(), "燃料");
 				//6 研发租赁资产费用分配表
 				Path path6 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "研发租赁资产费用分配表"));
+				this.generateLeaseAsset(year, path6, xm.getXmId());
 				//7 科研仪器设备工时登记表
 				Path path7 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "科研仪器设备工时登记表"));
+				this.generateHoursAsset(year, path7, xm.getXmId());
 				//8 科研仪器设备折旧费用分配表
 				Path path8 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "科研仪器设备折旧费用分配表"));
+				this.generateCostAsset(year, path8, xm.getXmId());
 				//9 科研无形资产摊销费用分配表
 				Path path9 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "科研无形资产摊销费用分配表"));
+				this.generateWxzctxAsset(year, path9, xm.getXmId());
 				//10委外研发
 				Path path10 = FileUtil.mkdir(Paths.get(xmmcPath.toString(), "委外研发"));
 			}
@@ -432,6 +502,96 @@ public class ArchiveServiceImpl implements IArchiveService {
 		return true;
 	}
 
+	@SneakyThrows
+	private void generateWxzctxAsset(String year, Path path, Long xmId) {
+		for (int i = 1; i <= 12; i++) {
+			String yearAndMonth = year + (i < 10 ? "0" + i : i);
+			FileOutputStream os = new FileOutputStream(path + "/" + yearAndMonth + "科研无形资产摊销费用分配表.xlsx");
+			XmAssetQueryParam param = new XmAssetQueryParam();
+			param.setYearAndMonth(yearAndMonth);
+			param.setXmId(xmId);
+			xmIntangibleAssetService.exportKeyanwuxingzichanfenpeibiao(os, param);
+		}
+	}
+
+	@SneakyThrows
+	private void generateCostAsset(String year, Path path, Long xmId) {
+		for (int i = 1; i <= 12; i++) {
+			String yearAndMonth = year + (i < 10 ? "0" + i : i);
+			FileOutputStream os = new FileOutputStream(path + "/" + yearAndMonth + "科研仪器设备折旧费用分配表.xlsx");
+			XmAssetQueryParam param = new XmAssetQueryParam();
+			param.setYearAndMonth(yearAndMonth);
+			param.setXmId(xmId);
+			xmFixedAssetService.exportKeyanyiqishebeizhejiufeiyongfenpeibiao(os, param);
+		}
+	}
+
+	@SneakyThrows
+	private void generateHoursAsset(String year, Path path, Long xmId) {
+		for (int i = 1; i <= 12; i++) {
+			String yearAndMonth = year + (i < 10 ? "0" + i : i);
+			FileOutputStream os = new FileOutputStream(path + "/" + yearAndMonth + "科研仪器设备工时登记表.xlsx");
+			XmAssetHoursDto param = new XmAssetHoursDto();
+			param.setYearAndMonth(yearAndMonth);
+			param.setXmId(xmId);
+			hoursService.exportXmAssetHours(os, param);
+		}
+	}
+
+	@SneakyThrows
+	private void generateLeaseAsset(String year, Path path, Long xmId) {
+		for (int i = 1; i <= 12; i++) {
+			String yearAndMonth = year + (i < 10 ? "0" + i : i);
+			XmLeaseEntity param = new XmLeaseEntity();
+			param.setType("仪器设备");
+			param.setYearAndMonth(yearAndMonth);
+			param.setXmId(xmId);
+			List<JSONObject> leaseList = xmLeaseService.yanfazulinzichanfeiyongfenpeibiao(param);
+			if (Func.isEmpty(leaseList)) {
+				continue;
+			}
+			for (JSONObject o : leaseList) {
+				for (String key : o.keySet()) {
+					String[] arr = key.split(":");
+					String useDate = arr[1];
+					FileOutputStream fos = new FileOutputStream(path + "/" + useDate + "研发租赁资产费用分配表.xlsx");
+					param.setLeaseDate(DateUtil.parse(useDate, DateUtil.PATTERN_DATE));
+					xmLeaseService.exportYanfazulinzichanfeiyongfenpeibiao(fos, param);
+				}
+			}
+		}
+	}
+
+	@SneakyThrows
+	private void generateLinliaodan(String year, Path path, Long xmId, String type) {
+		String fileName = type.equals("材料") ? "研发领料单" : (type.equals("动力") ? "研发动力消耗单" : "研发燃料消耗单") + ".xlsx";
+		for (int i = 1; i <= 12; i++) {
+			String yearAndMonth = year + (i < 10 ? "0" + i : i);
+			XmGoodsDTO param = new XmGoodsDTO();
+			param.setType(type);
+			param.setYearAndMonth(yearAndMonth);
+			param.setXmId(xmId);
+			List<JSONObject> cailiaoList = xmGoodsService.yanfalingliaodan(param);
+			if (Func.isEmpty(cailiaoList)) {
+				continue;
+			}
+			for (JSONObject o : cailiaoList) {
+				for (String key : o.keySet()) {
+					String[] arr = key.split(":");
+
+					String useDate = arr[1];
+					FileOutputStream fos = new FileOutputStream(path + "/" + useDate + fileName);
+					param = new XmGoodsDTO();
+					param.setYearAndMonth(yearAndMonth);
+					param.setType(type);
+					param.setXmId(xmId);
+					param.setUseDate(DateUtil.parse(useDate, DateUtil.PATTERN_DATE));
+					xmGoodsService.exportYanfalingliaodan(fos, param);
+				}
+			}
+		}
+	}
+
 	private boolean generateD20(String year, String title) {
 		//A107012研发费用加计扣除优惠明细表
 		Path path = Paths.get(archiveDir, SecureUtil.getTenantId(), year, title);

+ 2 - 6
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/TechnicianServiceImpl.java

@@ -713,7 +713,7 @@ public class TechnicianServiceImpl extends BaseServiceImpl<TechnicianMapper, Tec
 
 	@SneakyThrows
 	@Override
-	public void exportNdgkjryhzb(HttpServletResponse response, TechnicianDTO dto) {
+	public void exportNdgkjryhzb(OutputStream os, TechnicianDTO dto) {
 		Query query = new Query().setCurrent(1).setSize(Integer.MAX_VALUE);
 		List<TechnicianVO> list = this.niandugaokejirenyuanhuizongbiao(Condition.getPage(query), dto).getRecords();
 
@@ -721,12 +721,8 @@ public class TechnicianServiceImpl extends BaseServiceImpl<TechnicianMapper, Tec
 		list.forEach(temp -> {
 			temp.setXh(i.getAndIncrement());
 		});
-
 		InputStream templateFileName = this.getClass().getClassLoader().getResourceAsStream("export-template/年度高新科技人员汇总表.xls");
-		response.setContentType("application/vnd.ms-excel");
-		response.setCharacterEncoding("utf-8");
-		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("年度高新科技人员汇总表.xls", Charsets.UTF_8));
-		ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+		ExcelWriter excelWriter = EasyExcel.write(os)
 			.withTemplate((templateFileName))
 			.excelType(ExcelTypeEnum.XLS)
 			.build();

+ 3 - 10
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmAssetHoursServiceImpl.java

@@ -8,7 +8,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import jakarta.annotation.Resource;
-import jakarta.servlet.http.HttpServletResponse;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.sky.core.log.exception.ServiceException;
@@ -16,7 +15,6 @@ import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
 import org.sky.core.secure.utils.SecureUtil;
-import org.sky.core.tool.utils.Charsets;
 import org.sky.core.tool.utils.CollectionUtil;
 import org.sky.core.tool.utils.Func;
 import org.sky.core.tool.utils.StringUtil;
@@ -38,7 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.BufferedInputStream;
-import java.net.URLEncoder;
+import java.io.OutputStream;
 import java.time.LocalDate;
 import java.time.YearMonth;
 import java.time.format.DateTimeFormatter;
@@ -254,14 +252,9 @@ public class XmAssetHoursServiceImpl extends BaseServiceImpl<XmAssetHoursMapper,
 	}
 
     @Override
-    public void exportXmAssetHours(HttpServletResponse response, XmAssetHoursDto dto) {
+    public void exportXmAssetHours(OutputStream os, XmAssetHoursDto dto) {
 		try {
-			response.setContentType("application/vnd.ms-excel");
-			response.setCharacterEncoding("utf-8");
-			response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("每月仪器设备工时打卡.xls", Charsets.UTF_8));
-
 			Query query = new Query().setCurrent(1).setSize(Integer.MAX_VALUE);
-
 			List<XmAssetHoursVO> list = this.selectXmAssetHoursPage(dto, Condition.getPage(query)).getRecords();
 			AtomicInteger index = new AtomicInteger(1);
 			for (XmAssetHoursVO vo : list) {
@@ -274,7 +267,7 @@ public class XmAssetHoursServiceImpl extends BaseServiceImpl<XmAssetHoursMapper,
 			List<List<Object>> data = buildData(list, year, month);
 
 			// 导出Excel(包含合并单元格策略)
-			EasyExcel.write(response.getOutputStream())
+			EasyExcel.write(os)
 				.registerWriteHandler(new AssetWorkMergeStrategy(year, month))
 				.registerWriteHandler(new CustomCellStyleHandler())
 				.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())

+ 4 - 5
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmFixedAssetServiceImpl.java

@@ -35,6 +35,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.util.*;
@@ -224,7 +225,7 @@ public class XmFixedAssetServiceImpl extends BaseServiceImpl<XmFixedAssetMapper,
 
 	@SneakyThrows
 	@Override
-	public void exportKeyanyiqishebeizhejiufeiyongfenpeibiao(HttpServletResponse response, XmAssetQueryParam dto) {
+	public void exportKeyanyiqishebeizhejiufeiyongfenpeibiao(OutputStream os, XmAssetQueryParam dto) {
 		List<XmFixedAssetCostVo> list = this.keyanyiqishebeizhejiufeiyongfenpeibiao(Condition.getPage(new Query().setCurrent(1).setSize(Integer.MAX_VALUE)), dto).getRecords();
 		AtomicInteger index = new AtomicInteger(1);
 
@@ -253,10 +254,8 @@ public class XmFixedAssetServiceImpl extends BaseServiceImpl<XmFixedAssetMapper,
 
 		});
 		InputStream templateFileName = this.getClass().getClassLoader().getResourceAsStream("export-template/仪器设备折旧费用分配表.xls");
-		response.setContentType("application/vnd.ms-excel");
-		response.setCharacterEncoding("utf-8");
-		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("仪器设备折旧费用分配表.xls", Charsets.UTF_8));
-		ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+
+		ExcelWriter excelWriter = EasyExcel.write(os)
 			.withTemplate((templateFileName))
 			.excelType(ExcelTypeEnum.XLS)
 			.build();

+ 22 - 13
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmGoodsServiceImpl.java

@@ -29,6 +29,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.util.*;
@@ -172,7 +173,6 @@ public class XmGoodsServiceImpl extends BaseServiceImpl<XmGoodsMapper, XmGoodsEn
 		Map<Long, List<XmGoodsVO>> mapByXmId = list.stream().collect(Collectors.groupingBy(XmGoodsVO::getXmId));
 		for (Long xmId : mapByXmId.keySet()) {
 			List<XmGoodsVO> listByXmId = mapByXmId.get(xmId);
-			Map<Date, List<XmGoodsVO>> mapByDay = listByXmId.stream().collect(Collectors.groupingBy(XmGoodsVO::getUseDate));
 
 			for (XmGoodsVO vo : listByXmId) {
 				String key = xmId + ":" + DateUtil.format(vo.getUseDate(), DateUtil.PATTERN_DATE);
@@ -203,22 +203,27 @@ public class XmGoodsServiceImpl extends BaseServiceImpl<XmGoodsMapper, XmGoodsEn
 
 	@SneakyThrows
 	@Override
-	public void exportYanfalingliaodan(HttpServletResponse response, XmGoodsDTO dto) {
-		this.export(response, dto, "研发领料单.xls");
+	public void exportYanfalingliaodan(OutputStream os, XmGoodsDTO dto) {
+		dto.setType("材料");
+		this.export(os, dto, "研发领料单.xls");
 	}
 
+	@SneakyThrows
 	@Override
-	public void exportYanfadonglihaoyongdan(HttpServletResponse response, XmGoodsDTO dto) {
-		this.export(response, dto, "研发动力消耗单.xls");
+	public void exportYanfadonglihaoyongdan(OutputStream os, XmGoodsDTO dto) {
+		dto.setType("动力");
+		this.export(os, dto, "研发动力消耗单.xls");
 	}
 
+	@SneakyThrows
 	@Override
-	public void exportYanfaranliaohaoyongdan(HttpServletResponse response, XmGoodsDTO dto) {
-		this.export(response, dto, "研发燃料消耗单.xls");
+	public void exportYanfaranliaohaoyongdan(OutputStream os, XmGoodsDTO dto) {
+		dto.setType("燃料");
+		this.export(os, dto, "研发燃料消耗单.xls");
 	}
 
 	@SneakyThrows
-	private void export(HttpServletResponse response, XmGoodsDTO dto, String templateName) {
+	private void export(OutputStream os, XmGoodsDTO dto, String templateName) {
 		if (Func.isBlank(dto.getYearAndMonth())) {
 			throw new ServiceException("参数yearAndMonth不能为空");
 		}
@@ -233,14 +238,18 @@ public class XmGoodsServiceImpl extends BaseServiceImpl<XmGoodsMapper, XmGoodsEn
 			assert excel != null;
 			excel.setXh(index.getAndIncrement() + "");
 			excel.setUseDateStr(Func.notNull(temp.getUseDate()) ? DateUtil.format(temp.getUseDate(), DateUtil.PATTERN_DATE) : null);
-			excel.setAmount(BigDecimal.valueOf(temp.getUseQuantity()).multiply(temp.getUnitPrice()));
+			if(excel.getUseQuantity()==null){
+				excel.setUseQuantity(0);
+			}
+			if(excel.getUnitPrice()==null){
+				excel.setUnitPrice(BigDecimal.ZERO);
+			}
+			excel.setAmount(BigDecimal.valueOf(excel.getUseQuantity()).multiply(excel.getUnitPrice()));
 			results.add(excel);
 		});
 		InputStream templateFileName = this.getClass().getClassLoader().getResourceAsStream("export-template/" + templateName);
-		response.setContentType("application/vnd.ms-excel");
-		response.setCharacterEncoding("utf-8");
-		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(templateName, Charsets.UTF_8));
-		ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+
+		ExcelWriter excelWriter = EasyExcel.write(os)
 			.withTemplate((templateFileName))
 			.excelType(ExcelTypeEnum.XLS)
 			.build();

+ 4 - 5
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmIntangibleAssetServiceImpl.java

@@ -35,6 +35,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.URLEncoder;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -309,7 +310,7 @@ public class XmIntangibleAssetServiceImpl extends BaseServiceImpl<XmIntangibleAs
 
 	@SneakyThrows
 	@Override
-	public void exportKeyanwuxingzichanfenpeibiao(HttpServletResponse response, XmAssetQueryParam dto) {
+	public void exportKeyanwuxingzichanfenpeibiao(OutputStream os, XmAssetQueryParam dto) {
 		List<XmIntangibleAssetCostVo> list = this.keyanwuxingzichantanxiaofeiyongfenpeibiao(Condition.getPage(new Query().setCurrent(1).setSize(Integer.MAX_VALUE)), dto).getRecords();
 		AtomicInteger index = new AtomicInteger(1);
 		List<JSONObject> results = new ArrayList<>();
@@ -335,10 +336,8 @@ public class XmIntangibleAssetServiceImpl extends BaseServiceImpl<XmIntangibleAs
 		});
 
 		InputStream templateFileName = this.getClass().getClassLoader().getResourceAsStream("export-template/无形资产摊销费用分配表.xls");
-		response.setContentType("application/vnd.ms-excel");
-		response.setCharacterEncoding("utf-8");
-		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("无形资产摊销费用分配表.xls", Charsets.UTF_8));
-		ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+
+		ExcelWriter excelWriter = EasyExcel.write(os)
 			.withTemplate((templateFileName))
 			.excelType(ExcelTypeEnum.XLS)
 			.build();

+ 4 - 5
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmLeaseServiceImpl.java

@@ -26,6 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.util.*;
@@ -192,7 +193,7 @@ public class XmLeaseServiceImpl extends BaseServiceImpl<XmLeaseMapper, XmLeaseEn
 
 	@SneakyThrows
 	@Override
-	public void exportYanfazulinzichanfeiyongfenpeibiao(HttpServletResponse response, XmLeaseEntity dto) {
+	public void exportYanfazulinzichanfeiyongfenpeibiao(OutputStream os, XmLeaseEntity dto) {
 		if (Func.isBlank(dto.getYearAndMonth())) {
 			throw new ServiceException("参数yearAndMonth不能为空");
 		}
@@ -208,10 +209,8 @@ public class XmLeaseServiceImpl extends BaseServiceImpl<XmLeaseMapper, XmLeaseEn
 			results.add(excel);
 		});
 		InputStream templateFileName = this.getClass().getClassLoader().getResourceAsStream("export-template/每月租赁资产费用分配表.xls");
-		response.setContentType("application/vnd.ms-excel");
-		response.setCharacterEncoding("utf-8");
-		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("每月租赁资产费用分配表.xls", Charsets.UTF_8));
-		ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+
+		ExcelWriter excelWriter = EasyExcel.write(os)
 			.withTemplate((templateFileName))
 			.excelType(ExcelTypeEnum.XLS)
 			.build();

+ 38 - 8
kd-service/kd-scientific/src/main/java/org/sky/scientific/service/impl/XmServiceImpl.java

@@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import freemarker.template.Template;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
@@ -19,6 +20,7 @@ import org.sky.core.mp.base.BaseServiceImpl;
 import org.sky.core.mp.support.Condition;
 import org.sky.core.mp.support.Query;
 import org.sky.core.secure.utils.SecureUtil;
+import org.sky.core.tool.api.R;
 import org.sky.core.tool.utils.*;
 import org.sky.scientific.e.XmStatusEnum;
 import org.sky.scientific.mapper.DepartmentMapper;
@@ -32,11 +34,14 @@ import org.sky.scientific.pojo.vo.XmSummary;
 import org.sky.scientific.pojo.vo.XmVO;
 import org.sky.scientific.pojo.vo.XmYszbVO;
 import org.sky.scientific.service.IXmService;
+import org.sky.system.feign.ISysClient;
+import org.sky.system.pojo.entity.Tenant;
 import org.springframework.stereotype.Service;
 import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
 
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.OutputStreamWriter;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URLEncoder;
@@ -57,6 +62,7 @@ public class XmServiceImpl extends BaseServiceImpl<XmMapper, XmEntity> implement
 	private final DepartmentMapper departmentMapper;
 	private final XmCostDetailsMapper xmCostDetailsMapper;
 	private final FreeMarkerConfigurer freeMarkerConfigurer;
+	private final ISysClient sysClient;
 
 	@Override
 	public IPage<XmEntity> selectXmList(IPage<XmEntity> page, XmDTO xm) {
@@ -106,18 +112,42 @@ public class XmServiceImpl extends BaseServiceImpl<XmMapper, XmEntity> implement
 	@Override
 	public XmVO selectApprovalInfo(Long xmId) {
 		XmEntity xm = baseMapper.selectById(xmId);
-		xm.setXmfzrxm(technicianMapper.getNameById(xm.getXmfzr()));
-		xm.setXmsqdw(departmentMapper.getFullNameById(xm.getXmsqdwid()));
+		xm.setXmfzrxm(Func.toStr(technicianMapper.getNameById(xm.getXmfzr()),""));
+		xm.setXmsqdw(Func.toStr(departmentMapper.getFullNameById(xm.getXmsqdwid()),""));
 		return BeanUtil.copyProperties(xm, XmVO.class);
 	}
 
+	@SneakyThrows
 	@Override
-	public void printApprovalInfo(HttpServletResponse response, Long xmId) {
-//		Template template = freeMarkerConfigurer.getConfiguration().getTemplate("1-项目立项-立项申请资料.ftl");
-//		response.setHeader("Content-disposition",
-//			"attachment;filename=" + URLEncoder.encode("项目立项-立项申请资料.doc", StandardCharsets.UTF_8));
-//		response.setContentType("application/msword");// 定义输出类型
-//		template.process(techYBVO, new OutputStreamWriter(response.getOutputStream()));
+	public void exportApprovalInfo(OutputStream os, Long xmId) {
+		if(Func.isNull(xmId)){
+			return;
+		}
+		XmVO xmVO = this.selectApprovalInfo(xmId);
+
+		JSONObject obj = new JSONObject();
+		cn.hutool.core.bean.BeanUtil.copyProperties(xmVO, obj);
+		obj.put("kssjStr", DateUtil.format(xmVO.getXmkssj(), "yyyy年MM月dd日"));
+		obj.put("jssjStr", DateUtil.format(xmVO.getXmjssj(), "yyyy年MM月dd日"));
+
+		StringBuilder sb = new StringBuilder();
+		for (JSONObject json : JSON.parseArray(xmVO.getXmyszemx(), JSONObject.class)) {
+			Integer year = json.getInteger("year");
+			String amount = json.getString("amount");
+			sb.append(year).append("年,").append(amount).append("万元");
+			sb.append("\n");
+		}
+		obj.put("xmyszemxStr", sb.toString());
+
+		obj.put("enterpriseName","");
+		R<Tenant> tenant = sysClient.getTenant(SecureUtil.getTenantId());
+		if (tenant.isSuccess()) {
+			obj.put("enterpriseName", tenant.getData().getTenantName());
+ 		}
+
+		Template template = freeMarkerConfigurer.getConfiguration().getTemplate("项目立项表.ftl");
+		// 定义输出类型
+		template.process(obj, new OutputStreamWriter(os));
 	}
 
 	@Override

BIN
kd-service/kd-scientific/src/main/resources/templates/1-项目立项-立项申请资料.doc


File diff suppressed because it is too large
+ 0 - 3
kd-service/kd-scientific/src/main/resources/templates/1-项目立项-立项申请资料.ftl


File diff suppressed because it is too large
+ 0 - 3
kd-service/kd-scientific/src/main/resources/templates/1-项目立项-立项申请资料.xml


BIN
kd-service/kd-scientific/src/main/resources/templates/3-项目实施-阶段性报告.doc


BIN
kd-service/kd-scientific/src/main/resources/templates/项目变更表.doc


File diff suppressed because it is too large
+ 3 - 0
kd-service/kd-scientific/src/main/resources/templates/项目变更表.ftl


File diff suppressed because it is too large
+ 3 - 0
kd-service/kd-scientific/src/main/resources/templates/项目变更表.xml


BIN
kd-service/kd-scientific/src/main/resources/templates/项目实施表.doc


File diff suppressed because it is too large
+ 3 - 0
kd-service/kd-scientific/src/main/resources/templates/项目实施表.ftl


File diff suppressed because it is too large
+ 3 - 0
kd-service/kd-scientific/src/main/resources/templates/项目实施表.xml


BIN
kd-service/kd-scientific/src/main/resources/templates/项目立项表.doc


File diff suppressed because it is too large
+ 3 - 0
kd-service/kd-scientific/src/main/resources/templates/项目立项表.ftl


File diff suppressed because it is too large
+ 3 - 0
kd-service/kd-scientific/src/main/resources/templates/项目立项表.xml


BIN
kd-service/kd-scientific/src/main/resources/templates/项目结题表.doc


File diff suppressed because it is too large
+ 3 - 0
kd-service/kd-scientific/src/main/resources/templates/项目结题表.ftl


File diff suppressed because it is too large
+ 3 - 0
kd-service/kd-scientific/src/main/resources/templates/项目结题表.xml