Commit c9b9eced071f53beda1754371b6d489e40e3151c

Authored by YunaiV
1 parent cf7a434f

流程详情页 90% - 接入审批通过、审批不通过的功能

yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java
@@ -46,14 +46,14 @@ public class BpmTaskController { @@ -46,14 +46,14 @@ public class BpmTaskController {
46 @PutMapping("/approve") 46 @PutMapping("/approve")
47 @ApiOperation("通过任务") 47 @ApiOperation("通过任务")
48 public CommonResult<Boolean> approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) { 48 public CommonResult<Boolean> approveTask(@Valid @RequestBody BpmTaskApproveReqVO reqVO) {
49 - taskService.approveTask(reqVO); 49 + taskService.approveTask(getLoginUserId(), reqVO);
50 return success(true); 50 return success(true);
51 } 51 }
52 52
53 @PutMapping("/reject") 53 @PutMapping("/reject")
54 @ApiOperation("不通过任务") 54 @ApiOperation("不通过任务")
55 public CommonResult<Boolean> rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) { 55 public CommonResult<Boolean> rejectTask(@Valid @RequestBody BpmTaskRejectReqVO reqVO) {
56 - taskService.rejectTask(reqVO); 56 + taskService.rejectTask(getLoginUserId(), reqVO);
57 return success(true); 57 return success(true);
58 } 58 }
59 59
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java
@@ -42,6 +42,7 @@ public interface BpmErrorCodeConstants { @@ -42,6 +42,7 @@ public interface BpmErrorCodeConstants {
42 42
43 // ========== 流程任务 1-009-005-000 ========== 43 // ========== 流程任务 1-009-005-000 ==========
44 ErrorCode TASK_COMPLETE_FAIL_NOT_EXISTS = new ErrorCode(1009004000, "审批任务失败,原因:该任务不处于未审批"); 44 ErrorCode TASK_COMPLETE_FAIL_NOT_EXISTS = new ErrorCode(1009004000, "审批任务失败,原因:该任务不处于未审批");
  45 + ErrorCode TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF = new ErrorCode(1009004001, "审批任务失败,原因:该任务的审批人不是你");
45 46
46 // ========== 流程任务分配规则 1-009-006-000 ========== 47 // ========== 流程任务分配规则 1-009-006-000 ==========
47 ErrorCode TASK_ASSIGN_RULE_EXISTS = new ErrorCode(1009006000, "流程({}) 的任务({}) 已经存在分配规则"); 48 ErrorCode TASK_ASSIGN_RULE_EXISTS = new ErrorCode(1009006000, "流程({}) 的任务({}) 已经存在分配规则");
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java
@@ -21,7 +21,6 @@ public interface BpmTaskService { @@ -21,7 +21,6 @@ public interface BpmTaskService {
21 * 获得指定流程实例的 Running 进行中的流程任务列表 21 * 获得指定流程实例的 Running 进行中的流程任务列表
22 * 22 *
23 * @param processInstanceId 流程实例的编号 23 * @param processInstanceId 流程实例的编号
24 - * @return 流程任务列表  
25 */ 24 */
26 List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId); 25 List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId);
27 26
@@ -81,16 +80,18 @@ public interface BpmTaskService { @@ -81,16 +80,18 @@ public interface BpmTaskService {
81 /** 80 /**
82 * 通过任务 81 * 通过任务
83 * 82 *
  83 + * @param userId 用户编号
84 * @param reqVO 通过请求 84 * @param reqVO 通过请求
85 */ 85 */
86 - void approveTask(@Valid BpmTaskApproveReqVO reqVO); 86 + void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO);
87 87
88 /** 88 /**
89 * 不通过任务 89 * 不通过任务
90 * 90 *
  91 + * @param userId 用户编号
91 * @param reqVO 不通过请求 92 * @param reqVO 不通过请求
92 */ 93 */
93 - void rejectTask(@Valid BpmTaskRejectReqVO reqVO); 94 + void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO);
94 95
95 /** 96 /**
96 * 返回高亮的流转进程 97 * 返回高亮的流转进程
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java
@@ -14,6 +14,7 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO @@ -14,6 +14,7 @@ import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO
14 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService; 14 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
15 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; 15 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
16 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; 16 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
  17 +import cn.iocoder.yudao.framework.activiti.core.util.ActivitiUtils;
17 import cn.iocoder.yudao.framework.common.pojo.PageResult; 18 import cn.iocoder.yudao.framework.common.pojo.PageResult;
18 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 19 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
19 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 20 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
@@ -200,12 +201,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -200,12 +201,15 @@ public class BpmTaskServiceImpl implements BpmTaskService {
200 201
201 @Override 202 @Override
202 @Transactional(rollbackFor = Exception.class) 203 @Transactional(rollbackFor = Exception.class)
203 - public void approveTask(BpmTaskApproveReqVO reqVO) { 204 + public void approveTask(Long userId, BpmTaskApproveReqVO reqVO) {
204 // 校验任务存在 205 // 校验任务存在
205 Task task = getTask(reqVO.getId()); 206 Task task = getTask(reqVO.getId());
206 if (task == null) { 207 if (task == null) {
207 throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS); 208 throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS);
208 } 209 }
  210 + if (!ActivitiUtils.equals(task.getAssignee(), userId)) {
  211 + throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF);
  212 + }
209 // 校验流程实例存在 213 // 校验流程实例存在
210 ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); 214 ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
211 if (instance == null) { 215 if (instance == null) {
@@ -224,12 +228,15 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -224,12 +228,15 @@ public class BpmTaskServiceImpl implements BpmTaskService {
224 228
225 @Override 229 @Override
226 @Transactional(rollbackFor = Exception.class) 230 @Transactional(rollbackFor = Exception.class)
227 - public void rejectTask(@Valid BpmTaskRejectReqVO reqVO) { 231 + public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) {
228 // 校验任务存在 232 // 校验任务存在
229 Task task = getTask(reqVO.getId()); 233 Task task = getTask(reqVO.getId());
230 if (task == null) { 234 if (task == null) {
231 throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS); 235 throw exception(TASK_COMPLETE_FAIL_NOT_EXISTS);
232 } 236 }
  237 + if (!ActivitiUtils.equals(task.getAssignee(), userId)) {
  238 + throw exception(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF);
  239 + }
233 // 校验流程实例存在 240 // 校验流程实例存在
234 ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId()); 241 ProcessInstance instance = processInstanceService.getProcessInstance(task.getProcessInstanceId());
235 if (instance == null) { 242 if (instance == null) {
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthPermissionInfoRespVO.java
@@ -32,6 +32,9 @@ public class SysAuthPermissionInfoRespVO { @@ -32,6 +32,9 @@ public class SysAuthPermissionInfoRespVO {
32 @Builder 32 @Builder
33 public static class UserVO { 33 public static class UserVO {
34 34
  35 + @ApiModelProperty(value = "用户编号", required = true, example = "1024")
  36 + private Long id;
  37 +
35 @ApiModelProperty(value = "用户昵称", required = true, example = "芋道源码") 38 @ApiModelProperty(value = "用户昵称", required = true, example = "芋道源码")
36 private String nickname; 39 private String nickname;
37 40
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/auth/SysAuthConvert.java
@@ -31,7 +31,7 @@ public interface SysAuthConvert { @@ -31,7 +31,7 @@ public interface SysAuthConvert {
31 31
32 default SysAuthPermissionInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) { 32 default SysAuthPermissionInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) {
33 return SysAuthPermissionInfoRespVO.builder() 33 return SysAuthPermissionInfoRespVO.builder()
34 - .user(SysAuthPermissionInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build()) 34 + .user(SysAuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build())
35 .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode)) 35 .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getCode))
36 .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission)) 36 .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission))
37 .build(); 37 .build();
yudao-admin-ui/src/store/getters.js
@@ -4,6 +4,7 @@ const getters = { @@ -4,6 +4,7 @@ const getters = {
4 device: state => state.app.device, 4 device: state => state.app.device,
5 visitedViews: state => state.tagsView.visitedViews, 5 visitedViews: state => state.tagsView.visitedViews,
6 cachedViews: state => state.tagsView.cachedViews, 6 cachedViews: state => state.tagsView.cachedViews,
  7 + userId: state => state.user.id,
7 token: state => state.user.token, 8 token: state => state.user.token,
8 avatar: state => state.user.avatar, 9 avatar: state => state.user.avatar,
9 name: state => state.user.name, 10 name: state => state.user.name,
yudao-admin-ui/src/store/modules/user.js
@@ -4,6 +4,7 @@ import { getToken, setToken, removeToken } from &#39;@/utils/auth&#39; @@ -4,6 +4,7 @@ import { getToken, setToken, removeToken } from &#39;@/utils/auth&#39;
4 const user = { 4 const user = {
5 state: { 5 state: {
6 token: getToken(), 6 token: getToken(),
  7 + id: 0, // 用户编号
7 name: '', 8 name: '',
8 avatar: '', 9 avatar: '',
9 roles: [], 10 roles: [],
@@ -11,6 +12,9 @@ const user = { @@ -11,6 +12,9 @@ const user = {
11 }, 12 },
12 13
13 mutations: { 14 mutations: {
  15 + SET_ID: (state, id) => {
  16 + state.id = id
  17 + },
14 SET_TOKEN: (state, token) => { 18 SET_TOKEN: (state, token) => {
15 state.token = token 19 state.token = token
16 }, 20 },
@@ -96,6 +100,7 @@ const user = { @@ -96,6 +100,7 @@ const user = {
96 } else { 100 } else {
97 commit('SET_ROLES', ['ROLE_DEFAULT']) 101 commit('SET_ROLES', ['ROLE_DEFAULT'])
98 } 102 }
  103 + commit('SET_ID', user.id)
99 commit('SET_NAME', user.userName) 104 commit('SET_NAME', user.userName)
100 commit('SET_AVATAR', avatar) 105 commit('SET_AVATAR', avatar)
101 resolve(res) 106 resolve(res)
yudao-admin-ui/src/views/bpm/processInstance/detail.vue
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px;"> 21 <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px;">
22 <el-button icon="el-icon-edit-outline" type="success" size="mini" @click="handleAudit(item, true)">通过</el-button> 22 <el-button icon="el-icon-edit-outline" type="success" size="mini" @click="handleAudit(item, true)">通过</el-button>
23 <el-button icon="el-icon-circle-close" type="danger" size="mini" @click="handleAudit(item, false)">不通过</el-button> 23 <el-button icon="el-icon-circle-close" type="danger" size="mini" @click="handleAudit(item, false)">不通过</el-button>
24 -<!-- <el-button icon="el-icon-edit-outline" type="primary" size="mini" @click="handleAssign">转办</el-button>--> 24 + <!-- <el-button icon="el-icon-edit-outline" type="primary" size="mini" @click="handleAssign">转办</el-button>-->
25 <el-button icon="el-icon-edit-outline" type="primary" size="mini" @click="handleDelegate(item)">委派</el-button> 25 <el-button icon="el-icon-edit-outline" type="primary" size="mini" @click="handleDelegate(item)">委派</el-button>
26 <el-button icon="el-icon-refresh-left" type="warning" size="mini" @click="handleBack(item)">退回</el-button> 26 <el-button icon="el-icon-refresh-left" type="warning" size="mini" @click="handleBack(item)">退回</el-button>
27 </div> 27 </div>
@@ -81,7 +81,7 @@ @@ -81,7 +81,7 @@
81 <script> 81 <script>
82 import {getProcessDefinitionBpmnXML, getProcessDefinitionList} from "@/api/bpm/definition"; 82 import {getProcessDefinitionBpmnXML, getProcessDefinitionList} from "@/api/bpm/definition";
83 import {DICT_TYPE, getDictDatas} from "@/utils/dict"; 83 import {DICT_TYPE, getDictDatas} from "@/utils/dict";
84 -import {getForm} from "@/api/bpm/form"; 84 +import store from "@/store";
85 import {decodeFields} from "@/utils/formGenerator"; 85 import {decodeFields} from "@/utils/formGenerator";
86 import Parser from '@/components/parser/Parser' 86 import Parser from '@/components/parser/Parser'
87 import {createProcessInstance, getMyProcessInstancePage, getProcessInstance} from "@/api/bpm/processInstance"; 87 import {createProcessInstance, getMyProcessInstancePage, getProcessInstance} from "@/api/bpm/processInstance";
@@ -196,10 +196,14 @@ export default { @@ -196,10 +196,14 @@ export default {
196 }); 196 });
197 197
198 // 需要审核的记录 198 // 需要审核的记录
  199 + const userId = store.getters.userId;
199 this.historicTasks.forEach(task => { 200 this.historicTasks.forEach(task => {
200 if (task.result !== 1) { // 只有待处理才需要 201 if (task.result !== 1) { // 只有待处理才需要
201 return; 202 return;
202 } 203 }
  204 + if (!task.assigneeUser || task.assigneeUser.id !== userId) { // 自己不是处理人
  205 + return;
  206 + }
203 this.tasks.push({...task}); 207 this.tasks.push({...task});
204 this.auditForms.push({ 208 this.auditForms.push({
205 comment: '' 209 comment: ''
yudao-admin-ui/src/views/bpm/processInstance/index.vue
@@ -106,6 +106,7 @@ @@ -106,6 +106,7 @@
106 <!-- TODO 芋艿:权限 --> 106 <!-- TODO 芋艿:权限 -->
107 <el-button type="text" size="small" icon="el-icon-delete" v-if="scope.row.result === 1" 107 <el-button type="text" size="small" icon="el-icon-delete" v-if="scope.row.result === 1"
108 @click="handleCancel(scope.row)">取消</el-button> 108 @click="handleCancel(scope.row)">取消</el-button>
  109 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleDetail(scope.row)">详情</el-button>
109 </template> 110 </template>
110 </el-table-column> 111 </el-table-column>
111 </el-table> 112 </el-table>
@@ -204,6 +205,10 @@ export default { @@ -204,6 +205,10 @@ export default {
204 this.msgSuccess("取消成功"); 205 this.msgSuccess("取消成功");
205 }) 206 })
206 }, 207 },
  208 + /** 处理详情按钮 */
  209 + handleDetail(row) {
  210 + this.$router.push({ path: "/bpm/process-instance/detail", query: { id: row.id}});
  211 + },
207 } 212 }
208 }; 213 };
209 </script> 214 </script>
yudao-admin-ui/src/views/bpm/task/done.vue
@@ -60,7 +60,7 @@ @@ -60,7 +60,7 @@
60 <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width"> 60 <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
61 <template slot-scope="scope"> 61 <template slot-scope="scope">
62 <!-- TODO 权限、颜色 --> 62 <!-- TODO 权限、颜色 -->
63 - <el-button size="mini" type="text" icon="el-icon-edit">详情</el-button> 63 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleAudit(scope.row)">详情</el-button>
64 </template> 64 </template>
65 </el-table-column> 65 </el-table-column>
66 </el-table> 66 </el-table>
@@ -127,7 +127,11 @@ export default { @@ -127,7 +127,11 @@ export default {
127 }, 127 },
128 getDateStar(ms) { 128 getDateStar(ms) {
129 return getDate(ms); 129 return getDate(ms);
130 - } 130 + },
  131 + /** 处理审批按钮 */
  132 + handleAudit(row) {
  133 + this.$router.push({ path: "/bpm/process-instance/detail", query: { id: row.processInstance.id}});
  134 + },
