ModifyFlowDetail.vue 24 KB

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