CostProjectApprovalManagerImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  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. List<CostProjectProccessNode> collect = proccessNodeList.stream().filter(node -> node.getProcessNodeKey().equals(NodeConstant.tjcl.getNodeKey()))
  345. .collect(Collectors.toList());
  346. CostProjectProccessNode pnode = collect.get(0);
  347. pnode.setActUserIds(req.getAuditGroup());
  348. pnode.setActStartTime(LocalDateTime.now());
  349. costProjectProccessNodeManager.updateById(pnode);
  350. //政策文件、监审对象提交资料清单、成本调查表
  351. //监审目录id
  352. String catalogId = costProjectApproval.getCatalogId();
  353. //TODO 根据监审目录id查询关联的成本调查表、财务表
  354. //财务表
  355. List<CostSurveyFdTemplate> costSurveyFdTemplates = costSurveyFdTemplateManager.listByCatalogId(catalogId);
  356. // if (ObjectUtil.isNotEmpty(costSurveyFdTemplates)) {
  357. // if (costSurveyFdTemplates.size() == 1) {
  358. // CostSurveyFdTemplate costSurveyFdTemplate = costSurveyFdTemplates.get(0);
  359. // List<CostSurveyFdTemplateHeaders> costSurveyFdTemplateHeaders = this.costSurveyFdTemplateHeadersManager.listBySurveyTemplateId(costSurveyFdTemplate.getSurveyTemplateId());
  360. // List<CostSurveyFdTemplateItems> costSurveyFdTemplateItems = this.costSurveyFdTemplateItemsManager.selectBySurveyTemplateId(costSurveyFdTemplate.getSurveyTemplateId());
  361. //
  362. // } else {
  363. // throw new BaseException("财务表关系为一对一");
  364. // }
  365. // }
  366. //成本表
  367. List<CostSurveyTemplate> costSurveyTemplates = costSurveyTemplateManager.listByCatalogId(catalogId);
  368. if (ObjectUtil.isNotEmpty(costSurveyTemplates)) {
  369. List<String> surveyTemplateIdList = costSurveyTemplates.stream().map(CostSurveyTemplate::getSurveyTemplateId).collect(Collectors.toList());
  370. LambdaQueryWrapper<CostSurveyTemplateHeaders> queryWrapper = new LambdaQueryWrapper<>();
  371. queryWrapper.in(CostSurveyTemplateHeaders::getSurveyTemplateId, surveyTemplateIdList);
  372. List<CostSurveyTemplateHeaders> headersList = this.costSurveyTemplateHeadersManager.list(queryWrapper);
  373. LambdaQueryWrapper<CostSurveyTemplateItems> queryWrapper1 = new LambdaQueryWrapper<>();
  374. queryWrapper1.in(CostSurveyTemplateItems::getSurveyTemplateId, surveyTemplateIdList);
  375. List<CostSurveyTemplateItems> itemsList = this.costSurveyTemplateItemsManager.list(queryWrapper1);
  376. }
  377. //核定表
  378. List<CostProjectTask> childList = new ArrayList<>();
  379. StringBuilder auditUnitName = new StringBuilder();
  380. // 统一处理 auditedUnitId,无论单个还是多个
  381. String[] unitIdList = costProjectTask.getAuditedUnitId().split(",");
  382. int orderNum = 1;
  383. for (String unitId : unitIdList) {
  384. // 创建子任务
  385. CostProjectTask childTask = new CostProjectTask();
  386. childTask.setProjectId(costProjectApproval.getProjectId());
  387. childTask.setProjectName(costProjectApproval.getProjectName() + "-子任务");
  388. childTask.setAuditedUnitId(unitId);
  389. childTask.setAuditedUnitName(auditedUnitManager.get(unitId).getUnitName());
  390. childTask.setCurrentNode(NodeConstant.tjcl.getNodeKey());
  391. childTask.setStatus(TaskStatusConstant.WAIT_SUBMIT.getStatusCode());
  392. childTask.setOrderNum(orderNum++);
  393. childTask.setPid(costProjectTask.getId());
  394. childTask.setIsDeleted(BaseConstant.NORMAL_STATUS);
  395. childTask.setYear(costProjectApproval.getProjectYear());
  396. childList.add(childTask);
  397. auditUnitName.append(childTask.getAuditedUnitName()).append(",");
  398. }
  399. // 保存所有子任务
  400. this.costProjectTaskManager.saveBatch(childList);
  401. // 给每个子任务对应的企业发送任务通知(绑定taskId)
  402. for (CostProjectTask childTask : childList) {
  403. // 查询企业对应的账号(用户ID)
  404. AuditedUnit auditedUnit = auditedUnitManager.getOne(
  405. new LambdaQueryWrapper<AuditedUnit>()
  406. .eq(AuditedUnit::getUnitId, childTask.getAuditedUnitId())
  407. .eq(AuditedUnit::getIsDeleted, "0")
  408. );
  409. String sendTarget = childTask.getCreateBy() == null ? "" : childTask.getCreateBy();
  410. String title = "监审任务发布通知";
  411. String content = "您有新的监审任务:" + costProjectApproval.getProjectName();
  412. if (StringUtil.isNotEmpty(req.getContent())) {
  413. content += "," + req.getContent();
  414. }
  415. String orgId = getCurrentUserMainOrgId();
  416. Org org = orgManager.getById(orgId);
  417. String noticeSource = (org != null ? org.getName() : "系统") + " " + AuthenticationUtil.getCurrentUserFullname();
  418. // 站内通知(绑定子任务ID)
  419. this.costNoticeManager.sendNotice(
  420. req.getProjectId(),
  421. childTask.getId(),
  422. "1",
  423. title,
  424. content,
  425. childTask.getAuditedUnitId(),
  426. noticeSource,
  427. sendTarget
  428. );
  429. }
  430. // 设置父任务的审计单位名称
  431. if (auditUnitName.length() > 0) {
  432. costProjectTask.setAuditedUnitName(
  433. auditUnitName.substring(0, auditUnitName.length() - 1)
  434. );
  435. }
  436. // 在子任务保存后创建关联数据
  437. List<CostProjectTaskDocument> taskDocumentList = new ArrayList<>();
  438. List<CostProjectTaskApproval> taskApprovals = new ArrayList<>();
  439. List<CostProjectTaskMaterial> taskMaterialList = new ArrayList<>();
  440. List<CostProjectTaskProccess> taskProccessList = new ArrayList<>();
  441. List<CostProjectTaskNode> taskNodeList = new ArrayList<>();
  442. List<CostProjectTaskPersonnel> taskPersonnelList = new ArrayList<>();
  443. for (CostProjectTask childTask : childList) {
  444. // 立项任务
  445. CostProjectTaskApproval taskApproval = CopyUtil.copy(costProjectApproval, CostProjectTaskApproval.class);
  446. taskApproval.setAuditedUnitId(childTask.getAuditedUnitId());
  447. taskApproval.setTaskId(childTask.getId());
  448. taskApprovals.add(taskApproval);
  449. // 关联文书
  450. List<CostProjectTaskDocument> documents = CopyUtil.copyList(documentList, CostProjectTaskDocument.class);
  451. documents.forEach(doc ->{
  452. doc.setTaskId(childTask.getId());
  453. doc.setId(null);
  454. } );
  455. taskDocumentList.addAll(documents);
  456. // 关联资料
  457. List<CostProjectTaskMaterial> materials = CopyUtil.copyList(materialList, CostProjectTaskMaterial.class);
  458. materials.forEach(mat ->{
  459. mat.setTaskId(childTask.getId());
  460. mat.setId(null);
  461. } );
  462. taskMaterialList.addAll(materials);
  463. // 关联成本调查表
  464. // 工作流程
  465. CostProjectTaskProccess process = CopyUtil.copy(projectProccess, CostProjectTaskProccess.class);
  466. process.setTaskId(childTask.getId());
  467. process.setProcessId(null);
  468. taskProccessList.add(process);
  469. // 流程节点
  470. List<CostProjectTaskNode> nodes = CopyUtil.copyList(proccessNodeList, CostProjectTaskNode.class);
  471. nodes.forEach(node -> {
  472. node.setTaskId(childTask.getId());
  473. node.setId(null);
  474. });
  475. taskNodeList.addAll(nodes);
  476. }
  477. // 保存所有关联数据
  478. this.costProjectTaskApprovalManager.saveBatch(taskApprovals);
  479. this.costProjectTaskDocumentManager.saveBatch(taskDocumentList);
  480. this.costProjectTaskMaterialManager.saveBatch(taskMaterialList);
  481. this.costProjectTaskProccessManager.saveBatch(taskProccessList);
  482. this.costProjectTaskNodeManager.saveBatch(taskNodeList);
  483. this.costProjectTaskPersonnelManager.saveBatch(taskPersonnelList);
  484. //更新监审单位名称
  485. this.costProjectTaskManager.updateById(costProjectTask);
  486. }
  487. @Override
  488. public IPage<CostProjectApproval> pageListForAuditTask(CostAuditTaskPageReq req) {
  489. // 获取当前用户
  490. IUser currentUser = ContextUtil.getCurrentUser();
  491. AuditedUnit unit = auditedUnitManager.getOne(
  492. new LambdaQueryWrapper<AuditedUnit>()
  493. .eq(AuditedUnit::getAccount, currentUser.getUserId())
  494. .eq(AuditedUnit::getIsDeleted, "0")
  495. );
  496. if (unit == null){
  497. return new Page<>();
  498. }
  499. // 构建查询条件
  500. LambdaQueryWrapper<CostProjectApproval> queryWrapper = new LambdaQueryWrapper<>();
  501. // 查询已发布状态的任务
  502. queryWrapper.eq(CostProjectApproval::getStatus, "2");
  503. // 查询未删除的记录
  504. queryWrapper.eq(CostProjectApproval::getIsDeleted, "0");
  505. // 查询包含当前用户企业ID的记录
  506. queryWrapper.like(CostProjectApproval::getAuditedUnitId, unit.getUnitId());
  507. // 根据请求参数添加查询条件
  508. if (StringUtil.isNotEmpty(req.getProjectName())) {
  509. queryWrapper.like(CostProjectApproval::getProjectName, req.getProjectName());
  510. }
  511. if (StringUtil.isNotEmpty(req.getAreaCode())) {
  512. queryWrapper.eq(CostProjectApproval::getAreaCode, req.getAreaCode());
  513. }
  514. if (StringUtil.isNotEmpty(req.getProjectYear())) {
  515. queryWrapper.eq(CostProjectApproval::getProjectYear, req.getProjectYear());
  516. }
  517. if (StringUtil.isNotEmpty(req.getAuditType())) {
  518. queryWrapper.eq(CostProjectApproval::getAuditType, req.getAuditType());
  519. }
  520. // 按创建时间倒序排列
  521. queryWrapper.orderByDesc(CostProjectApproval::getCreateTime);
  522. // 创建分页对象并执行查询
  523. Page<CostProjectApproval> page = new Page<>(req.getPageNum(), req.getPageSize());
  524. IPage<CostProjectApproval> result = this.page(page, queryWrapper);
  525. // 填充orgName和areaName
  526. List<CostProjectApproval> records = result.getRecords();
  527. for (CostProjectApproval record : records) {
  528. // 设置监审主体
  529. if (StringUtil.isNotEmpty(record.getOrgId())) {
  530. String[] orgIds = record.getOrgId().split(",");
  531. StringBuilder orgNames = new StringBuilder();
  532. for (int i = 0; i < orgIds.length; i++) {
  533. String orgId = orgIds[i].trim();
  534. if (StringUtil.isNotEmpty(orgId)) {
  535. if (i > 0) {
  536. orgNames.append(",");
  537. }
  538. orgNames.append(orgManager.get(orgId).getName());
  539. }
  540. }
  541. record.setOrgName(orgNames.toString());
  542. }
  543. // 设置立项地区
  544. if (StringUtil.isNotEmpty(record.getAreaCode())) {
  545. CostDistrict district = costDistrictManager.getOne(
  546. new LambdaQueryWrapper<CostDistrict>()
  547. .eq(CostDistrict::getCode, record.getAreaCode())
  548. );
  549. record.setAreaName(district != null ? district.getName() : "山西省");
  550. }
  551. // 查询当前用户对应的子任务
  552. CostProjectTask userTask = costProjectTaskManager.getOne(
  553. new LambdaQueryWrapper<CostProjectTask>()
  554. .eq(CostProjectTask::getProjectId, record.getProjectId())
  555. .ne(CostProjectTask::getPid,0)
  556. .eq(CostProjectTask::getAuditedUnitId, unit.getUnitId())
  557. .eq(CostProjectTask::getIsDeleted, 0)
  558. );
  559. if(userTask!=null) {
  560. // 设置子任务对象
  561. record.setUserTask(userTask);
  562. // 设置主状态为子任务状态
  563. record.setStatus(userTask.getStatus());
  564. record.setStatusName(TaskStatusConstant.getStatusNameByCode(userTask.getStatus()));
  565. record.setCurrentNode(userTask.getCurrentNode());
  566. record.setCurrentNodeName(NodeConstant.getNodeValueByKey(userTask.getCurrentNode()) + "-" + TaskStatusConstant.getStatusNameByCode(userTask.getStatus()));
  567. }
  568. //设置监审单位
  569. record.setAuditedUnitId(unit.getUnitId());
  570. record.setAuditedUnitName(unit.getUnitName());
  571. }
  572. return result;
  573. }
  574. @Override
  575. public List<CostProjectApproval> getList() {
  576. User currentUser = ContextUtil.getCurrentUser();
  577. String userId = currentUser.getId();
  578. User user = userService.getById(userId);
  579. Integer dataScope = user.getDataScope();
  580. QueryWrapper<CostProjectApproval> queryWrapper = new QueryWrapper<>();
  581. // 只能查自己和自己下属的
  582. if(dataScope != null && dataScope != 0){
  583. Set<String> areaSet = new HashSet<>();
  584. if(dataScope == 1){
  585. String cityCode = user.getCityCode();
  586. String codeSub = cityCode.substring(0, 4);
  587. QueryWrapper<CostDistrict> districtQueryWrapper = new QueryWrapper<>();
  588. districtQueryWrapper.like("code", codeSub);
  589. List<CostDistrict> costDistricts = costDistrictManager.list(districtQueryWrapper);
  590. for (CostDistrict costDistrict1 : costDistricts) {
  591. areaSet.add(costDistrict1.getCode());
  592. }
  593. }
  594. if(dataScope == 2){
  595. String code = user.getCountyCode();
  596. areaSet.add(code);
  597. }
  598. queryWrapper.in("area_code", areaSet);
  599. }
  600. queryWrapper.orderByDesc("create_time");
  601. return this.list(queryWrapper);
  602. }
  603. @Override
  604. public List<CostProjectApproval> getAnalyzeList() {
  605. User currentUser = ContextUtil.getCurrentUser();
  606. String userId = currentUser.getId();
  607. User user = userService.getById(userId);
  608. Integer dataScope = user.getDataScope();
  609. QueryWrapper<CostProjectTask> wrapperTask = new QueryWrapper<>();
  610. wrapperTask.eq("is_gd",1);
  611. List<CostProjectTask> list = costProjectTaskManager.list(wrapperTask);
  612. List<String> projectIds = list.stream().map(CostProjectTask::getProjectId).distinct().collect(Collectors.toList());
  613. QueryWrapper<CostProjectApproval> queryWrapper = new QueryWrapper<>();
  614. // 只能查自己和自己下属的
  615. if(dataScope != null && dataScope != 0){
  616. Set<String> areaSet = new HashSet<>();
  617. if(dataScope == 1){
  618. String cityCode = user.getCityCode();
  619. String codeSub = cityCode.substring(0, 4);
  620. QueryWrapper<CostDistrict> districtQueryWrapper = new QueryWrapper<>();
  621. districtQueryWrapper.like("code", codeSub);
  622. List<CostDistrict> costDistricts = costDistrictManager.list(districtQueryWrapper);
  623. for (CostDistrict costDistrict1 : costDistricts) {
  624. areaSet.add(costDistrict1.getCode());
  625. }
  626. }
  627. if(dataScope == 2){
  628. String code = user.getCountyCode();
  629. areaSet.add(code);
  630. }
  631. queryWrapper.in("area_code", areaSet);
  632. }
  633. queryWrapper.in("project_id",projectIds);
  634. queryWrapper.orderByDesc("create_time");
  635. return this.list(queryWrapper);
  636. }
  637. }