提交 | 用户 | 时间
820397 1 <template>
H 2
3   <ContentWrap>
4     <!-- 搜索工作栏 -->
5     <el-form
6       class="-mb-15px"
7       :model="queryParams"
8       ref="queryFormRef"
9       :inline="true"
10       label-width="68px"
11     >
12       <el-form-item label="发起人" prop="startUserId">
13         <el-select v-model="queryParams.startUserId" placeholder="请选择发起人" class="!w-240px">
14           <el-option
15             v-for="user in userList"
16             :key="user.id"
17             :label="user.nickname"
18             :value="user.id"
19           />
20         </el-select>
21       </el-form-item>
22       <el-form-item label="流程名称" prop="name">
23         <el-input
24           v-model="queryParams.name"
25           placeholder="请输入流程名称"
26           clearable
27           @keyup.enter="handleQuery"
28           class="!w-240px"
29         />
30       </el-form-item>
31       <el-form-item label="所属流程" prop="processDefinitionId">
32         <el-input
33           v-model="queryParams.processDefinitionId"
34           placeholder="请输入流程定义的编号"
35           clearable
36           @keyup.enter="handleQuery"
37           class="!w-240px"
38         />
39       </el-form-item>
40       <el-form-item label="流程分类" prop="category">
41         <el-select
42           v-model="queryParams.category"
43           placeholder="请选择流程分类"
44           clearable
45           class="!w-240px"
46         >
47           <el-option
48             v-for="category in categoryList"
49             :key="category.code"
50             :label="category.name"
51             :value="category.code"
52           />
53         </el-select>
54       </el-form-item>
55       <el-form-item label="流程状态" prop="status">
56         <el-select
57           v-model="queryParams.status"
58           placeholder="请选择流程状态"
59           clearable
60           class="!w-240px"
61         >
62           <el-option
63             v-for="dict in getIntDictOptions(DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS)"
64             :key="dict.value"
65             :label="dict.label"
66             :value="dict.value"
67           />
68         </el-select>
69       </el-form-item>
70       <el-form-item label="发起时间" prop="createTime">
71         <el-date-picker
72           v-model="queryParams.createTime"
73           value-format="YYYY-MM-DD HH:mm:ss"
74           type="daterange"
75           start-placeholder="开始日期"
76           end-placeholder="结束日期"
77           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
78           class="!w-220px"
79         />
80       </el-form-item>
81     </el-form>
82   </ContentWrap>
83
84   <!-- 列表 -->
85   <ContentWrap>
86     <el-table v-loading="loading" :data="list">
87       <el-table-column label="流程名称" align="center" prop="name" min-width="200px" fixed="left" />
88       <el-table-column
89         label="流程分类"
90         align="center"
91         prop="categoryName"
92         min-width="100"
93         fixed="left"
94       />
95       <el-table-column label="流程发起人" align="center" prop="startUser.nickname" width="120" />
96       <el-table-column label="发起部门" align="center" prop="startUser.deptName" width="120" />
97       <el-table-column label="流程状态" prop="status" width="120">
98         <template #default="scope">
99           <dict-tag :type="DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS" :value="scope.row.status" />
100         </template>
101       </el-table-column>
102       <el-table-column
103         label="发起时间"
104         align="center"
105         prop="startTime"
106         width="180"
107         :formatter="dateFormatter"
108       />
109       <el-table-column
110         label="结束时间"
111         align="center"
112         prop="endTime"
113         width="180"
114         :formatter="dateFormatter"
115       />
116       <el-table-column align="center" label="耗时" prop="durationInMillis" width="169">
117         <template #default="scope">
118           {{ scope.row.durationInMillis > 0 ? formatPast2(scope.row.durationInMillis) : '-' }}
119         </template>
120       </el-table-column>
121       <el-table-column label="当前审批任务" align="center" prop="tasks" min-width="120px">
122         <template #default="scope">
123           <el-button type="primary" v-for="task in scope.row.tasks" :key="task.id" link>
124             <span>{{ task.name }}</span>
125           </el-button>
126         </template>
127       </el-table-column>
128       <el-table-column label="流程编号" align="center" prop="id" min-width="320px" />
129       <el-table-column label="操作" align="center" fixed="right" width="180">
130         <template #default="scope">
131           <el-button
132             link
133             type="primary"
134             v-hasPermi="['bpm:process-instance:cancel']"
135             @click="handleDetail(scope.row)"
136           >
137             详情
138           </el-button>
139           <el-button
140             link
141             type="primary"
142             v-if="scope.row.status === 1"
143             v-hasPermi="['bpm:process-instance:query']"
144             @click="handleCancel(scope.row)"
145           >
146             取消
147           </el-button>
148         </template>
149       </el-table-column>
150     </el-table>
151     <!-- 分页 -->
152     <Pagination
153       :total="total"
154       v-model:page="queryParams.pageNo"
155       v-model:limit="queryParams.pageSize"
156       @pagination="getList"
157     />
158   </ContentWrap>
159 </template>
160 <script lang="ts" setup>
161 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
162 import { dateFormatter, formatPast2 } from '@/utils/formatTime'
163 import { ElMessageBox } from 'element-plus'
164 import * as ProcessInstanceApi from '@/api/bpm/processInstance'
165 import { CategoryApi } from '@/api/bpm/category'
166 import * as UserApi from '@/api/system/user'
167 import { cancelProcessInstanceByAdmin } from '@/api/bpm/processInstance'
168
169 // 它和【我的流程】的差异是,该菜单可以看全部的流程实例
170 defineOptions({ name: 'BpmProcessInstanceManager' })
171
172 const router = useRouter() // 路由
173 const message = useMessage() // 消息弹窗
174 const { t } = useI18n() // 国际化
175
176 const loading = ref(true) // 列表的加载中
177 const total = ref(0) // 列表的总页数
178 const list = ref([]) // 列表的数据
179 const queryParams = reactive({
180   pageNo: 1,
181   pageSize: 10,
182   startUserId: undefined,
183   name: '',
184   processDefinitionId: undefined,
185   category: undefined,
186   status: undefined,
187   createTime: []
188 })
189 const queryFormRef = ref() // 搜索的表单
190 const categoryList = ref([]) // 流程分类列表
191 const userList = ref<any[]>([]) // 用户列表
192
193 /** 查询列表 */
194 const getList = async () => {
195   loading.value = true
196   try {
197     const data = await ProcessInstanceApi.getProcessInstanceManagerPage(queryParams)
198     list.value = data.list
199     total.value = data.total
200   } finally {
201     loading.value = false
202   }
203 }
204
205 /** 搜索按钮操作 */
206 const handleQuery = () => {
207   queryParams.pageNo = 1
208   getList()
209 }
210
211 /** 重置按钮操作 */
212 const resetQuery = () => {
213   queryFormRef.value.resetFields()
214   handleQuery()
215 }
216
217 /** 查看详情 */
218 const handleDetail = (row) => {
219   router.push({
220     name: 'BpmProcessInstanceDetail',
221     query: {
222       id: row.id
223     }
224   })
225 }
226
227 /** 取消按钮操作 */
228 const handleCancel = async (row) => {
229   // 二次确认
230   const { value } = await ElMessageBox.prompt('请输入取消原因', '取消流程', {
231     confirmButtonText: t('common.ok'),
232     cancelButtonText: t('common.cancel'),
233     inputPattern: /^[\s\S]*.*\S[\s\S]*$/, // 判断非空,且非空格
234     inputErrorMessage: '取消原因不能为空'
235   })
236   // 发起取消
237   await ProcessInstanceApi.cancelProcessInstanceByAdmin(row.id, value)
238   message.success('取消成功')
239   // 刷新列表
240   await getList()
241 }
242
243 /** 激活时 **/
244 onActivated(() => {
245   getList()
246 })
247
248 /** 初始化 **/
249 onMounted(async () => {
250   await getList()
251   categoryList.value = await CategoryApi.getCategorySimpleList()
252   userList.value = await UserApi.getSimpleUserList()
253 })
254 </script>