Commit cf7a434f0cf3bd1767afeda406c08fd36aeac8a3

Authored by YunaiV
1 parent 519a4a16

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

yudao-admin-ui/src/views/bpm/processInstance/detail.vue
1 <template> 1 <template>
2 <div class="app-container"> 2 <div class="app-container">
3 <!-- 审批信息 --> 3 <!-- 审批信息 -->
4 - <el-card class="box-card" v-loading="processInstanceLoading"> 4 + <el-card class="box-card" v-loading="processInstanceLoading" v-for="(item, index) in tasks" :key="index">
5 <div slot="header" class="clearfix"> 5 <div slot="header" class="clearfix">
6 - <span class="el-icon-picture-outline">审批任务【TODO】</span> 6 + <span class="el-icon-picture-outline">审批任务【{{ item.name }}】</span>
7 </div> 7 </div>
8 <el-col :span="16" :offset="6" > 8 <el-col :span="16" :offset="6" >
9 - <el-form ref="form" :model="form" :rules="rules" label-width="80px">  
10 - <el-row>  
11 - <el-col :span="12">  
12 - <el-form-item label="审批建议" prop="comment">  
13 - <el-input type="textarea" v-model="form.comment" placeholder="请输入审批建议" />  
14 - </el-form-item>  
15 - </el-col>  
16 - </el-row> 9 + <el-form :ref="'form' + index" :model="auditForms[index]" :rules="auditRule" label-width="100px">
  10 + <el-form-item label="流程名" v-if="processInstance && processInstance.name">
  11 + {{ processInstance.name }}
  12 + </el-form-item>
  13 + <el-form-item label="流程发起人" v-if="processInstance && processInstance.startUser">
  14 + {{ processInstance.startUser.nickname }}
  15 + <el-tag type="info" size="mini">{{ processInstance.startUser.deptName }}</el-tag>
  16 + </el-form-item>
  17 + <el-form-item label="审批建议" prop="comment">
  18 + <el-input type="textarea" v-model="auditForms[index].comment" placeholder="请输入审批建议" />
  19 + </el-form-item>
17 </el-form> 20 </el-form>
18 <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px;"> 21 <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px;">
19 - <el-button icon="el-icon-edit-outline" type="success" size="mini" @click="handleComplete">通过</el-button>  
20 - <el-button icon="el-icon-circle-close" type="danger" size="mini" @click="handleReject">不通过</el-button>  
21 - <el-button icon="el-icon-edit-outline" type="primary" size="mini" @click="handleAssign">转办</el-button>  
22 - <el-button icon="el-icon-edit-outline" type="info" size="mini" @click="handleDelegate">委派</el-button>  
23 - <el-button icon="el-icon-refresh-left" type="warning" size="mini" @click="handleReturn">退回</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>
  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>
  26 + <el-button icon="el-icon-refresh-left" type="warning" size="mini" @click="handleBack(item)">退回</el-button>
