Commit f0963c3941c34a510933c80759b0154d7d7696fd

Authored by YunaiV
1 parent f049bd75

流程详情页 30% - 表单信息的展示

yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmTaskController.java
@@ -57,12 +57,12 @@ public class BpmTaskController { @@ -57,12 +57,12 @@ public class BpmTaskController {
57 return success(true); 57 return success(true);
58 } 58 }
59 59
60 - @GetMapping("/list-by-process-instance-id") 60 + @GetMapping("/historic-list-by-process-instance-id")
61 @ApiOperation(value = "获得指定流程实例的任务列表", notes = "包括完成的、未完成的") 61 @ApiOperation(value = "获得指定流程实例的任务列表", notes = "包括完成的、未完成的")
62 @ApiImplicitParam(name = "processInstanceId", value = "流程实例的编号", required = true, dataTypeClass = String.class) 62 @ApiImplicitParam(name = "processInstanceId", value = "流程实例的编号", required = true, dataTypeClass = String.class)
63 - public CommonResult<List<BpmTaskRespVO>> getTaskListByProcessInstanceId( 63 + public CommonResult<List<BpmTaskRespVO>> getHistoricTaskListByProcessInstanceId(
64 @RequestParam("processInstanceId") String processInstanceId) { 64 @RequestParam("processInstanceId") String processInstanceId) {
65 - return success(taskService.getTaskListByProcessInstanceId(processInstanceId)); 65 + return success(taskService.getHistoricTaskListByProcessInstanceId(processInstanceId));
66 } 66 }
67 67
68 /** 68 /**
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java
@@ -64,6 +64,7 @@ public interface BpmProcessInstanceConvert { @@ -64,6 +64,7 @@ public interface BpmProcessInstanceConvert {
64 64
65 @Mappings({ 65 @Mappings({
66 @Mapping(source = "id", target = "processInstanceId"), 66 @Mapping(source = "id", target = "processInstanceId"),
  67 + @Mapping(source = "id", target = "id", ignore = true),
67 @Mapping(source = "startDate", target = "createTime"), 68 @Mapping(source = "startDate", target = "createTime"),
68 @Mapping(source = "initiator", target = "startUserId"), 69 @Mapping(source = "initiator", target = "startUserId"),
69 @Mapping(source = "status", target = "status", ignore = true) 70 @Mapping(source = "status", target = "status", ignore = true)
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmTaskService.java
@@ -31,7 +31,7 @@ public interface BpmTaskService { @@ -31,7 +31,7 @@ public interface BpmTaskService {
31 * @param processInstanceId 流程实例的编号 31 * @param processInstanceId 流程实例的编号
32 * @return 流程任务列表 32 * @return 流程任务列表
33 */ 33 */
34 - List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId); 34 + List<BpmTaskRespVO> getHistoricTaskListByProcessInstanceId(String processInstanceId);
35 35
36 /** 36 /**
37 * 获得流程任务列表 37 * 获得流程任务列表
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java
@@ -91,7 +91,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -91,7 +91,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
91 } 91 }
92 92
93 @Override 93 @Override
94 - public List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId) { 94 + public List<BpmTaskRespVO> getHistoricTaskListByProcessInstanceId(String processInstanceId) {
95 // 获得任务列表 95 // 获得任务列表
96 List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery() 96 List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
97 .processInstanceId(processInstanceId) 97 .processInstanceId(processInstanceId)
yudao-admin-ui/src/api/bpm/processInstance.js
@@ -27,7 +27,7 @@ export function cancelProcessInstance(id, reason) { @@ -27,7 +27,7 @@ export function cancelProcessInstance(id, reason) {
27 }) 27 })
28 } 28 }
29 29
30 -export function getMyProcessInstance(id) { 30 +export function getProcessInstance(id) {
31 return request({ 31 return request({
32 url: '/bpm/process-instance/get?id=' + id, 32 url: '/bpm/process-instance/get?id=' + id,
33 method: 'get', 33 method: 'get',
yudao-admin-ui/src/api/bpm/task.js
@@ -40,3 +40,9 @@ export function rejectTask(data) { @@ -40,3 +40,9 @@ export function rejectTask(data) {
40 }) 40 })
41 } 41 }
42 42
  43 +export function getHistoricTaskListByProcessInstanceId(processInstanceId) {
  44 + return request({
  45 + url: '/bpm/task/historic-list-by-process-instance-id?processInstanceId=' + processInstanceId,
  46 + method: 'get',
  47 + })
  48 +}
yudao-admin-ui/src/router/index.js
@@ -198,6 +198,12 @@ export const constantRoutes = [ @@ -198,6 +198,12 @@ export const constantRoutes = [
198 component: (resolve) => require(['@/views/bpm/processInstance/create'], resolve), 198 component: (resolve) => require(['@/views/bpm/processInstance/create'], resolve),
199 name: '发起流程', 199 name: '发起流程',
200 meta: { title: '发起流程' } 200 meta: { title: '发起流程' }
  201 + },
  202 + {
  203 + path: 'process-instance/detail',
  204 + component: (resolve) => require(['@/views/bpm/processInstance/detail'], resolve),
  205 + name: '流程详情',
  206 + meta: { title: '流程详情' }
201 } 207 }
202 ] 208 ]
203 }, 209 },
yudao-admin-ui/src/views/bpm/processInstance/create.vue
@@ -70,8 +70,6 @@ export default { @@ -70,8 +70,6 @@ export default {
70 return { 70 return {
71 // 遮罩层 71 // 遮罩层
72 loading: true, 72 loading: true,
73 - // 总条数  
74 - total: 0,  
75 // 表格数据 73 // 表格数据
76 list: [], 74 list: [],
77 75
yudao-admin-ui/src/views/bpm/processInstance/detail.vue
1 <template> 1 <template>
2 <div class="app-container"> 2 <div class="app-container">
3 - <!-- 第一步,通过流程定义的列表,选择对应的流程 -->  
4 - <div v-if="!selectProcessInstance">  
5 - <el-table v-loading="loading" :data="list">  
6 - <el-table-column label="流程名称" align="center" prop="name" width="200">  
7 - <template slot-scope="scope">  
8 - <el-button type="text" @click="handleBpmnDetail(scope.row)">  
9 - <span>{{ scope.row.name }}</span>  
10 - </el-button>  
11 - </template>  
12 - </el-table-column>  
13 - <el-table-column label="流程分类" align="center" prop="category" width="100">  
14 - <template slot-scope="scope">  
15 - <span>{{ getDictDataLabel(DICT_TYPE.BPM_MODEL_CATEGORY, scope.row.category) }}</span>  
16 - </template>  
17 - </el-table-column>  
18 - <el-table-column label="流程版本" align="center" prop="processDefinition.version" width="80">  
19 - <template slot-scope="scope">  
20 - <el-tag size="medium" v-if="scope.row">v{{ scope.row.version }}</el-tag>  
21 - </template>  
22 - </el-table-column>  
23 - <el-table-column label="流程描述" align="center" prop="description" width="300" show-overflow-tooltip />  
24 - <el-table-column label="操作" align="center" class-name="small-padding fixed-width">  
25 - <template slot-scope="scope">  
26 - <el-button type="text" size="small" icon="el-icon-plus" @click="handleSelect(scope.row)">选择</el-button>  
27 - </template>  
28 - </el-table-column>  
29 - </el-table>  
30 - </div>  
31 - <!-- 第二步,填写表单,进行流程的提交 -->  
32 - <div v-else>  
33 - <el-card class="box-card" >  
34 - <div slot="header" class="clearfix">  
35 - <span class="el-icon-document">申请信息【{{ selectProcessInstance.name }}】</span>  
36 - <el-button style="float: right;" type="primary" @click="selectProcessInstance = undefined">选择其它流程</el-button> 3 + <!-- TODO 审批信息 -->
  4 + <!-- 申请信息 -->
  5 + <el-card class="box-card" v-loading="processInstanceLoading">
  6 + <div slot="header" class="clearfix">
  7 + <span class="el-icon-document">申请信息【{{ processInstance.name }}】</span>
  8 + </div>
  9 + <el-col :span="16" :offset="6">
  10 + <div>
  11 + <parser :key="new Date().getTime()" :form-conf="detailForm" @submit="submitForm" />
37 </div> 12 </div>
38 - <el-col :span="16" :offset="6">  
39 - <div>  
40 - <parser :key="new Date().getTime()" :form-conf="detailForm" @submit="submitForm" />  
41 - </div>  
42 - </el-col>  
43 - </el-card>  
44 - <el-card class="box-card">  
45 - <div slot="header" class="clearfix">  
46 - <span class="el-icon-picture-outline">流程图</span>  
47 - </div>  
48 - <my-process-viewer key="designer" v-model="bpmnXML" v-bind="bpmnControlForm" />  
49 - </el-card>  
50 - </div>  
51 - 13 + </el-col>
  14 + </el-card>
  15 + <!-- TODO 审批记录 -->
  16 + <!-- TODO 流程图 -->
  17 + <el-card class="box-card" v-loading="processInstanceLoading">
  18 + <div slot="header" class="clearfix">
  19 + <span class="el-icon-picture-outline">流程图</span>
  20 + </div>
  21 + <my-process-viewer key="designer" v-model="bpmnXML" v-bind="bpmnControlForm" />
  22 + </el-card>
52 </div> 23 </div>
53 </template> 24 </template>
54 25
@@ -58,7 +29,8 @@ import {DICT_TYPE, getDictDatas} from &quot;@/utils/dict&quot;; @@ -58,7 +29,8 @@ import {DICT_TYPE, getDictDatas} from &quot;@/utils/dict&quot;;
58 import {getForm} from "@/api/bpm/form"; 29 import {getForm} from "@/api/bpm/form";
59 import {decodeFields} from "@/utils/formGenerator"; 30 import {decodeFields} from "@/utils/formGenerator";
60 import Parser from '@/components/parser/Parser' 31 import Parser from '@/components/parser/Parser'
61 -import {createProcessInstance, getMyProcessInstancePage} from "@/api/bpm/processInstance"; 32 +import {createProcessInstance, getMyProcessInstancePage, getProcessInstance} from "@/api/bpm/processInstance";
  33 +import {getHistoricTaskListByProcessInstanceId} from "@/api/bpm/task";
62 34
63 // 流程实例的详情页,可用于审批 35 // 流程实例的详情页,可用于审批
64 export default { 36 export default {
@@ -69,11 +41,10 @@ export default { @@ -69,11 +41,10 @@ export default {
69 data() { 41 data() {
70 return { 42 return {
71 // 遮罩层 43 // 遮罩层
72 - loading: true,  
73 - // 总条数  
74 - total: 0,  
75 - // 表格数据  
76 - list: [], 44 + processInstanceLoading: true,
  45 + // 流程实例
  46 + id: undefined, // 流程实例的编号
  47 + processInstance: {},
77 48
78 // 流程表单详情 49 // 流程表单详情
79 detailForm: { 50 detailForm: {
@@ -86,27 +57,65 @@ export default { @@ -86,27 +57,65 @@ export default {
86 prefix: "activiti" 57 prefix: "activiti"
87 }, 58 },
88 59
89 - // 流程表单  
90 - selectProcessInstance: undefined, // 选择的流程实例 60 + // 审批记录
  61 + historicTasksLoad: true,
  62 + historicTasks: [],
91 63
92 // 数据字典 64 // 数据字典
93 categoryDictDatas: getDictDatas(DICT_TYPE.BPM_MODEL_CATEGORY), 65 categoryDictDatas: getDictDatas(DICT_TYPE.BPM_MODEL_CATEGORY),
94 }; 66 };
95 }, 67 },
96 created() { 68 created() {
97 - this.getList(); 69 + this.id = this.$route.query.id;
  70 + if (!this.id) {
  71 + this.$message.error('未传递 id 参数,无法查看流程信息');
  72 + return;
  73 + }
  74 + this.getDetail();
98 }, 75 },
99 methods: { 76 methods: {
100 - /** 查询流程定义列表 */  
101 - getList() {  
102 - this.loading = true;  
103 - getProcessDefinitionList({  
104 - suspensionState: 1  
105 - }).then(response => {  
106 - this.list = response.data  
107 - this.loading = false 77 + /** 获得流程实例 */
  78 + getDetail() {
  79 + // 获得流程实例相关
  80 + this.processInstanceLoading = true;
  81 + getProcessInstance(this.id).then(response => {
  82 + if (!response.data) {
  83 + this.$message.error('查询不到流程信息!');
  84 + return;
108 } 85 }
109 - ); 86 + // 设置流程信息
  87 + this.processInstance = response.data;
  88 +
  89 + // 设置表单信息
  90 + this.detailForm = {
  91 + ...JSON.parse(this.processInstance.processDefinition.formConf),
  92 + disabled: true, // 表单禁用
  93 + formBtns: false, // 按钮隐藏
  94 + fields: decodeFields(this.processInstance.processDefinition.formFields)
  95 + }
  96 + // 设置表单的值
  97 + this.detailForm.fields.forEach(item => {
  98 + const val = this.processInstance.formVariables[item.__vModel__]
  99 + if (val) {
  100 + item.__config__.defaultValue = val
  101 + }
  102 + })
  103 +
  104 + // 加载流程图
  105 + getProcessDefinitionBpmnXML(this.processInstance.processDefinition.id).then(response => {
  106 + this.bpmnXML = response.data
  107 + })
  108 +
  109 + // 取消加载中
  110 + this.processInstanceLoading = false;
  111 + });
  112 +
  113 + // 获得流程任务列表(审批记录)
  114 + this.historicTasksLoad = true;
  115 + getHistoricTaskListByProcessInstanceId(this.id).then(response => {
  116 + this.historicTasks = response.data;
  117 + this.historicTasksLoad = true;
  118 + });
110 }, 119 },
111 /** 处理选择流程的按钮操作 **/ 120 /** 处理选择流程的按钮操作 **/
112 handleSelect(row) { 121 handleSelect(row) {
@@ -121,10 +130,7 @@ export default { @@ -121,10 +130,7 @@ export default {
121 fields: decodeFields(row.formFields) 130 fields: decodeFields(row.formFields)
122 } 131 }
123 132
124 - // 加载流程图  
125 - getProcessDefinitionBpmnXML(row.id).then(response => {  
126 - this.bpmnXML = response.data  
127 - }) 133 +
128 } else if (row.formCustomCreatePath) { 134 } else if (row.formCustomCreatePath) {
129 this.$router.push({ path: row.formCustomCreatePath}); 135 this.$router.push({ path: row.formCustomCreatePath});
130 // 这里暂时无需加载流程图,因为跳出到另外个 Tab; 136 // 这里暂时无需加载流程图,因为跳出到另外个 Tab;
yudao-admin-ui/src/views/bpm/task/todo.vue
@@ -36,7 +36,7 @@ @@ -36,7 +36,7 @@
36 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 36 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
37 <template slot-scope="scope"> 37 <template slot-scope="scope">
38 <!-- TODO 权限、颜色 --> 38 <!-- TODO 权限、颜色 -->
39 - <el-button size="mini" type="text" icon="el-icon-edit">审批</el-button> 39 + <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> 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> 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> 42 <el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.suspensionState === 2">激活</el-button>
@@ -104,6 +104,10 @@ export default { @@ -104,6 +104,10 @@ export default {
104 this.resetForm("queryForm"); 104 this.resetForm("queryForm");
105 this.handleQuery(); 105 this.handleQuery();
106 }, 106 },
  107 + /** 处理审批按钮 */
  108 + handleAudit(row) {
  109 + this.$router.push({ path: "/bpm/process-instance/detail", query: { id: row.processInstance.id}});
  110 + },
107 audit(row, pass) { 111 audit(row, pass) {
108 if (pass) { 112 if (pass) {
109 approveTask({ 113 approveTask({