CostProjectApprovalManagerImpl.java 29 KB

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