CostProjectApprovalManagerImpl.java 32 KB

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