131 } 135 }
132 }; 136 };
133 </script> 137 </script>
yudao-framework/yudao-spring-boot-starter-activiti/src/main/java/cn/iocoder/yudao/framework/activiti/core/util/ActivitiUtils.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.activiti.core.util; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.activiti.core.util;
2 2
3 import cn.hutool.core.util.ReflectUtil; 3 import cn.hutool.core.util.ReflectUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
5 import com.alibaba.ttl.TransmittableThreadLocal; 6 import com.alibaba.ttl.TransmittableThreadLocal;
6 import org.activiti.bpmn.converter.BpmnXMLConverter; 7 import org.activiti.bpmn.converter.BpmnXMLConverter;
7 import org.activiti.bpmn.model.BpmnModel; 8 import org.activiti.bpmn.model.BpmnModel;
@@ -13,6 +14,7 @@ import org.activiti.engine.impl.util.io.BytesStreamSource; @@ -13,6 +14,7 @@ import org.activiti.engine.impl.util.io.BytesStreamSource;
13 import javax.xml.bind.Element; 14 import javax.xml.bind.Element;
14 import java.util.ArrayList; 15 import java.util.ArrayList;
15 import java.util.List; 16 import java.util.List;
  17 +import java.util.Objects;
16 import java.util.function.Consumer; 18 import java.util.function.Consumer;
17 19
18 /** 20 /**
@@ -45,6 +47,10 @@ public class ActivitiUtils { @@ -45,6 +47,10 @@ public class ActivitiUtils {
45 Authentication.setAuthenticatedUserId(null); 47 Authentication.setAuthenticatedUserId(null);
46 } 48 }
47 49
  50 + public static boolean equals(String userIdStr, Long userId) {
  51 + return Objects.equals(userId, NumberUtils.parseLong(userIdStr));
  52 + }
  53 +
48 // ========== BPMN XML 相关 ========== 54 // ========== BPMN XML 相关 ==========
49 55
50 /** 56 /**