package com.ruoyi.flowable.service.impl; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.enums.FileType; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.sms.SmsSenderUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.flowable.common.constant.ProcessConstants; import com.ruoyi.flowable.common.constant.UUIDGenerator; import com.ruoyi.flowable.common.enums.FlowStatusEnum; import com.ruoyi.flowable.factory.FlowServiceFactory; import com.ruoyi.flowable.service.IFlowInstanceService; import com.ruoyi.flowable.service.IFlowService; import com.ruoyi.flowable.service.IInvestigateService; import com.ruoyi.invest.domain.*; import com.ruoyi.invest.domain.vo.ProjectInvestigateVo; import com.ruoyi.invest.mapper.InvestigateMapper; import com.ruoyi.invest.mapper.TProjectScoringMapper; import com.ruoyi.invest.service.*; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.tool.service.ITUnifyFileService; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.*; /** * 项目池Service业务层处理 * * @author ruoyi * @date 2024-02-21 */ @Service public class InvestigateServiceImpl extends FlowServiceFactory implements IInvestigateService { @Autowired private InvestigateMapper investigateMapper; @Autowired private ITProjectInvestigateService tProjectInvestigateService; @Autowired private ITProjectInvestigatePersonService tProjectInvestigatePersonService; @Autowired private ITProjectPoolService tProjectPoolService; @Autowired private ITProjectCirculationService tProjectCirculationService; @Autowired private ITUnifyFileService tUnifyFileService; @Autowired private IFlowBaseInfoService activitiBaseInfoService; @Autowired private IFlowInstanceService flowInstanceService; @Autowired private ISysUserService sysUserService; @Autowired private SysDeptMapper sysDeptMapper; @Autowired private IFlowService flowService; @Autowired private TProjectScoringMapper tProjectScoringMapper; @Override public List getMyTaskList(String userId, TProjectInvestigate tProjectInvestigate){ return investigateMapper.getMyTaskList(userId, tProjectInvestigate); } @Override public List getMyDoneTaskList(String userId, TProjectInvestigate tProjectInvestigate){ return investigateMapper.getMyDoneTaskList(userId, tProjectInvestigate); } @Override public List getMyList(String userId,TProjectInvestigate tProjectInvestigate){ return investigateMapper.getMyList(userId, tProjectInvestigate); } /** * 查询项目池 * * @param pInstId 流程实例Id * @return 项目池 */ @Override public TProjectInvestigate selectTProjectInvestigateByProcInstId(String pInstId) { return investigateMapper.selectTProjectInvestigateByProcInstId(pInstId); } @Override public AjaxResult start(TProjectInvestigate tProjectInvestigate) { // 根据key值获取最新的流程部署id String pDefId = null; ProcessInstance pInst = null; try { List list = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("dgt-due-workflow") .orderByProcessDefinitionVersion().desc().list(); if(list.size()==0){ return AjaxResult.error("未找到该流程,无法开启流程!"); } pDefId = list.get(0).getId(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId) .latestVersion().singleResult(); if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { return AjaxResult.error("流程已被挂起,请先激活流程"); } if(StringUtils.isNotBlank(pDefId)){ //设置参数 Map formProperties = new HashMap(); // 设置流程发起人Id到流程中 SysUser sysUser = SecurityUtils.getLoginUser().getUser(); identityService.setAuthenticatedUserId(sysUser.getUserId().toString()); formProperties.put("auditPass",tProjectInvestigate.isFlag()?true:false); //暂存 formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId()); //投资部负责人 String leader=sysDeptMapper.selectDeptLeader("投资部"); formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId()); //尽职背调上传人 List userIds = Arrays.asList(tProjectInvestigate.getInvestigatePersonId().split(",")); formProperties.put("uploadList", userIds); pInst = runtimeService.startProcessInstanceById(pDefId, formProperties); if(pInst!=null){ String nickName= SecurityUtils.getLoginUser().getUser().getNickName(); String userId=SecurityUtils.getLoginUser().getUserId().toString(); //保存信息 tProjectInvestigate.setId(IdUtils.fastSimpleUUID()); tProjectInvestigate.setProcInstId(pInst.getProcessInstanceId()); tProjectInvestigate.setCreateBy(userId); if(tProjectInvestigate.isFlag()){ //tProjectInvestigate.setStatus(1);//提交 }else{ //tProjectInvestigate.setStatus(0);//暂存 } // todo 保存尽职背调附件信息 tUnifyFileService.insertTUnifyFileList(tProjectInvestigate.getListFile(), tProjectInvestigate.getProjectPoolId(), tProjectInvestigate.getId(),//尽调ID String.valueOf(FileType.INVESTIGATE.ordinal()),//文件类型:尽调 nickName); // todo 增加尽调创建记录 tProjectCirculationService.insertTProjectCirculation(tProjectInvestigate.getProjectPoolId(),tProjectInvestigate.getInvestigateName()+"(尽职背调)",nickName); // todo 更改尽调状态 tProjectPoolService.updateTProjectPoolByInvestigateFlag(tProjectInvestigate.getProjectPoolId(),"1"); // todo 短信提醒 /*if(StringUtils.isNotEmpty(tProjectInvestigate.getInvestigatePersonId())){ StringUtils.str2List(tProjectInvestigate.getInvestigatePersonId(),",",true,true).stream().forEach(str -> { SysUser user = sysUserService.selectUserById(Long.valueOf(str)); String contents = "您好,"+user.getNickName()+"," + tProjectInvestigate.getProjectName() + "已开启尽职背调。"; try { SmsSenderUtils.sendSms(user.getPhonenumber(),contents); } catch (IOException e) { logger.error("短信发送失败"+e.getMessage()); } }); }*/ tProjectInvestigateService.insertTProjectInvestigate(tProjectInvestigate); FlowBaseInfo flowBaseInfo = new FlowBaseInfo(); flowBaseInfo.setCreateBy(userId); flowBaseInfo.setId(UUIDGenerator.uuid()); flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst)); flowBaseInfo.setProcDefId(pDefId); flowBaseInfo.setProcInsId(pInst.getId()); flowBaseInfo.setTaskName("申请人"); flowBaseInfo.setFlag(true); flowBaseInfo.setComment(tProjectInvestigate.isFlag() ? "[提交]" : "[暂存]"); flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName()); activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo); TProjectPool tProjectPool=new TProjectPool(); tProjectPool.setId(tProjectInvestigate.getProjectPoolId()); tProjectPool.setProjectStage("4");//项目阶段-尽职背调 tProjectPool.setProjectState("f");//项目状态-尽职背调 tProjectPoolService.updateTProjectPool(tProjectPool); return AjaxResult.success(); } return AjaxResult.error(); } return AjaxResult.error(); } catch (Exception e) { /*res.put("status",false); res.put("msg", "流程定义id为空, 无法开启流程!");*/ e.printStackTrace(); return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!"); } } @Override public AjaxResult complete(TProjectInvestigate tProjectInvestigate, TProjectInvestigatePerson tProjectInvestigatePerson, FlowBaseInfo flow,HttpServletRequest request){ //Task task=taskService.createTaskQuery().processInstanceId(tProjectApproval.getProcInstId()).singleResult(); Task task = taskService.createTaskQuery().taskId(flow.getTaskId()).singleResult(); if (Objects.isNull(task)) { return AjaxResult.error("任务不存在"); } //当前你登录人 SysUser userInfo=SecurityUtils.getLoginUser().getUser(); Map rs = new HashMap(); rs.put("status",true); Map formProperties = new HashMap<>(); formProperties.put("auditPass", tProjectInvestigate.isFlag()); //尽职背调上传人 if("modifyApply".equals(task.getTaskDefinitionKey())) { //尽职背调上传人 List userIds = Arrays.asList(tProjectInvestigate.getInvestigatePersonId().split(",")); formProperties.put("uploadList", userIds); } Map fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId()); try { rs = flowService.taskComplete( task.getId(), tProjectInvestigate.isFlag(), formProperties, userInfo.getUserId().toString()); } catch (Exception e) { e.printStackTrace(); rs.put("status", false); rs.put("msg", "流程审批失败"); } boolean status = (boolean) rs.get("status"); // 审核成功, 则记录审核信息 if (status) { TProjectPool tProjectPool=new TProjectPool(); tProjectPool.setId(tProjectInvestigate.getProjectPoolId()); // todo 保存尽职背调资料 tUnifyFileService.insertTUnifyFileList(tProjectInvestigate.getListFile(), tProjectInvestigate.getProjectPoolId(), tProjectInvestigate.getId(), String.valueOf(FileType.INVESTIGATE.ordinal()), userInfo.getNickName()); //上传尽职背调报告 if ("upload".equals(task.getTaskDefinitionKey())) { if(StringUtils.isNull(tProjectInvestigatePerson.getId())){ tProjectInvestigatePerson.setId(IdUtils.fastSimpleUUID()); } tProjectInvestigatePerson.setInvestigatePerson(userInfo.getNickName()); tProjectInvestigatePerson.setInvestigatePersonId(userInfo.getUserId().toString()); tProjectInvestigatePerson.setDeptId(userInfo.getDeptId()); // todo 保存附件信息 tUnifyFileService.insertTUnifyFileList(tProjectInvestigatePerson.getListFile(), tProjectInvestigatePerson.getProjectPoolId(), tProjectInvestigatePerson.getId(),//尽调ID String.valueOf(FileType.INVESTIGATE.ordinal()),//文件类型:尽调 userInfo.getNickName()); // todo 增加项目创建记录 tProjectCirculationService.insertTProjectCirculation(tProjectInvestigatePerson.getProjectPoolId(),"上传尽调报告", userInfo.getNickName()); tProjectInvestigatePersonService.insertTProjectInvestigatePerson(tProjectInvestigatePerson); } if("president".equals(task.getTaskDefinitionKey())){ // tProjectPool.setProjectStage("5");//项目阶段-项目投决 // tProjectPool.setProjectState("i");//项目状态-项目投决通过 } //FlowBaseInfo flow = new FlowBaseInfo(); if(flow==null){ flow = new FlowBaseInfo(); } flow.setId(UUIDGenerator.uuid()); flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap())); flow.setStatus(FlowStatusEnum.RUNNING.getName()); flow.setProcDefId(task.getProcessDefinitionId()); flow.setProcInsId(task.getProcessInstanceId()); flow.setTaskDefKey(task.getTaskDefinitionKey()); String isOk = tProjectInvestigate.isFlag() ? "[同意]" : "[驳回]"; if ("modifyApply".equals(task.getTaskDefinitionKey())) { tProjectInvestigate.setStatus(tProjectInvestigate.isFlag() ? 1 : 4); isOk = tProjectInvestigate.isFlag() ? "[提交]" : "[关闭]"; } else { tProjectInvestigate.setStatus(tProjectInvestigate.isFlag() ? 2 : 0); } if (null != flow.getComment()) { flow.setComment(isOk + flow.getComment()); } else { flow.setComment(isOk); } flow.setTaskName(task.getName()); flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString()); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult(); // 表示流程已经审批结束了 if (processInstance == null) { flow.setStatus(FlowStatusEnum.ENDED.getName()); if (!"modifyApply".equals(task.getTaskDefinitionKey())&&!"president".equals(task.getTaskDefinitionKey())) { tProjectInvestigate.setStatus(3); tProjectPool.setProjectStage("5");//项目阶段-项目投决 tProjectPool.setProjectState("h");//项目状态-准备项目投决材料 tProjectPool.setUpdateBy(userInfo.getNickName()); //tProjectPool.setInvestigateDate(new Date());//投决通过日期 }else{ tProjectPool.setProjectStage("4");//项目阶段-尽职背调 tProjectPool.setProjectState("f");//项目状态-尽职背调 tProjectPool.setInvestigateFlag("0"); tProjectPool.setUpdateBy(userInfo.getNickName()); } tProjectPoolService.updateTProjectPool(tProjectPool); } tProjectInvestigateService.updateTProjectInvestigate(tProjectInvestigate); activitiBaseInfoService.addActivitiBaseInfo(flow); } return AjaxResult.success(); } public TProjectMeeting selectTProjectMeetingByProcInstId(String pInstId){ TProjectInvestigate tProjectInvestigate=this.selectTProjectInvestigateByProcInstId(pInstId); TProjectMeeting tProjectMeeting=null; if(tProjectInvestigate!=null){ //tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectInvestigate.getProjectPoolId()); } return tProjectMeeting; } /** * 根据流程Id查询汇总分数和平均分数 * @param pInstId * @return */ @Override public Map selectSumScore(String pInstId) { TProjectInvestigate tProjectInvestigate=this.selectTProjectInvestigateByProcInstId(pInstId); Map sumScore=new HashMap<>(); if(tProjectInvestigate!=null){ //TProjectMeeting tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectInvestigate.getProjectPoolId()); //sumScore=tProjectScoringMapper.selectMeetingId(tProjectMeeting.getId()); } return sumScore; } }