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 19 @ApiModelProperty(value = "接收时间", required = true)
20 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 37 @ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
35 38 private String id;
36 39  
  40 + @ApiModelProperty(value = "流程实例名称", required = true, example = "芋道")
  41 + private String name;
  42 +
37 43 @ApiModelProperty(value = "发起人的用户编号", required = true, example = "1024")
38 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 45 @Mapping(source = "task.id", target = "id"),
46 46 @Mapping(source = "task.name", target = "name"),
47 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 50 @Mapping(source = "processInstance.id", target = "processInstance.id"),
  51 + @Mapping(source = "processInstance.name", target = "processInstance.name"),
50 52 @Mapping(source = "processInstance.startUserId", target = "processInstance.startUserId"),
51 53 @Mapping(source = "processInstance.processDefinitionId", target = "processInstance.processDefinitionId"),
52 54 @Mapping(source = "user.nickname", target = "processInstance.startUserNickname")
53 55 })
54 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 60 return suspended ? SuspensionState.SUSPENDED.getStateCode() :
59 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 85 TaskQuery taskQuery = taskService.createTaskQuery()
86 86 .taskAssignee(String.valueOf(userId));
87 87 if (StrUtil.isNotBlank(pageVO.getName())) {
88   - taskQuery.taskName("%s" + pageVO.getName() + "%s");
  88 + taskQuery.taskNameLike("%" + pageVO.getName() + "%");
89 89 }
90 90 if (pageVO.getBeginCreateTime() != null) {
91 91 taskQuery.taskCreatedAfter(pageVO.getBeginCreateTime());
... ...
yudao-admin-ui/src/views/bpm/definition/index.vue
... ... @@ -29,7 +29,7 @@
29 29 <el-tag size="medium" type="warning" v-else>未部署</el-tag>
30 30 </template>
31 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 33 <template slot-scope="scope">
34 34 <el-tag type="success" v-if="scope.row.suspensionState === 1">激活</el-tag>
35 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 3  
4 4 <!-- 搜索工作栏 -->
5 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 12 </el-form-item>
16 13 <el-form-item>
17 14 <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
... ... @@ -23,13 +20,27 @@
23 20  
24 21 <!-- 列表 -->
25 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 38 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
30 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 44 </template>
34 45 </el-table-column>
35 46 </el-table>
... ... @@ -37,60 +48,12 @@
37 48 <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
38 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 51 </div>
89 52 </template>
90 53  
91 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 57 export default {
95 58 name: "Todo",
96 59 components: {
... ... @@ -103,50 +66,15 @@ export default {
103 66 showSearch: true,
104 67 // 总条数
105 68 total: 0,
106   - // 请假申请列表
  69 + // 待办任务列表
107 70 list: [],
108   - // 弹出层标题
109   - title: "",
110   - // 是否显示弹出层
111   - open: false,
112 71 // 查询参数
  72 + dateRangeCreateTime: [],
113 73 queryParams: {
114 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 80 created() {
... ... @@ -158,7 +86,7 @@ export default {
158 86 this.loading = true;
159 87 // 处理查询参数
160 88 let params = {...this.queryParams};
161   - // 执行查询
  89 + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
162 90 getTodoTaskPage(params).then(response => {
163 91 this.list = response.data.list;
164 92 this.total = response.data.total;
... ... @@ -186,9 +114,6 @@ export default {
186 114 this.resetForm("form");
187 115 },
188 116  
189   - statusFormat(row, column) {
190   - return row.status == 1 ? "未签收" : "已签收";
191   - },
192 117 /** 搜索按钮操作 */
193 118 handleQuery() {
194 119 this.queryParams.pageNo = 1;
... ... @@ -196,91 +121,11 @@ export default {
196 121 },
197 122 /** 重置按钮操作 */
198 123 resetQuery() {
199   - this.dateRangeStartTime = [];
200   - this.dateRangeEndTime = [];
  124 + this.dateRangeCreateTime = [];
201 125 this.dateRangeApplyTime = [];
202 126 this.resetForm("queryForm");
203 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 131 </script>
... ...