From 307103be8cf21d45edbcdc9be2b3dd1f741d744d Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Sun, 25 Sep 2022 19:48:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=B5=81=E7=A8=8B=E8=AF=A6=E6=83=85):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=81=E8=BD=AC=E8=AE=B0=E5=BD=95=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E5=92=8C=E7=BB=93=E6=9D=9F=E8=8A=82=E7=82=B9=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/workflow/domain/vo/WfDetailVo.java | 4 +- .../workflow/domain/vo/WfProcNodeVo.java | 67 +++++++++ .../service/impl/WfProcessServiceImpl.java | 133 ++++++++++-------- .../src/components/ProcessViewer/index.vue | 2 +- ruoyi-ui/src/views/workflow/work/detail.vue | 20 ++- 5 files changed, 158 insertions(+), 68 deletions(-) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfProcNodeVo.java diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java index 4cdd9fc4..6c3ad9cc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDetailVo.java @@ -21,9 +21,9 @@ public class WfDetailVo { private FormConf taskFormData; /** - * 历史任务信息 + * 历史流程节点信息 */ - private List historyTaskList; + private List historyProcNodeList; /** * 流程表单列表 diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfProcNodeVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfProcNodeVo.java new file mode 100644 index 00000000..6e0587f5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfProcNodeVo.java @@ -0,0 +1,67 @@ +package com.ruoyi.workflow.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.flowable.engine.task.Comment; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 工作流节点元素视图对象 + * + * @author KonBAI + * @createTime 2022/9/11 22:04 + */ +@Data +@ExcelIgnoreUnannotated +public class WfProcNodeVo implements Serializable { + /** + * 流程ID + */ + private String procDefId; + /** + * 活动ID + */ + private String activityId; + /** + * 活动名称 + */ + private String activityName; + /** + * 活动类型 + */ + private String activityType; + /** + * 活动耗时 + */ + private String duration; + /** + * 执行人Id + */ + private Long assigneeId; + /** + * 执行人名称 + */ + private String assigneeName; + /** + * 候选执行人 + */ + private String candidate; + /** + * 任务意见 + */ + private List commentList; + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** + * 结束时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java index b1f21892..d60f0667 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfProcessServiceImpl.java @@ -29,10 +29,7 @@ import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.workflow.domain.WfDeployForm; import com.ruoyi.workflow.domain.bo.WfProcessBo; -import com.ruoyi.workflow.domain.vo.WfDefinitionVo; -import com.ruoyi.workflow.domain.vo.WfDeployFormVo; -import com.ruoyi.workflow.domain.vo.WfDetailVo; -import com.ruoyi.workflow.domain.vo.WfTaskVo; +import com.ruoyi.workflow.domain.vo.*; import com.ruoyi.workflow.mapper.WfDeployFormMapper; import com.ruoyi.workflow.service.IWfProcessService; import com.ruoyi.workflow.service.IWfTaskService; @@ -214,7 +211,7 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce throw new ServiceException("没有可办理的任务!"); } detailVo.setTaskFormData(currTaskFormData(deployId, taskIns)); - detailVo.setHistoryTaskList(historyTaskList(procInsId)); + detailVo.setHistoryProcNodeList(historyProcNodeList(procInsId)); detailVo.setProcessFormList(processFormList(procInsId, deployId, taskIns)); return detailVo; } @@ -429,7 +426,7 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce private void buildProcessVariables(Map variables) { String userIdStr = LoginHelper.getUserId().toString(); identityService.setAuthenticatedUserId(userIdStr); - variables.put(TaskConstants.PROCESS_INITIATOR, userIdStr); + variables.put(BpmnXMLConstants.ATTRIBUTE_EVENT_START_INITIATOR, userIdStr); } @@ -546,67 +543,87 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce /** * 获取历史任务信息列表 */ - private List historyTaskList(String procInsId) { - List taskInstanceList = historyService.createHistoricTaskInstanceQuery() + private List historyProcNodeList(String procInsId) { + List historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery() .processInstanceId(procInsId) - .orderByHistoricTaskInstanceStartTime().desc() + .activityTypes(CollUtil.newHashSet(BpmnXMLConstants.ELEMENT_EVENT_START, BpmnXMLConstants.ELEMENT_EVENT_END, BpmnXMLConstants.ELEMENT_TASK_USER)) + .orderByHistoricActivityInstanceStartTime().desc() + .orderByHistoricActivityInstanceEndTime().desc() .list(); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(procInsId) + .singleResult(); + List commentList = taskService.getProcessInstanceComments(procInsId); - List taskVoList = new ArrayList<>(taskInstanceList.size()); - taskInstanceList.forEach(taskInstance -> { - WfTaskVo taskVo = new WfTaskVo(); - taskVo.setProcDefId(taskInstance.getProcessDefinitionId()); - taskVo.setTaskId(taskInstance.getId()); - taskVo.setTaskDefKey(taskInstance.getTaskDefinitionKey()); - taskVo.setTaskName(taskInstance.getName()); - taskVo.setCreateTime(taskInstance.getStartTime()); - taskVo.setFinishTime(taskInstance.getEndTime()); - if (StringUtils.isNotBlank(taskInstance.getAssignee())) { - SysUser user = userService.selectUserById(Long.parseLong(taskInstance.getAssignee())); - taskVo.setAssigneeId(user.getUserId()); - taskVo.setAssigneeName(user.getNickName()); - taskVo.setDeptName(user.getDept().getDeptName()); + + List elementVoList = new ArrayList<>(); + for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { + WfProcNodeVo elementVo = new WfProcNodeVo(); + elementVo.setProcDefId(activityInstance.getProcessDefinitionId()); + elementVo.setActivityId(activityInstance.getActivityId()); + elementVo.setActivityName(activityInstance.getActivityName()); + elementVo.setActivityType(activityInstance.getActivityType()); + elementVo.setCreateTime(activityInstance.getStartTime()); + elementVo.setEndTime(activityInstance.getEndTime()); + if (ObjectUtil.isNotNull(activityInstance.getDurationInMillis())) { + elementVo.setDuration(DateUtil.formatBetween(activityInstance.getDurationInMillis(), BetweenFormatter.Level.SECOND)); } - // 展示审批人员 - List linksForTask = historyService.getHistoricIdentityLinksForTask(taskInstance.getId()); - StringBuilder stringBuilder = new StringBuilder(); - for (HistoricIdentityLink identityLink : linksForTask) { - if ("candidate".equals(identityLink.getType())) { - if (StringUtils.isNotBlank(identityLink.getUserId())) { - SysUser user = userService.selectUserById(Long.parseLong(identityLink.getUserId())); - stringBuilder.append(user.getNickName()).append(","); + + if (BpmnXMLConstants.ELEMENT_EVENT_START.equals(activityInstance.getActivityType())) { + if (ObjectUtil.isNotNull(historicProcessInstance)) { + Long userId = Long.parseLong(historicProcessInstance.getStartUserId()); + SysUser user = userService.selectUserById(userId); + if (user != null) { + elementVo.setAssigneeId(user.getUserId()); + elementVo.setAssigneeName(user.getNickName()); } - if (StringUtils.isNotBlank(identityLink.getGroupId())) { - if (identityLink.getGroupId().startsWith(TaskConstants.ROLE_GROUP_PREFIX)) { - Long roleId = Long.parseLong(StringUtils.stripStart(identityLink.getGroupId(), TaskConstants.ROLE_GROUP_PREFIX)); - SysRole role = roleService.selectRoleById(roleId); - stringBuilder.append(role.getRoleName()).append(","); - } else if (identityLink.getGroupId().startsWith(TaskConstants.DEPT_GROUP_PREFIX)) { - Long deptId = Long.parseLong(StringUtils.stripStart(identityLink.getGroupId(), TaskConstants.DEPT_GROUP_PREFIX)); - SysDept dept = deptService.selectDeptById(deptId); - stringBuilder.append(dept.getDeptName()).append(","); + } + } else if (BpmnXMLConstants.ELEMENT_TASK_USER.equals(activityInstance.getActivityType())) { + if (StringUtils.isNotBlank(activityInstance.getAssignee())) { + SysUser user = userService.selectUserById(Long.parseLong(activityInstance.getAssignee())); + elementVo.setAssigneeId(user.getUserId()); + elementVo.setAssigneeName(user.getNickName()); + } + // 展示审批人员 + List linksForTask = historyService.getHistoricIdentityLinksForTask(activityInstance.getTaskId()); + StringBuilder stringBuilder = new StringBuilder(); + for (HistoricIdentityLink identityLink : linksForTask) { + if ("candidate".equals(identityLink.getType())) { + if (StringUtils.isNotBlank(identityLink.getUserId())) { + SysUser user = userService.selectUserById(Long.parseLong(identityLink.getUserId())); + stringBuilder.append(user.getNickName()).append(","); + } + if (StringUtils.isNotBlank(identityLink.getGroupId())) { + if (identityLink.getGroupId().startsWith(TaskConstants.ROLE_GROUP_PREFIX)) { + Long roleId = Long.parseLong(StringUtils.stripStart(identityLink.getGroupId(), TaskConstants.ROLE_GROUP_PREFIX)); + SysRole role = roleService.selectRoleById(roleId); + stringBuilder.append(role.getRoleName()).append(","); + } else if (identityLink.getGroupId().startsWith(TaskConstants.DEPT_GROUP_PREFIX)) { + Long deptId = Long.parseLong(StringUtils.stripStart(identityLink.getGroupId(), TaskConstants.DEPT_GROUP_PREFIX)); + SysDept dept = deptService.selectDeptById(deptId); + stringBuilder.append(dept.getDeptName()).append(","); + } } } } - } - if (StringUtils.isNotBlank(stringBuilder)) { - taskVo.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1)); - } - if (ObjectUtil.isNotNull(taskInstance.getDurationInMillis())) { - taskVo.setDuration(DateUtil.formatBetween(taskInstance.getDurationInMillis(), BetweenFormatter.Level.SECOND)); - } - // 获取意见评论内容 - if (CollUtil.isNotEmpty(commentList)) { - List comments = new ArrayList<>(); - for (Comment comment : commentList) { - if (comment.getTaskId().equals(taskInstance.getId())) { - comments.add(comment); - } + if (StringUtils.isNotBlank(stringBuilder)) { + elementVo.setCandidate(stringBuilder.substring(0, stringBuilder.length() - 1)); + } + // 获取意见评论内容 + if (CollUtil.isNotEmpty(commentList)) { + List comments = new ArrayList<>(); + for (Comment comment : commentList) { + + if (comment.getTaskId().equals(activityInstance.getTaskId())) { + comments.add(comment); + } + } + elementVo.setCommentList(comments); } - taskVo.setCommentList(comments); } - taskVoList.add(taskVo); - }); - return taskVoList; + elementVoList.add(elementVo); + } + return elementVoList; } } diff --git a/ruoyi-ui/src/components/ProcessViewer/index.vue b/ruoyi-ui/src/components/ProcessViewer/index.vue index e8409d26..3bc6594e 100644 --- a/ruoyi-ui/src/components/ProcessViewer/index.vue +++ b/ruoyi-ui/src/components/ProcessViewer/index.vue @@ -178,7 +178,7 @@ export default { this.dlgTitle = element.businessObject ? element.businessObject.name : undefined; // 计算当前悬浮任务审批记录,如果记录为空不显示弹窗 this.taskCommentList = (this.allCommentList || []).filter(item => { - return item.taskDefKey === this.selectTaskId; + return item.activityId === this.selectTaskId; }); this.dialogVisible = true; }, diff --git a/ruoyi-ui/src/views/workflow/work/detail.vue b/ruoyi-ui/src/views/workflow/work/detail.vue index dd666dfd..767475cc 100644 --- a/ruoyi-ui/src/views/workflow/work/detail.vue +++ b/ruoyi-ui/src/views/workflow/work/detail.vue @@ -77,14 +77,17 @@
- -

{{ item.taskName }}

- + +

{{ item.activityName }}

+ + {{ item.assigneeName }} 在 {{ item.createTime }} 发起流程 + + {{ item.assigneeName || '-'}} {{ item.candidate || '-'}} {{ item.createTime || '-'}} - {{ item.finishTime || '-' }} + {{ item.endTime || '-' }} {{ item.duration || '-'}}
@@ -95,6 +98,9 @@ {{ comment.fullMessage }}
+ + {{ item.createTime }} 结束流程 +
@@ -105,7 +111,7 @@ @@ -241,7 +247,7 @@ export default { unfinishedTaskSet: [], rejectedTaskSet: [] }, - historyTaskList: [], + historyProcNodeList: [], // 部门名称 deptName: undefined, // 部门树选项 @@ -428,7 +434,7 @@ export default { if (this.taskFormOpen) { this.taskFormData = data.taskFormData; } - this.historyTaskList = data.historyTaskList; + this.historyProcNodeList = data.historyProcNodeList; this.formOpen = true }) },