CostProjectTaskMaterialSummaryController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. package com.hotent.enterpriseDeclare.controller.material;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.hotent.base.annotation.ApiGroup;
  4. import com.hotent.base.constants.ApiGroupConsts;
  5. import com.hotent.base.controller.BaseController;
  6. import com.hotent.base.model.CommonResult;
  7. import com.hotent.base.util.StringUtil;
  8. import com.hotent.project.manager.CostProjectTaskManager;
  9. import com.hotent.project.manager.CostProjectTaskMaterialSummaryDetailManager;
  10. import com.hotent.project.manager.CostProjectTaskMaterialSummaryManager;
  11. import com.hotent.project.model.CostProjectTask;
  12. import com.hotent.project.model.CostProjectTaskMaterialSummary;
  13. import com.hotent.project.model.CostProjectTaskMaterialSummaryDetail;
  14. import com.hotent.project.req.MaterialSummarySortReq;
  15. import io.swagger.annotations.Api;
  16. import io.swagger.annotations.ApiOperation;
  17. import io.swagger.annotations.ApiParam;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import org.springframework.web.bind.annotation.*;
  21. import java.time.LocalDateTime;
  22. import java.util.List;
  23. /**
  24. * 资料归纳主表 前端控制器
  25. *
  26. * @company 山西清众科技股份有限公司
  27. * @author 超级管理员
  28. * @since 2025-01-27
  29. */
  30. @RestController
  31. @RequestMapping("/api/materialSummary/v1")
  32. @Api(tags = "资料归纳主表")
  33. @ApiGroup(group = {ApiGroupConsts.GROUP_COST})
  34. public class CostProjectTaskMaterialSummaryController extends BaseController<CostProjectTaskMaterialSummaryManager, CostProjectTaskMaterialSummary> {
  35. @Autowired
  36. private CostProjectTaskManager costProjectTaskManager;
  37. @Autowired
  38. private CostProjectTaskMaterialSummaryDetailManager costProjectTaskMaterialSummaryDetailManager;
  39. /**
  40. * 根据taskId获取资料归纳列表
  41. * @param taskId 任务ID
  42. * @return 资料归纳列表(包含明细)
  43. */
  44. @GetMapping(value = "/listByTaskId")
  45. @ApiOperation(value = "根据taskId获取资料归纳列表", httpMethod = "GET", notes = "根据taskId获取资料归纳列表(包含明细)")
  46. @Transactional
  47. public CommonResult<List<CostProjectTaskMaterialSummary>> listByTaskId(
  48. @ApiParam(name = "taskId", value = "任务ID", required = true)
  49. @RequestParam(required = true) String taskId) {
  50. List<CostProjectTaskMaterialSummary> summaryList = baseService.listByTaskId(taskId);
  51. // 如果为空,自动生成13个基础资料类别
  52. if (summaryList == null || summaryList.isEmpty()) {
  53. // 获取任务信息
  54. com.hotent.project.model.CostProjectTask mainTask = costProjectTaskManager.getById(taskId);
  55. if (mainTask != null) {
  56. // 查询子任务列表
  57. List<CostProjectTask> childTasks = costProjectTaskManager.list(
  58. new LambdaQueryWrapper<CostProjectTask>().eq(CostProjectTask::getPid, taskId)
  59. );
  60. // 同步生成资料归纳
  61. asyncMaterialSummaryService.generateMaterialSummary(mainTask, childTasks);
  62. asyncMaterialSummaryService.calculatePageCountAsync(mainTask.getId());
  63. // 重新查询
  64. summaryList = baseService.listByTaskId(taskId);
  65. }
  66. }
  67. return CommonResult.<List<CostProjectTaskMaterialSummary>>ok().value(summaryList);
  68. }
  69. @GetMapping(value = "/DetailistlByMasterId")
  70. @ApiOperation(value = "根据taskId获取资料归纳列表", httpMethod = "GET", notes = "根据taskId获取资料归纳列表(包含明细)")
  71. @Transactional
  72. public CommonResult<List<CostProjectTaskMaterialSummaryDetail>> listByMasetId(
  73. @ApiParam(name = "masterId", value = "主文件夹ID", required = true)
  74. @RequestParam(required = true) String masterId) {
  75. List<CostProjectTaskMaterialSummaryDetail> list = costProjectTaskMaterialSummaryDetailManager.list(
  76. new LambdaQueryWrapper<CostProjectTaskMaterialSummaryDetail>()
  77. .eq(CostProjectTaskMaterialSummaryDetail::getMasterId, masterId)
  78. );
  79. return CommonResult.<List<CostProjectTaskMaterialSummaryDetail>>ok().value(list);
  80. }
  81. /**
  82. * 根据id获取资料归纳详情
  83. * @param id 主表ID
  84. * @return 资料归纳详情(包含明细)
  85. */
  86. @GetMapping(value = "/getDetail")
  87. @ApiOperation(value = "根据id获取资料归纳详情", httpMethod = "GET", notes = "根据id获取资料归纳详情(包含明细)")
  88. public CommonResult<CostProjectTaskMaterialSummary> getDetail(
  89. @ApiParam(name = "id", value = "主表ID", required = true)
  90. @RequestParam(required = true) String id) {
  91. return CommonResult.<CostProjectTaskMaterialSummary>ok().value(baseService.getDetail(id));
  92. }
  93. /**
  94. * 新增、更新资料归纳主表
  95. * @param summary 资料归纳主表
  96. * @return
  97. */
  98. @PostMapping(value = "/save")
  99. @ApiOperation(value = "新增、更新资料归纳主表", httpMethod = "POST", notes = "新增、更新资料归纳主表")
  100. @Transactional
  101. public CommonResult<String> save(
  102. @ApiParam(name = "summary", value = "资料归纳主表", required = true)
  103. @RequestBody CostProjectTaskMaterialSummary summary) {
  104. String msg = StringUtil.isEmpty(summary.getId()) ? "添加资料归纳成功" : "更新资料归纳成功";
  105. baseService.createOrUpdate(summary);
  106. return CommonResult.<String>ok().message(msg);
  107. }
  108. /**
  109. * 新增、更新资料归纳子表
  110. * @return
  111. */
  112. @PostMapping(value = "/saveDetail")
  113. @ApiOperation(value = "新增、更新资料归纳子表", httpMethod = "POST", notes = "新增、更新资料归纳主表")
  114. @Transactional
  115. public CommonResult<String> saveDetail(
  116. @ApiParam(name = "summary", value = "资料归纳主表", required = true)
  117. @RequestBody CostProjectTaskMaterialSummaryDetail detail) {
  118. if (detail.getMasterId()==null){
  119. return CommonResult.<String>error().message("请选择资料归纳");
  120. }
  121. CostProjectTaskMaterialSummary summary = baseService.getById(detail.getMasterId());
  122. if (summary==null){
  123. return CommonResult.<String>error().message("请选择资料归纳");
  124. }
  125. detail.setTaskId(summary.getTaskId());
  126. // 如果有附件URL,自动解析文件页数
  127. if (StringUtil.isNotEmpty(detail.getAttachmentUrl())) {
  128. try {
  129. int pageCount = asyncMaterialSummaryService.calculateFilePageCount(detail.getAttachmentUrl());
  130. detail.setPageCount(pageCount);
  131. } catch (Exception e) {
  132. System.err.println("解析文件页数失败:" + e.getMessage());
  133. }
  134. }
  135. String msg = StringUtil.isEmpty(detail.getId()) ? "添加资料归纳成功" : "更新资料归纳成功";
  136. if (detail.getId()==null){
  137. detail.setCreateTime(LocalDateTime.now());
  138. }
  139. detail.setUpdateTime(LocalDateTime.now());
  140. costProjectTaskMaterialSummaryDetailManager.createOrUpdate(detail);
  141. // 保存明细后,更新主表的总页数
  142. try {
  143. asyncMaterialSummaryService.updateMasterTotalPageCount(detail.getMasterId());
  144. } catch (Exception e) {
  145. System.err.println("更新主表总页数失败:" + e.getMessage());
  146. // 更新失败不影响返回结果
  147. }
  148. return CommonResult.<String>ok().message(msg);
  149. }
  150. /**
  151. * 删除资料归纳明细
  152. * @param id 明细ID
  153. * @return
  154. */
  155. @DeleteMapping(value = "/deleteDetail")
  156. @ApiOperation(value = "删除资料归纳明细", httpMethod = "DELETE", notes = "删除资料归纳明细并同步更新主表总页数")
  157. @Transactional
  158. public CommonResult<String> deleteDetail(
  159. @ApiParam(name = "id", value = "明细ID", required = true)
  160. @RequestParam(required = true) String id) {
  161. // 先查询明细信息,获取主表ID
  162. CostProjectTaskMaterialSummaryDetail detail = costProjectTaskMaterialSummaryDetailManager.getById(id);
  163. if (detail == null) {
  164. return CommonResult.<String>error().message("资料归纳明细不存在");
  165. }
  166. String masterId = detail.getMasterId();
  167. // 删除明细(物理删除)
  168. costProjectTaskMaterialSummaryDetailManager.deleteById(id);
  169. // 删除后,更新主表的总页数
  170. try {
  171. if (StringUtil.isNotEmpty(masterId)) {
  172. asyncMaterialSummaryService.updateMasterTotalPageCount(masterId);
  173. }
  174. } catch (Exception e) {
  175. System.err.println("更新主表总页数失败:" + e.getMessage());
  176. // 更新失败不影响删除结果
  177. }
  178. return CommonResult.<String>ok().message("删除资料归纳明细成功");
  179. }
  180. /**
  181. * 批量保存资料归纳(主表+明细)
  182. * @param summary 资料归纳主表(包含detailList)
  183. * @return
  184. */
  185. @PostMapping(value = "/saveWithDetails")
  186. @ApiOperation(value = "批量保存资料归纳(主表+明细)", httpMethod = "POST", notes = "批量保存资料归纳(主表+明细)")
  187. @Transactional
  188. public CommonResult<String> saveWithDetails(
  189. @ApiParam(name = "summary", value = "资料归纳主表(包含detailList)", required = true)
  190. @RequestBody CostProjectTaskMaterialSummary summary) {
  191. String msg = StringUtil.isEmpty(summary.getId()) ? "保存资料归纳成功" : "更新资料归纳成功";
  192. baseService.saveWithDetails(summary);
  193. return CommonResult.<String>ok().message(msg);
  194. }
  195. /**
  196. * 删除资料归纳(级联删除明细)
  197. * @param id 主表ID
  198. * @return
  199. */
  200. @DeleteMapping(value = "/delete")
  201. @ApiOperation(value = "删除资料归纳", httpMethod = "DELETE", notes = "删除资料归纳(级联删除明细)")
  202. @Transactional
  203. public CommonResult<String> delete(
  204. @ApiParam(name = "id", value = "主表ID", required = true)
  205. @RequestParam(required = true) String id) {
  206. baseService.deleteById(id);
  207. return CommonResult.<String>ok().message("删除资料归纳成功");
  208. }
  209. /**
  210. * 资料排序
  211. * @param req 排序请求
  212. * @return
  213. */
  214. @PostMapping(value = "/sort")
  215. @ApiOperation(value = "资料排序", httpMethod = "POST", notes = "资料排序(上移/下移)")
  216. @Transactional
  217. public CommonResult<String> sort(
  218. @ApiParam(name = "req", value = "排序请求", required = true)
  219. @RequestBody MaterialSummarySortReq req) {
  220. if (StringUtil.isEmpty(req.getId()) || StringUtil.isEmpty(req.getDirection())) {
  221. return CommonResult.<String>error().message("ID和排序方向不能为空");
  222. }
  223. baseService.sort(req.getId(), req.getDirection());
  224. return CommonResult.<String>ok().message("排序成功");
  225. }
  226. @Autowired
  227. private com.hotent.project.service.AsyncMaterialSummaryService asyncMaterialSummaryService;
  228. /**
  229. * 档案校对通过,触发异步生成Word卷宗
  230. * @param taskId 任务ID
  231. * @return
  232. */
  233. @PostMapping(value = "/approveArchive")
  234. @ApiOperation(value = "档案校对通过", httpMethod = "POST", notes = "档案校对通过后,异步生成Word卷宗")
  235. public CommonResult<String> approveArchive(
  236. @ApiParam(name = "taskId", value = "任务ID", required = true)
  237. @RequestParam(required = true) String taskId) {
  238. // 校验任务是否存在资料归纳数据
  239. List<CostProjectTaskMaterialSummary> summaryList = baseService.listByTaskId(taskId);
  240. if (summaryList == null || summaryList.isEmpty()) {
  241. return CommonResult.<String>error().message("该任务没有资料归纳数据,无法校对");
  242. }
  243. // 校验所有资料是否都已上传附件
  244. boolean allHasAttachment = true;
  245. for (CostProjectTaskMaterialSummary summary : summaryList) {
  246. if (summary.getDetailList() != null) {
  247. for (com.hotent.project.model.CostProjectTaskMaterialSummaryDetail detail : summary.getDetailList()) {
  248. if (StringUtil.isEmpty(detail.getAttachmentUrl())) {
  249. allHasAttachment = false;
  250. break;
  251. }
  252. }
  253. }
  254. if (!allHasAttachment) {
  255. break;
  256. }
  257. }
  258. if (!allHasAttachment) {
  259. return CommonResult.<String>error().message("部分资料未上传附件,请完善后再进行校对");
  260. }
  261. // 异步生成Word卷宗
  262. asyncMaterialSummaryService.generateWordArchiveAsync(taskId);
  263. return CommonResult.<String>ok().message("档案校对通过,正在后台生成Word卷宗,请稍后查看");
  264. }
  265. /**
  266. * 查询Word卷宗生成状态
  267. * @param taskId 任务ID
  268. * @return
  269. */
  270. @GetMapping(value = "/getArchiveStatus")
  271. @ApiOperation(value = "查询Word卷宗生成状态", httpMethod = "GET", notes = "查询Word卷宗生成状态")
  272. public CommonResult<String> getArchiveStatus(
  273. @ApiParam(name = "taskId", value = "任务ID", required = true)
  274. @RequestParam(required = true) String taskId) {
  275. // TODO: 实现查询卷宗生成状态的逻辑
  276. // 可以在数据库中添加一个状态字段来记录生成进度
  277. return CommonResult.<String>ok().value("生成中").message("查询成功");
  278. }
  279. }