ModifyFlowDetail.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. <template>
  2. <div>
  3. <el-dialog
  4. class="modify-flow-detail page-dialog"
  5. :visible.sync="modalIsShow"
  6. title="流程图编辑"
  7. :close-on-click-modal="false"
  8. :close-on-press-escape="false"
  9. :show-close="false"
  10. append-to-body
  11. fullscreen
  12. destroy-on-close
  13. @open="visibleChange"
  14. >
  15. <div class="box-justify" slot="title">
  16. <h4 class="el-dialog__title">流程图编辑:{{ instance.name }}</h4>
  17. <div>
  18. <el-button @click="cancel">取消</el-button>
  19. <el-button type="primary" :disabled="isSubmit" @click="submit"
  20. >发布</el-button
  21. >
  22. </div>
  23. </div>
  24. <div class="flow-box">
  25. <div class="flow-content">
  26. <div class="flow-main">
  27. <!-- nodes -->
  28. <div
  29. v-for="node in nodes"
  30. :key="node.id"
  31. :id="`node-${node.id}`"
  32. :class="[
  33. 'flow-node',
  34. `node-${node.type.toLowerCase()}`,
  35. { 'is-active': curNode.id === node.id }
  36. ]"
  37. @click="toSelectNode(node)"
  38. >
  39. <div v-if="node.type === 'PROCESS'" class="flow-node-title">
  40. <i
  41. v-if="node.type === 'PROCESS'"
  42. :class="nodeIcons['PROCESS']"
  43. ></i
  44. >审批人
  45. </div>
  46. <div v-if="node.type === 'PROCESS'" class="flow-node-content">
  47. <template v-if="!IS_APPROVE_SET">
  48. <div v-if="node.property.approveUserType === 'USER'">
  49. <p>
  50. {{
  51. node.property.approveUsers
  52. .map(item => item.name)
  53. .join(",")
  54. }}
  55. </p>
  56. <p v-if="node.property.copyForUsers.length">
  57. 抄送:{{
  58. node.property.copyForUsers
  59. .map(item => item.name)
  60. .join(",")
  61. }}
  62. </p>
  63. </div>
  64. <div v-else>
  65. <p>
  66. {{
  67. node.property.approveRoles
  68. .map(item => item.name)
  69. .join(",")
  70. }}
  71. </p>
  72. </div>
  73. </template>
  74. <template
  75. v-if="IS_APPROVE_SET && node.property.approveUserCountType"
  76. >
  77. <p>
  78. 方式:{{
  79. APPROVE_USER_COUNT_TYPE[
  80. node.property.approveUserCountType
  81. ]
  82. }}
  83. </p>
  84. <p>
  85. 范围:{{
  86. APPROVE_USER_SELECT_RANGE[
  87. node.property.approveUserSelectRange
  88. ]
  89. }}
  90. </p>
  91. <p v-if="node.property.approveUserSelectRange === 'ROLE'">
  92. 角色:{{
  93. node.property.approveUserSelectRoles
  94. .map(item => item.name)
  95. .join(",")
  96. }}
  97. </p>
  98. </template>
  99. </div>
  100. <div v-else class="flow-node-content">
  101. <span><i :class="nodeIcons[node.type]"></i></span>
  102. <span>{{ node.content }}</span>
  103. </div>
  104. <div v-if="node.type !== 'END'" class="flow-link">
  105. <div class="node-add" @click.stop="toAddNode(node.id)">
  106. <i class="el-icon-plus"></i>
  107. </div>
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. <div class="flow-property">
  113. <div v-if="curNode.id" class="flow-property-main" :key="curNode.id">
  114. <h3 class="flow-property-title">节点属性</h3>
  115. <!-- 管理员指定审批人 -->
  116. <div v-if="!IS_APPROVE_SET" class="property-part">
  117. <h4 class="property-part-title">设置审批人</h4>
  118. <div class="flow-radio">
  119. <el-radio-group
  120. v-model="curNode.property.approveUserType"
  121. size="small"
  122. @change="curNodeChange"
  123. >
  124. <el-radio
  125. v-for="(val, key) in APPROVE_USER_TYPE"
  126. :key="key"
  127. :label="key"
  128. >{{ val }}</el-radio
  129. >
  130. </el-radio-group>
  131. </div>
  132. <!-- 添加成员 -->
  133. <div
  134. v-if="curNode.property.approveUserType === 'USER'"
  135. class="flow-users"
  136. >
  137. <el-button
  138. size="small"
  139. type="primary"
  140. @click="toAddUser('approveUsers')"
  141. >添加成员</el-button
  142. >
  143. <span class="tips-info">(最多添加5个)</span>
  144. <div class="user-list">
  145. <el-tag
  146. v-for="user in curNode.property.approveUsers"
  147. :key="user.id"
  148. size="small"
  149. closable
  150. :disable-transitions="false"
  151. @close="deleteApproveUser('approveUsers', user)"
  152. >
  153. {{ user.name }}
  154. </el-tag>
  155. <el-button
  156. class="user-clear"
  157. type="danger"
  158. size="mini"
  159. plain
  160. @click="clearApproveUsers('approveUsers')"
  161. >清空</el-button
  162. >
  163. </div>
  164. </div>
  165. <!-- 添加角色 -->
  166. <div v-else class="flow-users">
  167. <el-button
  168. size="small"
  169. type="primary"
  170. @click="toAddApproveRole('approveRoles')"
  171. >添加角色</el-button
  172. >
  173. <div class="user-list">
  174. <el-tag
  175. v-for="role in curNode.property.approveRoles"
  176. :key="role.id"
  177. size="small"
  178. closable
  179. :disable-transitions="false"
  180. @close="deleteApproveRole('approveRoles', role)"
  181. >
  182. {{ role.name }}
  183. </el-tag>
  184. <el-button
  185. class="user-clear"
  186. type="danger"
  187. size="mini"
  188. plain
  189. @click="clearApproveRole('approveRoles')"
  190. >清空</el-button
  191. >
  192. </div>
  193. </div>
  194. </div>
  195. <!-- 发起人指定审批人 -->
  196. <div v-else class="property-part">
  197. <h4 class="property-part-title">设置审批人</h4>
  198. <el-form label-width="80px">
  199. <el-form-item label="选择方式:">
  200. <el-select
  201. v-model="curNode.property.approveUserCountType"
  202. class="width-full"
  203. placeholder="请选择方式"
  204. :disabled="curNodeIsLast"
  205. @change="curNodeChange"
  206. >
  207. <el-option
  208. v-for="(val, key) in APPROVE_USER_COUNT_TYPE"
  209. :key="key"
  210. :value="key"
  211. :label="val"
  212. ></el-option>
  213. </el-select>
  214. </el-form-item>
  215. <el-form-item label="选择范围:">
  216. <el-select
  217. v-model="curNode.property.approveUserSelectRange"
  218. class="width-full"
  219. placeholder="请选择范围"
  220. :disabled="curNodeIsLast"
  221. @change="curNodeChange"
  222. >
  223. <el-option
  224. v-for="(val, key) in APPROVE_USER_SELECT_RANGE"
  225. :key="key"
  226. :value="key"
  227. :label="val"
  228. ></el-option>
  229. </el-select>
  230. </el-form-item>
  231. <el-form-item
  232. v-if="curNode.property.approveUserSelectRange === 'ROLE'"
  233. label="指定角色:"
  234. >
  235. <el-button
  236. size="small"
  237. type="primary"
  238. @click="toAddApproveRole('approveUserSelectRoles')"
  239. >添加角色</el-button
  240. >
  241. <div class="user-list">
  242. <el-tag
  243. v-for="role in curNode.property.approveUserSelectRoles"
  244. :key="role.id"
  245. size="small"
  246. closable
  247. :disable-transitions="false"
  248. @close="deleteApproveRole('approveUserSelectRoles', role)"
  249. >
  250. {{ role.name }}
  251. </el-tag>
  252. <el-button
  253. class="user-clear"
  254. type="danger"
  255. size="mini"
  256. plain
  257. @click="clearApproveRole('approveUserSelectRoles')"
  258. >清空</el-button
  259. >
  260. </div>
  261. </el-form-item>
  262. </el-form>
  263. </div>
  264. <!-- 抄送人 -->
  265. <div
  266. v-if="curNode.property.approveUserType === 'USER'"
  267. class="property-part"
  268. >
  269. <h4 class="property-part-title">设置抄送人</h4>
  270. <div class="flow-users">
  271. <el-button
  272. size="small"
  273. type="primary"
  274. @click="toAddUser('copyForUsers')"
  275. >添加成员</el-button
  276. >
  277. <span class="tips-info">(最多添加5个)</span>
  278. <div class="user-list">
  279. <el-tag
  280. v-for="user in curNode.property.copyForUsers"
  281. :key="user.id"
  282. closable
  283. size="small"
  284. :disable-transitions="false"
  285. @close="deleteApproveUser('copyForUsers', user)"
  286. >
  287. {{ user.name }}
  288. </el-tag>
  289. <el-button
  290. class="user-clear"
  291. type="danger"
  292. size="mini"
  293. plain
  294. @click="clearApproveUsers('copyForUsers')"
  295. >清空</el-button
  296. >
  297. </div>
  298. </div>
  299. </div>
  300. <!-- 高级设置 -->
  301. <div class="property-part">
  302. <h4 class="property-part-title">高级设置</h4>
  303. <p class="property-desc">多人审批时采用的审批方式</p>
  304. <div class="flow-radio-v">
  305. <el-radio-group
  306. v-model="curNode.property.multipleUserApproveType"
  307. size="small"
  308. @change="curNodeChange"
  309. >
  310. <el-radio
  311. v-for="(val, key) in MULTIPLE_USER_APPROVE_TYPE"
  312. :key="key"
  313. :label="key"
  314. >{{ val }}</el-radio
  315. >
  316. </el-radio-group>
  317. </div>
  318. </div>
  319. <!-- 驳回设置 -->
  320. <div class="property-part">
  321. <h4 class="property-part-title">驳回设置</h4>
  322. <p class="property-desc">允许驳回节点</p>
  323. <div class="flow-radio-v">
  324. <el-radio-group
  325. v-model="curNode.property.rejectType"
  326. size="small"
  327. @change="curNodeChange"
  328. >
  329. <el-radio
  330. v-for="(val, key) in REJECT_TYPE"
  331. :key="key"
  332. :label="key"
  333. >{{ val }}</el-radio
  334. >
  335. </el-radio-group>
  336. </div>
  337. <p class="property-desc">驳回后提交方式</p>
  338. <div class="flow-radio-v">
  339. <el-radio-group
  340. v-model="curNode.property.rejectResubmitType"
  341. size="small"
  342. @change="curNodeChange"
  343. >
  344. <el-radio
  345. v-for="(val, key) in REJECT_RESUBMIT_TYPE"
  346. :key="key"
  347. :label="key"
  348. >{{ val }}</el-radio
  349. >
  350. </el-radio-group>
  351. </div>
  352. </div>
  353. <el-button size="mini" type="danger" plain @click="toDeleteNode"
  354. >删除节点</el-button
  355. >
  356. </div>
  357. </div>
  358. </div>
  359. </el-dialog>
  360. <!-- SelectUserDialog -->
  361. <select-user-dialog
  362. ref="SelectUserDialog"
  363. :users="curAddUsers"
  364. @modified="userModified"
  365. ></select-user-dialog>
  366. <!-- SelectRoleDialog -->
  367. <select-role-dialog
  368. ref="SelectRoleDialog"
  369. :data="curAddRoles"
  370. @modified="roleModified"
  371. ></select-role-dialog>
  372. </div>
  373. </template>
  374. <script>
  375. import { deepCopy } from "../../../plugins/utils";
  376. import { flowDetail, updateFlowDetail } from "../api";
  377. import SelectUserDialog from "./SelectUserDialog";
  378. import SelectRoleDialog from "./SelectRoleDialog";
  379. const initFlowInfo = {
  380. id: null,
  381. name: "",
  382. type: "ELECTRON_FLOW",
  383. modelType: "USER_FIXED"
  384. };
  385. const DEFAULT_NODE = {
  386. id: "",
  387. type: "PROCESS", // 节点类型,START:开始节点,PROCESS:过程节点,END:结束节点
  388. content: "",
  389. w: 150,
  390. h: 40,
  391. x: 0,
  392. y: 0,
  393. property: {
  394. approveUserType: "USER", // 审批用户类型,USER:成员,ROLE:角色
  395. approveUsers: [], // 审批用户列表
  396. approveRoles: [], // 审批角色列表
  397. copyForUsers: [], // 抄送用户列表
  398. multipleUserApproveType: "ORDER", // 审批用户类别,ORDER:依次审批,ALL:会签(所有人必须审批),SOME:或签(一名审批人同意或拒绝即可)
  399. rejectType: "PREV", // 驳回类型,PREV:上一节点,START:发起人节点,PREV_ALL:该节点前全部节点
  400. rejectResubmitType: "NORMAL", // 驳回再提交类型,NORMAL:按正常流程提交,PREV_STEP:提交到驳回节点
  401. approveUserCountType: "ONE", // 选择方式,ONE:一个,MORE:多个
  402. approveUserSelectRange: "ALL", // 选择范围,ALL:全单位,ROLE:角色
  403. approveUserSelectRoles: [] // 指定角色范围
  404. }
  405. };
  406. // 详细参数:https://doc.qmth.com.cn/pages/viewpage.action?pageId=40435764
  407. export default {
  408. name: "modify-flow-detail",
  409. components: { SelectUserDialog, SelectRoleDialog },
  410. props: {
  411. instance: {
  412. type: Object,
  413. default() {
  414. return {};
  415. }
  416. }
  417. },
  418. data() {
  419. return {
  420. modalIsShow: false,
  421. isSubmit: false,
  422. initNodes: [
  423. {
  424. id: "1",
  425. type: "START",
  426. content: "开始流程",
  427. w: 150,
  428. h: 40,
  429. x: 0,
  430. y: 0,
  431. property: null
  432. },
  433. {
  434. id: "2",
  435. type: "END",
  436. content: "结束流程",
  437. w: 150,
  438. h: 40,
  439. x: 0,
  440. y: 0,
  441. property: null
  442. }
  443. ],
  444. flowInfo: { ...initFlowInfo },
  445. nodes: [],
  446. curNode: {},
  447. curNodeIsLast: false,
  448. curAddUsers: [],
  449. curAddUserType: "",
  450. curAddRoles: [],
  451. curAddRoleType: "",
  452. nodeIcons: {
  453. START: "el-icon-video-play",
  454. END: "el-icon-switch-button",
  455. PROCESS: "el-icon-circle-plus-outline"
  456. },
  457. APPROVE_USER_TYPE: {
  458. USER: "成员",
  459. ROLE: "角色"
  460. },
  461. MULTIPLE_USER_APPROVE_TYPE: {
  462. ORDER: "依次审批",
  463. ALL: "会签(所有人必须审批)",
  464. SOME: "或签(一名审批人同意或拒绝即可)"
  465. },
  466. REJECT_TYPE: {
  467. PREV: "上一节点",
  468. START: "发起人节点",
  469. PREV_ALL: "该节点前全部节点"
  470. },
  471. REJECT_RESUBMIT_TYPE: {
  472. NORMAL: "按正常流程提交",
  473. PREV_STEP: "提交到驳回节点"
  474. },
  475. APPROVE_USER_COUNT_TYPE: {
  476. ONE: "一次选择一个人",
  477. MORE: "一次选择多个人"
  478. },
  479. APPROVE_USER_SELECT_RANGE: {
  480. ALL: "全单位",
  481. ROLE: "指定角色"
  482. }
  483. };
  484. },
  485. computed: {
  486. IS_APPROVE_SET() {
  487. return this.flowInfo.modelType === "APPROVE_SET";
  488. }
  489. },
  490. methods: {
  491. async initData(val) {
  492. if (val.id) {
  493. const data = await flowDetail(val.id);
  494. this.flowInfo = this.$objAssign(initFlowInfo, data);
  495. this.flowInfo.id = data.customFlowId;
  496. this.nodes = data.customFlowLists;
  497. this.toSelectNode(this.nodes[1]);
  498. } else {
  499. this.flowInfo = this.$objAssign(initFlowInfo, val);
  500. this.nodes = deepCopy(this.initNodes);
  501. // this.toSelectNode(this.nodes[1]);
  502. this.toAddNode(this.nodes[0].id);
  503. // 发起人自选模式,默认新增两个节点
  504. if (this.IS_APPROVE_SET) this.toAddNode(this.nodes[0].id);
  505. }
  506. },
  507. visibleChange() {
  508. this.initData(this.instance);
  509. },
  510. cancel() {
  511. this.modalIsShow = false;
  512. },
  513. open() {
  514. this.modalIsShow = true;
  515. },
  516. getDefaultNode() {
  517. const nodeId = this.nodes.length
  518. ? Math.max.apply(
  519. null,
  520. this.nodes.map(item => item.id)
  521. ) + 1
  522. : 1;
  523. return { ...deepCopy(DEFAULT_NODE), id: nodeId };
  524. },
  525. toAddNode(curNodeId) {
  526. const newNode = this.getDefaultNode();
  527. const pos = this.nodes.findIndex(node => node.id === curNodeId);
  528. this.nodes.splice(pos + 1, 0, newNode);
  529. this.toSelectNode(newNode);
  530. },
  531. toDeleteNode() {
  532. const pos = this.nodes.findIndex(node => node.id === this.curNode.id);
  533. this.nodes.splice(pos, 1);
  534. if (this.nodes[pos] && this.nodes[pos].type === "PROCESS") {
  535. this.toSelectNode(this.nodes[pos]);
  536. } else {
  537. let prevPos = pos - 1;
  538. prevPos = Math.max(prevPos, 0);
  539. this.toSelectNode(this.nodes[prevPos]);
  540. }
  541. },
  542. toSelectNode(node) {
  543. if (node.type === "START" || node.type === "END") {
  544. this.curNode = {};
  545. return;
  546. }
  547. this.curNode = node ? deepCopy(node) : {};
  548. if (!this.IS_APPROVE_SET) return;
  549. // 发起人自选模式,最后一个节点禁止编辑审批人
  550. const pos = this.nodes.findIndex(item => item.id === node.id);
  551. this.curNodeIsLast = pos === this.nodes.length - 2;
  552. if (this.curNodeIsLast) {
  553. this.curNode.property.approveUserCountType = null;
  554. this.curNode.property.approveUserSelectRange = null;
  555. this.curNode.property.approveUserSelectRoles = [];
  556. this.curNodeChange();
  557. }
  558. },
  559. curNodeChange() {
  560. const pos = this.nodes.findIndex(node => node.id === this.curNode.id);
  561. this.nodes.splice(pos, 1, deepCopy(this.curNode));
  562. },
  563. // approveUser
  564. toAddUser(curAddUserType) {
  565. this.curAddUserType = curAddUserType;
  566. this.curAddUsers = this.curNode.property[this.curAddUserType];
  567. this.$refs.SelectUserDialog.open();
  568. },
  569. userModified(users) {
  570. this.curNode.property[this.curAddUserType] = users;
  571. this.curNodeChange();
  572. },
  573. deleteApproveUser(curAddUserType, user) {
  574. console.log(user);
  575. const pos = this.curNode.property[curAddUserType].findIndex(
  576. item => item.id === user.id
  577. );
  578. this.curNode.property[curAddUserType].splice(pos, 1);
  579. this.curNodeChange();
  580. },
  581. clearApproveUsers(curAddUserType) {
  582. this.curNode.property[curAddUserType] = [];
  583. this.curNodeChange();
  584. },
  585. // approveRole
  586. toAddApproveRole(curAddRoleType) {
  587. this.curAddRoleType = curAddRoleType;
  588. this.curAddRoles = this.curNode.property[this.curAddRoleType];
  589. this.$refs.SelectRoleDialog.open();
  590. },
  591. roleModified(roles) {
  592. this.curNode.property[this.curAddRoleType] = roles;
  593. this.curNodeChange();
  594. },
  595. deleteApproveRole(curAddRoleType, role) {
  596. const pos = this.curNode.property[curAddRoleType].findIndex(
  597. item => item.id === role.id
  598. );
  599. this.curNode.property[curAddRoleType].splice(pos, 1);
  600. this.curNodeChange();
  601. },
  602. clearApproveRole(curAddRoleType) {
  603. this.curNode.property[curAddRoleType] = [];
  604. this.curNodeChange();
  605. },
  606. checkData() {
  607. if (!this.nodes.some(node => node.type === "PROCESS")) {
  608. this.$message.error("请设置过程节点");
  609. return;
  610. }
  611. if (this.IS_APPROVE_SET) {
  612. const nodeUserValid = !this.nodes
  613. .filter(node => node.type === "PROCESS")
  614. .some(node => {
  615. if (node.property.approveUserSelectRange === "ROLE") {
  616. return !node.property.approveUserSelectRoles.length;
  617. } else {
  618. return false;
  619. }
  620. });
  621. if (!nodeUserValid) {
  622. this.$message.error("请完成节点设置");
  623. return;
  624. }
  625. } else {
  626. const nodeUserValid = !this.nodes
  627. .filter(node => node.type === "PROCESS")
  628. .some(node => {
  629. if (node.property.approveUserType === "USER") {
  630. return !node.property.approveUsers.length;
  631. // return !(
  632. // node.property.approveUsers.length &&
  633. // node.property.copyForUsers.length
  634. // );
  635. } else {
  636. return !node.property.approveRoles.length;
  637. }
  638. });
  639. if (!nodeUserValid) {
  640. this.$message.error("请完成节点设置");
  641. return;
  642. }
  643. }
  644. return true;
  645. },
  646. async submit() {
  647. if (this.isSubmit) return;
  648. const result = await this.$confirm(
  649. `确定要发布流程【${this.instance.name}】吗?`,
  650. "提示",
  651. {
  652. type: "warning"
  653. }
  654. ).catch(() => {});
  655. if (result !== "confirm") return;
  656. if (!this.checkData()) return;
  657. this.nodes.forEach(node => {
  658. const dom = document.getElementById(`node-${node.id}`);
  659. node.w = dom.clientWidth;
  660. node.h = dom.clientHeight;
  661. node.x = dom.offsetLeft;
  662. node.y = dom.offsetTop;
  663. });
  664. const nodes = this.nodes.map((node, index) => {
  665. let nnode = deepCopy(node);
  666. nnode.id = index + 1;
  667. if (node.property) {
  668. if (this.IS_APPROVE_SET) {
  669. if (node.property.approveUserSelectRange === "ALL") {
  670. node.property.approveUserSelectRoles = [];
  671. }
  672. } else {
  673. if (node.property.approveUserType === "USER") {
  674. nnode.approveRoles = [];
  675. } else {
  676. nnode.approveUsers = [];
  677. nnode.copyForUsers = [];
  678. }
  679. }
  680. }
  681. return nnode;
  682. });
  683. this.isSubmit = true;
  684. const res = await updateFlowDetail({
  685. customFlowId: this.flowInfo.id,
  686. name: this.flowInfo.name,
  687. type: this.flowInfo.type,
  688. modelType: this.flowInfo.modelType,
  689. publish: true,
  690. customFlowLists: nodes
  691. }).catch(() => {});
  692. this.isSubmit = false;
  693. if (!res) return;
  694. this.$message.success("编辑成功!");
  695. this.$emit("modified");
  696. this.cancel();
  697. }
  698. }
  699. };
  700. </script>