ArchiveProofread.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. <template>
  2. <div style="padding: 20px; background-color: #f9f9f9; border-radius: 4px">
  3. <div
  4. style="
  5. display: flex;
  6. justify-content: space-between;
  7. align-items: center;
  8. margin-bottom: 20px;
  9. "
  10. >
  11. <div style="font-size: 16px; font-weight: 500">档案目录核对</div>
  12. <div>
  13. <el-button style="margin-right: 10px" @click="handlePrevStep">
  14. 上一步
  15. </el-button>
  16. <el-button type="primary" @click="handleNextStep">下一步</el-button>
  17. </div>
  18. </div>
  19. <el-table
  20. v-loading="loading"
  21. :data="proofreadData"
  22. border
  23. style="width: 100%"
  24. >
  25. <el-table-column type="index" label="序号" width="60" align="center">
  26. <template slot-scope="{ row }">
  27. {{ row.orderNum }}
  28. </template>
  29. </el-table-column>
  30. <el-table-column
  31. prop="materialName"
  32. label="资料名称"
  33. min-width="300"
  34. align="left"
  35. />
  36. <el-table-column
  37. prop="pageCount"
  38. label="资料页数"
  39. width="120"
  40. align="center"
  41. />
  42. <el-table-column
  43. prop="pageRange"
  44. label="起止页码"
  45. width="120"
  46. align="center"
  47. />
  48. <el-table-column label="操作" width="200" align="center" fixed="right">
  49. <template slot-scope="{ row }">
  50. <el-button
  51. v-if="row.canGenerate === '1' && row.documentType === 1"
  52. type="text"
  53. size="small"
  54. @click="handleGenerate(row)"
  55. >
  56. 编辑生成
  57. </el-button>
  58. <el-button
  59. v-if="row.documentType === 0"
  60. type="text"
  61. size="small"
  62. @click="handleViewFiles(row)"
  63. >
  64. 查看
  65. </el-button>
  66. <el-button
  67. v-if="row.documentType === 2"
  68. type="text"
  69. size="small"
  70. @click="handleViewCatalog(row)"
  71. >
  72. 编辑生成
  73. </el-button>
  74. <el-button
  75. v-if="row.documentType === 3"
  76. type="text"
  77. size="small"
  78. @click="handleViewCatalog(row)"
  79. >
  80. 编辑生成
  81. </el-button>
  82. <el-button
  83. v-if="[1, 2, 3].includes(row.documentType) && row.attachmentUrl"
  84. type="text"
  85. size="small"
  86. @click="handlePreviewFile(row)"
  87. >
  88. 查看
  89. </el-button>
  90. </template>
  91. </el-table-column>
  92. </el-table>
  93. <!-- 文件列表弹窗(只读模式) -->
  94. <CostAuditDialog
  95. :visible.sync="fileListDialogVisible"
  96. title="文件列表"
  97. :show-confirm-btn="false"
  98. :show-footer="false"
  99. width="80%"
  100. @cancel="fileListDialogVisible = false"
  101. >
  102. <!-- 资料信息展示 -->
  103. <div
  104. v-if="currentViewingMaterial"
  105. style="
  106. margin-bottom: 20px;
  107. padding: 15px;
  108. background-color: #f5f7fa;
  109. border-radius: 4px;
  110. "
  111. >
  112. <el-row :gutter="20">
  113. <el-col :span="12">
  114. <span style="color: #606266; font-size: 14px; margin-right: 10px">
  115. 资料名称:
  116. </span>
  117. <span style="font-weight: 500; font-size: 16px">
  118. {{ currentViewingMaterial.materialName }}
  119. </span>
  120. </el-col>
  121. <el-col :span="12">
  122. <span style="color: #606266; font-size: 14px; margin-right: 10px">
  123. 资料序号:
  124. </span>
  125. <span style="font-weight: 500; font-size: 16px">
  126. {{
  127. currentViewingMaterial.materialOrderNum ||
  128. currentViewingMaterial.orderNum
  129. }}
  130. </span>
  131. </el-col>
  132. </el-row>
  133. </div>
  134. <!-- 文件列表(只读模式,使用表格展示) -->
  135. <el-table
  136. v-loading="fileListLoading"
  137. :data="fileListData"
  138. border
  139. style="width: 100%"
  140. >
  141. <el-table-column type="index" label="序号" width="60" align="center" />
  142. <el-table-column
  143. prop="documentName"
  144. label="文书名称"
  145. min-width="200"
  146. align="left"
  147. />
  148. <el-table-column
  149. prop="documentNumber"
  150. label="文号"
  151. width="200"
  152. align="center"
  153. />
  154. <el-table-column
  155. prop="auditedUnitName"
  156. label="被监审单位"
  157. min-width="150"
  158. align="left"
  159. />
  160. <el-table-column
  161. prop="fileSource"
  162. label="文件来源"
  163. width="150"
  164. align="center"
  165. />
  166. <el-table-column
  167. prop="pageCount"
  168. label="页数"
  169. width="100"
  170. align="center"
  171. >
  172. <template slot-scope="{ row }">
  173. {{ row.pageCount || 0 }}
  174. </template>
  175. </el-table-column>
  176. <el-table-column label="操作" width="120" align="center" fixed="right">
  177. <template slot-scope="{ row }">
  178. <el-button
  179. v-if="row.attachmentUrl"
  180. type="text"
  181. size="small"
  182. @click="handlePreviewFile(row)"
  183. >
  184. 查看文件
  185. </el-button>
  186. </template>
  187. </el-table-column>
  188. </el-table>
  189. <div slot="footer" style="text-align: right; margin-top: 20px">
  190. <el-button @click="fileListDialogVisible = false">关闭</el-button>
  191. </div>
  192. </CostAuditDialog>
  193. <!-- 卷内目录弹窗 -->
  194. <CostAuditDialog
  195. :visible.sync="catalogDialogVisible"
  196. title="卷内目录"
  197. :show-confirm-btn="false"
  198. :show-footer="true"
  199. width="60%"
  200. @cancel="handleCancelCatalog"
  201. >
  202. <!-- 目录表格(只读) -->
  203. <el-table
  204. v-loading="catalogLoading"
  205. :data="catalogData"
  206. border
  207. style="width: 100%"
  208. >
  209. <el-table-column type="index" label="序号" width="100" align="center" />
  210. <el-table-column
  211. prop="materialName"
  212. label="资料名称"
  213. min-width="300"
  214. align="left"
  215. />
  216. <el-table-column
  217. prop="pageRange"
  218. label="开始页码-结束页码"
  219. width="200"
  220. align="center"
  221. />
  222. <!-- <el-table-column
  223. prop="remark"
  224. label="备注"
  225. min-width="200"
  226. align="left"
  227. /> -->
  228. </el-table>
  229. <div slot="footer" style="text-align: right">
  230. <el-button @click="handleCancelCatalog">关闭</el-button>
  231. <el-button type="primary" @click="handleGenerateCatalog">
  232. 生成
  233. </el-button>
  234. </div>
  235. </CostAuditDialog>
  236. <!-- 生成文书弹窗 -->
  237. <CostAuditDialog
  238. :visible.sync="generateDialogVisible"
  239. :title="generateDialogTitle"
  240. :show-confirm-btn="false"
  241. :show-footer="true"
  242. width="50%"
  243. @cancel="handleCancelGenerate"
  244. >
  245. <el-form
  246. ref="generateForm"
  247. :model="generateForm"
  248. :rules="generateRules"
  249. label-width="120px"
  250. >
  251. <el-row :gutter="20">
  252. <el-col :span="12">
  253. <el-form-item label="保管期限" prop="retentionPeriod">
  254. <el-input-number
  255. v-model="generateForm.retentionPeriod"
  256. :min="1"
  257. :controls="false"
  258. placeholder="请输入保管期限"
  259. style="width: 100%"
  260. ></el-input-number>
  261. </el-form-item>
  262. </el-col>
  263. <el-col :span="12">
  264. <el-form-item label="卷宗号" prop="archiveNo">
  265. <el-input
  266. v-model="generateForm.archiveNo"
  267. placeholder="请输入卷宗号"
  268. clearable
  269. ></el-input>
  270. </el-form-item>
  271. </el-col>
  272. </el-row>
  273. </el-form>
  274. <div slot="footer" style="text-align: right">
  275. <el-button @click="handleCancelGenerate">取消</el-button>
  276. <el-button type="primary" @click="handleConfirmGenerate">
  277. 确定
  278. </el-button>
  279. </div>
  280. </CostAuditDialog>
  281. <!-- 卷宗封底说明弹窗 (documentType=3) -->
  282. <CostAuditDialog
  283. :visible.sync="coverRemarkDialogVisible"
  284. title="卷宗封底说明"
  285. :show-confirm-btn="false"
  286. :show-footer="true"
  287. width="50%"
  288. @cancel="handleCancelCoverRemark"
  289. >
  290. <el-form
  291. ref="coverRemarkForm"
  292. :model="coverRemarkForm"
  293. :rules="coverRemarkRules"
  294. label-width="120px"
  295. >
  296. <el-form-item label="封底说明" prop="remark">
  297. <el-input
  298. v-model="coverRemarkForm.remark"
  299. type="textarea"
  300. :rows="6"
  301. placeholder="请输入卷宗封底说明内容"
  302. maxlength="1000"
  303. show-word-limit
  304. ></el-input>
  305. </el-form-item>
  306. </el-form>
  307. <div slot="footer" style="text-align: right">
  308. <el-button @click="handleCancelCoverRemark">取消</el-button>
  309. <el-button type="primary" @click="handleConfirmCoverRemark">
  310. 确定
  311. </el-button>
  312. </div>
  313. </CostAuditDialog>
  314. </div>
  315. </template>
  316. <script>
  317. import {
  318. getArchiveProofreadList,
  319. saveArchiveDocument,
  320. } from '@/api/audit/dataProofread'
  321. import { getDetailListByMasterList } from '@/api/audit/dataInduction'
  322. import CostAuditDialog from '@/components/costAudit/CostAuditDialog.vue'
  323. import { Base64 } from 'js-base64'
  324. export default {
  325. name: 'ArchiveProofread',
  326. components: {
  327. CostAuditDialog,
  328. },
  329. props: {
  330. taskId: {
  331. type: String,
  332. default: '',
  333. },
  334. },
  335. data() {
  336. return {
  337. loading: false,
  338. proofreadData: [],
  339. // 文件列表弹窗相关
  340. fileListDialogVisible: false,
  341. fileListData: [],
  342. fileListLoading: false,
  343. currentViewingMaterial: null,
  344. // 卷内目录弹窗相关
  345. catalogDialogVisible: false,
  346. catalogData: [],
  347. catalogLoading: false,
  348. currentCatalogRow: null,
  349. // 生成文书弹窗相关
  350. generateDialogVisible: false,
  351. generateDialogTitle: '生成文书',
  352. generateForm: {
  353. id: '',
  354. taskId: '',
  355. documentType: null,
  356. retentionPeriod: null,
  357. archiveNo: '',
  358. },
  359. generateRules: {
  360. retentionPeriod: [
  361. { required: true, message: '请输入保管期限', trigger: 'blur' },
  362. ],
  363. archiveNo: [
  364. { required: true, message: '请输入卷宗号', trigger: 'blur' },
  365. ],
  366. },
  367. currentGenerateRow: null,
  368. // 卷宗封底说明弹窗相关 (documentType=3)
  369. coverRemarkDialogVisible: false,
  370. coverRemarkForm: {
  371. id: '',
  372. taskId: '',
  373. documentType: 3,
  374. remark: '',
  375. },
  376. coverRemarkRules: {
  377. remark: [
  378. { required: true, message: '请输入封底说明内容', trigger: 'blur' },
  379. ],
  380. },
  381. currentCoverRemarkRow: null,
  382. tableRow: {},
  383. }
  384. },
  385. watch: {
  386. taskId: {
  387. handler(newVal) {
  388. if (newVal) {
  389. this.loadProofreadData()
  390. }
  391. },
  392. immediate: true,
  393. },
  394. },
  395. methods: {
  396. async loadProofreadData() {
  397. if (!this.taskId) return
  398. try {
  399. this.loading = true
  400. const response = await getArchiveProofreadList({
  401. taskId: this.taskId,
  402. })
  403. if (response && response.value) {
  404. this.proofreadData = Array.isArray(response.value)
  405. ? response.value
  406. : response.value.list || []
  407. } else {
  408. this.proofreadData = []
  409. }
  410. } catch (error) {
  411. console.error('加载卷宗校对列表失败:', error)
  412. this.proofreadData = []
  413. this.$message.error('数据加载失败')
  414. } finally {
  415. this.loading = false
  416. }
  417. },
  418. handleGenerate(row) {
  419. this.tableRow = row
  420. // 处理生成操作
  421. this.currentGenerateRow = row
  422. // 根据 documentType 设置弹窗标题
  423. const titleMap = {
  424. 1: '生成案卷封面',
  425. 2: '生成卷内目录',
  426. 3: '生成案卷封底',
  427. }
  428. this.generateDialogTitle = titleMap[row.documentType] || '生成文书'
  429. // 重置表单数据
  430. this.generateForm = {
  431. id: row.id || '',
  432. taskId: this.taskId,
  433. documentType: row.documentType,
  434. retentionPeriod: row.retentionPeriod || null,
  435. archiveNo: row.archiveNo || '',
  436. }
  437. this.generateDialogVisible = true
  438. },
  439. handleEdit(row) {
  440. // 处理编辑操作
  441. this.$emit('edit', row)
  442. },
  443. handleViewFiles(row) {
  444. // 处理查看文件列表操作
  445. this.currentViewingMaterial = row
  446. this.fileListDialogVisible = true
  447. // 兼容不同的ID字段名称
  448. const masterId = row.relatedId
  449. if (!masterId) {
  450. this.$message.warning('无法获取资料ID')
  451. console.warn('资料数据缺少ID字段:', row)
  452. return
  453. }
  454. this.loadFileList(masterId)
  455. },
  456. handlePreviewFile(row) {
  457. const rawUrl = row.attachmentUrl || row.url || row.fileUrl
  458. if (!rawUrl) {
  459. this.$message.warning('暂无文件!')
  460. return
  461. }
  462. const absoluteUrl = rawUrl.startsWith('http')
  463. ? rawUrl
  464. : (window.context?.form || '') + rawUrl
  465. const baseHost =
  466. typeof host !== 'undefined' && host ? host : window.location.origin
  467. const encodedUrl = encodeURIComponent(Base64.encode(absoluteUrl))
  468. window.open(`${baseHost}:8012/onlinePreview?url=${encodedUrl}`)
  469. },
  470. handleViewCatalog(row) {
  471. // 查看卷内目录(documentType = 2)或卷宗封底说明(documentType = 3)
  472. if (row.documentType === 2) {
  473. this.currentCatalogRow = row
  474. this.catalogDialogVisible = true
  475. this.loadCatalogData()
  476. } else if (row.documentType === 3) {
  477. // 处理 documentType=3 的情况,打开卷宗封底说明弹窗
  478. this.currentCoverRemarkRow = row
  479. // 设置表单数据
  480. this.coverRemarkForm = {
  481. id: row.id || '',
  482. taskId: this.taskId,
  483. documentType: 3,
  484. remark: row.remark || '',
  485. }
  486. this.coverRemarkDialogVisible = true
  487. }
  488. },
  489. async loadCatalogData() {
  490. try {
  491. this.catalogLoading = true
  492. console.log('开始加载卷内目录数据')
  493. const response = await getArchiveProofreadList({
  494. taskId: this.taskId,
  495. })
  496. console.log('卷内目录响应:', response)
  497. if (response && response.value) {
  498. this.catalogData = Array.isArray(response.value)
  499. ? response.value
  500. : response.value.list || []
  501. // 过滤掉前两条记录
  502. if (this.catalogData.length > 2) {
  503. this.catalogData = this.catalogData.slice(2)
  504. } else {
  505. this.catalogData = []
  506. }
  507. console.log('卷内目录数据:', this.catalogData)
  508. } else {
  509. this.catalogData = []
  510. console.warn('卷内目录响应数据为空')
  511. }
  512. } catch (error) {
  513. console.error('加载卷内目录失败:', error)
  514. this.catalogData = []
  515. this.$message.error(
  516. '数据加载失败: ' + (error.message || '请检查网络连接')
  517. )
  518. } finally {
  519. this.catalogLoading = false
  520. }
  521. },
  522. handleCancelCatalog() {
  523. // 关闭卷内目录弹窗
  524. this.catalogDialogVisible = false
  525. this.currentCatalogRow = null
  526. this.catalogData = []
  527. },
  528. async handleGenerateCatalog() {
  529. // 生成卷内目录,调用 documentType=2 的保存接口
  530. try {
  531. this.catalogLoading = true
  532. const submitData = {
  533. taskId: this.taskId,
  534. documentType: 2, // 卷内目录
  535. }
  536. // 如果当前行有ID,说明是编辑
  537. if (this.currentCatalogRow && this.currentCatalogRow.id) {
  538. submitData.id = this.currentCatalogRow.id
  539. }
  540. console.log('生成卷内目录数据:', submitData)
  541. // 调用保存文书的API接口
  542. const response = await saveArchiveDocument(submitData)
  543. if (response && response.success !== false) {
  544. this.$message.success(response.message || '生成成功')
  545. this.catalogDialogVisible = false
  546. this.loadProofreadData() // 重新加载列表
  547. } else {
  548. this.$message.error(response.message || '生成失败')
  549. }
  550. } catch (error) {
  551. console.error('生成卷内目录失败:', error)
  552. this.$message.error(
  553. '生成失败:' + (error.message || '请检查网络连接')
  554. )
  555. } finally {
  556. this.catalogLoading = false
  557. }
  558. },
  559. async loadFileList(masterId) {
  560. if (!masterId) {
  561. console.error('加载文件列表失败: masterId 为空')
  562. return
  563. }
  564. try {
  565. this.fileListLoading = true
  566. console.log('开始加载文件列表, masterId:', masterId)
  567. const response = await getDetailListByMasterList(masterId)
  568. console.log('文件列表响应:', response)
  569. if (response && response.value) {
  570. this.fileListData = Array.isArray(response.value)
  571. ? response.value
  572. : response.value.list || []
  573. console.log('文件列表数据:', this.fileListData)
  574. } else {
  575. this.fileListData = []
  576. console.warn('文件列表响应数据为空')
  577. }
  578. } catch (error) {
  579. console.error('加载文件列表失败:', error)
  580. this.fileListData = []
  581. this.$message.error(
  582. '文件列表加载失败: ' + (error.message || '请检查网络连接')
  583. )
  584. } finally {
  585. this.fileListLoading = false
  586. }
  587. },
  588. handlePrevStep() {
  589. // 处理上一步操作
  590. this.$emit('prev-step')
  591. },
  592. handleNextStep() {
  593. // 检查卷宗封面、卷内目录和案卷封底是否有文件数据
  594. let missingFiles = []
  595. // 查找各类型的文档
  596. const coverFile = this.proofreadData.find(
  597. (item) => item.documentType === 1
  598. ) // 卷宗封面
  599. const catalogFile = this.proofreadData.find(
  600. (item) => item.documentType === 2
  601. ) // 卷内目录
  602. const bottomFile = this.proofreadData.find(
  603. (item) => item.documentType === 3
  604. ) // 案卷封底
  605. // 检查各文件是否存在且有附件
  606. if (!coverFile || !coverFile.attachmentUrl) {
  607. missingFiles.push('卷宗封面')
  608. }
  609. if (!catalogFile || !catalogFile.attachmentUrl) {
  610. missingFiles.push('卷内目录')
  611. }
  612. if (!bottomFile || !bottomFile.attachmentUrl) {
  613. missingFiles.push('案卷封底')
  614. }
  615. // 如果有缺失的文件,提示用户
  616. if (missingFiles.length > 0) {
  617. this.$message.warning(`以下文件未生成:${missingFiles.join('、')}`)
  618. return
  619. }
  620. // 如果所有文件都已生成,则继续下一步
  621. this.$emit('next-step')
  622. },
  623. handleCancelGenerate() {
  624. // 取消生成
  625. this.generateDialogVisible = false
  626. this.currentGenerateRow = null
  627. this.$nextTick(() => {
  628. if (this.$refs.generateForm) {
  629. this.$refs.generateForm.resetFields()
  630. }
  631. })
  632. },
  633. handleCancelCoverRemark() {
  634. // 取消卷宗封底说明
  635. this.coverRemarkDialogVisible = false
  636. this.currentCoverRemarkRow = null
  637. this.$nextTick(() => {
  638. if (this.$refs.coverRemarkForm) {
  639. this.$refs.coverRemarkForm.resetFields()
  640. }
  641. })
  642. },
  643. async handleConfirmCoverRemark() {
  644. // 确认卷宗封底说明
  645. this.$refs.coverRemarkForm.validate(async (valid) => {
  646. if (!valid) return false
  647. try {
  648. // 准备提交数据
  649. const submitData = {
  650. taskId: this.coverRemarkForm.taskId,
  651. documentType: this.coverRemarkForm.documentType,
  652. remark: this.coverRemarkForm.remark,
  653. }
  654. // 如果有ID,说明是编辑
  655. if (this.coverRemarkForm.id) {
  656. submitData.id = this.coverRemarkForm.id
  657. }
  658. console.log('生成卷宗封底说明数据:', submitData)
  659. // 调用保存文书的API接口(与documentType=1和documentType=2相同的方法)
  660. const response = await saveArchiveDocument(submitData)
  661. if (response && response.success !== false) {
  662. this.$message.success(response.message || '生成成功')
  663. this.coverRemarkDialogVisible = false
  664. this.loadProofreadData() // 重新加载列表
  665. } else {
  666. this.$message.error(response.message || '生成失败')
  667. }
  668. } catch (error) {
  669. console.error('生成卷宗封底说明失败:', error)
  670. this.$message.error(
  671. '生成失败:' + (error.message || '请检查网络连接')
  672. )
  673. }
  674. })
  675. },
  676. async handleConfirmGenerate() {
  677. // 确认生成
  678. this.$refs.generateForm.validate(async (valid) => {
  679. if (!valid) return false
  680. try {
  681. // 准备提交数据
  682. const submitData = {
  683. taskId: this.generateForm.taskId,
  684. documentType: this.generateForm.documentType,
  685. retentionPeriod: this.generateForm.retentionPeriod,
  686. archiveNo: this.generateForm.archiveNo,
  687. relatedId: this.tableRow.relatedId,
  688. }
  689. // 如果有ID,说明是编辑
  690. if (this.generateForm.id) {
  691. submitData.id = this.generateForm.id
  692. }
  693. console.log('生成文书数据:', submitData)
  694. // 调用生成文书的API接口
  695. const response = await saveArchiveDocument(submitData)
  696. if (response && response.success !== false) {
  697. this.$message.success(response.message || '生成成功')
  698. this.generateDialogVisible = false
  699. this.loadProofreadData() // 重新加载列表
  700. } else {
  701. this.$message.error(response.message || '生成失败')
  702. }
  703. } catch (error) {
  704. console.error('生成文书失败:', error)
  705. this.$message.error(
  706. '生成失败:' + (error.message || '请检查网络连接')
  707. )
  708. }
  709. })
  710. },
  711. },
  712. }
  713. </script>
  714. <style scoped lang="scss"></style>