From 6fbfdf4c73f9673adb7e2777e83565195568f7a8 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期四, 28 十一月 2024 06:04:16 +0800 Subject: [PATCH] 完善流程(表单回显接口)、项目流程表增加流程实例id字段、流程推进详情接口 --- flowable/src/main/java/com/ycl/service/IFlowTaskService.java | 10 + business/src/main/java/com/ycl/domain/vo/ProjectProcessDetailVO.java | 86 ++++++++++ business/src/main/java/com/ycl/domain/entity/ProjectProcess.java | 5 business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java | 20 +- flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java | 28 +++ business/src/main/java/com/ycl/controller/ProjectProcessController.java | 21 + start/src/main/resources/application.yml | 20 +- flowable/src/main/java/com/ycl/common/enums/FlowComment.java | 3 flowable/src/main/java/com/ycl/controller/FlowTaskController.java | 14 + business/src/main/resources/mapper/ProjectProcessMapper.xml | 1 business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 253 ++++++++++++++++++++++++++++++- business/src/main/java/com/ycl/service/ProjectProcessService.java | 16 + business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java | 3 13 files changed, 437 insertions(+), 43 deletions(-) diff --git a/business/src/main/java/com/ycl/controller/ProjectProcessController.java b/business/src/main/java/com/ycl/controller/ProjectProcessController.java index 40e3749..9024cbf 100644 --- a/business/src/main/java/com/ycl/controller/ProjectProcessController.java +++ b/business/src/main/java/com/ycl/controller/ProjectProcessController.java @@ -34,7 +34,7 @@ @PostMapping("/page") @ApiOperation(value = "鍒嗛〉", notes = "鍒嗛〉") - @PreAuthorize("@ss.hasPermi('projectProcess:page')") +// @PreAuthorize("@ss.hasPermi('projectProcess:page')") public Result page(ProjectProcessQuery query) { return projectProcessService.page(query); } @@ -42,16 +42,23 @@ @PostMapping("/set") @ApiOperation(value = "椤圭洰璁剧疆娴佺▼", notes = "椤圭洰璁剧疆娴佺▼") - @PreAuthorize("@ss.hasPermi('projectProcess:set')") +// @PreAuthorize("@ss.hasPermi('projectProcess:set')") public Result projectSetProcess(@RequestBody @Validated ProjectProcessForm form) { return projectProcessService.projectSetProcess(form); } - @GetMapping("/{id}") - @ApiOperation(value = "璇︽儏", notes = "璇︽儏") - @PreAuthorize("@ss.hasPermi('projectProcess:detail')") - public Result detail(@PathVariable("id") Integer id) { - return projectProcessService.detail(id); + @GetMapping("/detail/{projectId}/{processId}") + @ApiOperation(value = "鑾峰彇椤圭洰娴佺▼璇︽儏淇℃伅", notes = "鑾峰彇椤圭洰娴佺▼璇︽儏淇℃伅") +// @PreAuthorize("@ss.hasPermi('projectProcess:detail')") + public Result detail(@PathVariable("projectId") Long projectId, @PathVariable("processId") String processId) { + return projectProcessService.detail(projectId, processId); + } + + @PostMapping("/start/{projectId}/{processId}") + @ApiOperation(value = "鍚姩娴佺▼", notes = "鍚姩娴佺▼") +// @PreAuthorize("@ss.hasPermi('projectProcess:start')") + public Result startProcess(@PathVariable("projectId") String projectId, @PathVariable("processId") String processId) { + return projectProcessService.startProcess(projectId, processId); } } diff --git a/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java b/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java index b3f79fd..e5609bf 100644 --- a/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java +++ b/business/src/main/java/com/ycl/domain/entity/ProjectProcess.java @@ -24,8 +24,11 @@ private Long projectId; @TableField("flowable_process_id") - /** 娴佺▼ID */ + /** 娴佺▼瀹氫箟ID */ private String flowableProcessId; + @TableField("process_instance_id") + /** 娴佺▼瀹炰緥id */ + private String processInstanceId; } diff --git a/business/src/main/java/com/ycl/domain/vo/ProjectProcessDetailVO.java b/business/src/main/java/com/ycl/domain/vo/ProjectProcessDetailVO.java new file mode 100644 index 0000000..fc38137 --- /dev/null +++ b/business/src/main/java/com/ycl/domain/vo/ProjectProcessDetailVO.java @@ -0,0 +1,86 @@ +package com.ycl.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @author锛歺p + * @date锛�2024/11/27 16:25 + */ +@Data +public class ProjectProcessDetailVO { + + /** + * 椤圭洰id + */ + private Long projectId; + + /** + * 椤圭洰鍚嶇О + */ + private String projectName; + + /** + * 椤圭洰浠g爜 + */ + private String projectCode; + + /** + * 椤圭洰鏍囩 + */ + private List<String> tagList; + + /** + * 浠e姙鍒楄〃 + */ + private List<Object> taskList; + + private TaskStatistics statistics; + + + @Data + public static class TaskStatistics { + + /** + * 鎬诲叡浠诲姟鏁� + */ + private Long totalTaskNum = 0L; + + /** + * 寰呭姙浠诲姟鏁� + */ + private Long todoTaskNum = 0L; + + /** + * 褰撳墠浠诲姟 + */ + private Object currentTask; + + /** + * 鍓╀綑浠诲姟鏁� + */ + private Long remainingTaskNum = 0L; + + /** + * 鎸夋椂瀹屾垚浠诲姟鏁� + */ + private Long timelyFinishedTaskNum = 0L; + + /** + * 瓒呮椂瀹屾垚浠诲姟鏁� + */ + private Long overtimeFinishedTaskNum = 0L; + + /** + * 涓存湡浠诲姟鏁� + */ + private Long willOvertimeTaskNum = 0L; + + /** + * 鐫e姙浠诲姟鏁� + */ + private Long urgeTaskNum = 0L; + + } +} diff --git a/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java b/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java index a063406..1c0c7b1 100644 --- a/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java +++ b/business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java @@ -27,4 +27,7 @@ @ApiModelProperty("娴佺▼鍚嶇О") private String flowableProcessName; + + @ApiModelProperty("娴佺▼瀹炰緥id") + private String processInstanceId; } diff --git a/business/src/main/java/com/ycl/service/ProjectProcessService.java b/business/src/main/java/com/ycl/service/ProjectProcessService.java index e200d09..2a67244 100644 --- a/business/src/main/java/com/ycl/service/ProjectProcessService.java +++ b/business/src/main/java/com/ycl/service/ProjectProcessService.java @@ -23,11 +23,12 @@ Result page(ProjectProcessQuery query); /** - * 鏍规嵁id鏌ユ壘 - * @param id + * 鏍规嵁椤圭洰id鏌ユ壘 + * @param projectId + * @param processId * @return */ - Result detail(Integer id); + Result detail(Long projectId, String processId); /** * 椤圭洰璁剧疆娴佺▼ @@ -36,4 +37,13 @@ * @return */ Result projectSetProcess(ProjectProcessForm form); + + /** + * 鍚姩娴佺▼ + * + * @param processId 娴佺▼瀹氫箟id + * @param projectId 椤圭洰id锛屼綔涓轰笟鍔d瀛樺叆activity琛� + * @return + */ + Result startProcess(String projectId, String processId); } diff --git a/business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java index 5d39aaf..bea6ce4 100644 --- a/business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProcessConfigInfoServiceImpl.java @@ -91,23 +91,23 @@ public Result list(ProcessConfigInfoQuery query) { List<FlowProcDefWithConfigDto> dataList = flowDeployMapper.selectDeployListWithConfig(query); - // 鏍规嵁 processDefId 鍒嗙粍锛屽苟鍙栨瘡缁勪腑 鐗堟湰鍙� 鏈�澶х殑閭d竴涓� - Map<String, FlowProcDefWithConfigDto> groupedByProcessDefId = dataList.stream() - .collect(Collectors.toMap( - FlowProcDefWithConfigDto::getProcessDefId, // keyMapper: 鎻愬彇 processDefId 浣滀负閿� - Function.identity(), // valueMapper: 鐩存帴浣跨敤瀵硅薄浣滀负鍊� - BinaryOperator.maxBy(Comparator.comparingInt(FlowProcDefWithConfigDto::getProcessDefVersion)) // mergeFunction: 姣旇緝 processDefVersion锛屽彇鏈�澶х殑 - )); - List<FlowProcDefWithConfigDto> resultList = new ArrayList<>(groupedByProcessDefId.values()); +// // 鏍规嵁 processDefId 鍒嗙粍锛屽苟鍙栨瘡缁勪腑 鐗堟湰鍙� 鏈�澶х殑閭d竴涓� +// Map<String, FlowProcDefWithConfigDto> groupedByProcessDefId = dataList.stream() +// .collect(Collectors.toMap( +// FlowProcDefWithConfigDto::getProcessDefId, // keyMapper: 鎻愬彇 processDefId 浣滀负閿� +// Function.identity(), // valueMapper: 鐩存帴浣跨敤瀵硅薄浣滀负鍊� +// BinaryOperator.maxBy(Comparator.comparingInt(FlowProcDefWithConfigDto::getProcessDefVersion)) // mergeFunction: 姣旇緝 processDefVersion锛屽彇鏈�澶х殑 +// )); +// List<FlowProcDefWithConfigDto> resultList = new ArrayList<>(groupedByProcessDefId.values()); // 鍔犺浇鎸傝〃鍗� - for (FlowProcDefWithConfigDto procDef : resultList) { + for (FlowProcDefWithConfigDto procDef : dataList) { SysForm sysForm = sysDeployFormService.selectSysDeployFormByDeployId(procDef.getDeploymentId()); if (Objects.nonNull(sysForm)) { procDef.setFormName(sysForm.getFormName()); procDef.setFormId(sysForm.getFormId()); } } - return Result.ok().data(resultList); + return Result.ok().data(dataList); } } diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java index 31d6031..4856ea1 100644 --- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java +++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java @@ -1,9 +1,21 @@ package com.ycl.service.impl; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.ycl.common.constant.ProcessConstants; +import com.ycl.common.core.domain.AjaxResult; +import com.ycl.common.core.domain.entity.SysRole; +import com.ycl.common.core.domain.entity.SysUser; +import com.ycl.common.enums.FlowComment; +import com.ycl.common.utils.SecurityUtils; +import com.ycl.domain.dto.FlowTaskDto; +import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.entity.ProjectProcess; +import com.ycl.domain.vo.ProjectProcessDetailVO; +import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; import com.ycl.service.ProjectProcessService; import com.ycl.common.base.Result; @@ -11,14 +23,30 @@ import com.ycl.domain.form.ProjectProcessForm; import com.ycl.domain.vo.ProjectProcessVO; import com.ycl.domain.query.ProjectProcessQuery; +import com.ycl.system.service.ISysRoleService; +import com.ycl.system.service.ISysUserService; +import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.Process; +import org.flowable.bpmn.model.StartEvent; +import org.flowable.engine.*; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.repository.ProcessDefinition; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.identitylink.api.IdentityLink; +import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.ycl.framework.utils.PageUtil; import org.springframework.beans.BeanUtils; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -32,6 +60,14 @@ public class ProjectProcessServiceImpl extends ServiceImpl<ProjectProcessMapper, ProjectProcess> implements ProjectProcessService { private final ProjectProcessMapper projectProcessMapper; + private final RuntimeService runtimeService; + private final TaskService taskService; + private final IdentityService identityService; + private final RepositoryService repositoryService; + private final ProjectInfoMapper projectInfoMapper; + private final HistoryService historyService; + private final ISysUserService sysUserService; + private final ISysRoleService sysRoleService; /** * 鍒嗛〉鏌ヨ @@ -46,15 +82,48 @@ } /** - * 鏍规嵁id鏌ユ壘 - * @param id + * 鑾峰彇娴佺▼璇︽儏 + * @param projectId * @return */ @Override - public Result detail(Integer id) { - ProjectProcessVO vo = baseMapper.getById(id); - Assert.notNull(vo, "璁板綍涓嶅瓨鍦�"); - return Result.ok().data(vo); + public Result detail(Long projectId, String processId) { + // 椤圭洰淇℃伅 + ProjectInfo projectInfo = new LambdaQueryChainWrapper<>(projectInfoMapper) + .select(ProjectInfo::getId, ProjectInfo::getProjectName, ProjectInfo::getProjectCode) + .eq(ProjectInfo::getId, projectId) + .one(); + + if (Objects.isNull(projectInfo)) { + return Result.error("璇ラ」鐩笉瀛樺湪"); + } + + ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, projectId) + .eq(ProjectProcess::getFlowableProcessId, processId) + .one(); + if (Objects.isNull(projectProcess)) { + return Result.error("璇ラ」鐩湭璁剧疆娴佺▼"); + } + + ProjectProcessDetailVO detail = new ProjectProcessDetailVO(); + detail.setProjectId(projectId); + detail.setProjectName(projectInfo.getProjectName()); + detail.setProjectCode(projectInfo.getProjectCode()); + + ProjectProcessDetailVO.TaskStatistics taskStatistics = new ProjectProcessDetailVO.TaskStatistics(); + // 鐘舵�佺粺璁� + taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processId)); + taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInstanceId())); +// taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId())); + taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInstanceId())); + detail.setStatistics(taskStatistics); + + Result result = Result.ok(); + + // 浠e姙浠诲姟 + this.getTodoTaskList(projectProcess.getProcessInstanceId(),"", 1, 5, result); + return result.data(detail); } @@ -76,4 +145,172 @@ } return Result.ok("娴佺▼鍙樻洿鎴愬姛"); } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result startProcess(String projectId, String processId) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processId) + .latestVersion().singleResult(); + if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { + return Result.error("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�"); + } + Map<String, Object> variables = new HashMap<>(2); + // 璁剧疆娴佺▼鍙戣捣浜篒d鍒版祦绋嬩腑 + SysUser sysUser = SecurityUtils.getLoginUser().getUser(); + identityService.setAuthenticatedUserId(sysUser.getUserId().toString()); + variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId()); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId, projectId, variables); +// // 娴佺▼鍙戣捣鏃� 璺宠繃鍙戣捣浜鸿妭鐐� +// // 缁欑涓�姝ョ敵璇蜂汉鑺傜偣璁剧疆浠诲姟鎵ц浜哄拰鎰忚 +// Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult(); +// if (Objects.nonNull(task)) { +// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getNickName() + "鍙戣捣娴佺▼鐢宠"); +// taskService.complete(task.getId(), variables); +// } + // 椤圭洰娴佺▼鍏宠仈娴佺▼瀹炰緥id + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(ProjectProcess::getProjectId, projectId) + .eq(ProjectProcess::getFlowableProcessId, processId) + .set(ProjectProcess::getProcessInstanceId, processInstance.getProcessInstanceId()) + .update(); + return Result.ok("娴佺▼鍚姩鎴愬姛"); + } + + + private void getTodoTaskList(String processInstanceId, String name, Integer pageNum, Integer pageSize, Result result) { + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .processInstanceId(processInstanceId) + .includeProcessVariables() + .orderByTaskCreateTime().desc(); + +// TODO 浼犲叆鍚嶇О鏌ヨ涓嶅埌鏁版嵁? + if (StringUtils.isNotBlank(name)) { + taskQuery.processDefinitionNameLike(name); + } + result.total(taskQuery.count()); + List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); + List<FlowTaskDto> flowList = new ArrayList<>(); + for (Task task : taskList) { + FlowTaskDto flowTask = new FlowTaskDto(); + // 褰撳墠娴佺▼淇℃伅 + flowTask.setTaskId(task.getId()); + flowTask.setTaskDefKey(task.getTaskDefinitionKey()); + flowTask.setCreateTime(task.getCreateTime()); + flowTask.setProcDefId(task.getProcessDefinitionId()); + flowTask.setExecutionId(task.getExecutionId()); + flowTask.setTaskName(task.getName()); + // 娴佺▼瀹氫箟淇℃伅 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(task.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setProcInsId(task.getProcessInstanceId()); + + // 娴佺▼鍙戣捣浜轰俊鎭� + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .singleResult(); + SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getUserId().toString()); + flowTask.setStartUserName(startUser.getNickName()); + flowTask.setStartDeptName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : ""); + // 娴佺▼澶勭悊浜轰俊鎭� + List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); + for (IdentityLink identityLink : identityLinksForTask) { + // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂� + if (StringUtils.isNotBlank(identityLink.getUserId())) { + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); + if (Objects.nonNull(sysUser)) { + flowTask.setAssigneeId(sysUser.getUserId()); + if (Objects.nonNull(sysUser.getDept())) { + flowTask.setAssigneeDeptName(sysUser.getDept().getDeptName()); + } + flowTask.setAssigneeName(sysUser.getNickName()); + } + // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉� + } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { + SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); + if (Objects.nonNull(role)) { + flowTask.setAssigneeId(Long.parseLong(identityLink.getGroupId())); + flowTask.setAssigneeDeptName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�"); + flowTask.setAssigneeName("鏆傛湭澶勭悊"); + } + } + } + flowList.add(flowTask); + } + result.put("taskList", flowList); + } + + /** + * 鑾峰彇娴佺▼鑺傜偣鏁帮紙鎬讳换鍔℃暟锛屼笉鍖呭惈寮�濮嬨�佺粨鏉熺瓑鐗规畩鐨勶紝鍙粺璁serTask绫诲瀷鐨勶級 + * + * @param processDefinitionId 娴佺▼瀹氫箟id + * @return + */ + private Long getTotalTaskNum(String processDefinitionId) { + // 鑾峰彇娴佺▼瀹氫箟 + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(processDefinitionId) + .singleResult(); + + if (processDefinition == null) { + throw new IllegalArgumentException("娴佺▼瀹氫箟ID鏃犳晥: " + processDefinitionId); + } + + // 鑾峰彇BPMN妯″瀷 + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); + if (bpmnModel == null) { + throw new IllegalStateException("鏃犳硶鑾峰彇BPMN妯″瀷: " + processDefinitionId); + } + + // 鑾峰彇娴佺▼瀵硅薄 + Process process = bpmnModel.getProcessById(processDefinition.getKey()); + if (process == null) { + throw new IllegalStateException("鏃犳硶鑾峰彇娴佺▼瀵硅薄: " + processDefinition.getKey()); + } + + // 璁$畻浠诲姟鑺傜偣鏁伴噺 + Long taskNodeCount = 0L; + List<FlowElement> flowElements = process.getFlowElements().stream().toList(); + for (FlowElement flowElement : flowElements) { + if (flowElement instanceof org.flowable.bpmn.model.UserTask) { + taskNodeCount++; + } + } + return taskNodeCount; + } + + /** + * 鑾峰彇娴佺▼鍓╀綑鏈畬鎴愮殑浠诲姟鏁� + * + * @param processInstanceId + * @return + */ + private Long getNotFinishedTaskNum(String processInstanceId) { + return historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).processUnfinished().count(); + } + + /** + * 鑾峰彇寰呭姙浠诲姟鏁� + * + * @param processInstanceId + * @return + */ + private Long getTodoTaskNum(String processInstanceId) { + return taskService.createTaskQuery().active().processInstanceId(processInstanceId).count(); + } + + /** + * 鑾峰彇褰撳墠鐜妭鐨勬墍鏈変换鍔℃暟 + * + * @param processInstanceId + * @return + */ + private List<Task> getCurrentNodeTaskList(String processInstanceId) { + return taskService.createTaskQuery().processDefinitionId(processInstanceId).list(); + } } diff --git a/business/src/main/resources/mapper/ProjectProcessMapper.xml b/business/src/main/resources/mapper/ProjectProcessMapper.xml index 2e19f42..3d69fe9 100644 --- a/business/src/main/resources/mapper/ProjectProcessMapper.xml +++ b/business/src/main/resources/mapper/ProjectProcessMapper.xml @@ -18,7 +18,6 @@ <result column="area_code" property="areaCode" /> <!-- <result column="management_centralization" property="managementCentralization" />--> <result column="project_approval_type" property="projectApprovalType" /> - <result column="investment_catalogue" property="investmentCatalogue" /> <result column="importance_type" property="importanceType" /> <result column="year" property="year" /> <result column="year_invest_amount" property="yearInvestAmount" /> diff --git a/flowable/src/main/java/com/ycl/common/enums/FlowComment.java b/flowable/src/main/java/com/ycl/common/enums/FlowComment.java index e066c76..f845a7b 100644 --- a/flowable/src/main/java/com/ycl/common/enums/FlowComment.java +++ b/flowable/src/main/java/com/ycl/common/enums/FlowComment.java @@ -11,7 +11,8 @@ /** * 璇存槑 */ - NORMAL("1", "姝e父鎰忚"), + SUBMIT("submit", "/鎻愪氦琛ㄥ崟/鎻愪氦瀹℃牳锛屾�讳箣浠h〃涓婃姤鐨勬搷浣�"), + NORMAL("1", "姝e父鎰忚锛屽鏍搁�氳繃鐨勬剰鎬�"), REBACK("2", "閫�鍥炴剰瑙�"), REJECT("3", "椹冲洖鎰忚"), DELEGATE("4", "濮旀淳鎰忚"), diff --git a/flowable/src/main/java/com/ycl/controller/FlowTaskController.java b/flowable/src/main/java/com/ycl/controller/FlowTaskController.java index ef3110d..70a98a4 100644 --- a/flowable/src/main/java/com/ycl/controller/FlowTaskController.java +++ b/flowable/src/main/java/com/ycl/controller/FlowTaskController.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Map; /** * <p>宸ヤ綔娴佷换鍔$鐞�<p> @@ -84,7 +85,7 @@ } - @ApiOperation(value = "娴佺▼鍒濆鍖栬〃鍗�", response = FlowTaskDto.class) + @ApiOperation(value = "鑾峰彇娴佺▼鍏宠仈鐨勮〃鍗�", response = FlowTaskDto.class) @GetMapping(value = "/flowFormData") public AjaxResult flowFormData(String deployId) { return flowTaskService.flowFormData(deployId); @@ -96,7 +97,16 @@ return flowTaskService.processVariables(taskId); } - @ApiOperation(value = "瀹℃壒浠诲姟") + + @ApiOperation(value = "瀹屾垚鎻愪氦琛ㄥ崟浠诲姟/鏅�氭彁浜�") + @Log(title = "瀹屾垚鎻愪氦琛ㄥ崟浠诲姟/鏅�氭彁浜�", businessType = BusinessType.INSERT) + @PostMapping("/complete/form/{taskId}") + public AjaxResult completeSubmitForm(@ApiParam(value = "娴佺▼瀹氫箟id") @PathVariable(value = "taskId") String taskId, + @ApiParam(value = "鍙橀噺闆嗗悎,json瀵硅薄") @RequestBody Map<String, Object> variables) { + return flowTaskService.completeSubmitForm(taskId, variables); + } + + @ApiOperation(value = "瀹屾垚瀹℃壒浠诲姟") @Log(title = "瀹℃壒浠诲姟", businessType = BusinessType.UPDATE) @PostMapping(value = "/complete") public AjaxResult complete(@RequestBody FlowTaskVo flowTaskVo) { diff --git a/flowable/src/main/java/com/ycl/service/IFlowTaskService.java b/flowable/src/main/java/com/ycl/service/IFlowTaskService.java index 2c088c2..93cd0cc 100644 --- a/flowable/src/main/java/com/ycl/service/IFlowTaskService.java +++ b/flowable/src/main/java/com/ycl/service/IFlowTaskService.java @@ -5,6 +5,7 @@ import com.ycl.domain.vo.FlowTaskVo; import java.io.InputStream; +import java.util.Map; /** * @author Tony @@ -213,4 +214,13 @@ * @return */ AjaxResult flowTaskInfo(String procInsId, String elementId); + + /** + * 瀹屾垚鎻愪氦琛ㄥ崟浠诲姟 + * + * @param taskId 浠诲姟id + * @param variables 琛ㄥ崟鏁版嵁 + * @return + */ + AjaxResult completeSubmitForm(String taskId, Map<String, Object> variables); } diff --git a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java index 4bcfac6..bae5779 100644 --- a/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java +++ b/flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java @@ -82,7 +82,7 @@ private final ISysFormService sysFormService; /** - * 瀹屾垚浠诲姟 + * 瀹屾垚瀹℃牳浠诲姟 * * @param taskVo 璇锋眰瀹炰綋鍙傛暟 */ @@ -103,6 +103,25 @@ taskService.complete(taskVo.getTaskId(), taskVo.getVariables()); } return AjaxResult.success(); + } + + /** + * 瀹屾垚琛ㄥ崟鎻愪氦浠诲姟/鏅�氫换鍔� + * + * @param taskId 浠诲姟id + * @param variables 琛ㄥ崟鏁版嵁 + * @return + */ + @Override + public AjaxResult completeSubmitForm(String taskId, Map<String, Object> variables) { + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if (Objects.isNull(task)) { + return AjaxResult.error("浠诲姟涓嶅瓨鍦�"); + } +// variables.put(taskId + "formJson", variables.get("formJson")); + taskService.addComment(taskId, task.getProcessInstanceId(), FlowComment.SUBMIT.getType(), "瀹屾垚鎻愪氦"); + taskService.complete(taskId, variables); + return AjaxResult.success("鎻愪氦鎴愬姛"); } /** @@ -1114,7 +1133,13 @@ } else { parameters = taskService.getVariables(taskId); } + JSONObject oldVariables = JSONObject.parseObject(JSON.toJSONString(parameters.get("formJson"))); + if (Objects.isNull(oldVariables)) { + // 濡傛灉鏄┖鐨勶紝鐩存帴浣跨敤涓昏〃鍗� + String deploymentId = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getDeploymentId(); + return this.flowFormData(deploymentId); + } List<JSONObject> oldFields = JSON.parseObject(JSON.toJSONString(oldVariables.get("widgetList")), new TypeReference<List<JSONObject>>() { }); // 璁剧疆宸插~鍐欑殑琛ㄥ崟涓虹鐢ㄧ姸鎬� @@ -1215,6 +1240,7 @@ return AjaxResult.success(flowTask); } + /** * 灏哋bject绫诲瀷鐨勬暟鎹浆鍖栨垚Map<String,Object> * diff --git a/start/src/main/resources/application.yml b/start/src/main/resources/application.yml index f70d518..161c6cd 100644 --- a/start/src/main/resources/application.yml +++ b/start/src/main/resources/application.yml @@ -41,6 +41,8 @@ level: com.ruoyi: debug org.springframework: warn + org.flowable.engine.impl.persistence.entity.*: debug + org.flowable.task.service.impl.persistence.entity.*: debug # 鐢ㄦ埛閰嶇疆 user: @@ -78,7 +80,7 @@ # 浠ょ墝瀵嗛挜 secret: gfabcdefghijklmnopqrstuvwxyz12 # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛� - expireTime: 1200 + expireTime: 10000 # PageHelper鍒嗛〉鎻掍欢 pagehelper: @@ -107,13 +109,13 @@ # 宸ヤ綔娴� Flowable 閰嶇疆锛宖lowable瀹屾暣鐨勯厤缃紝鍙傝锛欯see https://www.flowable.com/open-source/docs/bpmn/ch05a-Spring-Boot/#flowable-application-properties flowable: database-schema-update: true # 鑷姩鏇存柊flowable琛ㄧ粨鏋勶紝绗竴娆¤繛鎺ユ暟鎹簱鏃跺彲浠ヨ缃负true - # 鍏抽棴鍚勪釜妯″潡鐢熸垚琛紝鐩墠鍙娇鐢ㄥ伐浣滄祦鍩虹琛� +# # 鍏抽棴鍚勪釜妯″潡鐢熸垚琛紝鐩墠鍙娇鐢ㄥ伐浣滄祦鍩虹琛� idm: # idm鏄痜lowable鐨勮韩浠界鐞嗘ā鍧楋細鍗崇敤鎴枫�佽璇併�佹潈闄愮瓑 enabled: false - cmmn: # cmmn鏄痜lowable鐨勬渚嬬鐞嗘ā鍧楋紝浣撶幇鍦╢lowable-ui涓殑锛氭祦绋嬪缓妯″櫒銆乁I锛孈see https://www.flowable.com/open-source/docs/cmmn/ch06-cmmn - enabled: true - dmn: # dmn鏄痜lowable鐨勫喅绛栨ā鍨嬶紝浣撶幇鍦╢lowable-ui涓殑鍐崇瓥琛� @see https://www.flowable.com/open-source/docs/dmn/ch06-DMN-Introduction - enabled: false - app: # app鐨勫姛鑳芥槸涓篺lowable鍦╯pring涓珮鏁堣繍琛岃�屾彁渚涗簡寰堝bean锛屼笌flowable鏈韩鐨勫唴瀹规棤鍏� - enabled: true - check-process-definitions: true +# cmmn: # cmmn鏄痜lowable鐨勬渚嬬鐞嗘ā鍧楋紝浣撶幇鍦╢lowable-ui涓殑锛氭祦绋嬪缓妯″櫒銆乁I锛孈see https://www.flowable.com/open-source/docs/cmmn/ch06-cmmn +# enabled: true +# dmn: # dmn鏄痜lowable鐨勫喅绛栨ā鍨嬶紝浣撶幇鍦╢lowable-ui涓殑鍐崇瓥琛� @see https://www.flowable.com/open-source/docs/dmn/ch06-DMN-Introduction +# enabled: false +# app: # app鐨勫姛鑳芥槸涓篺lowable鍦╯pring涓珮鏁堣繍琛岃�屾彁渚涗簡寰堝bean锛屼笌flowable鏈韩鐨勫唴瀹规棤鍏� +# enabled: true +# check-process-definitions: true -- Gitblit v1.8.0