24 </div> 27 </div>
25 </el-col> 28 </el-col>
26 </el-card> 29 </el-card>
@@ -43,8 +46,7 @@ @@ -43,8 +46,7 @@
43 <div class="block"> 46 <div class="block">
44 <el-timeline> 47 <el-timeline>
45 <el-timeline-item v-for="(item, index) in historicTasks" :key="index" 48 <el-timeline-item v-for="(item, index) in historicTasks" :key="index"
46 - :icon="getTimelineItemIcon(item)"  
47 - :type="getTimelineItemType(item)"> 49 + :icon="getTimelineItemIcon(item)" :type="getTimelineItemType(item)">
48 <p style="font-weight: 700">任务:{{ item.name }}</p> 50 <p style="font-weight: 700">任务:{{ item.name }}</p>
49 <el-card :body-style="{ padding: '10px' }"> 51 <el-card :body-style="{ padding: '10px' }">
50 <label v-if="item.assigneeUser" style="font-weight: normal; margin-right: 30px;"> 52 <label v-if="item.assigneeUser" style="font-weight: normal; margin-right: 30px;">
@@ -83,7 +85,7 @@ import {getForm} from &quot;@/api/bpm/form&quot;; @@ -83,7 +85,7 @@ import {getForm} from &quot;@/api/bpm/form&quot;;
83 import {decodeFields} from "@/utils/formGenerator"; 85 import {decodeFields} from "@/utils/formGenerator";
84 import Parser from '@/components/parser/Parser' 86 import Parser from '@/components/parser/Parser'
85 import {createProcessInstance, getMyProcessInstancePage, getProcessInstance} from "@/api/bpm/processInstance"; 87 import {createProcessInstance, getMyProcessInstancePage, getProcessInstance} from "@/api/bpm/processInstance";
86 -import {getHistoricTaskListByProcessInstanceId} from "@/api/bpm/task"; 88 +import {approveTask, getHistoricTaskListByProcessInstanceId, rejectTask} from "@/api/bpm/task";
87 import {getDate} from "@/utils/dateUtils"; 89 import {getDate} from "@/utils/dateUtils";
88 90
89 // 流程实例的详情页,可用于审批 91 // 流程实例的详情页,可用于审批
@@ -116,8 +118,9 @@ export default { @@ -116,8 +118,9 @@ export default {
116 historicTasks: [], 118 historicTasks: [],
117 119
118 // 审批表单 120 // 审批表单
119 - form: {},  
120 - rules: { 121 + tasks: [],
  122 + auditForms: [],
  123 + auditRule: {
121 comment: [{ required: true, message: "审批建议不能为空", trigger: "blur" }], 124 comment: [{ required: true, message: "审批建议不能为空", trigger: "blur" }],
122 }, 125 },
123 126
@@ -172,7 +175,10 @@ export default { @@ -172,7 +175,10 @@ export default {
172 175
173 // 获得流程任务列表(审批记录) 176 // 获得流程任务列表(审批记录)
174 this.historicTasksLoad = true; 177 this.historicTasksLoad = true;
  178 + this.tasks = [];
  179 + this.auditForms = [];
175 getHistoricTaskListByProcessInstanceId(this.id).then(response => { 180 getHistoricTaskListByProcessInstanceId(this.id).then(response => {
  181 + // 审批记录
176 this.historicTasks = response.data; 182 this.historicTasks = response.data;
177 // 排序,将未完成的排在前面,已完成的排在后面; 183 // 排序,将未完成的排在前面,已完成的排在后面;
178 this.historicTasks.sort((a, b) => { 184 this.historicTasks.sort((a, b) => {
@@ -188,6 +194,19 @@ export default { @@ -188,6 +194,19 @@ export default {
188 return b.createTime - a.createTime; 194 return b.createTime - a.createTime;
189 } 195 }
190 }); 196 });
  197 +
  198 + // 需要审核的记录
  199 + this.historicTasks.forEach(task => {
  200 + if (task.result !== 1) { // 只有待处理才需要
  201 + return;
  202 + }
  203 + this.tasks.push({...task});
  204 + this.auditForms.push({
  205 + comment: ''
  206 + })
  207 + });
  208 +
  209 + // 取消加载中
191 this.historicTasksLoad = false; 210 this.historicTasksLoad = false;
192 }); 211 });
193 }, 212 },
@@ -266,6 +285,38 @@ export default { @@ -266,6 +285,38 @@ export default {
266 } 285 }
267 return ''; 286 return '';
268 }, 287 },
  288 + /** 处理审批通过和不通过的操作 */
  289 + handleAudit(task, pass) {
  290 + const index = this.tasks.indexOf(task);
  291 + this.$refs['form' + index][0].validate(valid => {
  292 + if (!valid) {
  293 + return;
  294 + }
  295 + const data = {
  296 + id: task.id,
  297 + comment: this.auditForms[index].comment
  298 + }
  299 + if (pass) {
  300 + approveTask(data).then(response => {
  301 + this.msgSuccess("审批通过成功!");
  302 + this.getDetail(); // 获得最新详情
  303 + });
  304 + } else {
  305 + rejectTask(data).then(response => {
  306 + this.msgSuccess("审批不通过成功!");
  307 + this.getDetail(); // 获得最新详情
  308 + });
  309 + }
  310 + })
  311 + },
  312 + /** 处理审批退回的操作 */
  313 + handleDelegate(task) {
  314 + this.msgError("暂不支持【委派】功能,可以使用【转派】替代!");
  315 + },
  316 + /** 处理审批退回的操作 */
  317 + handleBack(task) {
  318 + this.msgError("暂不支持【退回】功能!");
  319 + }
269 } 320 }
270 }; 321 };
271 </script> 322 </script>
yudao-admin-ui/src/views/bpm/task/todo.vue
@@ -3,6 +3,9 @@ @@ -3,6 +3,9 @@
3 3
4 <!-- 搜索工作栏 --> 4 <!-- 搜索工作栏 -->
5 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> 5 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  6 + <el-form-item label="流程发起人">
  7 + 321321321
  8 + </el-form-item>
6 <el-form-item label="流程名" prop="name"> 9 <el-form-item label="流程名" prop="name">
7 <el-input v-model="queryParams.name" placeholder="请输入流程名" clearable size="small" @keyup.enter.native="handleQuery"/> 10 <el-input v-model="queryParams.name" placeholder="请输入流程名" clearable size="small" @keyup.enter.native="handleQuery"/>
8 </el-form-item> 11 </el-form-item>
@@ -37,8 +40,6 @@ @@ -37,8 +40,6 @@
37 <template slot-scope="scope"> 40 <template slot-scope="scope">
38 <!-- TODO 权限、颜色 --> 41 <!-- TODO 权限、颜色 -->
39 <el-button size="mini" type="text" icon="el-icon-edit" @click="handleAudit(scope.row)">审批</el-button> 42 <el-button size="mini" type="text" icon="el-icon-edit" @click="handleAudit(scope.row)">审批</el-button>
40 - <el-button size="mini" type="text" icon="el-icon-edit" @click="audit(scope.row, true)">通过</el-button>  
41 - <el-button size="mini" type="text" icon="el-icon-edit" @click="audit(scope.row, false)">不通过</el-button>  
42 <el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.suspensionState === 2">激活</el-button> 43 <el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.suspensionState === 2">激活</el-button>
43 <el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.suspensionState === 1">挂起</el-button> 44 <el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.suspensionState === 1">挂起</el-button>
44 </template> 45 </template>
@@ -108,19 +109,6 @@ export default { @@ -108,19 +109,6 @@ export default {
108 handleAudit(row) { 109 handleAudit(row) {
109 this.$router.push({ path: "/bpm/process-instance/detail", query: { id: row.processInstance.id}}); 110 this.$router.push({ path: "/bpm/process-instance/detail", query: { id: row.processInstance.id}});
110 }, 111 },
111 - audit(row, pass) {  
112 - if (pass) {  
113 - approveTask({  
114 - id: row.id,  
115 - comment: '通过'  
116 - })  
117 - } else {  
118 - rejectTask({  
119 - id: row.id,  
120 - comment: '不通过'  
121 - })  
122 - }  
123 - }  
124 } 112 }
125 }; 113 };
126 </script> 114 </script>