model.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. <template>
  2. <div class="app-container">
  3. <div class="filter-container">
  4. <el-checkbox v-model="listQuery.latestVersion">最新版本</el-checkbox>
  5. </div>
  6. <div class="filter-container">
  7. <el-input
  8. v-model="listQuery.modelKey"
  9. placeholder="模型key"
  10. style="width: 200px"
  11. class="filter-item"
  12. @keyup.enter.native="btnQuery"
  13. />
  14. <el-input
  15. v-model="listQuery.modelName"
  16. placeholder="模型名称"
  17. style="width: 200px"
  18. class="filter-item"
  19. @keyup.enter.native="btnQuery"
  20. />
  21. <el-select
  22. v-model="listQuery.modelCategory"
  23. placeholder="模型类别"
  24. class="filter-item"
  25. >
  26. <el-option
  27. v-for="(item, index) in dicts.processCategory"
  28. :key="index"
  29. :label="item.content"
  30. :value="item.value"
  31. ></el-option>
  32. </el-select>
  33. <el-dropdown
  34. split-button
  35. type="primary"
  36. @click="btnQuery"
  37. class="filter-item"
  38. >
  39. <i class="el-icon-search el-icon--left"></i>查询
  40. <el-dropdown-menu slot="dropdown">
  41. <el-dropdown-item icon="el-icon-zoom-out" @click.native="btnReset"
  42. >重置</el-dropdown-item
  43. >
  44. </el-dropdown-menu>
  45. </el-dropdown>
  46. <el-button-group>
  47. <el-button
  48. icon="el-icon-plus"
  49. type="primary"
  50. @click="btnCreate"
  51. class="filter-item"
  52. >新增
  53. </el-button>
  54. <el-button
  55. icon="el-icon-plus"
  56. type="primary"
  57. @click="btnImport"
  58. class="filter-item"
  59. >导入
  60. </el-button>
  61. <!--<el-button v-permission="'flowable:model:delete'" icon="el-icon-delete" @click="btnDelete()"
  62. class="filter-item">批量删除
  63. </el-button>-->
  64. </el-button-group>
  65. </div>
  66. <el-table
  67. :data="records"
  68. ref="multipleTable"
  69. @selection-change="selectionChange"
  70. border
  71. fit
  72. highlight-current-row
  73. style="width: 100%"
  74. :cell-style="{ padding: '3px' }"
  75. >
  76. <el-table-column type="selection" align="center"> </el-table-column>
  77. <el-table-column label="模型key" prop="key" align="center">
  78. <template slot-scope="scope"
  79. ><span>{{ scope.row.key }}</span></template
  80. >
  81. </el-table-column>
  82. <el-table-column label="模型名称" prop="name" align="center">
  83. <template slot-scope="scope"
  84. ><span>{{ scope.row.name }}</span></template
  85. >
  86. </el-table-column>
  87. <el-table-column label="模型类别" prop="category" align="center">
  88. <!-- <template slot-scope="scope">
  89. <span v-html="formatDictText(dicts.processCategory,scope.row.category)"></span>
  90. </template> -->
  91. </el-table-column>
  92. <el-table-column label="版本" prop="version" align="center">
  93. <template slot-scope="scope"
  94. ><span>{{ scope.row.version }}</span></template
  95. >
  96. </el-table-column>
  97. <el-table-column label="是否发布" prop="deployed" align="center">
  98. <template slot-scope="scope"
  99. ><span>{{ scope.row.deployed ? '是' : '否' }}</span></template
  100. >
  101. </el-table-column>
  102. <el-table-column label="操作" align="center">
  103. <template slot-scope="{ row }">
  104. <el-dropdown>
  105. <span class="el-dropdown-link"
  106. >操作<i class="el-icon-arrow-down el-icon--right"></i
  107. ></span>
  108. <el-dropdown-menu slot="dropdown">
  109. <el-dropdown-item icon="el-icon-view" @click.native="btnView(row)"
  110. >查看</el-dropdown-item
  111. >
  112. <!--<el-dropdown-item v-permission="'flowable:model:update'" icon="el-icon-edit" divided
  113. @click.native="btnUpdate(row)">修改
  114. </el-dropdown-item>-->
  115. <el-dropdown-item
  116. icon="el-icon-edit"
  117. divided
  118. @click.native="btnCopy(row)"
  119. >复制
  120. </el-dropdown-item>
  121. <el-dropdown-item
  122. icon="el-icon-edit"
  123. divided
  124. @click.native="btnUpdateModel(row)"
  125. >流程设计
  126. </el-dropdown-item>
  127. <el-dropdown-item
  128. icon="el-icon-delete"
  129. divided
  130. @click.native="btnDelete(row.id)"
  131. >删除
  132. </el-dropdown-item>
  133. <el-dropdown-item
  134. icon="el-icon-delete"
  135. divided
  136. @click.native="btnDelete(row.id, true)"
  137. >删除包含历史
  138. </el-dropdown-item>
  139. <el-dropdown-item
  140. v-if="!row.deployed"
  141. icon="el-icon-edit"
  142. divided
  143. @click.native="btnDeploy(row.id)"
  144. >部署
  145. </el-dropdown-item>
  146. </el-dropdown-menu>
  147. </el-dropdown>
  148. </template>
  149. </el-table-column>
  150. </el-table>
  151. <pagination
  152. v-show="total > 0"
  153. :total="total"
  154. :current.sync="listQuery.current"
  155. :size.sync="listQuery.size"
  156. @pagination="list"
  157. />
  158. <el-dialog title="流程模型" :visible.sync="dialogFormVisible">
  159. <el-form
  160. ref="dataForm"
  161. :rules="rules"
  162. :model="temp"
  163. :disabled="dialogStatus === 'view'"
  164. label-position="right"
  165. label-width="110px"
  166. >
  167. <el-form-item label="模型key" prop="key">
  168. <el-input v-model="temp.key" />
  169. </el-form-item>
  170. <el-form-item label="模型名称" prop="name">
  171. <el-input v-model="temp.name" />
  172. </el-form-item>
  173. <el-form-item label="模型类别" prop="category">
  174. <el-select v-model="temp.category" placeholder="模型类别">
  175. <el-option
  176. v-for="item in dicts.processCategory"
  177. :key="item.value"
  178. :label="item.content"
  179. :value="item.value"
  180. ></el-option>
  181. </el-select>
  182. </el-form-item>
  183. <el-form-item label="模型描述" prop="description">
  184. <el-input v-model="temp.description" />
  185. </el-form-item>
  186. <el-form-item label="租户ID" prop="tenantId">
  187. <el-input v-model="temp.tenantId" />
  188. </el-form-item>
  189. </el-form>
  190. <div slot="footer" class="dialog-footer">
  191. <el-button icon="el-icon-close" @click="dialogFormVisible = false"
  192. >取消</el-button
  193. >
  194. <el-button
  195. v-if="dialogStatus !== 'view'"
  196. icon="el-icon-check"
  197. type="primary"
  198. @click="dialogStatus === 'create' ? createData() : updateData()"
  199. >确定
  200. </el-button>
  201. </div>
  202. </el-dialog>
  203. <el-dialog title="流程导入" :visible.sync="dialogImportVisible">
  204. <!--<div class="filter-container">
  205. <el-input v-model="importTenantId" placeholder="租户" clearable style="width: 200px;"/>
  206. </div>-->
  207. <el-upload
  208. class="upload-demo"
  209. drag
  210. action
  211. :show-file-list="false"
  212. :before-upload="beforeUpload"
  213. :http-request="doImport"
  214. >
  215. <i class="el-icon-upload"></i>
  216. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  217. <div class="el-upload__tip" slot="tip"
  218. >只能上传.bpmn20.xml,.bpmn文件,且不超过512K</div
  219. >
  220. </el-upload>
  221. </el-dialog>
  222. </div>
  223. </template>
  224. <script>
  225. import Pagination from '@/components/Pagination';
  226. import {
  227. deleteAction,
  228. getAction,
  229. postAction,
  230. putAction
  231. } from '@/api/flowable/manage';
  232. import { Message } from 'element-ui';
  233. export default {
  234. name: 'FlowableModel',
  235. components: { Pagination },
  236. data () {
  237. return {
  238. dicts: [],
  239. records: null,
  240. selectedRecords: [],
  241. total: 0,
  242. listQuery: {
  243. current: 1,
  244. size: 10,
  245. modelKey: undefined,
  246. latestVersion: true,
  247. modelName: undefined,
  248. modelCategory: undefined
  249. },
  250. dialogFormVisible: false,
  251. dialogStatus: '',
  252. temp: {
  253. id: undefined,
  254. key: '',
  255. name: '',
  256. category: '',
  257. description: '',
  258. tenantId: ''
  259. },
  260. rules: {
  261. id: [{ required: true, message: '该项不能为空', trigger: 'change' }],
  262. key: [{ required: true, message: '该项不能为空', trigger: 'change' }],
  263. name: [{ required: true, message: '该项不能为空', trigger: 'change' }]
  264. },
  265. dialogImportVisible: false
  266. };
  267. },
  268. beforeCreate () {
  269. // this.getDicts('processCategory,taskCategory').then(({data}) => {
  270. // this.dicts = data
  271. // })
  272. },
  273. created () {
  274. this.list();
  275. },
  276. methods: {
  277. list () {
  278. getAction('/flowable/model/list', this.listQuery).then((res) => {
  279. console.log('res', res);
  280. if (res.data.code == 0) {
  281. console.log('res.data.data', res.data.data);
  282. const { data } = res;
  283. this.records = res.data.data.list;
  284. this.total = res.data.data.count;
  285. console.log('this.records', this.records, 'this.total', this.total);
  286. }
  287. });
  288. },
  289. btnQuery () {
  290. this.listQuery.current = 1;
  291. this.list();
  292. },
  293. btnReset () {
  294. this.listQuery = {
  295. current: 1,
  296. size: 10,
  297. modelKey: undefined,
  298. latestVersion: true,
  299. modelName: undefined,
  300. modelCategory: undefined
  301. };
  302. this.list();
  303. },
  304. resetTemp () {
  305. this.temp = {
  306. id: undefined,
  307. key: '',
  308. name: '',
  309. category: '',
  310. description: '',
  311. tenantId: ''
  312. };
  313. },
  314. btnView (row) {
  315. this.temp = Object.assign({}, row);
  316. this.dialogStatus = 'view';
  317. this.dialogFormVisible = true;
  318. this.$nextTick(() => {
  319. this.$refs['dataForm'].clearValidate();
  320. });
  321. },
  322. btnCreate () {
  323. this.resetTemp();
  324. this.dialogStatus = 'create';
  325. this.dialogFormVisible = true;
  326. this.$nextTick(() => {
  327. this.$refs['dataForm'].clearValidate();
  328. });
  329. },
  330. btnImport () {
  331. this.dialogImportVisible = true;
  332. },
  333. beforeUpload (file) {
  334. // 上传前格式与大小校验
  335. const fileName = file.name;
  336. const isFileTypeOk =
  337. fileName.endsWith('.bpmn20.xml') ||
  338. fileName.endsWith('.bpmn') ||
  339. fileName.endsWith('.bar') ||
  340. fileName.endsWith('.zip');
  341. const isLt512 = file.size / 1024 / 512 < 1;
  342. if (!isFileTypeOk) {
  343. Message.error('上传文件格式不正确');
  344. }
  345. if (!isLt512) {
  346. Message.error('上传文件大小不能超过512K');
  347. }
  348. return isFileTypeOk && isLt512;
  349. },
  350. doImport (fileObj) {
  351. let formData = new FormData();
  352. formData.set('file', fileObj.file);
  353. // formData.set("tenantId", this.importTenantId);
  354. postAction('/flowable/model/import', formData).then(({ msg }) => {
  355. this.dialogImportVisible = false;
  356. Message.success(msg);
  357. this.list();
  358. });
  359. },
  360. createData () {
  361. this.$refs['dataForm'].validate((valid) => {
  362. if (valid) {
  363. postAction('/flowable/model/save', this.temp).then(({ msg }) => {
  364. this.dialogFormVisible = false;
  365. Message.success(msg);
  366. this.list();
  367. });
  368. }
  369. });
  370. },
  371. btnUpdate (row) {
  372. this.temp = Object.assign({}, row);
  373. this.dialogStatus = 'update';
  374. this.dialogFormVisible = true;
  375. this.$nextTick(() => {
  376. this.$refs['dataForm'].clearValidate();
  377. });
  378. },
  379. btnCopy (row) {
  380. putAction('/flowable/model/copy', { id: row.id }).then(({ msg }) => {
  381. console.log('msg', msg);
  382. Message.success(msg);
  383. this.list();
  384. });
  385. },
  386. btnUpdateModel (row) {
  387. this.$router.push({
  388. path: '/flowableModelEdit',
  389. query: { id: row.id, isView: row.deployed }
  390. });
  391. },
  392. updateData () {
  393. this.$refs['dataForm'].validate((valid) => {
  394. if (valid) {
  395. putAction('/flowable/model/update', this.temp).then(({ msg }) => {
  396. this.dialogFormVisible = false;
  397. Message.success(msg);
  398. this.list();
  399. });
  400. }
  401. });
  402. },
  403. btnDelete (id, cascade) {
  404. let ids = id
  405. ? [id]
  406. : this.selectedRecords.map((record) => {
  407. return record.id;
  408. });
  409. if (ids.length == 0) {
  410. Message.error('请选择要删除的记录');
  411. return;
  412. }
  413. deleteAction('/flowable/model/delete', {
  414. ids: ids.toString(),
  415. cascade
  416. }).then((res) => {
  417. console.log('res', res);
  418. Message.success(res.data.message);
  419. this.list();
  420. });
  421. },
  422. btnDeploy (id) {
  423. postAction('/flowable/model/deploy', { id }).then(({ msg }) => {
  424. Message.success(msg);
  425. this.list();
  426. });
  427. },
  428. selectionChange (selectedRecords) {
  429. this.selectedRecords = selectedRecords;
  430. }
  431. }
  432. };
  433. </script>
  434. <style>
  435. .app-container {
  436. padding: 10px;
  437. }
  438. .filter-container .filter-item {
  439. display: inline-block;
  440. vertical-align: middle;
  441. margin-bottom: 5px;
  442. margin-right: 4px;
  443. }
  444. .filter-container {
  445. padding-bottom: 5px;
  446. }
  447. </style>