processInstance.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. <template>
  2. <div class="app-container">
  3. <div class="filter-container">
  4. <el-checkbox v-model="listQuery.unfinished">未办结</el-checkbox>
  5. <el-checkbox v-model="listQuery.finished">已办结</el-checkbox>
  6. </div>
  7. <div class="filter-container">
  8. <el-input
  9. v-model="listQuery.processDefinitionId"
  10. placeholder="流程定义ID"
  11. style="width: 200px"
  12. class="filter-item"
  13. @keyup.enter.native="btnQuery"
  14. />
  15. <el-input
  16. v-model="listQuery.processInstanceId"
  17. placeholder="流程实例ID"
  18. style="width: 200px"
  19. class="filter-item"
  20. @keyup.enter.native="btnQuery"
  21. />
  22. <el-input
  23. v-model="listQuery.processDefinitionName"
  24. placeholder="流程定义名称"
  25. style="width: 200px"
  26. class="filter-item"
  27. @keyup.enter.native="btnQuery"
  28. />
  29. <el-input
  30. v-model="listQuery.processDefinitionKey"
  31. placeholder="流程定义KEY"
  32. style="width: 200px"
  33. class="filter-item"
  34. @keyup.enter.native="btnQuery"
  35. />
  36. <el-input
  37. v-model="listQuery.businessKey"
  38. placeholder="业务主键KEY"
  39. style="width: 200px"
  40. class="filter-item"
  41. @keyup.enter.native="btnQuery"
  42. />
  43. <el-input
  44. v-model="listQuery.startedBy"
  45. placeholder="启动人"
  46. style="width: 200px"
  47. class="filter-item"
  48. @keyup.enter.native="btnQuery"
  49. />
  50. <el-dropdown
  51. split-button
  52. type="primary"
  53. @click="btnQuery"
  54. class="filter-item"
  55. >
  56. <i class="el-icon-search el-icon--left"></i>查询
  57. <el-dropdown-menu slot="dropdown">
  58. <el-dropdown-item icon="el-icon-zoom-out" @click.native="btnReset"
  59. >重置</el-dropdown-item
  60. >
  61. </el-dropdown-menu>
  62. </el-dropdown>
  63. </div>
  64. <el-table
  65. :data="records"
  66. ref="multipleTable"
  67. border
  68. fit
  69. highlight-current-row
  70. style="width: 100%"
  71. :cell-style="{ padding: '3px' }"
  72. >
  73. <el-table-column
  74. label="流程实例ID"
  75. prop="id"
  76. align="center"
  77. width="290px"
  78. >
  79. <template slot-scope="scope"
  80. ><span>{{ scope.row.id }}</span></template
  81. >
  82. </el-table-column>
  83. <el-table-column
  84. label="流程定义名称"
  85. prop="processDefinitionName"
  86. align="center"
  87. >
  88. <template slot-scope="scope"
  89. ><span>{{ scope.row.processDefinitionName }}</span></template
  90. >
  91. </el-table-column>
  92. <el-table-column
  93. label="流程定义KEY"
  94. prop="processDefinitionKey"
  95. align="center"
  96. >
  97. <template slot-scope="scope"
  98. ><span>{{ scope.row.processDefinitionKey }}</span></template
  99. >
  100. </el-table-column>
  101. <el-table-column
  102. label="版本"
  103. prop="processDefinitionVersion"
  104. align="center"
  105. width="60px"
  106. >
  107. <template slot-scope="scope"
  108. ><span>{{ scope.row.processDefinitionVersion }}</span></template
  109. >
  110. </el-table-column>
  111. <el-table-column
  112. label="开始时间"
  113. prop="startTime"
  114. align="center"
  115. width="165px"
  116. >
  117. <template slot-scope="scope"
  118. ><span>{{ scope.row.startTime }}</span></template
  119. >
  120. </el-table-column>
  121. <el-table-column
  122. label="结束时间"
  123. prop="endTime"
  124. align="center"
  125. width="165px"
  126. >
  127. <template slot-scope="scope"
  128. ><span>{{ scope.row.endTime }}</span></template
  129. >
  130. </el-table-column>
  131. <el-table-column label="操作" align="center">
  132. <template slot-scope="{ row }">
  133. <el-dropdown>
  134. <span class="el-dropdown-link"
  135. >操作<i class="el-icon-arrow-down el-icon--right"></i
  136. ></span>
  137. <el-dropdown-menu slot="dropdown">
  138. <el-dropdown-item
  139. icon="el-icon-view"
  140. @click.native="btnViewProcessInstance(row)"
  141. >查看
  142. </el-dropdown-item>
  143. <el-dropdown-item
  144. icon="el-icon-view"
  145. divided
  146. @click.native="btnView(row.id)"
  147. >查看详情
  148. </el-dropdown-item>
  149. <el-dropdown-item
  150. icon="el-icon-view"
  151. divided
  152. @click.native="btnViewTaskList(row)"
  153. >任务列表
  154. </el-dropdown-item>
  155. <el-dropdown-item
  156. icon="el-icon-delete"
  157. divided
  158. @click.native="btnDelete(row.id)"
  159. >删除
  160. </el-dropdown-item>
  161. <el-dropdown-item
  162. icon="el-icon-delete"
  163. divided
  164. @click.native="btnDelete(row.id, true)"
  165. >
  166. 删除包含历史
  167. </el-dropdown-item>
  168. </el-dropdown-menu>
  169. </el-dropdown>
  170. </template>
  171. </el-table-column>
  172. </el-table>
  173. <pagination
  174. v-show="total > 0"
  175. :total="total"
  176. :current.sync="listQuery.current"
  177. :size.sync="listQuery.size"
  178. @pagination="list"
  179. />
  180. <el-dialog title="流程实例" :visible.sync="dialogFormVisible">
  181. <el-form
  182. ref="dataForm"
  183. :model="temp"
  184. disabled
  185. label-position="right"
  186. label-width="110px"
  187. >
  188. <el-row>
  189. <el-col :span="12">
  190. <el-form-item label="流程实例ID" prop="id">
  191. <el-input v-model="temp.id" />
  192. </el-form-item>
  193. </el-col>
  194. <el-col :span="12">
  195. <el-form-item label="业务主键Key" prop="businessKey">
  196. <el-input v-model="temp.businessKey" />
  197. </el-form-item>
  198. </el-col>
  199. </el-row>
  200. <el-row>
  201. <el-col :span="12">
  202. <el-form-item label="流程定义ID" prop="processDefinitionId">
  203. <el-input v-model="temp.processDefinitionId" />
  204. </el-form-item>
  205. </el-col>
  206. <el-col :span="12">
  207. <el-form-item label="流程定义名称" prop="processDefinitionName">
  208. <el-input v-model="temp.processDefinitionName" />
  209. </el-form-item>
  210. </el-col>
  211. </el-row>
  212. <el-row>
  213. <el-col :span="12">
  214. <el-form-item label="流程定义KEY" prop="processDefinitionKey">
  215. <el-input v-model="temp.processDefinitionKey" />
  216. </el-form-item>
  217. </el-col>
  218. <el-col :span="12">
  219. <el-form-item label="流程定义版本" prop="processDefinitionVersion">
  220. <el-input v-model="temp.processDefinitionVersion" />
  221. </el-form-item>
  222. </el-col>
  223. </el-row>
  224. <el-row>
  225. <el-col :span="12">
  226. <el-form-item label="开始时间" prop="startTime">
  227. <el-date-picker
  228. v-model="temp.startTime"
  229. style="width: 200px"
  230. type="datetime"
  231. value-format="yyyy-MM-dd HH:mm:ss"
  232. ></el-date-picker>
  233. </el-form-item>
  234. </el-col>
  235. <el-col :span="12">
  236. <el-form-item label="结束时间" prop="endTime">
  237. <el-date-picker
  238. v-model="temp.endTime"
  239. style="width: 200px"
  240. type="datetime"
  241. value-format="yyyy-MM-dd HH:mm:ss"
  242. ></el-date-picker>
  243. </el-form-item>
  244. </el-col>
  245. </el-row>
  246. <el-row>
  247. <el-col :span="12">
  248. <el-form-item label="启动人ID" prop="startUserId">
  249. <el-input v-model="temp.startUserId" />
  250. </el-form-item>
  251. </el-col>
  252. <el-col :span="12">
  253. <el-form-item label="启动人姓名" prop="startUserName">
  254. <el-input v-model="temp.startUserName" />
  255. </el-form-item>
  256. </el-col>
  257. </el-row>
  258. <el-row>
  259. <el-col :span="12">
  260. <el-form-item label="启动节点ID" prop="startActivityId">
  261. <el-input v-model="temp.startActivityId" />
  262. </el-form-item>
  263. </el-col>
  264. <el-col :span="12">
  265. <el-form-item label="耗时(毫秒)" prop="durationInMillis">
  266. <el-input v-model="temp.durationInMillis" />
  267. </el-form-item>
  268. </el-col>
  269. </el-row>
  270. <el-row>
  271. <el-col :span="12">
  272. <el-form-item label="子流程ID" prop="superProcessInstanceId">
  273. <el-input v-model="temp.superProcessInstanceId" />
  274. </el-form-item>
  275. </el-col>
  276. <el-col :span="12">
  277. <el-form-item label="状态" prop="suspended">
  278. <el-input
  279. v-if="temp.endTime == null"
  280. v-model="temp.suspended ? '挂起' : '激活'"
  281. />
  282. <el-input v-else value="结束" />
  283. </el-form-item>
  284. </el-col>
  285. </el-row>
  286. <el-row>
  287. <el-col :span="12">
  288. <el-form-item label="删除原因" prop="deleteReason">
  289. <el-input v-model="temp.deleteReason" />
  290. </el-form-item>
  291. </el-col>
  292. </el-row>
  293. </el-form>
  294. <div slot="footer" class="dialog-footer">
  295. <el-button
  296. v-permission="'flowable:processInstance:suspendOrActivate'"
  297. v-if="temp.endTime == null"
  298. icon="el-icon-check"
  299. @click="btnSuspendOrActivate(temp.id, temp.suspended)"
  300. >{{ temp.suspended ? '激活' : '挂起' }}
  301. </el-button>
  302. <el-button icon="el-icon-close" @click="dialogFormVisible = false"
  303. >取消</el-button
  304. >
  305. </div>
  306. </el-dialog>
  307. <process-detail
  308. v-if="dialogViewVisible"
  309. :visible.sync="dialogViewVisible"
  310. :processInstanceId="processInstanceId"
  311. ></process-detail>
  312. </div>
  313. </template>
  314. <script>
  315. import Pagination from '@/components/Pagination';
  316. import {
  317. deleteAction,
  318. getAction,
  319. postAction,
  320. putAction
  321. } from '@/api/flowable/manage';
  322. import { Message } from 'element-ui';
  323. import ProcessDetail from './components/ProcessDetail';
  324. export default {
  325. name: 'FlowableProcessInstance',
  326. components: { ProcessDetail, Pagination },
  327. data() {
  328. return {
  329. dicts: [],
  330. records: null,
  331. selectedRecords: [],
  332. total: 0,
  333. listQuery: {
  334. current: 1,
  335. size: 10,
  336. processInstanceId: undefined,
  337. processDefinitionId: undefined,
  338. processDefinitionName: undefined,
  339. processDefinitionKey: undefined,
  340. businessKey: undefined,
  341. startedBy: undefined,
  342. unfinished: false,
  343. finished: false
  344. },
  345. dialogFormVisible: false,
  346. dialogImportVisible: false,
  347. importTenantId: '',
  348. dialogProcessImageVisible: false,
  349. processInstanceId: '',
  350. temp: {
  351. id: undefined,
  352. businessKey: '',
  353. processDefinitionId: '',
  354. processDefinitionName: '',
  355. processDefinitionKey: '',
  356. processDefinitionVersion: '',
  357. startTime: undefined,
  358. endTime: undefined,
  359. durationInMillis: undefined,
  360. startUserId: '',
  361. startUserName: '',
  362. startActivityId: '',
  363. superProcessInstanceId: '',
  364. suspended: undefined,
  365. deleteReason: ''
  366. },
  367. dialogViewVisible: false
  368. };
  369. },
  370. created() {
  371. if (this.$route.query && this.$route.query.processDefinitionId) {
  372. this.listQuery.processDefinitionId =
  373. this.$route.query.processDefinitionId;
  374. }
  375. this.list();
  376. },
  377. methods: {
  378. list() {
  379. getAction('/flowable/processInstance/list', this.listQuery).then(
  380. (res) => {
  381. if (res.data.code == 0) {
  382. console.log(res.data.data);
  383. this.records = res.data.data.records;
  384. this.total = res.data.data.total;
  385. }
  386. }
  387. );
  388. },
  389. btnQuery() {
  390. this.listQuery.current = 1;
  391. this.list();
  392. },
  393. btnReset() {
  394. this.listQuery = {
  395. current: 1,
  396. size: 10,
  397. processInstanceId: undefined,
  398. processDefinitionId: undefined,
  399. processDefinitionName: undefined,
  400. processDefinitionKey: undefined,
  401. businessKey: undefined,
  402. startedBy: undefined,
  403. unfinished: false,
  404. finished: false
  405. };
  406. this.list();
  407. },
  408. btnViewProcessInstance(row) {
  409. getAction('/flowable/processInstance/queryById', {
  410. processInstanceId: row.id
  411. }).then((res) => {
  412. const { data } = res;
  413. this.temp = Object.assign({}, data);
  414. this.dialogFormVisible = true;
  415. });
  416. },
  417. btnView(processInstanceId) {
  418. this.processInstanceId = processInstanceId;
  419. this.dialogViewVisible = true;
  420. },
  421. btnViewTaskList(row) {
  422. this.$router.push({
  423. path: '/flowable/task',
  424. query: { processInstanceId: row.id }
  425. });
  426. },
  427. btnDelete(id, cascade) {
  428. if (!id) {
  429. Message.error('请选择要删除的记录');
  430. return;
  431. }
  432. deleteAction('/flowable/processInstance/delete', {
  433. processInstanceId: id,
  434. cascade: cascade
  435. }).then(({ msg }) => {
  436. Message.success(msg);
  437. this.list();
  438. });
  439. },
  440. btnSuspendOrActivate(processInstanceId, suspend) {
  441. let suspendOrActivate = suspend ? 'activate' : 'suspend';
  442. putAction('/flowable/processInstance/' + suspendOrActivate, {
  443. processInstanceId: processInstanceId
  444. }).then(({ msg }) => {
  445. Message.success(msg);
  446. this.temp.suspended = !suspend;
  447. });
  448. }
  449. }
  450. };
  451. </script>
  452. <style scoped>
  453. .app-container {
  454. padding: 10px;
  455. }
  456. .filter-container .filter-item {
  457. display: inline-block;
  458. vertical-align: middle;
  459. margin-bottom: 5px;
  460. margin-right: 4px;
  461. }
  462. .filter-container {
  463. padding-bottom: 5px;
  464. }
  465. </style>