| | |
| | | package com.ycl.service.impl; |
| | | |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | |
| | | import com.ycl.common.constant.ProcessConstants; |
| | | import com.ycl.common.constant.ProcessOverTimeConstants; |
| | | import com.ycl.common.core.domain.entity.SysDept; |
| | | import com.ycl.common.core.domain.entity.SysDictData; |
| | | import com.ycl.common.core.domain.entity.SysRole; |
| | | import com.ycl.common.core.domain.entity.SysUser; |
| | | import com.ycl.common.enums.business.HandlerTypeEnum; |
| | | import com.ycl.common.enums.business.ProcessLogEventTypeEnum; |
| | | import com.ycl.common.enums.business.SuperviseTypeEnum; |
| | | import com.ycl.common.enums.business.TaskStatusEnum; |
| | | import com.ycl.common.enums.business.*; |
| | | import com.ycl.common.utils.SecurityUtils; |
| | | import com.ycl.constant.TaskTypeConstant; |
| | | import com.ycl.domain.entity.*; |
| | | import com.ycl.domain.form.TaskDelegationForm; |
| | | import com.ycl.domain.form.TaskJumpForm; |
| | | import com.ycl.domain.form.TaskSuperviseForm; |
| | | import com.ycl.domain.json.DelegateData; |
| | | import com.ycl.domain.json.JumpData; |
| | | import com.ycl.domain.json.SuperviseData; |
| | | import com.ycl.domain.form.*; |
| | | import com.ycl.domain.json.*; |
| | | import com.ycl.domain.vo.CustomerTaskVO; |
| | | import com.ycl.domain.vo.IndexCustomerTaskVO; |
| | | import com.ycl.domain.vo.ProjectProcessDetailVO; |
| | |
| | | import com.ycl.service.*; |
| | | import com.ycl.common.base.Result; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ycl.domain.form.ProjectProcessForm; |
| | | import com.ycl.domain.vo.ProjectProcessVO; |
| | | import com.ycl.domain.query.ProjectProcessQuery; |
| | | import com.ycl.service.common.TaskCommonService; |
| | | import com.ycl.system.service.ISysDeptService; |
| | | import com.ycl.system.service.ISysDictTypeService; |
| | | import com.ycl.system.service.ISysRoleService; |
| | | import com.ycl.system.service.ISysUserService; |
| | | import lombok.Synchronized; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.flowable.bpmn.model.*; |
| | | import org.flowable.bpmn.model.Process; |
| | |
| | | private final ApplicationEventPublisher publisher; |
| | | private final ISysDeptService deptService; |
| | | private final ProcessLogService processLogService; |
| | | private final ISysDictTypeService dictTypeService; |
| | | |
| | | /** |
| | | * 分页查询 |
| | |
| | | } |
| | | } |
| | | ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper) |
| | | .select(ProjectInfo::getCreateBy) |
| | | .select(ProjectInfo::getProjectOwnerUnit) |
| | | .eq(ProjectInfo::getId, form.getProjectId()) |
| | | .one(); |
| | | if (Objects.isNull(project)) { |
| | | throw new RuntimeException("项目不存在"); |
| | | } |
| | | SysUser user = sysUserService.selectUserById(project.getCreateBy()); |
| | | if (Objects.isNull(user)) { |
| | | SysDept dept = deptService.selectDeptById(project.getProjectOwnerUnit()); |
| | | if (Objects.isNull(dept)) { |
| | | throw new RuntimeException("项目业主单位不存在"); |
| | | } |
| | | String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId(), user.getDeptId()); |
| | | String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId(), dept.getDeptId()); |
| | | new LambdaUpdateChainWrapper<>(baseMapper) |
| | | .eq(ProjectProcess::getProjectId, form.getProjectId()) |
| | | .set(ProjectProcess::getProcessDefId, form.getProcessDefId()) |
| | | .set(ProjectProcess::getProcessInsId, processInsId) |
| | | .set(ProjectProcess::getDataLaunch, project.getCreateBy()) |
| | | .set(ProjectProcess::getDataLaunch, project.getProjectOwnerUnit()) |
| | | .update(); |
| | | |
| | | return Result.ok("流程变更成功"); |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result startProcess(Long projectId, String processDefId) { |
| | | ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper) |
| | | .select(ProjectInfo::getCreateBy) |
| | | .eq(ProjectInfo::getId, projectId) |
| | | .one(); |
| | | ProjectInfo project = projectInfoMapper.selectById(projectId); |
| | | if (Objects.isNull(project)) { |
| | | throw new RuntimeException("项目不存在"); |
| | | } |
| | | SysUser user = sysUserService.selectUserById(project.getCreateBy()); |
| | | if (Objects.isNull(user)) { |
| | | SysDept dept = deptService.selectDeptById(project.getProjectOwnerUnit()); |
| | | if (Objects.isNull(dept)) { |
| | | throw new RuntimeException("项目业主单位不存在"); |
| | | } |
| | | String processInsId = this.startPro(projectId, processDefId, user.getDeptId()); |
| | | String processInsId = this.startPro(projectId, processDefId, dept.getDeptId()); |
| | | ProjectProcess entity = new ProjectProcess(); |
| | | entity.setProjectId(projectId); |
| | | entity.setProcessDefId(processDefId); |
| | | entity.setProcessInsId(processInsId); |
| | | entity.setDataLaunch(project.getCreateBy()); |
| | | entity.setDataLaunch(project.getProjectOwnerUnit()); |
| | | baseMapper.insert(entity); |
| | | |
| | | return Result.ok("流程启动成功"); |
| | |
| | | .processDefinitionId(task.getProcessDefinitionId()) |
| | | .singleResult(); |
| | | taskVO.setDeployId(pd.getDeploymentId()); |
| | | taskVO.setProcessName(pd.getName()); |
| | | taskVO.setProcessName(pd.getName() + "(v" + pd.getVersion() + ")"); |
| | | taskVO.setProcessInsId(task.getProcessInstanceId()); |
| | | taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 检查是否挂起 |
| | | if (processLogService.taskIsHangup(task.getId(), task.getProcessInstanceId())) { |
| | | taskVO.setTaskStatus(TaskStatusEnum.HANGUP); |
| | | } |
| | | this.distinctVo(taskVO); |
| | | vos.add(taskVO); |
| | | } |
| | |
| | | jsonData.setAfterHandlerIds(afterHandlerIds); |
| | | jsonData.setAfterHandlerType(form.getPeopleType()); |
| | | // 发布转办事件 |
| | | publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), ProcessLogEventTypeEnum.DELEGATE, jsonData)); |
| | | publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), task.getName(),ProcessLogEventTypeEnum.DELEGATE, jsonData)); |
| | | |
| | | return Result.ok("转办成功"); |
| | | } |
| | |
| | | Task task = taskService.createTaskQuery().taskId(form.getTaskId()).processInstanceId(form.getProcessInsId()).singleResult(); |
| | | if (Objects.nonNull(task)) { |
| | | // 添加跳过日志 |
| | | publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc()))); |
| | | publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(),ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc()))); |
| | | // 查出该任务绑定的表单 |
| | | |
| | | Map<String, Object> data = new HashMap<>(1); |
| | |
| | | |
| | | @Override |
| | | public Result taskSupervise(TaskSuperviseForm form) { |
| | | Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); |
| | | SuperviseData jsonData = new SuperviseData(); |
| | | jsonData.setCreateTime(new Date()); |
| | | jsonData.setContent(form.getContent()); |
| | |
| | | } |
| | | dataList.add(jsonData); |
| | | //添加督办日志 |
| | | publisher.publishEvent(new TaskLogEvent(this, processLog.getId(), processLog.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), ProcessLogEventTypeEnum.SUPERVISE, dataList)); |
| | | publisher.publishEvent(new TaskLogEvent(this, processLog.getId(), processLog.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(),ProcessLogEventTypeEnum.SUPERVISE, dataList)); |
| | | return Result.ok("操作成功"); |
| | | } |
| | | |
| | | @Override |
| | | @Synchronized |
| | | public Result taskHangup(TaskHangupForm form) { |
| | | Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); |
| | | if (Objects.isNull(task)) { |
| | | throw new RuntimeException("任务不存在"); |
| | | } |
| | | List<ProcessLog> logs = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) |
| | | .eq(ProcessLog::getTaskId, form.getTaskId()) |
| | | .eq(ProcessLog::getProcessInsId, form.getProcessInsId()) |
| | | .eq(ProcessLog::getProjectId, form.getProjectId()) |
| | | .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.HANGUP, ProcessLogEventTypeEnum.CANCEL_HANGUP) |
| | | .list(); |
| | | if (logs.size() % 2 != 0) { |
| | | throw new RuntimeException("该任务正在挂起中,不能再次挂起"); |
| | | } |
| | | // 任务挂起只需要存日志,查询待办时如果有这个日志记录,则禁用提交按钮,以此实现任务挂起 |
| | | publisher.publishEvent(new TaskLogEvent(this, |
| | | null, |
| | | SecurityUtils.getUserId(), |
| | | form.getProjectId(), |
| | | form.getProcessInsId(), |
| | | form.getTaskId(), |
| | | task.getName(), |
| | | ProcessLogEventTypeEnum.HANGUP, |
| | | new HangupData(form.getReason()) |
| | | )); |
| | | return Result.ok("操作成功"); |
| | | } |
| | | |
| | | @Override |
| | | @Synchronized |
| | | public Result cancelTaskHangup(TaskHangupForm form) { |
| | | Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); |
| | | if (Objects.isNull(task)) { |
| | | throw new RuntimeException("任务不存在"); |
| | | } |
| | | List<ProcessLog> logs = new LambdaQueryChainWrapper<>(processLogService.getBaseMapper()) |
| | | .eq(ProcessLog::getTaskId, form.getTaskId()) |
| | | .eq(ProcessLog::getProcessInsId, form.getProcessInsId()) |
| | | .eq(ProcessLog::getProjectId, form.getProjectId()) |
| | | .in(ProcessLog::getEventType, ProcessLogEventTypeEnum.HANGUP, ProcessLogEventTypeEnum.CANCEL_HANGUP) |
| | | .list(); |
| | | if (logs.size() % 2 == 0) { |
| | | throw new RuntimeException("该任务未被挂起,不能取消挂起"); |
| | | } |
| | | publisher.publishEvent(new TaskLogEvent(this, |
| | | null, |
| | | SecurityUtils.getUserId(), |
| | | form.getProjectId(), |
| | | form.getProcessInsId(), |
| | | form.getTaskId(), |
| | | task.getName(), |
| | | ProcessLogEventTypeEnum.CANCEL_HANGUP, |
| | | new HangupData(form.getReason()) |
| | | )); |
| | | return Result.ok("操作成功"); |
| | | } |
| | | |
| | | @Override |
| | | public Result taskTeamwork(TaskTeamWorkForm form) { |
| | | Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); |
| | | if (Objects.isNull(task)) { |
| | | return Result.error("任务不存在"); |
| | | } |
| | | ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(projectProcessMapper) |
| | | .eq(ProjectProcess::getProcessInsId, task.getProcessInstanceId()) |
| | | .eq(ProjectProcess::getProcessDefId, task.getProcessDefinitionId()) |
| | | .one(); |
| | | if (Objects.isNull(projectProcess)) { |
| | | return Result.error("项目流程未绑定"); |
| | | } |
| | | // 1. 保存发起人填写的表单数据,但不直接完成该任务。提交后任务处理人必须等到协同人处理完之后才能完成任务 |
| | | Map<String, Object> processVariables = new HashMap<>(); |
| | | //查出字典中需要注入的字段信息 |
| | | List<String> dictList = dictTypeService.selectDictDataByType("flow_variables").stream().map(SysDictData::getDictValue).collect(Collectors.toList()); |
| | | Map<String, Object> newV = new HashMap<>(2); |
| | | if (!org.springframework.util.CollectionUtils.isEmpty(form.getVariables())) { |
| | | for (String key : form.getVariables().keySet()) { |
| | | newV.put(task.getTaskDefinitionKey() + "&" + key, form.getVariables().get(key)); |
| | | //字典里有就放入流程变量中 |
| | | if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(dictList) && dictList.contains(key)) { |
| | | processVariables.put(key,form.getVariables().get(key)); |
| | | } |
| | | } |
| | | } |
| | | if( !processVariables.isEmpty() ) { |
| | | taskService.setVariables(form.getTaskId(), processVariables); |
| | | } |
| | | |
| | | // 2. 保存日志 |
| | | publisher.publishEvent(new TaskLogEvent(this, |
| | | null, |
| | | SecurityUtils.getUserId(), |
| | | form.getProjectId(), |
| | | form.getProcessInsId(), |
| | | form.getTaskId(), |
| | | task.getName(), |
| | | ProcessLogEventTypeEnum.TEAM_WORK, |
| | | new TeamWorkData(form.getHandlerType(), form.getHandlerIds(), TeamWorkStatusEnum.NOT_FINISHED) |
| | | )); |
| | | return Result.ok("操作成功"); |
| | | } |
| | | |
| | |
| | | for (Task task : taskList) { |
| | | CustomerTaskVO taskVO = new CustomerTaskVO(); |
| | | this.setRuntimeTaskInfo(task, taskVO, projectId); |
| | | // 检查是否挂起 |
| | | if (processLogService.taskIsHangup(task.getId(), task.getProcessInstanceId())) { |
| | | taskVO.setTaskStatus(TaskStatusEnum.HANGUP); |
| | | } |
| | | vos.add(taskVO); |
| | | } |
| | | result.put("taskList", vos); |