ApprovalServiceImpl.java 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  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.sms.SmsSenderUtils;
  9. import com.ruoyi.common.utils.uuid.IdUtils;
  10. import com.ruoyi.flowable.common.constant.ProcessConstants;
  11. import com.ruoyi.flowable.common.constant.UUIDGenerator;
  12. import com.ruoyi.flowable.common.enums.FlowStatusEnum;
  13. import com.ruoyi.flowable.factory.FlowServiceFactory;
  14. import com.ruoyi.flowable.service.IFlowInstanceService;
  15. import com.ruoyi.flowable.service.IFlowService;
  16. import com.ruoyi.flowable.service.IApprovalService;
  17. import com.ruoyi.invest.domain.*;
  18. import com.ruoyi.invest.domain.vo.ProjectApprovalVo;
  19. import com.ruoyi.invest.mapper.ApprovalMapper;
  20. import com.ruoyi.invest.mapper.TProjectPoolMapper;
  21. import com.ruoyi.invest.mapper.TProjectScoringMapper;
  22. import com.ruoyi.invest.service.*;
  23. import com.ruoyi.system.mapper.SysDeptMapper;
  24. import com.ruoyi.system.service.ISysUserService;
  25. import com.ruoyi.tool.service.ITUnifyFileService;
  26. import org.flowable.engine.repository.ProcessDefinition;
  27. import org.flowable.engine.runtime.ProcessInstance;
  28. import org.flowable.task.api.Task;
  29. import org.slf4j.Logger;
  30. import org.slf4j.LoggerFactory;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.beans.factory.annotation.Value;
  33. import org.springframework.stereotype.Service;
  34. import javax.servlet.http.HttpServletRequest;
  35. import java.io.IOException;
  36. import java.util.*;
  37. /**
  38. * 项目池Service业务层处理
  39. *
  40. * @author ruoyi
  41. * @date 2024-02-21
  42. */
  43. @Service
  44. public class ApprovalServiceImpl extends FlowServiceFactory implements IApprovalService
  45. {
  46. protected final Logger logger = LoggerFactory.getLogger(this.getClass());
  47. @Value("${spring.profiles.active}")
  48. private String active;
  49. @Autowired
  50. private ApprovalMapper approvalMapper;
  51. @Autowired
  52. private ITProjectApprovalService tProjectApprovalService;
  53. @Autowired
  54. private ITProjectPoolService tProjectPoolService;
  55. @Autowired
  56. private ITProjectCirculationService tProjectCirculationService;
  57. @Autowired
  58. private ITUnifyFileService tUnifyFileService;
  59. @Autowired
  60. private IFlowBaseInfoService activitiBaseInfoService;
  61. @Autowired
  62. private IFlowInstanceService flowInstanceService;
  63. @Autowired
  64. private ISysUserService sysUserService;
  65. @Autowired
  66. private SysDeptMapper sysDeptMapper;
  67. @Autowired
  68. private IFlowService flowService;
  69. @Autowired
  70. private ITProjectMeetingService tProjectMeetingService;
  71. @Autowired
  72. private ITProjectScoringService tProjectScoringService;
  73. @Autowired
  74. private TProjectScoringMapper tProjectScoringMapper;
  75. @Override
  76. public List<ProjectApprovalVo> selectAllApprovalList(TProjectApproval tProjectApproval){
  77. return approvalMapper.selectAllApprovalList(tProjectApproval);
  78. }
  79. @Override
  80. public List<ProjectApprovalVo> getMyTaskList(String userId, TProjectApproval tProjectApproval){
  81. return approvalMapper.getMyTaskList(userId, tProjectApproval);
  82. }
  83. @Override
  84. public List<ProjectApprovalVo> getMyDoneTaskList(String userId, TProjectApproval tProjectApproval){
  85. return approvalMapper.getMyDoneTaskList(userId, tProjectApproval);
  86. }
  87. @Override
  88. public List<ProjectApprovalVo> getMyList(String userId,TProjectApproval tProjectApproval){
  89. return approvalMapper.getMyList(userId, tProjectApproval);
  90. }
  91. /**
  92. * 查询项目池
  93. *
  94. * @param pInstId 流程实例Id
  95. * @return 项目池
  96. */
  97. @Override
  98. public TProjectApproval selectTProjectApprovalByProcInstId(String pInstId)
  99. {
  100. return approvalMapper.selectTProjectApprovalByProcInstId(pInstId);
  101. }
  102. @Override
  103. public AjaxResult start(TProjectApproval tProjectApproval) {
  104. // 根据key值获取最新的流程部署id
  105. String pDefId = null;
  106. ProcessInstance pInst = null;
  107. try {
  108. List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
  109. .processDefinitionKey("dgt-project-workflow")
  110. .orderByProcessDefinitionVersion().desc().list();
  111. if(list.size()==0){
  112. return AjaxResult.error("未找到该流程,无法开启流程!");
  113. }
  114. pDefId = list.get(0).getId();
  115. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId)
  116. .latestVersion().singleResult();
  117. if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
  118. return AjaxResult.error("流程已被挂起,请先激活流程");
  119. }
  120. if(StringUtils.isNotBlank(pDefId)){
  121. //设置参数
  122. Map<String, Object> formProperties = new HashMap<String, Object>();
  123. // 设置流程发起人Id到流程中
  124. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  125. identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
  126. formProperties.put("auditPass",tProjectApproval.isFlag()?true:false);
  127. //暂存
  128. formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
  129. //投资部负责人
  130. String leader=sysDeptMapper.selectDeptLeader("投资部");
  131. formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
  132. pInst = runtimeService.startProcessInstanceById(pDefId, formProperties);
  133. // ProcessInstance p = runtimeService.startProcessInstanceById(procDefId, variables);
  134. if(pInst!=null){
  135. String nickName= SecurityUtils.getLoginUser().getUser().getNickName();
  136. String userId=SecurityUtils.getLoginUser().getUserId().toString();
  137. //保存信息
  138. tProjectApproval.setId(IdUtils.fastSimpleUUID());
  139. tProjectApproval.setProcInstId(pInst.getProcessInstanceId());
  140. tProjectApproval.setCreateBy(userId);
  141. if(tProjectApproval.isFlag()){
  142. tProjectApproval.setStatus(1);//提交
  143. }else{
  144. tProjectApproval.setStatus(0);//暂存
  145. }
  146. // todo 保存立项资料
  147. tUnifyFileService.insertTUnifyFileLists(tProjectApproval.getListFile(),
  148. tProjectApproval.getProjectPoolId(),
  149. tProjectApproval.getId(),
  150. String.valueOf(FileType.APPROVAL.ordinal()),
  151. nickName, "l","3");
  152. // todo 保存其他附件信息
  153. tUnifyFileService.insertTUnifyFileLists(tProjectApproval.getOtherFile(),
  154. tProjectApproval.getProjectPoolId(),
  155. tProjectApproval.getId(),
  156. String.valueOf(FileType.OTHER.ordinal()),
  157. nickName,"k","3");
  158. // todo 更改立项状态
  159. tProjectPoolService.updateTProjectPoolByApprovalFlag(tProjectApproval.getProjectPoolId(),"1");
  160. // todo 短信提醒
  161. /*if(StringUtils.isNotEmpty(tProjectApproval.getParticipantsId())){
  162. StringUtils.str2List(tProjectApproval.getParticipantsId(),",",true,true).stream().forEach(str -> {
  163. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  164. String contents = "您好,"+user.getNickName()+"," + tProjectApproval.getProjectName() + "已发起立项申请。";
  165. try {
  166. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  167. } catch (IOException e) {
  168. logger.error("短信发送失败"+e.getMessage());
  169. }
  170. });
  171. }*/
  172. // todo 增加项目创建记录
  173. tProjectCirculationService.insertTProjectCirculation(tProjectApproval.getProjectPoolId(),"立项申请",nickName);
  174. tProjectApprovalService.insertTProjectApproval(tProjectApproval);
  175. FlowBaseInfo flowBaseInfo = new FlowBaseInfo();
  176. flowBaseInfo.setCreateBy(userId);
  177. flowBaseInfo.setId(UUIDGenerator.uuid());
  178. flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst));
  179. flowBaseInfo.setProcDefId(pDefId);
  180. flowBaseInfo.setProcInsId(pInst.getId());
  181. flowBaseInfo.setTaskName("申请人");
  182. flowBaseInfo.setFlag(true);
  183. flowBaseInfo.setComment(tProjectApproval.isFlag() ? "[提交]" : "[暂存]");
  184. flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName());
  185. flowBaseInfo.setFlag(tProjectApproval.isFlag());
  186. activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo);
  187. TProjectPool tProjectPool=new TProjectPool();
  188. tProjectPool.setId(tProjectApproval.getProjectPoolId());
  189. tProjectPool.setProjectStage("3");//项目阶段-项目立项
  190. tProjectPool.setProjectState("d");//项目状态-项目立项
  191. tProjectPool.setProjectStatus("0");//项目机会状态-正常
  192. tProjectPoolService.updateTProjectPool(tProjectPool);
  193. if(flowBaseInfo.isFlag()){
  194. getAssignee(tProjectApproval,flowBaseInfo);
  195. }
  196. if (Objects.equals(active, "druid")) {
  197. //todo 短信
  198. sendMessage(flowBaseInfo,"");
  199. }
  200. return AjaxResult.success();
  201. }
  202. return AjaxResult.error();
  203. }
  204. return AjaxResult.error();
  205. } catch (Exception e) {
  206. /*res.put("status",false);
  207. res.put("msg", "流程定义id为空, 无法开启流程!");*/
  208. e.printStackTrace();
  209. return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!");
  210. }
  211. }
  212. @Override
  213. public AjaxResult complete(TProjectApproval tProjectApproval, TProjectMeeting tProjectMeeting,TProjectScoring tProjectScoring, FlowBaseInfo flow,HttpServletRequest request) throws Exception {
  214. //Task task=taskService.createTaskQuery().processInstanceId(tProjectApproval.getProcInstId()).singleResult();
  215. Task task = taskService.createTaskQuery().taskId(flow.getTaskId()).singleResult();
  216. if (Objects.isNull(task)) {
  217. return AjaxResult.error("任务不存在");
  218. }
  219. //当前你登录人
  220. SysUser userInfo=SecurityUtils.getLoginUser().getUser();
  221. Map<String, Object> rs = new HashMap<String, Object>();
  222. rs.put("status",true);
  223. Map<String, Object> formProperties = new HashMap<>();
  224. formProperties.put("auditPass", tProjectApproval.isFlag());
  225. //会议投决人
  226. if("meeting".equals(task.getTaskDefinitionKey())) {
  227. //立项审批人
  228. List<String> userIds = Arrays.asList(tProjectApproval.getParticipantsId().split(","));
  229. //List<String> userIds = Arrays.asList(tProjectMeeting.getParticipantsId().split(","));//会议人
  230. formProperties.put("decisionList", userIds);
  231. }
  232. if(StringUtils.isNotBlank(tProjectApproval.getIsTerminate())) {//不为空代表结束流程
  233. formProperties.put("whetherToEnd", true);
  234. }else{
  235. formProperties.put("whetherToEnd", false);
  236. }
  237. Map<String, Object> fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId());
  238. try {
  239. rs = flowService.taskComplete( task.getId(), tProjectApproval.isFlag(), formProperties, userInfo.getUserId().toString());
  240. } catch (Exception e) {
  241. e.printStackTrace();
  242. rs.put("status", false);
  243. rs.put("msg", "流程审批失败");
  244. }
  245. boolean status = (boolean) rs.get("status");
  246. // 审核成功, 则记录审核信息
  247. if (status) {
  248. TProjectPool tProjectPool=new TProjectPool();
  249. tProjectPool.setId(tProjectApproval.getProjectPoolId());
  250. if ("modifyApply".equals(task.getTaskDefinitionKey())) {
  251. // todo 立项申请报告
  252. tUnifyFileService.insertTUnifyFileLists(tProjectApproval.getListFile(),
  253. tProjectApproval.getProjectPoolId(),
  254. tProjectApproval.getId(),
  255. String.valueOf(FileType.APPROVAL.ordinal()),
  256. userInfo.getNickName(), "l", "3");
  257. // todo 保存其他附件信息
  258. tUnifyFileService.insertTUnifyFileLists(tProjectApproval.getOtherFile(),
  259. tProjectApproval.getProjectPoolId(),
  260. tProjectApproval.getId(),
  261. String.valueOf(FileType.OTHER.ordinal()),
  262. userInfo.getNickName(), "k", "3");
  263. }
  264. //发起会议
  265. if ("meeting".equals(task.getTaskDefinitionKey())) {
  266. if(tProjectMeeting!=null&&StringUtils.isNotBlank(tProjectMeeting.getId())){
  267. // todo 保存附件信息
  268. tUnifyFileService.insertTUnifyFileList(tProjectMeeting.getListFile(),
  269. tProjectMeeting.getProjectPoolId(),
  270. tProjectMeeting.getId(),//会议ID
  271. String.valueOf(FileType.MEETING.ordinal()),//文件类型:会议
  272. userInfo.getNickName());
  273. tProjectMeetingService.updateTProjectMeeting(tProjectMeeting);
  274. }else {
  275. if ("0".equals(tProjectApproval.getNeedMeeting())) {
  276. }
  277. tProjectMeeting.setId(IdUtils.fastSimpleUUID());
  278. tProjectMeeting.setCreateBy(userInfo.getNickName());
  279. tProjectMeeting.setProjectPoolId(tProjectApproval.getProjectPoolId());
  280. if (tProjectMeeting.getMeetingType().equals("LX") || tProjectMeeting.getMeetingType().equals("TJ")) {
  281. int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.lastTwoDigits() + "-");
  282. tProjectMeeting.setMeetingCode(tProjectMeeting.getProjectGroup() + "-" + DateUtils.lastTwoDigits() + "-" + tProjectMeeting.getMeetingType() + "-" + String.format("%03d", number + 1));
  283. } else {
  284. int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.dateTimeNow("YYYY"));
  285. tProjectMeeting.setMeetingCode(DateUtils.dateNow() + String.format("%03d", number + 1));
  286. }
  287. // todo 保存附件信息
  288. tUnifyFileService.insertTUnifyFileList(tProjectMeeting.getListFile(),
  289. tProjectMeeting.getProjectPoolId(),
  290. tProjectMeeting.getId(),//会议ID
  291. String.valueOf(FileType.MEETING.ordinal()),//文件类型:会议
  292. userInfo.getNickName());
  293. if(StringUtils.isNotBlank(tProjectMeeting.getMeetingTheme())){
  294. // todo 增加会议创建记录
  295. tProjectCirculationService.insertTProjectCirculation(tProjectMeeting.getProjectPoolId(), tProjectMeeting.getMeetingTheme() + "(会议)", userInfo.getNickName());
  296. }
  297. // todo 发送短信-参与人-发起人
  298. if (tProjectMeeting.getMeetingType().equals("LX") || tProjectMeeting.getMeetingType().equals("TJ")) {
  299. // todo 参与人
  300. /*if(StringUtils.isNotEmpty(tProjectMeeting.getParticipantsId())){
  301. StringUtils.str2List(tProjectMeeting.getParticipantsId(),",",true,true).stream().forEach(str -> {
  302. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  303. String contents = "您好," + user.getNickName() + ",兹定于 " +
  304. DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
  305. "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
  306. try {
  307. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  308. } catch (IOException e) {
  309. logger.error("短信发送失败"+e.getMessage());
  310. }
  311. });
  312. }*/
  313. // todo 发起人
  314. /*if(StringUtils.isNotEmpty(tProjectMeeting.getPromoterId())){
  315. SysUser user = sysUserService.selectUserById(Long.valueOf(tProjectMeeting.getPromoterId()));
  316. String contents = "您好," + user.getNickName() + ",兹定于 " +
  317. DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
  318. "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
  319. try {
  320. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  321. } catch (IOException e) {
  322. logger.error("短信发送失败"+e.getMessage());
  323. }
  324. }*/
  325. }
  326. tProjectMeetingService.insertTProjectMeeting(tProjectMeeting);
  327. }
  328. }
  329. //上传打分表
  330. if("decision".equals(task.getTaskDefinitionKey())){
  331. tProjectScoring.setCreateBy(userInfo.getNickName());
  332. tProjectScoring.setProjectPoolId(tProjectApproval.getProjectPoolId());
  333. // todo 增加项目创建记录
  334. tProjectCirculationService.insertTProjectCirculation(tProjectScoring.getProjectPoolId(),"上传打分表", userInfo.getNickName());
  335. tProjectScoringService.insertTProjectScoring(tProjectScoring);
  336. }
  337. if("industryResearch".equals(task.getTaskDefinitionKey())){
  338. // todo 保存项目行研报告
  339. tUnifyFileService.insertTUnifyFileLists(tProjectApproval.getListFile(),
  340. tProjectApproval.getProjectPoolId(),
  341. tProjectApproval.getId(),//附件业务Id
  342. String.valueOf(FileType.INDUSTRY.ordinal()),//文件类型:项目行研报告
  343. userInfo.getNickName(),"m","3");
  344. // todo 增加文件创建记录
  345. //tProjectCirculationService.insertTProjectCirculation(tProjectApproval.getProjectPoolId(),tProjectApproval.getListFile().get(0).getNewUploadName()+"(项目行研报告)",userInfo.getNickName());
  346. }
  347. if("technicalResearch".equals(task.getTaskDefinitionKey())){
  348. // todo 保存项目技术报告
  349. tUnifyFileService.insertTUnifyFileLists(tProjectApproval.getListFile(),
  350. tProjectApproval.getProjectPoolId(),
  351. tProjectApproval.getId(),//附件业务Id
  352. String.valueOf(FileType.TECHNICAL.ordinal()),//文件类型:项目技术报告
  353. userInfo.getNickName(),"n","3");
  354. // todo 增加文件创建记录
  355. //tProjectCirculationService.insertTProjectCirculation(tProjectApproval.getProjectPoolId(),tProjectApproval.getListFile().get(0).getNewUploadName()+"(项目技术报告)",userInfo.getNickName());
  356. }
  357. if("president".equals(task.getTaskDefinitionKey())){
  358. tProjectPool.setProjectStage("3");//项目阶段-项目立项
  359. tProjectPool.setProjectState("e");//项目状态-立项通过
  360. }
  361. //FlowBaseInfo flow = new FlowBaseInfo();
  362. if(flow==null){
  363. flow = new FlowBaseInfo();
  364. }
  365. flow.setId(UUIDGenerator.uuid());
  366. flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap()));
  367. flow.setStatus(FlowStatusEnum.RUNNING.getName());
  368. flow.setProcDefId(task.getProcessDefinitionId());
  369. flow.setProcInsId(task.getProcessInstanceId());
  370. flow.setTaskDefKey(task.getTaskDefinitionKey());
  371. String isOk = tProjectApproval.isFlag() ? "[同意]" : "[驳回]";
  372. if ("modifyApply".equals(task.getTaskDefinitionKey())) {
  373. tProjectApproval.setStatus(tProjectApproval.isFlag() ? 1 : 4);
  374. isOk = tProjectApproval.isFlag() ? "[提交]" : "[关闭]";
  375. } else {
  376. tProjectApproval.setStatus(tProjectApproval.isFlag() ? 2 : 0);
  377. if("president".equals(task.getTaskDefinitionKey())){//总裁室
  378. if(!tProjectApproval.isFlag()&&StringUtils.isNotBlank(tProjectApproval.getIsTerminate())){//如果不为空代表可能是驳回(终止)或者观望
  379. isOk= "[关闭]";
  380. }
  381. }
  382. }
  383. if (null != flow.getComment()) {
  384. flow.setComment(isOk + flow.getComment());
  385. } else {
  386. flow.setComment(isOk);
  387. }
  388. flow.setTaskName(task.getName());
  389. flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
  390. flow.setFlag(tProjectApproval.isFlag());
  391. ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult();
  392. String result="";
  393. // 表示流程已经审批结束了
  394. if (processInstance == null) {
  395. flow.setStatus(FlowStatusEnum.ENDED.getName());
  396. if (!"modifyApply".equals(task.getTaskDefinitionKey())) {
  397. if(tProjectApproval.isFlag()) {//审批通过
  398. tProjectApproval.setStatus(3);
  399. tProjectPool.setProjectStage("4");//项目阶段-尽调背调
  400. tProjectPool.setProjectState("f");//项目状态-尽调背调
  401. tProjectPool.setUpdateBy(userInfo.getNickName());
  402. tProjectPool.setProjectDate(new Date());//立项通过日期
  403. // todo 增加项目创建记录
  404. tProjectCirculationService.insertTProjectCirculation(tProjectPool.getId(), "项目立项完成", userInfo.getNickName());
  405. }else{//终止和观望
  406. if(StringUtils.isNotBlank(tProjectApproval.getIsTerminate())) {
  407. tProjectApproval.setStatus(4);//流程状态为关闭
  408. if ("1".equals(tProjectApproval.getIsTerminate())) {
  409. result="【终止】";
  410. tProjectPool.setProjectStatus("1");//终止
  411. } else {
  412. result="【观望】";
  413. tProjectPool.setProjectStatus("2");//观望
  414. }
  415. tProjectPool.setProjectStage("3");//项目阶段-项目立项
  416. tProjectPool.setProjectState("c");//项目状态-准备立项材料
  417. tProjectPool.setApprovalFlag("0");
  418. tProjectPool.setUpdateBy(userInfo.getNickName());
  419. }
  420. }
  421. }else{//暂存的关闭
  422. tProjectPool.setProjectStage("3");//项目阶段-项目立项
  423. tProjectPool.setProjectState("c");//项目状态-准备立项材料
  424. tProjectPool.setApprovalFlag("0");
  425. tProjectPool.setUpdateBy(userInfo.getNickName());
  426. }
  427. tProjectPoolService.updateTProjectPool(tProjectPool);
  428. }
  429. tProjectApprovalService.updateTProjectApproval(tProjectApproval);
  430. activitiBaseInfoService.addActivitiBaseInfo(flow);
  431. if(flow.isFlag()){
  432. getAssignee(tProjectApproval,flow);
  433. }
  434. if (Objects.equals(active, "druid")) {
  435. // todo 短信提醒
  436. sendMessage(flow,result);
  437. }
  438. }
  439. return AjaxResult.success();
  440. }
  441. public TProjectMeeting selectTProjectMeetingByProcInstId(String pInstId){
  442. TProjectApproval tProjectApproval=this.selectTProjectApprovalByProcInstId(pInstId);
  443. TProjectMeeting tProjectMeeting=null;
  444. if(tProjectApproval!=null){
  445. tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectApproval.getProjectPoolId());
  446. }
  447. return tProjectMeeting;
  448. }
  449. /**
  450. * 根据流程Id查询汇总分数和平均分数
  451. * @param pInstId
  452. * @return
  453. */
  454. @Override
  455. public Map<String, String> selectSumScore(String pInstId) {
  456. TProjectApproval tProjectApproval=this.selectTProjectApprovalByProcInstId(pInstId);
  457. Map<String, String> sumScore=new HashMap<>();
  458. if(tProjectApproval!=null){
  459. TProjectMeeting tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectApproval.getProjectPoolId());
  460. if(tProjectMeeting!=null) {
  461. sumScore = tProjectScoringMapper.selectMeetingId(tProjectMeeting.getId());
  462. }
  463. }
  464. return sumScore;
  465. }
  466. // todo 短信
  467. public void sendMessage(FlowBaseInfo flowBaseInfo,String result) {
  468. boolean flag = flowBaseInfo.isFlag();
  469. String procInsId = flowBaseInfo.getProcInsId();
  470. // 待办任务
  471. List<Task> tasks = taskService.createTaskQuery().processInstanceId(procInsId).list();
  472. // 对应业务单据
  473. ProjectApprovalVo projectApproval = approvalMapper.selectProjectApprovalByProcInstId(procInsId);
  474. if (projectApproval == null) {
  475. return;
  476. }
  477. // 申请人
  478. SysUser applyUserInfo = sysUserService.selectUserById(Long.valueOf(projectApproval.getCreateBy()));
  479. // 当前登录人
  480. SysUser loginUser = SecurityUtils.getLoginUser().getUser();
  481. if(tasks.size()>0) {
  482. for (int i = 0; i < tasks.size(); i++) {
  483. Task task = tasks.get(i);
  484. if (task != null) {
  485. if (Objects.equals(applyUserInfo.getUserId(), loginUser.getUserId()) && !flag) {
  486. // 如果是申请人暂存或者关闭或者自己驳回,不用给自己发审批短信
  487. } else {
  488. // 申请人提交,给下一个审批人发短信
  489. // 审批人同意,给下一个审批人发短信
  490. if (flag) { //给审批人发送短信
  491. if (tasks.size()<2
  492. &&("industryResearch".equals(task.getTaskDefinitionKey())||"technicalResearch".equals(task.getTaskDefinitionKey()))){
  493. continue;
  494. }
  495. String assignee = task.getAssignee();
  496. if (org.apache.commons.lang3.StringUtils.isNotBlank(assignee)) { // 给审批人发送短信
  497. SysUser auditUser = sysUserService.selectUserById(Long.valueOf(assignee));
  498. String auditContents = auditUser.getNickName() + ",您好。投资系统中" + projectApproval.getProjectName() + "的项目立项流程待处理,请查看!";
  499. if (auditUser != null && StringUtils.isNotBlank(auditUser.getPhonenumber())) {
  500. try{
  501. SmsSenderUtils.sendSms(auditUser.getPhonenumber(), auditContents);
  502. } catch (IOException e) {
  503. logger.error("短信发送失败"+e.getMessage());
  504. }
  505. }
  506. }
  507. } else { // 审批人驳回,给申请人发短信
  508. String rejectContents = applyUserInfo.getNickName()+",您好。你在投资系统中提交" + projectApproval.getProjectName() + "的项目立项申请已审核,结果为【驳回】,请查看!";
  509. if (applyUserInfo != null && StringUtils.isNotBlank(applyUserInfo.getPhonenumber())) {
  510. try{
  511. SmsSenderUtils.sendSms(applyUserInfo.getPhonenumber(), rejectContents);
  512. } catch (IOException e) {
  513. logger.error("短信发送失败"+e.getMessage());
  514. }
  515. }
  516. }
  517. }
  518. }
  519. }
  520. }else{
  521. String completeContents ="";
  522. if(flag) {
  523. // 审批完成,给申请人发短信
  524. //XXX,您好。你在投资系统中提交“XXX”的项目立项申请已审核,结果为【通过】/【驳回】/【观望】!
  525. completeContents = applyUserInfo.getNickName()+",您好。你在投资系统中提交" + projectApproval.getProjectName() + "的项目立项申请已审核,结果为【同意】,请查看!";
  526. if (applyUserInfo != null && StringUtils.isNotBlank(applyUserInfo.getPhonenumber())) {
  527. try{
  528. SmsSenderUtils.sendSms(applyUserInfo.getPhonenumber(), completeContents);
  529. } catch (IOException e) {
  530. logger.error("短信发送失败"+e.getMessage());
  531. }
  532. }
  533. }else{
  534. if(StringUtils.isNotEmpty(result)){//代表是终止或者观望
  535. completeContents = applyUserInfo.getNickName()+",您好。你在投资系统中提交" + projectApproval.getProjectName() + "的项目立项申请已审核,结果为"+result+",请查看!";
  536. if (applyUserInfo != null && StringUtils.isNotBlank(applyUserInfo.getPhonenumber())) {
  537. try{
  538. SmsSenderUtils.sendSms(applyUserInfo.getPhonenumber(), completeContents);
  539. } catch (IOException e) {
  540. logger.error("短信发送失败"+e.getMessage());
  541. }
  542. }
  543. }
  544. }
  545. }
  546. }
  547. /**
  548. * 跳节点
  549. * @param projectApproval
  550. * @param flow
  551. * @throws Exception
  552. */
  553. public void getAssignee(TProjectApproval projectApproval, FlowBaseInfo flow) throws Exception {
  554. SysUser sysUser=SecurityUtils.getLoginUser().getUser();//当前登陆人
  555. if (sysUser == null) {
  556. sysUser=sysUserService.selectUserById(Long.parseLong(projectApproval.getCreateBy()));
  557. }
  558. //Task task = taskService.createTaskQuery().processInstanceId(flow.getProcInsId()).singleResult();
  559. List<Task> tasks = taskService.createTaskQuery().processInstanceId(flow.getProcInsId()).list();
  560. Long userId=sysUser.getUserId();
  561. for(int i = 0; i < tasks.size(); i++) {
  562. Task task = tasks.get(i);
  563. if (task == null || StringUtils.isBlank(task.getAssignee())) {
  564. return;
  565. }
  566. Long assignee = Long.parseLong(task.getAssignee());
  567. if ("deptLeader".equals(task.getTaskDefinitionKey()) && (userId.equals(assignee) || projectApproval.getCreateBy().equals(assignee))) {
  568. JumpNode(projectApproval, flow);
  569. }
  570. }
  571. }
  572. public Map<String, Object> JumpNode(TProjectApproval projectApproval, FlowBaseInfo flow) throws Exception{
  573. List<Task> list = taskService.createTaskQuery().processInstanceId(flow.getProcInsId()).list();
  574. String taskId=null;
  575. Map<String, Object> rs = new HashMap<String, Object>();
  576. rs.put("status",true);
  577. if (list.size()>0) {
  578. taskId = list.get(0).getId();
  579. flow.setTaskId(taskId);
  580. boolean flag = flow.isFlag();
  581. //当前流程节点Id信息
  582. // ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(flow.getProcInsId()).singleResult();
  583. // String activitiId = execution.getActivityId();
  584. Map<String, Object> formProperties = new HashMap<>();
  585. formProperties.put("auditPass", flow.isFlag());
  586. //投资部负责人
  587. String leader=sysDeptMapper.selectDeptLeader("投资部");
  588. formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
  589. if(StringUtils.isNotBlank(projectApproval.getIsTerminate())) {//不为空代表结束流程
  590. formProperties.put("whetherToEnd", true);
  591. }else{
  592. formProperties.put("whetherToEnd", false);
  593. }
  594. //当前登陆人
  595. Long userId=SecurityUtils.getUserId();
  596. try {
  597. //表单审核
  598. rs = flowService.taskComplete(taskId, flag, formProperties, userId.toString());
  599. } catch (Exception e) {
  600. e.printStackTrace();
  601. rs.put("status", false);
  602. rs.put("msg", "流程审批失败");
  603. }
  604. if (flow.isFlag()){
  605. getAssignee(projectApproval,flow);
  606. }
  607. }
  608. return rs;
  609. }
  610. }