ApprovalServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. package com.ruoyi.flowable.service.impl;
  2. import com.ruoyi.common.core.domain.AjaxResult;
  3. import com.ruoyi.common.core.domain.entity.SysUser;
  4. import com.ruoyi.common.enums.FileType;
  5. import com.ruoyi.common.utils.DateUtils;
  6. import com.ruoyi.common.utils.SecurityUtils;
  7. import com.ruoyi.common.utils.StringUtils;
  8. import com.ruoyi.common.utils.uuid.IdUtils;
  9. import com.ruoyi.flowable.common.constant.ProcessConstants;
  10. import com.ruoyi.flowable.common.constant.UUIDGenerator;
  11. import com.ruoyi.flowable.common.enums.FlowStatusEnum;
  12. import com.ruoyi.flowable.factory.FlowServiceFactory;
  13. import com.ruoyi.flowable.service.IFlowInstanceService;
  14. import com.ruoyi.flowable.service.IFlowService;
  15. import com.ruoyi.flowable.service.IApprovalService;
  16. import com.ruoyi.invest.domain.*;
  17. import com.ruoyi.invest.domain.vo.ProjectApprovalVo;
  18. import com.ruoyi.invest.mapper.ApprovalMapper;
  19. import com.ruoyi.invest.mapper.TProjectPoolMapper;
  20. import com.ruoyi.invest.mapper.TProjectScoringMapper;
  21. import com.ruoyi.invest.service.*;
  22. import com.ruoyi.system.mapper.SysDeptMapper;
  23. import com.ruoyi.system.service.ISysUserService;
  24. import com.ruoyi.tool.service.ITUnifyFileService;
  25. import org.flowable.engine.repository.ProcessDefinition;
  26. import org.flowable.engine.runtime.ProcessInstance;
  27. import org.flowable.task.api.Task;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Service;
  30. import javax.servlet.http.HttpServletRequest;
  31. import java.util.*;
  32. /**
  33. * 项目池Service业务层处理
  34. *
  35. * @author ruoyi
  36. * @date 2024-02-21
  37. */
  38. @Service
  39. public class ApprovalServiceImpl extends FlowServiceFactory implements IApprovalService
  40. {
  41. @Autowired
  42. private ApprovalMapper approvalMapper;
  43. @Autowired
  44. private ITProjectApprovalService tProjectApprovalService;
  45. @Autowired
  46. private ITProjectPoolService tProjectPoolService;
  47. @Autowired
  48. private ITProjectCirculationService tProjectCirculationService;
  49. @Autowired
  50. private ITUnifyFileService tUnifyFileService;
  51. @Autowired
  52. private IFlowBaseInfoService activitiBaseInfoService;
  53. @Autowired
  54. private IFlowInstanceService flowInstanceService;
  55. @Autowired
  56. private ISysUserService sysUserService;
  57. @Autowired
  58. private SysDeptMapper sysDeptMapper;
  59. @Autowired
  60. private IFlowService flowService;
  61. @Autowired
  62. private ITProjectMeetingService tProjectMeetingService;
  63. @Autowired
  64. private ITProjectScoringService tProjectScoringService;
  65. @Autowired
  66. private TProjectScoringMapper tProjectScoringMapper;
  67. @Override
  68. public List<ProjectApprovalVo> selectAllApprovalList(TProjectApproval tProjectApproval){
  69. return approvalMapper.selectAllApprovalList(tProjectApproval);
  70. }
  71. @Override
  72. public List<ProjectApprovalVo> getMyTaskList(String userId, TProjectApproval tProjectApproval){
  73. return approvalMapper.getMyTaskList(userId, tProjectApproval);
  74. }
  75. @Override
  76. public List<ProjectApprovalVo> getMyDoneTaskList(String userId, TProjectApproval tProjectApproval){
  77. return approvalMapper.getMyDoneTaskList(userId, tProjectApproval);
  78. }
  79. @Override
  80. public List<ProjectApprovalVo> getMyList(String userId,TProjectApproval tProjectApproval){
  81. return approvalMapper.getMyList(userId, tProjectApproval);
  82. }
  83. /**
  84. * 查询项目池
  85. *
  86. * @param pInstId 流程实例Id
  87. * @return 项目池
  88. */
  89. @Override
  90. public TProjectApproval selectTProjectApprovalByProcInstId(String pInstId)
  91. {
  92. return approvalMapper.selectTProjectApprovalByProcInstId(pInstId);
  93. }
  94. @Override
  95. public AjaxResult start(TProjectApproval tProjectApproval) {
  96. // 根据key值获取最新的流程部署id
  97. String pDefId = null;
  98. ProcessInstance pInst = null;
  99. try {
  100. List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
  101. .processDefinitionKey("dgt-project-workflow")
  102. .orderByProcessDefinitionVersion().desc().list();
  103. if(list.size()==0){
  104. return AjaxResult.error("未找到该流程,无法开启流程!");
  105. }
  106. pDefId = list.get(0).getId();
  107. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId)
  108. .latestVersion().singleResult();
  109. if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
  110. return AjaxResult.error("流程已被挂起,请先激活流程");
  111. }
  112. if(StringUtils.isNotBlank(pDefId)){
  113. //设置参数
  114. Map<String, Object> formProperties = new HashMap<String, Object>();
  115. // 设置流程发起人Id到流程中
  116. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  117. identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
  118. formProperties.put("auditPass",tProjectApproval.isFlag()?true:false);
  119. //暂存
  120. formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
  121. //投资部负责人
  122. String leader=sysDeptMapper.selectDeptLeader("投资部");
  123. formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
  124. pInst = runtimeService.startProcessInstanceById(pDefId, formProperties);
  125. // ProcessInstance p = runtimeService.startProcessInstanceById(procDefId, variables);
  126. if(pInst!=null){
  127. String nickName= SecurityUtils.getLoginUser().getUser().getNickName();
  128. String userId=SecurityUtils.getLoginUser().getUserId().toString();
  129. //保存信息
  130. tProjectApproval.setId(IdUtils.fastSimpleUUID());
  131. tProjectApproval.setProcInstId(pInst.getProcessInstanceId());
  132. tProjectApproval.setCreateBy(userId);
  133. if(tProjectApproval.isFlag()){
  134. tProjectApproval.setStatus(1);//提交
  135. }else{
  136. tProjectApproval.setStatus(0);//暂存
  137. }
  138. // todo 保存立项资料
  139. tUnifyFileService.insertTUnifyFileList(tProjectApproval.getListFile(),
  140. tProjectApproval.getProjectPoolId(),
  141. tProjectApproval.getId(),
  142. String.valueOf(FileType.APPROVAL.ordinal()),
  143. nickName);
  144. // todo 更改立项状态
  145. tProjectPoolService.updateTProjectPoolByApprovalFlag(tProjectApproval.getProjectPoolId(),"1");
  146. // todo 短信提醒
  147. /*if(StringUtils.isNotEmpty(tProjectApproval.getParticipantsId())){
  148. StringUtils.str2List(tProjectApproval.getParticipantsId(),",",true,true).stream().forEach(str -> {
  149. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  150. String contents = "您好,"+user.getNickName()+"," + tProjectApproval.getProjectName() + "已发起立项申请。";
  151. try {
  152. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  153. } catch (IOException e) {
  154. logger.error("短信发送失败"+e.getMessage());
  155. }
  156. });
  157. }*/
  158. // todo 增加项目创建记录
  159. tProjectCirculationService.insertTProjectCirculation(tProjectApproval.getProjectPoolId(),"立项申请",nickName);
  160. tProjectApprovalService.insertTProjectApproval(tProjectApproval);
  161. FlowBaseInfo flowBaseInfo = new FlowBaseInfo();
  162. flowBaseInfo.setCreateBy(userId);
  163. flowBaseInfo.setId(UUIDGenerator.uuid());
  164. flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst));
  165. flowBaseInfo.setProcDefId(pDefId);
  166. flowBaseInfo.setProcInsId(pInst.getId());
  167. flowBaseInfo.setTaskName("申请人");
  168. flowBaseInfo.setFlag(true);
  169. flowBaseInfo.setComment(tProjectApproval.isFlag() ? "[提交]" : "[暂存]");
  170. flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName());
  171. activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo);
  172. TProjectPool tProjectPool=new TProjectPool();
  173. tProjectPool.setId(tProjectApproval.getProjectPoolId());
  174. tProjectPool.setProjectStage("3");//项目阶段-项目立项
  175. tProjectPool.setProjectState("d");//项目状态-项目立项
  176. tProjectPoolService.updateTProjectPool(tProjectPool);
  177. return AjaxResult.success();
  178. }
  179. return AjaxResult.error();
  180. }
  181. return AjaxResult.error();
  182. } catch (Exception e) {
  183. /*res.put("status",false);
  184. res.put("msg", "流程定义id为空, 无法开启流程!");*/
  185. e.printStackTrace();
  186. return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!");
  187. }
  188. }
  189. @Override
  190. public AjaxResult complete(TProjectApproval tProjectApproval, TProjectMeeting tProjectMeeting,TProjectScoring tProjectScoring, FlowBaseInfo flow,HttpServletRequest request){
  191. //Task task=taskService.createTaskQuery().processInstanceId(tProjectApproval.getProcInstId()).singleResult();
  192. Task task = taskService.createTaskQuery().taskId(flow.getTaskId()).singleResult();
  193. if (Objects.isNull(task)) {
  194. return AjaxResult.error("任务不存在");
  195. }
  196. //当前你登录人
  197. SysUser userInfo=SecurityUtils.getLoginUser().getUser();
  198. Map<String, Object> rs = new HashMap<String, Object>();
  199. rs.put("status",true);
  200. Map<String, Object> formProperties = new HashMap<>();
  201. formProperties.put("auditPass", tProjectApproval.isFlag());
  202. //会议投决人
  203. if("meeting".equals(task.getTaskDefinitionKey())) {
  204. //立项审批人
  205. List<String> userIds = Arrays.asList(tProjectApproval.getParticipantsId().split(","));
  206. //List<String> userIds = Arrays.asList(tProjectMeeting.getParticipantsId().split(","));//会议人
  207. formProperties.put("decisionList", userIds);
  208. }
  209. if(StringUtils.isNotBlank(tProjectApproval.getIsTerminate())) {//不为空代表结束流程
  210. formProperties.put("whetherToEnd", true);
  211. }else{
  212. formProperties.put("whetherToEnd", false);
  213. }
  214. Map<String, Object> fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId());
  215. try {
  216. rs = flowService.taskComplete( task.getId(), tProjectApproval.isFlag(), formProperties, userInfo.getUserId().toString());
  217. } catch (Exception e) {
  218. e.printStackTrace();
  219. rs.put("status", false);
  220. rs.put("msg", "流程审批失败");
  221. }
  222. boolean status = (boolean) rs.get("status");
  223. // 审核成功, 则记录审核信息
  224. if (status) {
  225. TProjectPool tProjectPool=new TProjectPool();
  226. tProjectPool.setId(tProjectApproval.getProjectPoolId());
  227. // todo 保存立项资料
  228. tUnifyFileService.insertTUnifyFileList(tProjectApproval.getListFile(),
  229. tProjectApproval.getProjectPoolId(),
  230. tProjectApproval.getId(),
  231. String.valueOf(FileType.APPROVAL.ordinal()),
  232. userInfo.getNickName());
  233. //发起会议
  234. if ("meeting".equals(task.getTaskDefinitionKey())) {
  235. if(tProjectMeeting!=null&&StringUtils.isNotBlank(tProjectMeeting.getId())){
  236. // todo 保存附件信息
  237. tUnifyFileService.insertTUnifyFileList(tProjectMeeting.getListFile(),
  238. tProjectMeeting.getProjectPoolId(),
  239. tProjectMeeting.getId(),//会议ID
  240. String.valueOf(FileType.MEETING.ordinal()),//文件类型:会议
  241. userInfo.getNickName());
  242. tProjectMeetingService.updateTProjectMeeting(tProjectMeeting);
  243. }else {
  244. if ("0".equals(tProjectApproval.getNeedMeeting())) {
  245. }
  246. tProjectMeeting.setId(IdUtils.fastSimpleUUID());
  247. tProjectMeeting.setCreateBy(userInfo.getNickName());
  248. tProjectMeeting.setProjectPoolId(tProjectApproval.getProjectPoolId());
  249. if (tProjectMeeting.getMeetingType().equals("LX") || tProjectMeeting.getMeetingType().equals("TJ")) {
  250. int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.lastTwoDigits() + "-");
  251. tProjectMeeting.setMeetingCode(tProjectMeeting.getProjectGroup() + "-" + DateUtils.lastTwoDigits() + "-" + tProjectMeeting.getMeetingType() + "-" + String.format("%03d", number + 1));
  252. } else {
  253. int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.dateTimeNow("YYYY"));
  254. tProjectMeeting.setMeetingCode(DateUtils.dateNow() + String.format("%03d", number + 1));
  255. }
  256. // todo 保存附件信息
  257. tUnifyFileService.insertTUnifyFileList(tProjectMeeting.getListFile(),
  258. tProjectMeeting.getProjectPoolId(),
  259. tProjectMeeting.getId(),//会议ID
  260. String.valueOf(FileType.MEETING.ordinal()),//文件类型:会议
  261. userInfo.getNickName());
  262. if(StringUtils.isNotBlank(tProjectMeeting.getMeetingTheme())){
  263. // todo 增加会议创建记录
  264. tProjectCirculationService.insertTProjectCirculation(tProjectMeeting.getProjectPoolId(), tProjectMeeting.getMeetingTheme() + "(会议)", userInfo.getNickName());
  265. }
  266. // todo 发送短信-参与人-发起人
  267. if (tProjectMeeting.getMeetingType().equals("LX") || tProjectMeeting.getMeetingType().equals("TJ")) {
  268. // todo 参与人
  269. /*if(StringUtils.isNotEmpty(tProjectMeeting.getParticipantsId())){
  270. StringUtils.str2List(tProjectMeeting.getParticipantsId(),",",true,true).stream().forEach(str -> {
  271. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  272. String contents = "您好," + user.getNickName() + ",兹定于 " +
  273. DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
  274. "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
  275. try {
  276. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  277. } catch (IOException e) {
  278. logger.error("短信发送失败"+e.getMessage());
  279. }
  280. });
  281. }*/
  282. // todo 发起人
  283. /*if(StringUtils.isNotEmpty(tProjectMeeting.getPromoterId())){
  284. SysUser user = sysUserService.selectUserById(Long.valueOf(tProjectMeeting.getPromoterId()));
  285. String contents = "您好," + user.getNickName() + ",兹定于 " +
  286. DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
  287. "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
  288. try {
  289. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  290. } catch (IOException e) {
  291. logger.error("短信发送失败"+e.getMessage());
  292. }
  293. }*/
  294. }
  295. tProjectMeetingService.insertTProjectMeeting(tProjectMeeting);
  296. }
  297. }
  298. //上传打分表
  299. if("decision".equals(task.getTaskDefinitionKey())){
  300. tProjectScoring.setCreateBy(userInfo.getNickName());
  301. tProjectScoring.setProjectPoolId(tProjectApproval.getProjectPoolId());
  302. // todo 增加项目创建记录
  303. tProjectCirculationService.insertTProjectCirculation(tProjectScoring.getProjectPoolId(),"上传打分表", userInfo.getNickName());
  304. tProjectScoringService.insertTProjectScoring(tProjectScoring);
  305. }
  306. if("president".equals(task.getTaskDefinitionKey())){
  307. tProjectPool.setProjectStage("3");//项目阶段-项目立项
  308. tProjectPool.setProjectState("e");//项目状态-立项通过
  309. }
  310. //FlowBaseInfo flow = new FlowBaseInfo();
  311. if(flow==null){
  312. flow = new FlowBaseInfo();
  313. }
  314. flow.setId(UUIDGenerator.uuid());
  315. flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap()));
  316. flow.setStatus(FlowStatusEnum.RUNNING.getName());
  317. flow.setProcDefId(task.getProcessDefinitionId());
  318. flow.setProcInsId(task.getProcessInstanceId());
  319. flow.setTaskDefKey(task.getTaskDefinitionKey());
  320. String isOk = tProjectApproval.isFlag() ? "[同意]" : "[驳回]";
  321. if ("modifyApply".equals(task.getTaskDefinitionKey())) {
  322. tProjectApproval.setStatus(tProjectApproval.isFlag() ? 1 : 4);
  323. isOk = tProjectApproval.isFlag() ? "[提交]" : "[关闭]";
  324. } else {
  325. tProjectApproval.setStatus(tProjectApproval.isFlag() ? 2 : 0);
  326. if("president".equals(task.getTaskDefinitionKey())){//总裁室
  327. if(!tProjectApproval.isFlag()&&StringUtils.isNotBlank(tProjectApproval.getIsTerminate())){//如果不为空代表可能是驳回(终止)或者观望
  328. isOk= "[关闭]";
  329. }
  330. }
  331. }
  332. if (null != flow.getComment()) {
  333. flow.setComment(isOk + flow.getComment());
  334. } else {
  335. flow.setComment(isOk);
  336. }
  337. flow.setTaskName(task.getName());
  338. flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
  339. ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult();
  340. // 表示流程已经审批结束了
  341. if (processInstance == null) {
  342. flow.setStatus(FlowStatusEnum.ENDED.getName());
  343. if (!"modifyApply".equals(task.getTaskDefinitionKey())) {
  344. if(tProjectApproval.isFlag()) {//审批通过
  345. tProjectApproval.setStatus(3);
  346. tProjectPool.setProjectStage("4");//项目阶段-尽调背调
  347. tProjectPool.setProjectState("f");//项目状态-尽调背调
  348. tProjectPool.setUpdateBy(userInfo.getNickName());
  349. tProjectPool.setProjectDate(new Date());//立项通过日期
  350. // todo 增加项目创建记录
  351. tProjectCirculationService.insertTProjectCirculation(tProjectPool.getId(), "项目立项完成", userInfo.getNickName());
  352. }else{//终止和观望
  353. if(StringUtils.isNotBlank(tProjectApproval.getIsTerminate())) {
  354. tProjectApproval.setStatus(4);//流程状态为关闭
  355. if ("1".equals(tProjectApproval.getIsTerminate())) {
  356. tProjectPool.setProjectStatus("1");//终止
  357. } else {
  358. tProjectPool.setProjectStatus("2");//观望
  359. }
  360. tProjectPool.setProjectStage("3");//项目阶段-项目立项
  361. tProjectPool.setProjectState("c");//项目状态-准备立项材料
  362. tProjectPool.setApprovalFlag("0");
  363. tProjectPool.setUpdateBy(userInfo.getNickName());
  364. }
  365. }
  366. }else{//暂存的关闭
  367. tProjectPool.setProjectStage("3");//项目阶段-项目立项
  368. tProjectPool.setProjectState("c");//项目状态-准备立项材料
  369. tProjectPool.setApprovalFlag("0");
  370. tProjectPool.setUpdateBy(userInfo.getNickName());
  371. }
  372. tProjectPoolService.updateTProjectPool(tProjectPool);
  373. }
  374. tProjectApprovalService.updateTProjectApproval(tProjectApproval);
  375. activitiBaseInfoService.addActivitiBaseInfo(flow);
  376. }
  377. return AjaxResult.success();
  378. }
  379. public TProjectMeeting selectTProjectMeetingByProcInstId(String pInstId){
  380. TProjectApproval tProjectApproval=this.selectTProjectApprovalByProcInstId(pInstId);
  381. TProjectMeeting tProjectMeeting=null;
  382. if(tProjectApproval!=null){
  383. tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectApproval.getProjectPoolId());
  384. }
  385. return tProjectMeeting;
  386. }
  387. /**
  388. * 根据流程Id查询汇总分数和平均分数
  389. * @param pInstId
  390. * @return
  391. */
  392. @Override
  393. public Map<String, String> selectSumScore(String pInstId) {
  394. TProjectApproval tProjectApproval=this.selectTProjectApprovalByProcInstId(pInstId);
  395. Map<String, String> sumScore=new HashMap<>();
  396. if(tProjectApproval!=null){
  397. TProjectMeeting tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectApproval.getProjectPoolId());
  398. if(tProjectMeeting!=null) {
  399. sumScore = tProjectScoringMapper.selectMeetingId(tProjectMeeting.getId());
  400. }
  401. }
  402. return sumScore;
  403. }
  404. }