From 3a90db6a115e25cfd9104a780c535ca672076379 Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Sun, 25 Dec 2022 18:44:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=8A=9E=E5=85=AC=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=B5=81=E7=A8=8B=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD=E3=80=82?= =?UTF-8?q?(I5RH0X)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/WfProcessController.java | 86 ++++++- .../domain/vo/WfClaimTaskExportVo.java | 57 +++++ .../workflow/domain/vo/WfDefinitionVo.java | 7 +- .../domain/vo/WfFinishedTaskExportVo.java | 70 ++++++ .../workflow/domain/vo/WfOwnTaskExportVo.java | 75 ++++++ .../domain/vo/WfTodoTaskExportVo.java | 57 +++++ .../workflow/service/IWfProcessService.java | 26 +++ .../service/impl/WfProcessServiceImpl.java | 217 ++++++++++++++++++ ruoyi-ui/src/views/workflow/work/claim.vue | 16 ++ ruoyi-ui/src/views/workflow/work/copy.vue | 6 +- ruoyi-ui/src/views/workflow/work/finished.vue | 16 ++ ruoyi-ui/src/views/workflow/work/index.vue | 16 ++ ruoyi-ui/src/views/workflow/work/own.vue | 14 +- ruoyi-ui/src/views/workflow/work/todo.vue | 23 +- 14 files changed, 658 insertions(+), 28 deletions(-) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfClaimTaskExportVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfFinishedTaskExportVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfOwnTaskExportVo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTodoTaskExportVo.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java index 18dfd155..f7e35328 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/workflow/WfProcessController.java @@ -1,22 +1,28 @@ package com.ruoyi.web.controller.workflow; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.flowable.core.domain.ProcessQuery; import com.ruoyi.workflow.domain.bo.WfCopyBo; -import com.ruoyi.workflow.domain.vo.WfCopyVo; -import com.ruoyi.workflow.domain.vo.WfDefinitionVo; -import com.ruoyi.workflow.domain.vo.WfTaskVo; +import com.ruoyi.workflow.domain.vo.*; import com.ruoyi.workflow.service.IWfCopyService; import com.ruoyi.workflow.service.IWfProcessService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.util.List; import java.util.Map; /** @@ -99,6 +105,80 @@ public class WfProcessController extends BaseController { return copyService.selectPageList(copyBo, pageQuery); } + /** + * 导出可发起流程列表 + */ + @SaCheckPermission("workflow:process:startExport") + @Log(title = "可发起流程", businessType = BusinessType.EXPORT) + @PostMapping("/startExport") + public void startExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectStartProcessList(processQuery); + ExcelUtil.exportExcel(list, "可发起流程", WfDefinitionVo.class, response); + } + + /** + * 导出我拥有流程列表 + */ + @SaCheckPermission("workflow:process:ownExport") + @Log(title = "我拥有流程", businessType = BusinessType.EXPORT) + @PostMapping("/ownExport") + public void ownExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectOwnProcessList(processQuery); + List listVo = BeanUtil.copyToList(list, WfOwnTaskExportVo.class); + for (WfOwnTaskExportVo exportVo : listVo) { + exportVo.setStatus(ObjectUtil.isNull(exportVo.getFinishTime()) ? "进行中" : "已完成"); + } + ExcelUtil.exportExcel(listVo, "我拥有流程", WfOwnTaskExportVo.class, response); + } + + /** + * 导出待办流程列表 + */ + @SaCheckPermission("workflow:process:todoExport") + @Log(title = "待办流程", businessType = BusinessType.EXPORT) + @PostMapping("/todoExport") + public void todoExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectTodoProcessList(processQuery); + List listVo = BeanUtil.copyToList(list, WfTodoTaskExportVo.class); + ExcelUtil.exportExcel(listVo, "待办流程", WfTodoTaskExportVo.class, response); + } + + /** + * 导出待签流程列表 + */ + @SaCheckPermission("workflow:process:claimExport") + @Log(title = "待签流程", businessType = BusinessType.EXPORT) + @PostMapping("/claimExport") + public void claimExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectClaimProcessList(processQuery); + List listVo = BeanUtil.copyToList(list, WfClaimTaskExportVo.class); + ExcelUtil.exportExcel(listVo, "待签流程", WfClaimTaskExportVo.class, response); + } + + /** + * 导出已办流程列表 + */ + @SaCheckPermission("workflow:process:finishedExport") + @Log(title = "已办流程", businessType = BusinessType.EXPORT) + @PostMapping("/finishedExport") + public void finishedExport(@Validated ProcessQuery processQuery, HttpServletResponse response) { + List list = processService.selectFinishedProcessList(processQuery); + List listVo = BeanUtil.copyToList(list, WfFinishedTaskExportVo.class); + ExcelUtil.exportExcel(listVo, "已办流程", WfFinishedTaskExportVo.class, response); + } + + /** + * 导出抄送流程列表 + */ + @SaCheckPermission("workflow:process:copyExport") + @Log(title = "抄送流程", businessType = BusinessType.EXPORT) + @PostMapping("/copyExport") + public void copyExport(WfCopyBo copyBo, HttpServletResponse response) { + copyBo.setUserId(getUserId()); + List list = copyService.selectList(copyBo); + ExcelUtil.exportExcel(list, "抄送流程", WfCopyVo.class, response); + } + /** * 查询流程部署关联表单信息 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfClaimTaskExportVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfClaimTaskExportVo.java new file mode 100644 index 00000000..960010e4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfClaimTaskExportVo.java @@ -0,0 +1,57 @@ +package com.ruoyi.workflow.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 待签流程对象导出VO + * + * @author konbai + */ +@Data +@NoArgsConstructor +public class WfClaimTaskExportVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 任务编号 + */ + @ExcelProperty(value = "任务编号") + private String taskId; + + /** + * 流程名称 + */ + @ExcelProperty(value = "流程名称") + private String procDefName; + + /** + * 任务节点 + */ + @ExcelProperty(value = "任务节点") + private String taskName; + + /** + * 流程版本 + */ + @ExcelProperty(value = "流程版本") + private int procDefVersion; + + /** + * 流程发起人名称 + */ + @ExcelProperty(value = "流程发起人") + private String startUserName; + + /** + * 接收时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "接收时间") + private Date createTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDefinitionVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDefinitionVo.java index 454620d4..84c85634 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDefinitionVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfDefinitionVo.java @@ -2,6 +2,8 @@ package com.ruoyi.workflow.domain.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.ruoyi.common.annotation.ExcelDictFormat; +import com.ruoyi.common.convert.ExcelDictConvert; import lombok.Data; import java.util.Date; @@ -69,9 +71,10 @@ public class WfDefinitionVo { private String deploymentId; /** - * 流程定义状态: 1:激活 , 2:中止 + * 流程是否暂停(true:挂起 false:激活 ) */ - @ExcelProperty(value = "流程定义状态: 1:激活 , 2:中止") + @ExcelProperty(value = "流程是否挂起", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "true=挂起,false=激活") private Boolean suspended; /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfFinishedTaskExportVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfFinishedTaskExportVo.java new file mode 100644 index 00000000..eda85906 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfFinishedTaskExportVo.java @@ -0,0 +1,70 @@ +package com.ruoyi.workflow.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 已办流程对象导出VO + * + * @author konbai + */ +@Data +@NoArgsConstructor +public class WfFinishedTaskExportVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 任务编号 + */ + @ExcelProperty(value = "任务编号") + private String taskId; + + /** + * 流程名称 + */ + @ExcelProperty(value = "流程名称") + private String procDefName; + + /** + * 任务节点 + */ + @ExcelProperty(value = "任务节点") + private String taskName; + + /** + * 流程版本 + */ + @ExcelProperty(value = "流程版本") + private int procDefVersion; + + /** + * 流程发起人名称 + */ + @ExcelProperty(value = "流程发起人") + private String startUserName; + + /** + * 接收时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "接收时间") + private Date createTime; + + /** + * 审批时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "审批时间") + private Date finishTime; + + /** + * 任务耗时 + */ + @ExcelProperty(value = "任务耗时") + private String duration; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfOwnTaskExportVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfOwnTaskExportVo.java new file mode 100644 index 00000000..a717db8c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfOwnTaskExportVo.java @@ -0,0 +1,75 @@ +package com.ruoyi.workflow.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 我拥有流程对象导出VO + * + * @author konbai + */ +@Data +@NoArgsConstructor +public class WfOwnTaskExportVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 流程实例ID + */ + @ExcelProperty(value = "流程编号") + private String procInsId; + + /** + * 流程名称 + */ + @ExcelProperty(value = "流程名称") + private String procDefName; + + /** + * 流程类别 + */ + @ExcelProperty(value = "流程类别") + private String category; + + /** + * 流程版本 + */ + @ExcelProperty(value = "流程版本") + private int procDefVersion; + + /** + * 提交时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "提交时间") + private Date createTime; + + /** + * 流程状态 + */ + @ExcelProperty(value = "流程状态") + private String status; + + /** + * 任务耗时 + */ + @ExcelProperty(value = "任务耗时") + private String duration; + + /** + * 当前节点 + */ + @ExcelProperty(value = "当前节点") + private String taskName; + + /** + * 任务完成时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date finishTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTodoTaskExportVo.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTodoTaskExportVo.java new file mode 100644 index 00000000..4e67d586 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/domain/vo/WfTodoTaskExportVo.java @@ -0,0 +1,57 @@ +package com.ruoyi.workflow.domain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 待办流程对象导出VO + * + * @author konbai + */ +@Data +@NoArgsConstructor +public class WfTodoTaskExportVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 任务编号 + */ + @ExcelProperty(value = "任务编号") + private String taskId; + + /** + * 流程名称 + */ + @ExcelProperty(value = "流程名称") + private String procDefName; + + /** + * 任务节点 + */ + @ExcelProperty(value = "任务节点") + private String taskName; + + /** + * 流程版本 + */ + @ExcelProperty(value = "流程版本") + private int procDefVersion; + + /** + * 流程发起人名称 + */ + @ExcelProperty(value = "流程发起人") + private String startUserName; + + /** + * 接收时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "接收时间") + private Date createTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java index b5172ea2..314b86d6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/IWfProcessService.java @@ -7,6 +7,7 @@ import com.ruoyi.workflow.domain.vo.WfDefinitionVo; import com.ruoyi.workflow.domain.vo.WfDetailVo; import com.ruoyi.workflow.domain.vo.WfTaskVo; +import java.util.List; import java.util.Map; /** @@ -22,30 +23,55 @@ public interface IWfProcessService { */ TableDataInfo selectPageStartProcessList(ProcessQuery processQuery, PageQuery pageQuery); + /** + * 查询可发起流程列表 + */ + List selectStartProcessList(ProcessQuery processQuery); + /** * 查询我的流程列表 * @param pageQuery 分页参数 */ TableDataInfo selectPageOwnProcessList(ProcessQuery processQuery, PageQuery pageQuery); + /** + * 查询我的流程列表 + */ + List selectOwnProcessList(ProcessQuery processQuery); + /** * 查询代办任务列表 * @param pageQuery 分页参数 */ TableDataInfo selectPageTodoProcessList(ProcessQuery processQuery, PageQuery pageQuery); + /** + * 查询代办任务列表 + */ + List selectTodoProcessList(ProcessQuery processQuery); + /** * 查询待签任务列表 * @param pageQuery 分页参数 */ TableDataInfo selectPageClaimProcessList(ProcessQuery processQuery, PageQuery pageQuery); + /** + * 查询待签任务列表 + */ + List selectClaimProcessList(ProcessQuery processQuery); + /** * 查询已办任务列表 * @param pageQuery 分页参数 */ TableDataInfo selectPageFinishedProcessList(ProcessQuery processQuery, PageQuery pageQuery); + /** + * 查询已办任务列表 + */ + List selectFinishedProcessList(ProcessQuery processQuery); + /** * 查询流程部署关联表单信息 * @param definitionId 流程定义ID 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 c9ab9aaa..d544475b 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 @@ -121,6 +121,38 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce return TableDataInfo.build(page); } + @Override + public List selectStartProcessList(ProcessQuery processQuery) { + // 流程定义列表数据查询 + ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery() + .latestVersion() + .active() + .orderByProcessDefinitionKey() + .asc(); + // 构建搜索条件 + ProcessUtils.buildProcessSearch(processDefinitionQuery, processQuery); + + List definitionList = processDefinitionQuery.list(); + + List definitionVoList = new ArrayList<>(); + for (ProcessDefinition processDefinition : definitionList) { + String deploymentId = processDefinition.getDeploymentId(); + Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult(); + WfDefinitionVo vo = new WfDefinitionVo(); + vo.setDefinitionId(processDefinition.getId()); + vo.setProcessKey(processDefinition.getKey()); + vo.setProcessName(processDefinition.getName()); + vo.setVersion(processDefinition.getVersion()); + vo.setDeploymentId(processDefinition.getDeploymentId()); + vo.setSuspended(processDefinition.isSuspended()); + // 流程定义时间 + vo.setCategory(deployment.getCategory()); + vo.setDeploymentTime(deployment.getDeploymentTime()); + definitionVoList.add(vo); + } + return definitionVoList; + } + @Override public TableDataInfo selectPageOwnProcessList(ProcessQuery processQuery, PageQuery pageQuery) { Page page = new Page<>(); @@ -172,6 +204,52 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce return TableDataInfo.build(page); } + @Override + public List selectOwnProcessList(ProcessQuery processQuery) { + HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() + .startedBy(TaskUtils.getUserId()) + .orderByProcessInstanceStartTime() + .desc(); + // 构建搜索条件 + ProcessUtils.buildProcessSearch(historicProcessInstanceQuery, processQuery); + List historicProcessInstances = historicProcessInstanceQuery.list(); + List taskVoList = new ArrayList<>(); + for (HistoricProcessInstance hisIns : historicProcessInstances) { + WfTaskVo taskVo = new WfTaskVo(); + taskVo.setCreateTime(hisIns.getStartTime()); + taskVo.setFinishTime(hisIns.getEndTime()); + taskVo.setProcInsId(hisIns.getId()); + + // 计算耗时 + if (Objects.nonNull(hisIns.getEndTime())) { + taskVo.setDuration(DateUtils.getDatePoor(hisIns.getEndTime(), hisIns.getStartTime())); + } else { + taskVo.setDuration(DateUtils.getDatePoor(DateUtils.getNowDate(), hisIns.getStartTime())); + } + // 流程部署实例信息 + Deployment deployment = repositoryService.createDeploymentQuery() + .deploymentId(hisIns.getDeploymentId()).singleResult(); + taskVo.setDeployId(hisIns.getDeploymentId()); + taskVo.setProcDefId(hisIns.getProcessDefinitionId()); + taskVo.setProcDefName(hisIns.getProcessDefinitionName()); + taskVo.setProcDefVersion(hisIns.getProcessDefinitionVersion()); + taskVo.setCategory(deployment.getCategory()); + // 当前所处流程 + List taskList = taskService.createTaskQuery().processInstanceId(hisIns.getId()).list(); + if (CollUtil.isNotEmpty(taskList)) { + taskVo.setTaskId(taskList.get(0).getId()); + } else { + List historicTaskInstance = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(hisIns.getId()).orderByHistoricTaskInstanceEndTime().desc().list(); + if (CollUtil.isNotEmpty(historicTaskInstance)) { + taskVo.setTaskId(historicTaskInstance.get(0).getId()); + } + } + taskVoList.add(taskVo); + } + return taskVoList; + } + @Override public TableDataInfo selectPageTodoProcessList(ProcessQuery processQuery, PageQuery pageQuery) { Page page = new Page<>(); @@ -222,6 +300,51 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce return TableDataInfo.build(page); } + @Override + public List selectTodoProcessList(ProcessQuery processQuery) { + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() + .taskCandidateOrAssigned(TaskUtils.getUserId()) + .taskCandidateGroupIn(TaskUtils.getCandidateGroup()) + .orderByTaskCreateTime().desc(); + // 构建搜索条件 + ProcessUtils.buildProcessSearch(taskQuery, processQuery); + List taskList = taskQuery.list(); + List taskVoList = new ArrayList<>(); + for (Task task : taskList) { + WfTaskVo taskVo = new WfTaskVo(); + // 当前流程信息 + taskVo.setTaskId(task.getId()); + taskVo.setTaskDefKey(task.getTaskDefinitionKey()); + taskVo.setCreateTime(task.getCreateTime()); + taskVo.setProcDefId(task.getProcessDefinitionId()); + taskVo.setTaskName(task.getName()); + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(task.getProcessDefinitionId()) + .singleResult(); + taskVo.setDeployId(pd.getDeploymentId()); + taskVo.setProcDefName(pd.getName()); + taskVo.setProcDefVersion(pd.getVersion()); + taskVo.setProcInsId(task.getProcessInstanceId()); + + // 流程发起人信息 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .singleResult(); + SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + taskVo.setStartUserId(startUser.getNickName()); + taskVo.setStartUserName(startUser.getNickName()); + taskVo.setStartDeptName(startUser.getDept().getDeptName()); + // 流程变量 + taskVo.setProcVars(this.getProcessVariables(task.getId())); + + taskVoList.add(taskVo); + } + return taskVoList; + } + @Override public TableDataInfo selectPageClaimProcessList(ProcessQuery processQuery, PageQuery pageQuery) { Page page = new Page<>(); @@ -269,6 +392,49 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce return TableDataInfo.build(page); } + @Override + public List selectClaimProcessList(ProcessQuery processQuery) { + TaskQuery taskQuery = taskService.createTaskQuery() + .active() + .includeProcessVariables() + .taskCandidateUser(TaskUtils.getUserId()) + .taskCandidateGroupIn(TaskUtils.getCandidateGroup()) + .orderByTaskCreateTime().desc(); + // 构建搜索条件 + ProcessUtils.buildProcessSearch(taskQuery, processQuery); + List taskList = taskQuery.list(); + List flowList = new ArrayList<>(); + for (Task task : taskList) { + WfTaskVo flowTask = new WfTaskVo(); + // 当前流程信息 + flowTask.setTaskId(task.getId()); + flowTask.setTaskDefKey(task.getTaskDefinitionKey()); + flowTask.setCreateTime(task.getCreateTime()); + flowTask.setProcDefId(task.getProcessDefinitionId()); + 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 = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getNickName()); + flowTask.setStartUserName(startUser.getNickName()); + flowTask.setStartDeptName(startUser.getDept().getDeptName()); + + flowList.add(flowTask); + } + return flowList; + } + @Override public TableDataInfo selectPageFinishedProcessList(ProcessQuery processQuery, PageQuery pageQuery) { Page page = new Page<>(); @@ -327,6 +493,57 @@ public class WfProcessServiceImpl extends FlowServiceFactory implements IWfProce return TableDataInfo.build(page); } + @Override + public List selectFinishedProcessList(ProcessQuery processQuery) { + HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery() + .includeProcessVariables() + .finished() + .taskAssignee(TaskUtils.getUserId()) + .orderByHistoricTaskInstanceEndTime() + .desc(); + // 构建搜索条件 + ProcessUtils.buildProcessSearch(taskInstanceQuery, processQuery); + List historicTaskInstanceList = taskInstanceQuery.list(); + List hisTaskList = new ArrayList<>(); + for (HistoricTaskInstance histTask : historicTaskInstanceList) { + WfTaskVo flowTask = new WfTaskVo(); + // 当前流程信息 + flowTask.setTaskId(histTask.getId()); + // 审批人员信息 + flowTask.setCreateTime(histTask.getCreateTime()); + flowTask.setFinishTime(histTask.getEndTime()); + flowTask.setDuration(DateUtil.formatBetween(histTask.getDurationInMillis(), BetweenFormatter.Level.SECOND)); + flowTask.setProcDefId(histTask.getProcessDefinitionId()); + flowTask.setTaskDefKey(histTask.getTaskDefinitionKey()); + flowTask.setTaskName(histTask.getName()); + + // 流程定义信息 + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() + .processDefinitionId(histTask.getProcessDefinitionId()) + .singleResult(); + flowTask.setDeployId(pd.getDeploymentId()); + flowTask.setProcDefName(pd.getName()); + flowTask.setProcDefVersion(pd.getVersion()); + flowTask.setProcInsId(histTask.getProcessInstanceId()); + flowTask.setHisProcInsId(histTask.getProcessInstanceId()); + + // 流程发起人信息 + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(histTask.getProcessInstanceId()) + .singleResult(); + SysUser startUser = userService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); + flowTask.setStartUserId(startUser.getNickName()); + flowTask.setStartUserName(startUser.getNickName()); + flowTask.setStartDeptName(startUser.getDept().getDeptName()); + + // 流程变量 + flowTask.setProcVars(this.getProcessVariables(histTask.getId())); + + hisTaskList.add(flowTask); + } + return hisTaskList; + } + @Override public String selectFormContent(String definitionId, String deployId) { InputStream inputStream = repositoryService.getProcessModel(definitionId); diff --git a/ruoyi-ui/src/views/workflow/work/claim.vue b/ruoyi-ui/src/views/workflow/work/claim.vue index 2a48992d..87078699 100644 --- a/ruoyi-ui/src/views/workflow/work/claim.vue +++ b/ruoyi-ui/src/views/workflow/work/claim.vue @@ -30,6 +30,16 @@ + + 导出 + @@ -149,6 +159,12 @@ export default { path: '/work/todo' }) }) + }, + /** 导出按钮操作 */ + handleExport() { + this.download('workflow/process/claimExport', { + ...this.queryParams + }, `wf_claim_process_${new Date().getTime()}.xlsx`) } } }; diff --git a/ruoyi-ui/src/views/workflow/work/copy.vue b/ruoyi-ui/src/views/workflow/work/copy.vue index ea43d950..4f79fd99 100644 --- a/ruoyi-ui/src/views/workflow/work/copy.vue +++ b/ruoyi-ui/src/views/workflow/work/copy.vue @@ -30,8 +30,8 @@ plain icon="el-icon-download" size="mini" + v-hasPermi="['workflow:process:copyExport']" @click="handleExport" - v-hasPermi="['workflow:process:export']" >导出 @@ -201,9 +201,9 @@ export default { }, /** 导出按钮操作 */ handleExport() { - this.download('workflow/copy/export', { + this.download('workflow/process/copyExport', { ...this.queryParams - }, `copy_${new Date().getTime()}.xlsx`) + }, `wf_copy_process_${new Date().getTime()}.xlsx`) } } }; diff --git a/ruoyi-ui/src/views/workflow/work/finished.vue b/ruoyi-ui/src/views/workflow/work/finished.vue index 29a8a70b..c512bfb2 100644 --- a/ruoyi-ui/src/views/workflow/work/finished.vue +++ b/ruoyi-ui/src/views/workflow/work/finished.vue @@ -29,6 +29,16 @@ + + 导出 + @@ -223,6 +233,12 @@ export default { this.$modal.msgSuccess(res.msg); this.getList(); }); + }, + /** 导出按钮操作 */ + handleExport() { + this.download('workflow/process/finishedExport', { + ...this.queryParams + }, `wf_finished_process_${new Date().getTime()}.xlsx`) } } }; diff --git a/ruoyi-ui/src/views/workflow/work/index.vue b/ruoyi-ui/src/views/workflow/work/index.vue index 2d07d05c..725cd3a0 100644 --- a/ruoyi-ui/src/views/workflow/work/index.vue +++ b/ruoyi-ui/src/views/workflow/work/index.vue @@ -35,6 +35,16 @@ + + 导出 + @@ -176,6 +186,12 @@ export default { } }) }, + /** 导出按钮操作 */ + handleExport() { + this.download('workflow/process/startExport', { + ...this.queryParams + }, `wf_start_process_${new Date().getTime()}.xlsx`) + }, categoryFormat(row, column) { return this.categoryOptions.find(k => k.code === row.category)?.categoryName ?? ''; } diff --git a/ruoyi-ui/src/views/workflow/work/own.vue b/ruoyi-ui/src/views/workflow/work/own.vue index 4fb46aee..e6f9fa3d 100644 --- a/ruoyi-ui/src/views/workflow/work/own.vue +++ b/ruoyi-ui/src/views/workflow/work/own.vue @@ -64,6 +64,7 @@ plain icon="el-icon-download" size="mini" + v-hasPermi="['workflow:process:ownExport']" @click="handleExport" >导出 @@ -280,16 +281,9 @@ export default { }, /** 导出按钮操作 */ handleExport() { - const queryParams = this.queryParams; - this.$confirm('是否确认导出所有流程定义数据项?', "警告", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - }).then(function() { - // return exportDeployment(queryParams); - }).then(response => { - this.download(response.msg); - }) + this.download('workflow/process/ownExport', { + ...this.queryParams + }, `wf_own_process_${new Date().getTime()}.xlsx`) }, categoryFormat(row, column) { return this.categoryOptions.find(k => k.code === row.category)?.categoryName ?? ''; diff --git a/ruoyi-ui/src/views/workflow/work/todo.vue b/ruoyi-ui/src/views/workflow/work/todo.vue index 5226c91a..98ffc434 100644 --- a/ruoyi-ui/src/views/workflow/work/todo.vue +++ b/ruoyi-ui/src/views/workflow/work/todo.vue @@ -29,6 +29,16 @@ + + 导出 + @@ -186,16 +196,9 @@ export default { }, /** 导出按钮操作 */ handleExport() { - const queryParams = this.queryParams; - this.$confirm('是否确认导出所有流程定义数据项?', "警告", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - }).then(function () { - return exportDeployment(queryParams); - }).then(response => { - this.download(response.msg); - }) + this.download('workflow/process/todoExport', { + ...this.queryParams + }, `wf_todo_process_${new Date().getTime()}.xlsx`) } } };