index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. <!-- 采购订单修订—— 列表 -->
  2. <script>
  3. import { TableColumns, SearchColumns, TabColumns, SelectColumns } from "./column";
  4. import orderApi from "@/api/business/purchase/purchase-order";
  5. import {
  6. initPage,
  7. initParams,
  8. initDicts,
  9. } from "@/utils/init/index.js";
  10. export default {
  11. name: "PuchaseOrder",
  12. dicts: initDicts(SelectColumns),
  13. components: {
  14. AddDrawer: () => import('./add/index.vue'),
  15. SeeDrawer: () => import('./see/index.vue'),
  16. EditDrawer: () => import('./edit/index.vue'),
  17. PurchaseReturnDrawer: () => import('./purchaseReturn/index.vue'),
  18. },
  19. data() {
  20. const initTabColumns = () => TabColumns;
  21. return {
  22. loading: false,
  23. tabLoading:false,
  24. isSimpleSearch: true,
  25. pageSizes: [10, 20, 50, 100],
  26. page: initPage(),
  27. searchColumns: SearchColumns,
  28. params: initParams(SearchColumns),
  29. tableColumns: TableColumns,
  30. tableData: [],
  31. tabColumns: initTabColumns(),
  32. tabName: "puOrderItemList",
  33. tabTableDatas: {
  34. puOrderItemList: [],
  35. puOrderExecuteList: [],
  36. },
  37. checkedList: [],
  38. // 子表Select
  39. checkedTabList: [],
  40. // 主表点击信息
  41. primaryResource:{},
  42. timer:300,
  43. timeOut:null,
  44. };
  45. },
  46. computed: {
  47. showSearchColumns() {
  48. return this.isSimpleSearch
  49. ? this.searchColumns.slice(0, 4)
  50. : this.searchColumns;
  51. },
  52. },
  53. created() {
  54. // this.fetchList(this.params, this.page);
  55. this.handleRefreshList();
  56. },
  57. methods: {
  58. async fetchList(data, params) {
  59. try {
  60. this.loading = true;
  61. params['isAsc'] = 'desc';
  62. params['orderByColumn'] = 'updateTime';
  63. const { code, msg, rows, total } = await orderApi.list(data, params);
  64. if (code === 200) {
  65. this.page.total = total;
  66. this.tableData = rows;
  67. }
  68. } catch (err) {
  69. //
  70. } finally {
  71. this.loading = false;
  72. for (const key in this.tabTableDatas) {
  73. this.tabTableDatas[key] = [];
  74. }
  75. }
  76. },
  77. handleSearchChange() {
  78. this.isSimpleSearch = !this.isSimpleSearch;
  79. },
  80. // 刷新操作
  81. handleRefreshList() {
  82. this.page = initPage();
  83. this.checkedList = [];
  84. this.checkedTabList = [];
  85. this.primaryResource = {};
  86. this.fetchList(this.params, this.page);
  87. },
  88. // 查询操作
  89. handleQueryList() {
  90. let {date} = this.params;
  91. this.params.startDate = date ? date[0] :'';
  92. this.params.endDate = date ? date[1] : '';
  93. this.fetchList(this.params, this.page);
  94. },
  95. // 重置操作
  96. handleResetList() {
  97. this.page = initPage();
  98. this.params = initParams(SearchColumns);
  99. this.fetchList(this.params, this.page);
  100. },
  101. handleTabClick() { },
  102. // 新增
  103. handleOpenAddDrawer(copyVal) {
  104. const { setVisible, setCopyParams } = this.$refs.addDrawerFef;
  105. setVisible(true,(copyVal.id && copyVal.id != '') ? true :false);
  106. copyVal.id && copyVal.id != '' && setCopyParams(copyVal.id);
  107. },
  108. // 复制
  109. handleCopy() {
  110. // let rowDetails = {
  111. // ... this.checkedList[0],
  112. // id: '',
  113. // code: '',
  114. // status: '0',
  115. // source: '3',
  116. // };
  117. this.handleOpenAddDrawer(this.checkedList[0]);
  118. },
  119. // 查看
  120. async handleOpenSeeDrawer(row) {
  121. window.clearInterval(this.timeOut);
  122. const { id } = row;
  123. const { setVisible, fetchItem } = this.$refs.seeDrawerRef;
  124. await setVisible(true);
  125. await fetchItem(id);
  126. },
  127. // 编辑、修订
  128. async handleOpenEditDrawer(row) {
  129. const { id } = row;
  130. const { setVisible, fetchItem } = this.$refs.editDrawerRef;
  131. await setVisible(true);
  132. await fetchItem(id);
  133. },
  134. // 获取子表信息
  135. handleDetailsData(row) {
  136. window.clearTimeout(this.timeOut)
  137. this.timeOut = setTimeout(async () =>{
  138. try {
  139. this.tabLoading = true;
  140. this.primaryResource = row;
  141. this.checkedTabList = [];
  142. const { code, msg, data } = await orderApi.details(row.id);
  143. if (code === 200) {
  144. // 物料信息:puOrderItemList 执行结果:puOrderExecuteList
  145. for (const key in this.tabTableDatas) {
  146. this.tabTableDatas[key] = data[key];
  147. }
  148. }
  149. } catch (err) {}
  150. finally{
  151. this.tabLoading = false;
  152. }
  153. },this.timer)
  154. },
  155. // 操作提示弹窗
  156. handleConfirmTips(success){
  157. this.$confirm('是否继续此操作?', '提示', {
  158. confirmButtonText: '确定',
  159. cancelButtonText: '取消',
  160. type: 'warning'
  161. }).then(() => {
  162. success();
  163. }).catch(() => {
  164. this.$message({
  165. type: 'info',
  166. message: '已取消操作!'
  167. });
  168. });
  169. },
  170. // 删除操作
  171. handleDeleteList(row) {
  172. try {
  173. this.loading = true;
  174. this.handleConfirmTips(async()=>{
  175. const { id } = row;
  176. const { code } = await orderApi.remove(id);
  177. if (code === 200) {
  178. this.handleRefreshList();
  179. }
  180. })
  181. } catch (err) {
  182. //
  183. } finally {
  184. this.loading = false;
  185. }
  186. },
  187. // 批量提交
  188. handleBatchSubmit(){
  189. let inconformity = this.checkedList.filter(row => !(row.status == '0' || row.status == '3'));
  190. console.log(inconformity,'inconformity--------');
  191. if(!inconformity.length && this.checkedList.length){
  192. let puOrderIds = this.checkedList.map( item => Number(item.id));
  193. this.fetchSubmit(puOrderIds);
  194. }else{
  195. this.$message({
  196. message: '当前选中存在不满足提交条件的数据!',
  197. type: 'warning'
  198. });
  199. }
  200. },
  201. // 提交
  202. handleSubmit(row) {
  203. let puOrderIds = [Number(row.id)];
  204. this.fetchSubmit(puOrderIds);
  205. // try {
  206. // this.handleConfirmTips(async()=>{
  207. // let { code } = await orderApi.submit({ puOrderId: row.id });
  208. // if (code == 200) {
  209. // this.handleRefreshList();
  210. // }
  211. // })
  212. // } catch (error) {
  213. // } finally {
  214. // }
  215. },
  216. fetchSubmit(puOrderIds){
  217. try {
  218. this.handleConfirmTips(async()=>{
  219. let { code } = await orderApi.submit({ puOrderIds});
  220. if (code == 200) {
  221. this.handleRefreshList();
  222. }
  223. })
  224. } catch (error) {
  225. } finally {
  226. }
  227. },
  228. // 判断“整单退回”按钮
  229. judgeIsAllReturn() {
  230. if (this.checkedList.length == 1) {
  231. // 非手工、状态:自由/驳回
  232. if (this.checkedList[0].source != 3 && (this.checkedList[0].status == 0 || this.checkedList[0].status == 3)) {
  233. return false
  234. }
  235. }
  236. return true;
  237. },
  238. // 整单退回
  239. handleAllReturn() {
  240. this.handleReturn(this.checkedList[0].id,[]);
  241. },
  242. // 判断“行退回”按钮
  243. judgeIsLineReturn() {
  244. if (this.checkedTabList.length == 1) {
  245. // 主信息:非手工、状态:自由/驳回
  246. if(this.primaryResource.source != 3 &&
  247. (this.primaryResource.status == 0 || this.primaryResource.status == 3) ){
  248. return false
  249. }
  250. }
  251. return true;
  252. },
  253. // 行退回
  254. handleLineReturn(){
  255. let ids = this.checkedTabList.map(checked => checked.id);
  256. console.log(ids,'行退回ids');
  257. this.handleReturn(this.primaryResource.id,ids);
  258. },
  259. // 退回接口
  260. handleReturn(id,documentIds){
  261. this.$prompt('请输入退回原因', '提示', {
  262. confirmButtonText: '确定',
  263. cancelButtonText: '取消',
  264. inputPattern: /\s*\S+?/,
  265. inputErrorMessage: '退回原因不能为空'
  266. }).then(async ({ value }) => {
  267. let data = {
  268. id:Number(id),
  269. documentIds:documentIds.map(ids =>Number(ids)),
  270. baskCause: value,
  271. };
  272. console.log(data);
  273. try {
  274. let { code, msg } = await orderApi.documentsReturn(data);
  275. if (code === 200) {
  276. this.handleRefreshList();
  277. }
  278. } catch (error) {
  279. console.log(error,'error------------');
  280. }
  281. }).catch(() => { });
  282. },
  283. // 判断是否满足整单关闭
  284. judgeIsAllClose() {
  285. if (this.checkedList.length == 1) {
  286. if (this.checkedList[0].status == 0) {
  287. // 未审批状态下整单关闭
  288. return false
  289. }
  290. }
  291. return true;
  292. },
  293. // 整单关闭
  294. handleAllClose() {
  295. // 未审批状态下整单关闭
  296. try {
  297. this.handleConfirmTips(async() =>{
  298. let puOrderIds = this.checkedList.map(order => Number(order.id));
  299. // console.log(puOrderIds,'puOrderIds');
  300. let { code } = await orderApi.close({ puOrderIds });
  301. if (code === 200) {
  302. this.handleRefreshList();
  303. }
  304. })
  305. } catch (error) { }
  306. },
  307. // 付款协议
  308. async handlePaymentRequest(){
  309. // name:工号
  310. try {
  311. // let {name} = this.$store.state.user;
  312. let {code,msg} = await orderApi.payRequest();
  313. if(code == 200){
  314. msg.replace(/\/n/g,'');
  315. let url = `uclient://start/http://172.16.100.2:8081?ssoKey=${msg}&uiloader=nc.uap.lfw.applet.PortalUILoader&nodeId=40040407`
  316. window.location.href = url;
  317. }
  318. } catch (error) {
  319. }
  320. },
  321. // 退货
  322. async handlePurchaseReturn(){
  323. const { id } = this.checkedList[0];
  324. const { setVisible, fetchStorage } = this.$refs.PurchaseReturnDrawerRef;
  325. await setVisible(true);
  326. await fetchStorage(id);
  327. },
  328. // 主表Select框
  329. handleSelect(selection, row) {
  330. this.checkedList = selection;
  331. console.log(this.checkedList, 'this.checkedList');
  332. },
  333. // 子表Select框
  334. handleTabSelect(selection, row){
  335. this.checkedTabList = selection;
  336. console.log(this.checkedTabList, 'this.checkedTabList');
  337. },
  338. // 保留两位小数,补位
  339. keepTwoDecimalStr(num) {
  340. if(num){
  341. const result = Number(num.toString().match(/^\d+(?:\.\d{0,2})?/));
  342. let s = result.toString();
  343. let rs = s.indexOf('.');
  344. if (rs < 0) {
  345. rs = s.length;
  346. s += '.';
  347. }
  348. while (s.length <= rs + 2) {
  349. s += '0';
  350. }
  351. return s;
  352. }else{
  353. return '';
  354. }
  355. }
  356. }
  357. };
  358. </script>
  359. <template>
  360. <el-card
  361. v-loading="loading"
  362. style="width: calc(100% - 24px); height: 100%; margin: 10px"
  363. :body-style="{ padding: 0 }"
  364. >
  365. <SeeDrawer ref="seeDrawerRef"></SeeDrawer>
  366. <AddDrawer ref="addDrawerFef" @close="handleRefreshList"></AddDrawer>
  367. <EditDrawer ref="editDrawerRef" @close="handleRefreshList"></EditDrawer>
  368. <PurchaseReturnDrawer ref="PurchaseReturnDrawerRef" @close="handleRefreshList"></PurchaseReturnDrawer>
  369. <el-form
  370. size="mini"
  371. label-position="right"
  372. label-width="100px"
  373. :model="params"
  374. style="padding: 20px 0 0 0"
  375. >
  376. <el-row :gutter="24" >
  377. <el-col :span="20">
  378. <el-row :gutter="20" style="display:flex; flex-wrap: wrap;">
  379. <el-col
  380. v-for="column in showSearchColumns"
  381. :key="column.title"
  382. :xl="6" :lg="6" :md="8" :sm="12" :xs="24"
  383. >
  384. <el-form-item :prop="column.key" :label="column.title">
  385. <el-input v-if="column.inputType === 'Input'"
  386. v-model="params[column.key]"
  387. :placeholder="column.placeholder"
  388. @keyup.enter.native="fetchList(params, page)"
  389. ></el-input>
  390. <dr-popover-select v-if="column.inputType === 'PopoverSelect'"
  391. v-model="params[column.key]"
  392. :source.sync="params"
  393. :title="column.title"
  394. :type="column.referName"
  395. :multiple="column.multiple"
  396. :readonly="column.readonly"
  397. :value-key="column.valueKey"
  398. :placeholder="column.placeholder"
  399. :data-mapping="column.dataMapping"
  400. :query-params="column.queryParams"
  401. :clearable="column.clearable"
  402. @keyup.enter.native="fetchList(params, page)"
  403. ></dr-popover-select>
  404. <!-- @keyup.enter.native="useQuery(params, page)" -->
  405. <el-select v-if="column.inputType === 'Select'"
  406. v-model="params[column.key]"
  407. :disabled="column.disabled"
  408. :clearable="column.clearable"
  409. :placeholder="column.placeholder"
  410. :multiple="column.multiple"
  411. :collapse-tags="column.tags"
  412. style="width: 100%"
  413. @keyup.enter.native="fetchList(params, page)"
  414. >
  415. <el-option
  416. v-for="item in dict.type[column.referName]"
  417. :key="item.value"
  418. :label="item.label"
  419. :value="item.value"
  420. ></el-option>
  421. </el-select>
  422. <!-- 只有是否 -->
  423. <el-select v-if="column.inputType === 'SelectCheck'"
  424. v-model="params[column.key]"
  425. :disabled="column.disabled"
  426. :clearable="column.clearable"
  427. :placeholder="column.placeholder"
  428. style="width: 100%"
  429. @keyup.enter.native="fetchList(params, page)"
  430. >
  431. <el-option key="N" label="否" value="N"></el-option>
  432. <el-option key="Y" label="是" value="Y"></el-option>
  433. </el-select>
  434. <el-date-picker v-if="column.inputType === 'DatePicker'"
  435. v-model="params[column.key]"
  436. size="mini"
  437. type="daterange"
  438. :value-format="column.valueFormat"
  439. :unlink-panels="column.unlinkPanels"
  440. :picker-options="column.pickerOptions"
  441. :range-separator="column.rangeSeparator"
  442. :end-placeholder="column.endPlaceholder"
  443. :start-placeholder="column.startPlaceholder"
  444. :clearable="column.clearable"
  445. style="width: 100%"
  446. @keyup.enter.native="fetchList(params, page)"
  447. >
  448. </el-date-picker>
  449. </el-form-item>
  450. </el-col>
  451. </el-row>
  452. </el-col>
  453. <el-col :span="4" style="text-align: right; padding-right: 40px">
  454. <el-button type="primary" size="mini" @click="handleQueryList"
  455. v-hasPermi="['material:order:query']">搜索</el-button>
  456. <el-button size="mini" @click="handleResetList">重置</el-button>
  457. </el-col>
  458. </el-row>
  459. </el-form>
  460. <el-divider>
  461. <i :class="isSimpleSearch ? 'el-icon-arrow-down' : 'el-icon-arrow-up'" style="cursor: pointer"
  462. @click="handleSearchChange"></i>
  463. </el-divider>
  464. <!-- 操作 -->
  465. <el-row :gutter="24" style="padding: 0 20px">
  466. <!-- <el-col :span="6">123</el-col> -->
  467. <el-col :span="24" style="text-align: right;margin: 0 10px 0 0">
  468. <!-- <el-button-group style="margin-left: 10px"> -->
  469. <el-button size="mini" type="primary" plain @click="handleOpenAddDrawer"
  470. v-hasPermi="['material:order:add']">新增</el-button>
  471. <!-- </el-button-group> -->
  472. <el-button-group style="margin-left: 10px">
  473. <el-button size="mini" :disabled="checkedList.length != 1" @click="handleCopy">复制</el-button>
  474. <el-button size="mini" @click="handleBatchSubmit">批量提交</el-button>
  475. </el-button-group>
  476. <el-button-group style="margin-left: 10px" :key="checkedList.length + 1">
  477. <el-button size="mini" @click="handleAllReturn" :disabled="judgeIsAllReturn()">整单退回</el-button>
  478. <el-button size="mini" @click="handleAllClose" :disabled="judgeIsAllClose()">整单关闭</el-button>
  479. </el-button-group>
  480. <el-button-group style="margin-left: 10px">
  481. <!-- <el-button size="mini"
  482. :disabled="!(checkedList.length == 1 && checkedList[0].deliveryStatus == '0')"
  483. :key="checkedList.length"
  484. @click="handlePurchaseReturn"
  485. >采购退货</el-button> -->
  486. <el-button size="mini" @click="handlePaymentRequest">付款申请</el-button>
  487. <!-- <el-button size="mini">附件管理</el-button>
  488. <el-button size="mini">单据追溯</el-button> -->
  489. </el-button-group>
  490. </el-col>
  491. </el-row>
  492. <el-table
  493. @row-dblclick="handleOpenSeeDrawer"
  494. @row-click="handleDetailsData"
  495. :data="tableData"
  496. size="mini"
  497. highlight-current-row
  498. @select="handleSelect"
  499. height="450"
  500. style="width: 100%; margin: 20px 0 0 0"
  501. >
  502. <el-table-column type="selection" width="45" ></el-table-column>
  503. <el-table-column type="index" width="50" label="序号"></el-table-column>
  504. <el-table-column
  505. v-for="(column, index) in tableColumns"
  506. :key="index"
  507. :prop="column.key"
  508. :label="column.title"
  509. :width="column.width || 180"
  510. :show-overflow-tooltip="column.showOverflowTooltip || true"
  511. >
  512. <template slot-scope="scope">
  513. <dict-tag v-if="column.inputType === 'Select'"
  514. size="small"
  515. :value="scope.row[column.key]"
  516. :options="dict.type[column.referName]"
  517. />
  518. <el-checkbox v-else-if="column.inputType === 'Checkbox'"
  519. v-model="scope.row[column.key]"
  520. disabled
  521. true-label="Y"
  522. false-label="N"
  523. > </el-checkbox>
  524. <span v-else>{{column.precision ? keepTwoDecimalStr(scope.row[column.key]):scope.row[column.key] }}</span>
  525. </template>
  526. </el-table-column>
  527. <el-table-column fixed="right" label="操作" width="120">
  528. <template slot-scope="scope">
  529. <!-- <el-button @click.stop="handleOpenSeeDrawer(scope.row)" type="text" size="small">查看</el-button> -->
  530. <el-button
  531. v-if="scope.row.status == '2'"
  532. type="text"
  533. size="small"
  534. @click.stop="handleOpenEditDrawer(scope.row)"
  535. v-hasPermi="['material:order:edit']">
  536. 修订
  537. </el-button>
  538. <el-button
  539. v-if="scope.row.status == '0' || scope.row.status == '3'"
  540. type="text"
  541. size="small"
  542. @click.stop="handleOpenEditDrawer(scope.row)"
  543. v-hasPermi="['material:order:edit']">
  544. 编辑
  545. </el-button>
  546. <!-- 0=自由态,1=审批中,2=已审核,3=已驳回 4=提交中-->
  547. <el-button
  548. v-if="(scope.row.status == '0' || scope.row.status == '3') && scope.row.source == '3'"
  549. type="text"
  550. size="small"
  551. @click.stop="handleDeleteList(scope.row)"
  552. v-hasPermi="['material:order:remove']"
  553. >删除</el-button>
  554. <el-button
  555. v-if="scope.row.status == '0' || scope.row.status == '3'"
  556. type="text"
  557. size="mini"
  558. v-hasPermi="['material:order:toOa']"
  559. @click.stop="handleSubmit(scope.row)"
  560. >提交</el-button>
  561. </template>
  562. </el-table-column>
  563. </el-table>
  564. <pagination
  565. v-show="page.total>0"
  566. :total="page.total"
  567. :page.sync="page.pageNum"
  568. :limit.sync="page.pageSize"
  569. @pagination="fetchList(params, page)"
  570. />
  571. <div style="position: relative; padding-top: 10px;" v-loading="tabLoading">
  572. <el-row style="position: absolute; top: 30px; right: 20px;z-index: 10;">
  573. <el-button
  574. size="mini"
  575. @click="handleLineReturn"
  576. :disabled="judgeIsLineReturn()"
  577. >行退回</el-button>
  578. </el-row>
  579. <el-tabs v-model="tabName" @tab-click="handleTabClick" style="width: 100%;padding: 20px 10px">
  580. <el-tab-pane
  581. v-for="(column, index) in tabColumns"
  582. :key="index"
  583. :label="column.title"
  584. :name="column.key"
  585. >
  586. <el-table
  587. :data="tabTableDatas[column.key]"
  588. style="width: 100%"
  589. highlight-current-row
  590. :height="tabTableDatas[column.key].length ? 300 : 100"
  591. @select="handleTabSelect"
  592. >
  593. <el-table-column
  594. v-if=" tabName === 'puOrderItemList'"
  595. type="selection"
  596. width="45"
  597. ></el-table-column>
  598. <el-table-column type="index" width="50" label="序号"></el-table-column>
  599. <el-table-column
  600. v-for="(cColumn, cIndex) in column.tableColumns"
  601. :key="cIndex"
  602. :prop="cColumn.key"
  603. :label="cColumn.title"
  604. :width="cColumn.width || 180"
  605. :show-overflow-tooltip="cColumn.showOverflowTooltip || true"
  606. >
  607. <template slot-scope="scope">
  608. <dict-tag v-if="cColumn.referName"
  609. size="small"
  610. :value="scope.row[cColumn.key]"
  611. :options="dict.type[cColumn.referName]"
  612. />
  613. <el-checkbox v-else-if="cColumn.inputType === 'Checkbox'"
  614. v-model="scope.row[cColumn.key]"
  615. disabled
  616. true-label="Y"
  617. false-label="N"
  618. ></el-checkbox>
  619. <span v-else>{{cColumn.precision ? keepTwoDecimalStr(scope.row[cColumn.key]): scope.row[cColumn.key] }}</span>
  620. </template>
  621. </el-table-column>
  622. </el-table>
  623. </el-tab-pane>
  624. </el-tabs>
  625. </div>
  626. </el-card>
  627. </template>