Commit 77f06e79c41bdb9ff0e2cb4962150b68c7e3b6ce

Authored by YunaiV
1 parent b083795a

实现 bpm 待办任务的前端界面

yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/task/BpmTaskTodoPageItemRespVO.java
@@ -19,8 +19,11 @@ public class BpmTaskTodoPageItemRespVO { @@ -19,8 +19,11 @@ public class BpmTaskTodoPageItemRespVO {
19 @ApiModelProperty(value = "接收时间", required = true) 19 @ApiModelProperty(value = "接收时间", required = true)
20 private Date claimTime; 20 private Date claimTime;
21 21
22 - @ApiModelProperty(value = "任务状态", notes = "参见 bpm_process_instance_status", example = "1")  
23 - private Integer status; 22 + @ApiModelProperty(value = "创建时间", required = true)
  23 + private Date createTime;
  24 +
  25 + @ApiModelProperty(value = "激活状态", required = true, example = "1", notes = "参见 SuspensionState 枚举")
  26 + private Integer suspensionState;
24 27
25 /** 28 /**
26 * 所属流程实例 29 * 所属流程实例
@@ -34,6 +37,9 @@ public class BpmTaskTodoPageItemRespVO { @@ -34,6 +37,9 @@ public class BpmTaskTodoPageItemRespVO {
34 @ApiModelProperty(value = "流程实例编号", required = true, example = "1024") 37 @ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
35 private String id; 38 private String id;
36 39
  40 + @ApiModelProperty(value = "流程实例名称", required = true, example = "芋道")
  41 + private String name;
  42 +
37 @ApiModelProperty(value = "发起人的用户编号", required = true, example = "1024") 43 @ApiModelProperty(value = "发起人的用户编号", required = true, example = "1024")
38 private Long startUserId; 44 private Long startUserId;
39 45
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmTaskConvert.java
@@ -45,16 +45,18 @@ public interface BpmTaskConvert { @@ -45,16 +45,18 @@ public interface BpmTaskConvert {
45 @Mapping(source = "task.id", target = "id"), 45 @Mapping(source = "task.id", target = "id"),
46 @Mapping(source = "task.name", target = "name"), 46 @Mapping(source = "task.name", target = "name"),
47 @Mapping(source = "task.claimTime", target = "claimTime"), 47 @Mapping(source = "task.claimTime", target = "claimTime"),
48 - @Mapping(source = "task.suspended", target = "status", qualifiedByName = "convertSuspendedToStatus"), 48 + @Mapping(source = "task.createTime", target = "createTime"),
  49 + @Mapping(source = "task.suspended", target = "suspensionState", qualifiedByName = "convertSuspendedToSuspensionState"),
49 @Mapping(source = "processInstance.id", target = "processInstance.id"), 50 @Mapping(source = "processInstance.id", target = "processInstance.id"),
  51 + @Mapping(source = "processInstance.name", target = "processInstance.name"),
50 @Mapping(source = "processInstance.startUserId", target = "processInstance.startUserId"), 52 @Mapping(source = "processInstance.startUserId", target = "processInstance.startUserId"),
51 @Mapping(source = "processInstance.processDefinitionId", target = "processInstance.processDefinitionId"), 53 @Mapping(source = "processInstance.processDefinitionId", target = "processInstance.processDefinitionId"),
52 @Mapping(source = "user.nickname", target = "processInstance.startUserNickname") 54 @Mapping(source = "user.nickname", target = "processInstance.startUserNickname")
53 }) 55 })
54 BpmTaskTodoPageItemRespVO convert(Task task, ProcessInstance processInstance, SysUserDO user); 56 BpmTaskTodoPageItemRespVO convert(Task task, ProcessInstance processInstance, SysUserDO user);
55 57
56 - @Named("convertSuspendedToStatus")  
57 - default Integer convertAssigneeToStatus(boolean suspended) { 58 + @Named("convertSuspendedToSuspensionState")
  59 + default Integer convertSuspendedToSuspensionState(boolean suspended) {
58 return suspended ? SuspensionState.SUSPENDED.getStateCode() : 60 return suspended ? SuspensionState.SUSPENDED.getStateCode() :
59 SuspensionState.ACTIVE.getStateCode(); 61 SuspensionState.ACTIVE.getStateCode();
60 } 62 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java
@@ -85,7 +85,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -85,7 +85,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
85 TaskQuery taskQuery = taskService.createTaskQuery() 85 TaskQuery taskQuery = taskService.createTaskQuery()
86 .taskAssignee(String.valueOf(userId)); 86 .taskAssignee(String.valueOf(userId));
87 if (StrUtil.isNotBlank(pageVO.getName())) { 87 if (StrUtil.isNotBlank(pageVO.getName())) {
88 - taskQuery.taskName("%s" + pageVO.getName() + "%s"); 88 + taskQuery.taskNameLike("%" + pageVO.getName() + "%");
89 } 89 }
90 if (pageVO.getBeginCreateTime() != null) { 90 if (pageVO.getBeginCreateTime() != null) {
91 taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime()); 91 taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime());
yudao-admin-ui/src/views/bpm/definition/index.vue
@@ -29,7 +29,7 @@ @@ -29,7 +29,7 @@
29 <el-tag size="medium" type="warning" v-else>未部署</el-tag> 29 <el-tag size="medium" type="warning" v-else>未部署</el-tag>
30 </template> 30 </template>
31 </el-table-column> 31 </el-table-column>
32 - <el-table-column label="激活状态" align="center" prop="version" width="80"> 32 + <el-table-column label="状态" align="center" prop="version" width="80">
33 <template slot-scope="scope"> 33 <template slot-scope="scope">
34 <el-tag type="success" v-if="scope.row.suspensionState === 1">激活</el-tag> 34 <el-tag type="success" v-if="scope.row.suspensionState === 1">激活</el-tag>
35 <el-tag type="warning" v-if="scope.row.suspensionState === 2">挂起</el-tag> 35 <el-tag type="warning" v-if="scope.row.suspensionState === 2">挂起</el-tag>
yudao-admin-ui/src/views/bpm/process/index.vue renamed to yudao-admin-ui/src/views/bpm/processInstance/index.vue
yudao-admin-ui/src/views/bpm/task/todo.vue
@@ -3,15 +3,12 @@ @@ -3,15 +3,12 @@
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="状态" prop="status">  
7 - <el-select v-model="queryParams.status" placeholder="请选择状态">  
8 - <el-option  
9 - v-for="dict in leaveStatusData"  
10 - :key="parseInt(dict.value)"  
11 - :label="dict.label"  
12 - :value="parseInt(dict.value)"  
13 - />  
14 - </el-select> 6 + <el-form-item label="流程名" prop="name">
  7 + <el-input v-model="queryParams.name" placeholder="请输入流程名" clearable size="small" @keyup.enter.native="handleQuery"/>
  8 + </el-form-item>
  9 + <el-form-item label="创建时间">
  10 + <el-date-picker v-model="dateRangeCreateTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
  11 + type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
15 </el-form-item> 12 </el-form-item>
16 <el-form-item> 13 <el-form-item>
17 <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> 14 <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -23,13 +20,27 @@ @@ -23,13 +20,27 @@
23 20
24 <!-- 列表 --> 21 <!-- 列表 -->
25 <el-table v-loading="loading" :data="list"> 22 <el-table v-loading="loading" :data="list">
26 - <el-table-column label="任务Id" align="center" prop="id" />  
27 - <el-table-column label="流程名称" align="center" prop="processName" />  
28 - <el-table-column label="任务状态" align="center" :formatter="statusFormat" prop="status" /> 23 + <el-table-column label="任务编号" align="center" prop="id" width="300" />
  24 + <el-table-column label="任务名称" align="center" prop="name" />
  25 + <el-table-column label="所属流程" align="center" prop="processInstance.name" />
  26 + <el-table-column label="流程发起人" align="center" prop="processInstance.startUserNickname" />
  27 + <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  28 + <template slot-scope="scope">
  29 + <span>{{ parseTime(scope.row.createTime) }}</span>
  30 + </template>
  31 + </el-table-column>
  32 + <el-table-column label="状态" align="center" prop="version" width="80">
  33 + <template slot-scope="scope">
  34 + <el-tag type="success" v-if="scope.row.suspensionState === 1">激活</el-tag>
  35 + <el-tag type="warning" v-if="scope.row.suspensionState === 2">挂起</el-tag>
  36 + </template>
  37 + </el-table-column>
29 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 38 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
30 <template slot-scope="scope"> 39 <template slot-scope="scope">
31 - <el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.status == 1" @click="handleClaim(scope.row)">签收</el-button>  
32 - <el-button size="mini" type="text" icon="el-icon-edit" v-if="scope.row.status == 2" @click="getTaskFormKey(scope.row)">办理</el-button> 40 + <!-- TODO 权限、颜色 -->
  41 + <el-button size="mini" type="text" icon="el-icon-edit">审批</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 === 1">挂起</el-button>
33 </template> 44 </template>
34 </el-table-column> 45 </el-table-column>
35 </el-table> 46 </el-table>
@@ -37,60 +48,12 @@ @@ -37,60 +48,12 @@
37 <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" 48 <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
38 @pagination="getList"/> 49 @pagination="getList"/>
39 50
40 - <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>  
41 - <el-tabs tab-position="left" style="height: 500px;">  
42 - <el-tab-pane label="详情">  
43 - <el-form ref="form" :model="handleTask.formObject" label-width="80px">  
44 - <el-form-item label="状态" >  
45 - {{ getDictDataLabel(DICT_TYPE.OA_LEAVE_STATUS, handleTask.formObject.status) }}  
46 - </el-form-item>  
47 - <el-form-item label="申请人id" >{{handleTask.formObject.userId}}</el-form-item>  
48 - <el-form-item label="开始时间" >{{ parseTime(handleTask.formObject.startTime) }}</el-form-item>  
49 - <el-form-item label="结束时间" prop="endTime">{{ parseTime(handleTask.formObject.endTime) }}</el-form-item>  
50 - <el-form-item label="请假类型" prop="leaveType">  
51 - {{ getDictDataLabel(DICT_TYPE.OA_LEAVE_TYPE, handleTask.formObject.leaveType) }}  
52 - </el-form-item>  
53 - <el-form-item label="原因" prop="reason">{{handleTask.formObject.reason}}</el-form-item>  
54 - <el-form-item label="申请时间" prop="applyTime">{{ parseTime(handleTask.formObject.applyTime) }}</el-form-item>  
55 - </el-form>  
56 - </el-tab-pane>  
57 - <el-tab-pane label="任务处理">  
58 - <el-steps :active="handleTask.historyTask.length-1" simple finish-status="success">  
59 - <el-step :title="item.stepName" icon="el-icon-edit" v-for="(item) in handleTask.historyTask" ></el-step>  
60 - </el-steps>  
61 - <br/>  
62 - <el-steps direction="vertical" :active="handleTask.historyTask.length-1" finish-status="success" space="60px">  
63 - <el-step :title="item.stepName" :description="item.comment" v-for="(item) in handleTask.historyTask" ></el-step>  
64 - </el-steps>  
65 - <br/>  
66 - <el-form ref="taskForm" :model="task" label-width="80px" v-show="handleTask.taskVariable !=''">  
67 - <el-form-item label="处理意见" prop="approved">  
68 - <el-select v-model="task.approved" placeholder="处理意见">  
69 - <el-option  
70 - v-for="dict in approvedData"  
71 - :key="parseInt(dict.value)"  
72 - :label="dict.label"  
73 - :value="parseInt(dict.value)"  
74 - />  
75 - </el-select>  
76 - </el-form-item>  
77 - <el-input  
78 - type="textarea"  
79 - :rows="2"  
80 - v-model="task.comment">  
81 - </el-input>  
82 - </el-form>  
83 - <br/>  
84 - <el-button type="primary" @click="submitTask">提交</el-button>  
85 - </el-tab-pane>  
86 - </el-tabs>  
87 - </el-dialog>  
88 </div> 51 </div>
89 </template> 52 </template>
90 53
91 <script> 54 <script>
92 -import { completeTask, taskSteps, getTaskFormKey,deleteLeave, getLeave, getTodoTaskPage, claimTask } from "@/api/oa/todo";  
93 -import { getDictDataLabel, getDictDatas, DICT_TYPE } from '@/utils/dict' 55 +import { getTodoTaskPage } from '@/api/bpm/task'
  56 +
94 export default { 57 export default {
95 name: "Todo", 58 name: "Todo",
96 components: { 59 components: {
@@ -103,50 +66,15 @@ export default { @@ -103,50 +66,15 @@ export default {
103 showSearch: true, 66 showSearch: true,
104 // 总条数 67 // 总条数
105 total: 0, 68 total: 0,
106 - // 请假申请列表 69 + // 待办任务列表
107 list: [], 70 list: [],
108 - // 弹出层标题  
109 - title: "",  
110 - // 是否显示弹出层  
111 - open: false,  
112 // 查询参数 71 // 查询参数
  72 + dateRangeCreateTime: [],
113 queryParams: { 73 queryParams: {
114 pageNo: 1, 74 pageNo: 1,
115 - pageSize: 10  
116 - },  
117 - // 表单参数  
118 - form: {},  
119 - handleTask: {  
120 - historyTask:[{  
121 - stepName:"步骤一"  
122 - }  
123 - ],  
124 - taskVariable: "",  
125 - formObject: {}  
126 - },  
127 - steps:[{  
128 - stepName:"步骤一"  
129 - }],  
130 - task: {  
131 - approved : 1,  
132 - variables: {},  
133 - taskId: undefined,  
134 - comment: ""  
135 - },  
136 - rules: { 75 + pageSize: 10,
  76 + name: null,
137 }, 77 },
138 - leaveTypeDictData: getDictDatas(DICT_TYPE.OA_LEAVE_TYPE),  
139 - leaveStatusData: getDictDatas(DICT_TYPE.OA_LEAVE_STATUS),  
140 - approvedData: [  
141 - {  
142 - value: 1,  
143 - label: '同意'  
144 - },  
145 - {  
146 - value: 0,  
147 - label: '不同意'  
148 - }  
149 - ]  
150 }; 78 };
151 }, 79 },
152 created() { 80 created() {
@@ -158,7 +86,7 @@ export default { @@ -158,7 +86,7 @@ export default {
158 this.loading = true; 86 this.loading = true;
159 // 处理查询参数 87 // 处理查询参数
160 let params = {...this.queryParams}; 88 let params = {...this.queryParams};
161 - // 执行查询 89 + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
162 getTodoTaskPage(params).then(response => { 90 getTodoTaskPage(params).then(response => {
163 this.list = response.data.list; 91 this.list = response.data.list;
164 this.total = response.data.total; 92 this.total = response.data.total;
@@ -186,9 +114,6 @@ export default { @@ -186,9 +114,6 @@ export default {
186 this.resetForm("form"); 114 this.resetForm("form");
187 }, 115 },
188 116
189 - statusFormat(row, column) {  
190 - return row.status == 1 ? "未签收" : "已签收";  
191 - },  
192 /** 搜索按钮操作 */ 117 /** 搜索按钮操作 */
193 handleQuery() { 118 handleQuery() {
194 this.queryParams.pageNo = 1; 119 this.queryParams.pageNo = 1;
@@ -196,91 +121,11 @@ export default { @@ -196,91 +121,11 @@ export default {
196 }, 121 },
197 /** 重置按钮操作 */ 122 /** 重置按钮操作 */
198 resetQuery() { 123 resetQuery() {
199 - this.dateRangeStartTime = [];  
200 - this.dateRangeEndTime = []; 124 + this.dateRangeCreateTime = [];
201 this.dateRangeApplyTime = []; 125 this.dateRangeApplyTime = [];
202 this.resetForm("queryForm"); 126 this.resetForm("queryForm");
203 this.handleQuery(); 127 this.handleQuery();
204 }, 128 },
205 - getTaskFormKey(row) {  
206 - const taskId = row.id;  
207 - const data = {  
208 - taskId : taskId  
209 - }  
210 - getTaskFormKey(data).then(response => {  
211 - const resp = response.data;  
212 - const path = resp.formKey;  
213 - const taskId = resp.id;  
214 - const businessKey = resp.businessKey;  
215 - const route = {  
216 - path: path,  
217 - query: {  
218 - businessKey: businessKey,  
219 - taskId:taskId,  
220 - processInstanceId : resp.processInstanceId  
221 - }  
222 - }  
223 - this.$router.replace(route);  
224 - });  
225 - },  
226 - handleLeaveApprove(row) {  
227 - this.reset();  
228 - const businessKey = row.businessKey;  
229 - const taskId = row.id;  
230 - const processKey = row.processKey;  
231 - const data = {  
232 - taskId : taskId,  
233 - businessKey: businessKey,  
234 - processKey: processKey  
235 - }  
236 - taskSteps(data).then(response => {  
237 - this.form = {};  
238 - this.handleTask = response.data;  
239 - this.task.taskId = taskId;  
240 - this.open = true;  
241 - this.title = "任务办理";  
242 - });  
243 - },  
244 - /** 任务签收操作 */  
245 - handleClaim(row) {  
246 - this.reset();  
247 - const id = row.id;  
248 - claimTask(id).then(() => {  
249 - this.getList();  
250 - this.msgSuccess("签收成功");  
251 - });  
252 - },  
253 - /** 提交任务 */  
254 - submitTask() {  
255 - const taskVariableName = this.handleTask.taskVariable;  
256 - if (taskVariableName != "") {  
257 - if (this.task.approved == 1) {  
258 - this.task.variables[taskVariableName] = true;  
259 - }  
260 - if (this.task.approved == 0) {  
261 - this.task.variables[taskVariableName] = false;  
262 - }  
263 - }  
264 - completeTask(this.task).then(response => {  
265 - this.msgSuccess("执行任务成功");  
266 - this.open = false;  
267 - this.getList();  
268 - })  
269 - },  
270 - /** 删除按钮操作 */  
271 - handleDelete(row) {  
272 - const id = row.id;  
273 - this.$confirm('是否确认删除请假申请编号为"' + id + '"的数据项?', "警告", {  
274 - confirmButtonText: "确定",  
275 - cancelButtonText: "取消",  
276 - type: "warning"  
277 - }).then(function() {  
278 - return deleteLeave(id);  
279 - }).then(() => {  
280 - this.getList();  
281 - this.msgSuccess("删除成功");  
282 - })  
283 - }  
284 } 129 }
285 }; 130 };
286 </script> 131 </script>