CostProjectApprovalManagerImpl.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. package com.hotent.project.manager.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.baomidou.mybatisplus.core.metadata.IPage;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.hotent.base.exception.BaseException;
  9. import com.hotent.base.query.PageList;
  10. import com.hotent.base.util.StringUtil;
  11. import com.hotent.baseInfo.manager.*;
  12. import com.hotent.baseInfo.model.*;
  13. import com.hotent.constant.BaseConstant;
  14. import com.hotent.constant.NodeConstant;
  15. import com.hotent.constant.TaskStatusConstant;
  16. import com.hotent.enterpriseDeclare.req.CostAuditTaskPageReq;
  17. import com.hotent.project.manager.*;
  18. import com.hotent.project.model.*;
  19. import com.hotent.project.dao.CostProjectApprovalDao;
  20. import com.hotent.base.manager.impl.BaseManagerImpl;
  21. import com.hotent.project.req.CostProjectApprovalPageReq;
  22. import com.hotent.project.req.CostProjectApprovalPublishReq;
  23. import com.hotent.project.resp.CostAnnualPlanDetailResp;
  24. import com.hotent.project.resp.CostProjectApprovalDetailResp;
  25. import com.hotent.surveyinfo.manager.*;
  26. import com.hotent.surveyinfo.model.*;
  27. import com.hotent.uc.api.model.IUser;
  28. import com.hotent.uc.manager.OrgManager;
  29. import com.hotent.uc.manager.UserManager;
  30. import com.hotent.uc.model.User;
  31. import com.hotent.uc.util.ContextUtil;
  32. import com.hotent.util.AreaCodeUtil;
  33. import com.hotent.util.CopyUtil;
  34. import dm.jdbc.convert.J2DB;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.stereotype.Service;
  37. import org.springframework.transaction.annotation.Transactional;
  38. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  39. import java.time.LocalDateTime;
  40. import java.util.ArrayList;
  41. import java.util.Arrays;
  42. import java.util.List;
  43. import java.util.Map;
  44. import java.util.stream.Collectors;
  45. import javax.annotation.Resource;
  46. import com.hotent.base.util.BeanUtils;
  47. /**
  48. * 成本监审立项主表 服务实现类
  49. *
  50. * @author 超级管理员
  51. * @company 山西清众科技股份有限公司
  52. * @since 2025-09-22
  53. */
  54. @Service
  55. public class CostProjectApprovalManagerImpl extends BaseManagerImpl<CostProjectApprovalDao, CostProjectApproval> implements CostProjectApprovalManager {
  56. @Autowired
  57. private OrgManager orgManager;
  58. @Autowired
  59. private AuditedUnitManager auditedUnitManager;
  60. @Autowired
  61. private CostNoticeManager costNoticeManager;
  62. @Autowired
  63. private CostProjectTaskManager costProjectTaskManager;
  64. @Autowired
  65. private CostProjectTaskApprovalManager costProjectTaskApprovalManager;
  66. @Autowired
  67. private CostProjectTaskDocumentManager costProjectTaskDocumentManager;
  68. @Autowired
  69. private CostProjectMaterialManager costProjectMaterialManager;
  70. @Autowired
  71. private CostProjectTaskMaterialManager costProjectTaskMaterialManager;
  72. @Autowired
  73. private CostProjectDocumentManager costProjectDocumentManager;
  74. @Autowired
  75. private CostProjectProccessManager costProjectProccessManager;
  76. @Autowired
  77. private CostProjectTaskProccessManager costProjectTaskProccessManager;
  78. @Autowired
  79. private CostProjectTaskNodeManager costProjectTaskNodeManager;
  80. @Autowired
  81. private CostProjectProccessNodeManager costProjectProccessNodeManager;
  82. @Autowired
  83. private CostProjectTaskPersonnelManager costProjectTaskPersonnelManager;
  84. @Autowired
  85. private CostProjectProccessPersonnelManager costProjectProccessPersonnelManager;
  86. @Autowired
  87. private CostCatalogManager costCatalogManager;
  88. @Autowired
  89. private CostCatalogUnitManager costCatalogUnitManager;
  90. @Autowired
  91. private CostCatalogInformationManager costCatalogInformationManager;
  92. @Autowired
  93. private CostProjectScenarioManager costProjectScenarioManager;
  94. @Autowired
  95. private CostProjectSurveyManager costProjectSurveyManager;
  96. @Autowired
  97. private CostSurveyFdTemplateManager costSurveyFdTemplateManager;
  98. @Autowired
  99. private CostSurveyFdTemplateHeadersManager costSurveyFdTemplateHeadersManager;
  100. @Autowired
  101. private CostSurveyFdTemplateItemsManager costSurveyFdTemplateItemsManager;
  102. @Autowired
  103. private CostSurveyTemplateManager costSurveyTemplateManager;
  104. @Autowired
  105. private CostSurveyTemplateHeadersManager costSurveyTemplateHeadersManager;
  106. @Autowired
  107. private CostSurveyTemplateItemsManager costSurveyTemplateItemsManager;
  108. @Autowired
  109. private CostDistrictManager costDistrictManager;
  110. /**
  111. * cost_survey_fd_project_data
  112. * cost_survey_fd_project_headers
  113. * cost_survey_fd_project_template
  114. * cost_survey_project_data
  115. * cost_survey_project_headers
  116. * cost_survey_project_template
  117. * cost_verify_project_data
  118. * cost_verify_project_headers
  119. * cost_verify_project_template
  120. * @param id
  121. * @return
  122. */
  123. @Autowired
  124. private CostSurveyFdProjectDataManager costSurveyFdProjectDataManager;
  125. @Autowired
  126. private CostSurveyFdProjectHeadersManager costSurveyFdProjectHeadersManager;
  127. @Autowired
  128. private CostSurveyFdProjectTemplateManager costSurveyFdProjectTemplateManager;
  129. @Autowired
  130. private CostSurveyProjectDataManager costSurveyProjectDataManager;
  131. @Autowired
  132. private CostSurveyProjectHeadersManager costSurveyProjectHeadersManager;
  133. @Autowired
  134. private CostSurveyProjectTemplateManager costSurveyProjectTemplateManager;
  135. @Autowired
  136. private CostVerifyProjectDataManager costVerifyProjectDataManager;
  137. @Autowired
  138. private CostVerifyProjectHeadersManager costVerifyProjectHeadersManager;
  139. @Autowired
  140. private CostVerifyProjectTemplateManager costVerifyProjectTemplateManager;
  141. @Autowired
  142. private UserManager userManager;
  143. @Autowired
  144. UserManager userService;
  145. @Override
  146. public CostProjectApprovalDetailResp getDetail(String id) {
  147. CostProjectApproval costProjectApproval = this.get(id);
  148. CostProjectApprovalDetailResp detailResp = CopyUtil.copy(costProjectApproval, CostProjectApprovalDetailResp.class);
  149. //单位级别:0:省/自治区/直辖市 1:市级 2:县级
  150. if (ObjectUtil.isNotEmpty(costProjectApproval.getAreaCode()) && ObjectUtil.isNotEmpty(costProjectApproval.getAreaLevel())) {
  151. //如果是区县级
  152. if (BaseConstant.REGION_LEVEL_COUNTY.equals(costProjectApproval.getAreaLevel())) {
  153. String cityCode = AreaCodeUtil.getCityCode(costProjectApproval.getAreaCode());
  154. String provinceCode = AreaCodeUtil.getProvinceCode(cityCode);
  155. detailResp.setCity(cityCode);
  156. detailResp.setProvince(provinceCode);
  157. detailResp.setCounty(costProjectApproval.getAreaCode());
  158. } else if (BaseConstant.REGION_LEVEL_CITY.equals(costProjectApproval.getAreaLevel())) {
  159. String provinceCode = AreaCodeUtil.getProvinceCode(costProjectApproval.getAreaCode());
  160. detailResp.setProvince(provinceCode);
  161. detailResp.setCity(costProjectApproval.getAreaCode());
  162. } else if (BaseConstant.REGION_LEVEL_PROVINCE.equals(costProjectApproval.getAreaLevel())) {
  163. detailResp.setProvince(costProjectApproval.getAreaCode());
  164. } else {
  165. detailResp.setProvince("未知编码");
  166. }
  167. }
  168. if (ObjectUtil.isNotEmpty(costProjectApproval.getAuditedUnitId())) {
  169. String[] split = costProjectApproval.getAuditedUnitId().split(",");
  170. List<AuditedUnit> auditedUnits = auditedUnitManager.listByIds(Arrays.asList(split));
  171. detailResp.setAuditUnitName(auditedUnits.stream().map(AuditedUnit::getUnitName).collect(Collectors.joining(",")));
  172. }
  173. if (ObjectUtil.isNotEmpty(costProjectApproval.getOrgId())) {
  174. detailResp.setOrgName(orgManager.get(costProjectApproval.getOrgId()).getName());
  175. }
  176. // 反查负责人名称
  177. if (ObjectUtil.isNotEmpty(costProjectApproval.getLeaderId())) {
  178. try {
  179. com.hotent.uc.model.User user = userManager.get(costProjectApproval.getLeaderId());
  180. if (ObjectUtil.isNotEmpty(user)) {
  181. detailResp.setLeaderName(user.getFullname());
  182. }
  183. } catch (Exception e) {
  184. // 记录异常但不影响主流程
  185. }
  186. }
  187. // 反查项目组成员名称
  188. if (ObjectUtil.isNotEmpty(costProjectApproval.getProjectMembers())) {
  189. try {
  190. String[] memberIds = costProjectApproval.getProjectMembers().split(",");
  191. if (memberIds.length > 0) {
  192. StringBuilder memberNames = new StringBuilder();
  193. for (int i = 0; i < memberIds.length; i++) {
  194. String memberId = memberIds[i].trim();
  195. if (StringUtil.isNotEmpty(memberId)) {
  196. com.hotent.uc.model.User user = userManager.get(memberId);
  197. if (ObjectUtil.isNotEmpty(user)) {
  198. if (i > 0) {
  199. memberNames.append(",");
  200. }
  201. memberNames.append(user.getFullname());
  202. }
  203. }
  204. }
  205. detailResp.setProjectMembersName(memberNames.toString());
  206. }
  207. } catch (Exception e) {
  208. // 记录异常但不影响主流程
  209. }
  210. }
  211. CostProjectTaskProccess taskProccess = costProjectTaskProccessManager.getOne(
  212. new QueryWrapper<CostProjectTaskProccess>().eq("project_id", costProjectApproval.getProjectId())
  213. );
  214. if (taskProccess !=null ) {
  215. detailResp.setPlannedAuditStartDate(taskProccess.getPlannedAuditStartDate());
  216. detailResp.setPlannedAuditEndDate(taskProccess.getPlannedAuditEndDate());
  217. }
  218. return detailResp;
  219. }
  220. @Override
  221. @Transactional
  222. public void createOrUpdate(CostProjectApproval costProjectApproval) {
  223. //新建或更新
  224. this.saveOrUpdate(costProjectApproval);
  225. }
  226. //新增
  227. @Override
  228. public boolean save(CostProjectApproval costProjectApproval) {
  229. costProjectApproval.setIsDeleted(BaseConstant.NORMAL_STATUS);
  230. costProjectApproval.setCreateBy(ContextUtil.getCurrentUser().getAccount());
  231. costProjectApproval.setCreateTime(LocalDateTime.now());
  232. costProjectApproval.setAreaLevel(AreaCodeUtil.getAreaLevel(costProjectApproval.getAreaCode()).getLevel().getDescription());
  233. CostCatalog costCatalog = costCatalogManager.get(costProjectApproval.getCatalogId());
  234. if (costCatalog == null) {
  235. throw new BaseException("请选择成本目录");
  236. }
  237. super.save(costProjectApproval);
  238. //报送资料
  239. List<CostCatalogUnit> catalogUnitList = costCatalogUnitManager.getListByCatalogId(costProjectApproval.getCatalogId());
  240. List<CostProjectMaterial> materialList = CopyUtil.copyList(catalogUnitList, CostProjectMaterial.class);
  241. materialList.forEach(material -> {
  242. material.setId(null);
  243. material.setProjectId(costProjectApproval.getProjectId());
  244. });
  245. this.costProjectMaterialManager.saveBatch(materialList);
  246. return true;
  247. }
  248. //修改
  249. @Override
  250. @Transactional
  251. public boolean updateById(CostProjectApproval costProjectApproval) {
  252. if (StringUtil.isEmpty(costProjectApproval.getProjectId())) {
  253. throw new BaseException("请选择要修改的记录");
  254. }
  255. costProjectApproval.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
  256. costProjectApproval.setUpdateTime(LocalDateTime.now());
  257. costProjectApproval.setAreaLevel(AreaCodeUtil.getAreaLevel(costProjectApproval.getAreaCode()).getLevel().getDescription());
  258. return super.updateById(costProjectApproval);
  259. }
  260. @Override
  261. public PageList<CostProjectApproval> pageList(CostProjectApprovalPageReq req) throws Exception {
  262. /*LambdaQueryWrapper<CostProjectApproval> qw = new LambdaQueryWrapper<>();
  263. qw.eq(CostProjectApproval::getIsDeleted, BaseConstant.NORMAL_STATUS);
  264. if (StringUtil.isNotEmpty(req.getProjectName())) {
  265. qw.like(CostProjectApproval::getProjectName, req.getProjectName());
  266. }
  267. if (StringUtil.isNotEmpty(req.getProjectYear())) {
  268. qw.eq(CostProjectApproval::getProjectYear, req.getProjectYear());
  269. }
  270. if (StringUtil.isNotEmpty(req.getAreaCode())) {
  271. qw.eq(CostProjectApproval::getAreaCode, req.getAreaCode());
  272. }
  273. IPage<CostProjectApproval> page = new Page<>(req.getPageNum(), req.getPageSize());
  274. return this.page(page, qw);*/
  275. IUser iUser = ContextUtil.getCurrentUser();
  276. User user = userService.getByAccount(iUser.getAccount());
  277. req.setDataScope(user.getDataScope());
  278. req.setProvinceCode(user.getProvinceCode());
  279. req.setCityCode(user.getCityCode());
  280. req.setCountyCode(user.getCountyCode());
  281. Page<CostProjectApproval> objectPage = new Page<>(req.getPage(),req.getPageSize());
  282. //Page<CostSurveyTemplate> page =baseMapper.getCostSurveyTemplatePage(objectPage,params);
  283. Page<CostProjectApproval> page =baseMapper.getCostProjectApprovalPage(objectPage
  284. ,req.getDataScope()
  285. ,req.getProvinceCode(),req.getCityCode()
  286. ,req.getCountyCode()
  287. ,req.getProjectYear()
  288. ,req.getAreaCode()
  289. ,req.getProjectName());
  290. return new PageList<>(page);
  291. }
  292. @Override
  293. @Transactional(rollbackFor = Exception.class)
  294. public void publish(CostProjectApprovalPublishReq req) {
  295. CostProjectApproval costProjectApproval = this.get(req.getProjectId());
  296. if (costProjectApproval == null) {
  297. throw new BaseException("项目不存在");
  298. }
  299. if ("2".equals(costProjectApproval.getStatus())) {
  300. throw new BaseException("项目已发布");
  301. }
  302. if (ObjectUtil.isNotEmpty(req.getSendType())) {
  303. if (req.getSendType().contains(",")) {
  304. //站内通知
  305. this.costNoticeManager.sendNotice(req.getProjectId(),null, "1", costProjectApproval.getProjectName(), req.getContent(), costProjectApproval.getAuditedUnitId().split(",")[0],"","");
  306. //短信发送
  307. } else if (req.getSendType().equals("1")) {
  308. //站内通知
  309. this.costNoticeManager.sendNotice(req.getProjectId(),null, "1", costProjectApproval.getProjectName(), req.getContent(),costProjectApproval.getAuditedUnitId().split(",")[0],"","");
  310. } else if (req.getSendType().equals("2")) {
  311. //短信发送
  312. } else {
  313. throw new BaseException("请选择正确的发送方式");
  314. }
  315. }
  316. LambdaUpdateWrapper<CostProjectApproval> updateWrapper = new LambdaUpdateWrapper<>();
  317. updateWrapper.set(CostProjectApproval::getStatus, "2");
  318. updateWrapper.set(CostProjectApproval::getAuditGroup, req.getAuditGroup());
  319. updateWrapper.set(CostProjectApproval::getSendType, req.getSendType());
  320. updateWrapper.eq(CostProjectApproval::getProjectId, req.getProjectId());
  321. this.update(updateWrapper);
  322. //任务创建
  323. CostProjectTask costProjectTask = new CostProjectTask();
  324. costProjectTask.setProjectId(costProjectApproval.getProjectId());
  325. costProjectTask.setProjectName(costProjectApproval.getProjectName());
  326. costProjectTask.setAuditedUnitId(costProjectApproval.getAuditedUnitId());
  327. costProjectTask.setAuditPeriod(costProjectApproval.getAuditPeriod());
  328. costProjectTask.setSourceType(costProjectApproval.getSourceType());
  329. costProjectTask.setAuditType(costProjectApproval.getAuditType());
  330. costProjectTask.setCurrentNode(NodeConstant.tjcl.getNodeKey());
  331. costProjectTask.setStatus(TaskStatusConstant.WAIT_SUBMIT.getStatusCode());
  332. costProjectTask.setOrderNum(1);
  333. costProjectTask.setIsDeleted(BaseConstant.NORMAL_STATUS);
  334. costProjectTask.setYear(costProjectApproval.getProjectYear());
  335. costProjectTask.setPid("0");
  336. this.costProjectTaskManager.save(costProjectTask);
  337. //文书集合
  338. List<CostProjectDocument> documentList = this.costProjectDocumentManager.getListByProjectId(costProjectApproval.getProjectId());
  339. //资料集合
  340. List<CostProjectMaterial> materialList = this.costProjectMaterialManager.getListByProjectId(costProjectApproval.getProjectId());
  341. //流程对象
  342. CostProjectProccess projectProccess = costProjectProccessManager.getProcessByProjectId(costProjectApproval.getProjectId());
  343. //节点集合
  344. List<CostProjectProccessNode> proccessNodeList = costProjectProccessNodeManager.getListByProcessId(projectProccess.getProcessId());
  345. //政策文件、监审对象提交资料清单、成本调查表
  346. //监审目录id
  347. String catalogId = costProjectApproval.getCatalogId();
  348. //TODO 根据监审目录id查询关联的成本调查表、财务表
  349. //财务表
  350. List<CostSurveyFdTemplate> costSurveyFdTemplates = costSurveyFdTemplateManager.listByCatalogId(catalogId);
  351. if (ObjectUtil.isNotEmpty(costSurveyFdTemplates)) {
  352. if (costSurveyFdTemplates.size() == 1) {
  353. CostSurveyFdTemplate costSurveyFdTemplate = costSurveyFdTemplates.get(0);
  354. List<CostSurveyFdTemplateHeaders> costSurveyFdTemplateHeaders = this.costSurveyFdTemplateHeadersManager.listBySurveyTemplateId(costSurveyFdTemplate.getSurveyTemplateId());
  355. List<CostSurveyFdTemplateItems> costSurveyFdTemplateItems = this.costSurveyFdTemplateItemsManager.selectBySurveyTemplateId(costSurveyFdTemplate.getSurveyTemplateId());
  356. } else {
  357. throw new BaseException("财务表关系为一对一");
  358. }
  359. }
  360. //成本表
  361. List<CostSurveyTemplate> costSurveyTemplates = costSurveyTemplateManager.listByCatalogId(catalogId);
  362. if (ObjectUtil.isNotEmpty(costSurveyTemplates)) {
  363. List<String> surveyTemplateIdList = costSurveyTemplates.stream().map(CostSurveyTemplate::getSurveyTemplateId).collect(Collectors.toList());
  364. LambdaQueryWrapper<CostSurveyTemplateHeaders> queryWrapper = new LambdaQueryWrapper<>();
  365. queryWrapper.in(CostSurveyTemplateHeaders::getSurveyTemplateId, surveyTemplateIdList);
  366. List<CostSurveyTemplateHeaders> headersList = this.costSurveyTemplateHeadersManager.list(queryWrapper);
  367. LambdaQueryWrapper<CostSurveyTemplateItems> queryWrapper1 = new LambdaQueryWrapper<>();
  368. queryWrapper1.in(CostSurveyTemplateItems::getSurveyTemplateId, surveyTemplateIdList);
  369. List<CostSurveyTemplateItems> itemsList = this.costSurveyTemplateItemsManager.list(queryWrapper1);
  370. }
  371. //核定表
  372. List<CostProjectTask> childList = new ArrayList<>();
  373. StringBuilder auditUnitName = new StringBuilder();
  374. // 统一处理 auditedUnitId,无论单个还是多个
  375. String[] unitIdList = costProjectTask.getAuditedUnitId().split(",");
  376. int orderNum = 1;
  377. for (String unitId : unitIdList) {
  378. // 创建子任务
  379. CostProjectTask childTask = new CostProjectTask();
  380. childTask.setProjectId(costProjectApproval.getProjectId());
  381. childTask.setProjectName(costProjectApproval.getProjectName() + "-子任务");
  382. childTask.setAuditedUnitId(unitId);
  383. childTask.setAuditedUnitName(auditedUnitManager.get(unitId).getUnitName());
  384. childTask.setCurrentNode(NodeConstant.tjcl.getNodeKey());
  385. childTask.setStatus(TaskStatusConstant.WAIT_SUBMIT.getStatusCode());
  386. childTask.setOrderNum(orderNum++);
  387. childTask.setPid(costProjectTask.getId());
  388. childTask.setIsDeleted(BaseConstant.NORMAL_STATUS);
  389. childTask.setYear(costProjectApproval.getProjectYear());
  390. childList.add(childTask);
  391. auditUnitName.append(childTask.getAuditedUnitName()).append(",");
  392. }
  393. // 保存所有子任务
  394. this.costProjectTaskManager.saveBatch(childList);
  395. // 设置父任务的审计单位名称
  396. if (auditUnitName.length() > 0) {
  397. costProjectTask.setAuditedUnitName(
  398. auditUnitName.substring(0, auditUnitName.length() - 1)
  399. );
  400. }
  401. // 在子任务保存后创建关联数据
  402. List<CostProjectTaskDocument> taskDocumentList = new ArrayList<>();
  403. List<CostProjectTaskApproval> taskApprovals = new ArrayList<>();
  404. List<CostProjectTaskMaterial> taskMaterialList = new ArrayList<>();
  405. List<CostProjectTaskProccess> taskProccessList = new ArrayList<>();
  406. List<CostProjectTaskNode> taskNodeList = new ArrayList<>();
  407. List<CostProjectTaskPersonnel> taskPersonnelList = new ArrayList<>();
  408. for (CostProjectTask childTask : childList) {
  409. // 立项任务
  410. CostProjectTaskApproval taskApproval = CopyUtil.copy(costProjectApproval, CostProjectTaskApproval.class);
  411. taskApproval.setAuditedUnitId(childTask.getAuditedUnitId());
  412. taskApproval.setTaskId(childTask.getId());
  413. taskApprovals.add(taskApproval);
  414. // 关联文书
  415. List<CostProjectTaskDocument> documents = CopyUtil.copyList(documentList, CostProjectTaskDocument.class);
  416. documents.forEach(doc ->{
  417. doc.setTaskId(childTask.getId());
  418. doc.setId(null);
  419. } );
  420. taskDocumentList.addAll(documents);
  421. // 关联资料
  422. List<CostProjectTaskMaterial> materials = CopyUtil.copyList(materialList, CostProjectTaskMaterial.class);
  423. materials.forEach(mat ->{
  424. mat.setTaskId(childTask.getId());
  425. mat.setId(null);
  426. } );
  427. taskMaterialList.addAll(materials);
  428. // 工作流程
  429. CostProjectTaskProccess process = CopyUtil.copy(projectProccess, CostProjectTaskProccess.class);
  430. process.setTaskId(childTask.getId());
  431. process.setProcessId(null);
  432. taskProccessList.add(process);
  433. // 流程节点
  434. List<CostProjectTaskNode> nodes = CopyUtil.copyList(proccessNodeList, CostProjectTaskNode.class);
  435. nodes.forEach(node -> {
  436. node.setTaskId(childTask.getId());
  437. node.setId(null);
  438. });
  439. taskNodeList.addAll(nodes);
  440. }
  441. // 保存所有关联数据
  442. this.costProjectTaskApprovalManager.saveBatch(taskApprovals);
  443. this.costProjectTaskDocumentManager.saveBatch(taskDocumentList);
  444. this.costProjectTaskMaterialManager.saveBatch(taskMaterialList);
  445. this.costProjectTaskProccessManager.saveBatch(taskProccessList);
  446. this.costProjectTaskNodeManager.saveBatch(taskNodeList);
  447. this.costProjectTaskPersonnelManager.saveBatch(taskPersonnelList);
  448. //更新监审单位名称
  449. this.costProjectTaskManager.updateById(costProjectTask);
  450. }
  451. @Override
  452. public IPage<CostProjectApproval> pageListForAuditTask(CostAuditTaskPageReq req) {
  453. // 获取当前用户
  454. IUser currentUser = ContextUtil.getCurrentUser();
  455. AuditedUnit unit = auditedUnitManager.getOne(
  456. new LambdaQueryWrapper<AuditedUnit>()
  457. .eq(AuditedUnit::getAccount, currentUser.getUserId())
  458. .eq(AuditedUnit::getIsDeleted, "0")
  459. );
  460. if (unit == null){
  461. return new Page<>();
  462. }
  463. // 构建查询条件
  464. LambdaQueryWrapper<CostProjectApproval> queryWrapper = new LambdaQueryWrapper<>();
  465. // 查询已发布状态的任务
  466. queryWrapper.eq(CostProjectApproval::getStatus, "2");
  467. // 查询未删除的记录
  468. queryWrapper.eq(CostProjectApproval::getIsDeleted, "0");
  469. // 查询包含当前用户企业ID的记录
  470. queryWrapper.like(CostProjectApproval::getAuditedUnitId, unit.getUnitId());
  471. // 根据请求参数添加查询条件
  472. if (StringUtil.isNotEmpty(req.getProjectName())) {
  473. queryWrapper.like(CostProjectApproval::getProjectName, req.getProjectName());
  474. }
  475. if (StringUtil.isNotEmpty(req.getAreaCode())) {
  476. queryWrapper.eq(CostProjectApproval::getAreaCode, req.getAreaCode());
  477. }
  478. if (StringUtil.isNotEmpty(req.getProjectYear())) {
  479. queryWrapper.eq(CostProjectApproval::getProjectYear, req.getProjectYear());
  480. }
  481. if (StringUtil.isNotEmpty(req.getAuditType())) {
  482. queryWrapper.eq(CostProjectApproval::getAuditType, req.getAuditType());
  483. }
  484. // 按创建时间倒序排列
  485. queryWrapper.orderByDesc(CostProjectApproval::getCreateTime);
  486. // 创建分页对象并执行查询
  487. Page<CostProjectApproval> page = new Page<>(req.getPageNum(), req.getPageSize());
  488. IPage<CostProjectApproval> result = this.page(page, queryWrapper);
  489. // 填充orgName和areaName
  490. List<CostProjectApproval> records = result.getRecords();
  491. for (CostProjectApproval record : records) {
  492. // 设置监审主体
  493. if (StringUtil.isNotEmpty(record.getOrgId())) {
  494. String[] orgIds = record.getOrgId().split(",");
  495. StringBuilder orgNames = new StringBuilder();
  496. for (int i = 0; i < orgIds.length; i++) {
  497. String orgId = orgIds[i].trim();
  498. if (StringUtil.isNotEmpty(orgId)) {
  499. if (i > 0) {
  500. orgNames.append(",");
  501. }
  502. orgNames.append(orgManager.get(orgId).getName());
  503. }
  504. }
  505. record.setOrgName(orgNames.toString());
  506. }
  507. // 设置立项地区
  508. if (StringUtil.isNotEmpty(record.getAreaCode())) {
  509. CostDistrict district = costDistrictManager.getOne(
  510. new LambdaQueryWrapper<CostDistrict>()
  511. .eq(CostDistrict::getCode, record.getAreaCode())
  512. );
  513. record.setAreaName(district != null ? district.getName() : "山西省");
  514. }
  515. // 查询当前用户对应的子任务
  516. CostProjectTask userTask = costProjectTaskManager.getOne(
  517. new LambdaQueryWrapper<CostProjectTask>()
  518. .eq(CostProjectTask::getProjectId, record.getProjectId())
  519. .ne(CostProjectTask::getPid,0)
  520. .eq(CostProjectTask::getAuditedUnitId, unit.getUnitId())
  521. .eq(CostProjectTask::getIsDeleted, 0)
  522. );
  523. // CostProjectTaskProccess taskProccess = costProjectTaskProccessManager.getOne(
  524. // new LambdaQueryWrapper<CostProjectTaskProccess>()
  525. // .eq(CostProjectTaskProccess::getTaskId, userTask.getId())
  526. // );
  527. if(userTask!=null) {
  528. // 设置子任务对象
  529. record.setUserTask(userTask);
  530. // 设置主状态为子任务状态
  531. record.setStatus(userTask.getStatus());
  532. record.setStatusName(TaskStatusConstant.getStatusNameByCode(userTask.getStatus()));
  533. record.setCurrentNode(userTask.getCurrentNode());
  534. record.setCurrentNodeName(NodeConstant.getNodeValueByKey(userTask.getCurrentNode()) + "-" + TaskStatusConstant.getStatusNameByCode(userTask.getStatus()));
  535. }
  536. }
  537. return result;
  538. }
  539. }