audit-view-board.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  1. <template>
  2. <div :class="$style.title">
  3. <a-form-model layout="inline">
  4. <a-form-model-item label="年份:">
  5. <div style="width: 240px">
  6. <audit-year-time v-model="year" :single="false" @change="yearChange" />
  7. </div>
  8. </a-form-model-item>
  9. <a-form-model-item>
  10. <a-form-model-item label="组织机构:">
  11. <div style="width: 240px">
  12. <a-select
  13. v-model="mdgOrgCode"
  14. show-search
  15. placeholder="请先选择"
  16. :disabled="year.length === 0 || !isJt"
  17. :filter-option="filterOption"
  18. allow-clear
  19. >
  20. <a-select-option v-for="(item, i) in unitList" :key="i" :value="item.code">{{
  21. item.name
  22. }}</a-select-option>
  23. </a-select>
  24. </div>
  25. </a-form-model-item>
  26. <a-button type="primary" @click="searchData">查询</a-button>
  27. </a-form-model-item>
  28. </a-form-model>
  29. <a-divider></a-divider>
  30. <div :class="$style.contentView">
  31. <div :class="$style.viewBody">
  32. <div :class="$style.contentTitle">指标汇总</div>
  33. <a-form-model layout="inline" :class="$style.searchform">
  34. <a-form-model-item label="年份:">
  35. <div style="width: 200px">
  36. <a-select v-model="onYear">
  37. <a-select-option v-for="(item, i) in year" :key="i" :value="item">{{
  38. item
  39. }}</a-select-option>
  40. </a-select>
  41. </div>
  42. </a-form-model-item>
  43. <!-- 查询搜索 -->
  44. <a-form-model-item>
  45. <a-button type="primary" @click="searchBar">搜索</a-button>
  46. <a-button @click="resetBar">重置</a-button>
  47. </a-form-model-item>
  48. </a-form-model>
  49. <a-spin :spinning="isshowLoading1">
  50. <div id="echartsbar" :class="$style.bar"></div>
  51. <!-- 上网采购金额 -->
  52. <div :class="$style.purchaseData">上网采购金额:{{ purchase }}(万元)</div>
  53. </a-spin>
  54. </div>
  55. <div :class="$style.viewBody">
  56. <div :class="$style.contentTitle">趋势分析</div>
  57. <a-form-model layout="inline" :class="$style.searchform">
  58. <a-form-model-item label="指标选择:">
  59. <div style="width: 200px">
  60. <a-select v-model="targetKeys" placeholder="请选择指标" @change="selectZbChange">
  61. <a-select-option v-for="(item, i) in thirdClassifyData" :key="i" :value="item">
  62. {{ item }}
  63. </a-select-option>
  64. </a-select>
  65. </div>
  66. </a-form-model-item>
  67. <!-- 查询搜索 -->
  68. <a-form-model-item>
  69. <a-button type="primary" @click="searchLine">搜索</a-button>
  70. <a-button @click="resetLine">重置</a-button>
  71. </a-form-model-item>
  72. </a-form-model>
  73. <a-spin :spinning="isshowLoading2">
  74. <div id="echartsline" :class="$style.line"></div>
  75. </a-spin>
  76. </div>
  77. </div>
  78. </div>
  79. </template>
  80. <script>
  81. import components from '../riskLibrary/_import-components/audit-view-board-import'
  82. import auditPortraitService from './audit-portrait-service'
  83. import { message } from 'ant-design-vue'
  84. import auditYearTime from './audit-year-time.vue'
  85. import echarts from 'echarts'
  86. import { getUserInfo } from '@/common/store-mixin'
  87. import auditMaintainService from '../dataUphold/data-config'
  88. export default {
  89. name: 'AuditViewBoard',
  90. metaInfo: {
  91. title: '采购管理',
  92. },
  93. components: {
  94. ...components,
  95. auditYearTime,
  96. },
  97. data() {
  98. return {
  99. // 年份
  100. year: [],
  101. // 公司选择
  102. mdgOrgCode: '',
  103. // 单位列表
  104. unitList: [],
  105. // 饼图年份
  106. onYear: '',
  107. // 采购金额
  108. echartsBar: null,
  109. echartsLine: null,
  110. purchase: 0,
  111. purchaseData: [],
  112. isshowLoading1: false,
  113. isshowLoading2: false,
  114. // 趋势分析
  115. trendData: [],
  116. // 指标选择
  117. targetKeys: '',
  118. // 指标选择数据
  119. mockData: [],
  120. // 三级
  121. thirdClassifyData: [],
  122. // 表格数据
  123. tableData: [],
  124. // 表格列
  125. columns: [],
  126. // 搜索数据
  127. searchForm: {
  128. year: [],
  129. orgId: '',
  130. orgName: '',
  131. },
  132. orgList: [],
  133. isJt: false,
  134. userData: {},
  135. }
  136. },
  137. created() {
  138. // 默认年份 ,默认当前年份 及前两年
  139. // this.year = [2022]
  140. this.year = [
  141. new Date().getFullYear() - 3,
  142. new Date().getFullYear() - 2,
  143. new Date().getFullYear() - 1,
  144. ]
  145. this.yearChange('init')
  146. },
  147. mounted() {
  148. // 监听窗口变化
  149. // 初始化组织机构
  150. },
  151. // 页面销毁时取消监听
  152. beforeDestroy() {
  153. window.removeEventListener('resize', () => {
  154. this.echartsBar.resize()
  155. this.echartsLine.resize()
  156. })
  157. },
  158. methods: {
  159. // 初始化公司列表
  160. yearChange(type) {
  161. // 清空所选的组织机构
  162. this.mdgOrgCode = ''
  163. // 年份变化, 默认为第一年
  164. this.onYear = this.year[0] || ''
  165. // 查询所有有值公司
  166. const yearData = { year: this.year }
  167. this.searchForm.year = this.year
  168. auditPortraitService.getOrgList(yearData).then((res) => {
  169. // 过滤等于null的数据
  170. this.unitList = res.data.data.map((item) => {
  171. return {
  172. code: item.org_code,
  173. name: item.org_name,
  174. }
  175. })
  176. // 集团公司
  177. if (type === 'init') {
  178. const userInfo = getUserInfo()
  179. const grop = ['100001', '100000']
  180. // 查询当前公司列表下是否有本公司数据,如果有则本公司 为默认值,如果没有则不选中
  181. auditMaintainService.getCompany(userInfo.account).then((res) => {
  182. // 是否是集团员工
  183. this.userData = res.data
  184. if (grop.includes(res.data.code)) this.isJt = true
  185. const isOrg = this.unitList.find((item) => item.code === res.data.code)
  186. // 如果有匹配的值则为默认值
  187. if (isOrg && !this.isJt) {
  188. this.mdgOrgCode = res.data.code
  189. }
  190. // 如果不是集团 并且没有匹配值
  191. if (!this.isJt && !isOrg) {
  192. // 向unitList插入
  193. this.unitList.unshift({
  194. code: res.data.code,
  195. name: res.data.name,
  196. })
  197. }
  198. // 是集团
  199. if (this.isJt) {
  200. this.mdgOrgCode = '100000'
  201. }
  202. // 如果值不为空
  203. if (this.mdgOrgCode) {
  204. this.searchForm.orgId = this.mdgOrgCode
  205. this.searchForm.orgName = this.unitList.find(
  206. (item) => item.code === this.mdgOrgCode
  207. ).name
  208. }
  209. // 如果没有值则停止查询
  210. this.initUserUnit('init')
  211. })
  212. } else {
  213. const isOrg = this.unitList.find((item) => item.code === this.userData.code)
  214. // 如果有匹配的值则为默认值
  215. if (isOrg && !this.isJt) {
  216. this.mdgOrgCode = this.userData.code
  217. }
  218. // 如果不是集团 并且没有匹配值
  219. if (!this.isJt && !isOrg) {
  220. // 向unitList插入
  221. this.unitList.unshift({
  222. code: this.userData.code,
  223. name: this.userData.name,
  224. })
  225. }
  226. // 是集团
  227. if (this.isJt) {
  228. this.mdgOrgCode = '100000'
  229. }
  230. // 如果值不为空
  231. if (this.mdgOrgCode) {
  232. this.searchForm.orgId = this.mdgOrgCode
  233. this.searchForm.orgName = this.unitList.find(
  234. (item) => item.code === this.mdgOrgCode
  235. ).name
  236. }
  237. }
  238. })
  239. },
  240. // 公司查询
  241. filterOption(input, option) {
  242. return option.componentOptions.children[0].text.indexOf(input) >= 0
  243. },
  244. // 搜索
  245. searchData() {
  246. // 长度必须大于0
  247. if (this.year.length === 0) {
  248. message.error('请选择年份')
  249. return
  250. }
  251. if (!this.mdgOrgCode) {
  252. // message.error('该年份没有采购指标数据')
  253. message.error('请选择组织机构')
  254. return
  255. }
  256. this.searchBar()
  257. this.searchLine()
  258. // 查询指标
  259. },
  260. // 指标汇总
  261. searchBar() {
  262. if (!this.onYear) {
  263. message.error('请选择年份')
  264. return
  265. }
  266. // 组织机构
  267. if (!this.mdgOrgCode) {
  268. message.error('请选择组织机构')
  269. return
  270. }
  271. this.isshowLoading1 = true
  272. // 饼图数据
  273. const params = {
  274. mdg_orgCode: this.mdgOrgCode,
  275. year: [this.onYear],
  276. metricNameCn: this.mockData.map((item) => item.value),
  277. }
  278. auditPortraitService
  279. .getPurchaseData(params)
  280. .then((res) => {
  281. this.purchaseData = res.data.data[0].data || []
  282. // 过滤带率的数据
  283. this.purchaseData = this.purchaseData.filter(
  284. (item) => item.metric_name_cn.indexOf('率') === -1
  285. )
  286. // 如果有值则转成数字 保留两位小数,
  287. this.purchaseData = this.purchaseData.map((item) => {
  288. item.index_value = item.index_value ? (item.index_value * 1).toFixed(2) : 0
  289. return item
  290. })
  291. this.purchase =
  292. this.purchaseData.filter((item) => item.metric_name === 'swcgjewy')[0].index_value || 0
  293. this.initBar()
  294. })
  295. .finally(() => {
  296. // 如果两秒后还没有加载完毕则关闭
  297. setTimeout(() => {
  298. this.isshowLoading1 = false
  299. }, 2000)
  300. })
  301. },
  302. // 重置指标汇总
  303. resetBar() {
  304. // 重置年份
  305. this.onYear = this.year[0] || ''
  306. // 重新查询
  307. this.searchBar()
  308. },
  309. // 趋势分析
  310. searchLine() {
  311. if (this.targetKeys === '') {
  312. message.error('请选择指标')
  313. return
  314. }
  315. // 组织机构
  316. if (!this.mdgOrgCode) {
  317. message.error('请选择组织机构')
  318. return
  319. }
  320. this.isshowLoading2 = true
  321. // 根据指标获取值
  322. const cnData = this.mockData.filter((item) => item.thirdClassify === this.targetKeys)
  323. const params = {
  324. mdg_orgCode: this.mdgOrgCode,
  325. year: this.year,
  326. metricNameCn: cnData.map((item) => item.value),
  327. }
  328. auditPortraitService
  329. .getPurchaseData(params)
  330. .then((res) => {
  331. this.trendData = res.data.data || []
  332. // 整理成name 折线
  333. // 调用echarts
  334. this.initLine()
  335. })
  336. .finally(() => {
  337. // 如果两秒后还没有加载完毕则关闭
  338. setTimeout(() => {
  339. this.isshowLoading2 = false
  340. }, 2000)
  341. })
  342. },
  343. // 重置趋势分析
  344. resetLine() {
  345. // 重置指标 默认第一个指标
  346. this.targetKeys = this.mockData.find(
  347. (item) => item.thirdClassify === '上网采购'
  348. ).thirdClassify
  349. // 重新查询
  350. this.searchLine()
  351. },
  352. // 初始化指标
  353. initUserUnit(type) {
  354. const params = {
  355. columns:
  356. 'sortNumber,firstClassify,secondClassify,indexName,indexNameEn,indexMeasure,price,systemSource,remark,thirdClassify',
  357. maxResults: 1000,
  358. startPosition: 0,
  359. expressions: [
  360. {
  361. dataType: 'str',
  362. name: 'firstClassify',
  363. op: 'eq',
  364. stringValue: '采购管理',
  365. },
  366. ],
  367. buttonExpressions: [],
  368. formId: 'iamFinancialIndex',
  369. }
  370. auditPortraitService.getBusinessList(params).then((res) => {
  371. const data = res.data.data
  372. // 所有二级分类
  373. this.thirdClassifyData = Array.from(new Set(data.map((item) => item.thirdClassify)))
  374. // 获取所有指标
  375. this.mockData = data.map((item) => ({
  376. value: item.indexNameEn,
  377. label: item.indexName,
  378. // 三级名称
  379. thirdClassify: item.thirdClassify,
  380. }))
  381. // 默认选中网上
  382. this.targetKeys = this.mockData.find(
  383. (item) => item.thirdClassify === '上网采购'
  384. ).thirdClassify
  385. if (type === 'init') {
  386. if (!this.mdgOrgCode) {
  387. message.error('该年份没有采购指标数据')
  388. return
  389. }
  390. this.searchLine()
  391. this.searchBar()
  392. }
  393. })
  394. },
  395. // 选择指标
  396. selectZbChange(value) {
  397. //
  398. },
  399. // 初始化饼图
  400. initBar() {
  401. const bar = document.getElementById('echartsbar')
  402. this.echartsBar = echarts.init(bar)
  403. this.echartsBar.clear()
  404. const color = ['#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4']
  405. // 招标部分,公开采购 + 邀请招标采购
  406. // 非招部分=竞争性谈判采购+单一来源采购+询价采购+其他采购
  407. const zb = [
  408. {
  409. name: '公开招标',
  410. nameEn: 'gkzb_sjhtje',
  411. },
  412. ]
  413. const fzb = [
  414. {
  415. name: '邀请招标',
  416. nameEn: 'yqzbjewy',
  417. },
  418. {
  419. name: '竞争性谈判',
  420. nameEn: 'jzxtpjewy',
  421. },
  422. {
  423. name: '单一来源采购',
  424. nameEn: 'dylyjewy',
  425. },
  426. {
  427. name: '询价采购',
  428. nameEn: 'xjjewy',
  429. },
  430. {
  431. name: '其他采购',
  432. nameEn: 'qtcgjewy',
  433. },
  434. ]
  435. const allZb = [...zb, ...fzb]
  436. // 按照allZb的顺序排序
  437. // 整理成 value name
  438. const outer = []
  439. allZb.map((item) => {
  440. this.purchaseData.map((data) => {
  441. if (data.metric_name === item.nameEn) {
  442. outer.push({
  443. value: data.index_value,
  444. name: item.name,
  445. })
  446. }
  447. })
  448. })
  449. const inside = [
  450. {
  451. value: outer[0].value,
  452. name: '招标',
  453. },
  454. {
  455. // 除第一个外的所有值相加
  456. value: outer.slice(1).reduce((prev, cur) => {
  457. return prev + cur.value
  458. }, 0),
  459. name: '非招',
  460. },
  461. ]
  462. const option = {
  463. tooltip: {
  464. trigger: 'item',
  465. formatter: '{a} <br/>{b}: {c} ({d}%)',
  466. },
  467. legend: {
  468. data: ['非招', '招标', ...zb.map((val) => val.name), ...fzb.map((val) => val.name)],
  469. },
  470. series: [
  471. {
  472. name: '指标名称(万元)',
  473. type: 'pie',
  474. selectedMode: 'single',
  475. radius: [0, '25%'],
  476. label: {
  477. position: 'inner',
  478. fontSize: 14,
  479. },
  480. labelLine: {
  481. show: false,
  482. },
  483. // 饼图中心
  484. data: inside,
  485. itemStyle: {
  486. color: function(colos) {
  487. return colos.dataIndex === 1 ? '#91cc75' : '#5470c6'
  488. },
  489. },
  490. },
  491. {
  492. name: '指标名称(万元)',
  493. type: 'pie',
  494. radius: ['35%', '45%'],
  495. labelLine: {
  496. length: 30,
  497. },
  498. label: {
  499. formatter: '{a|{a}}{abg|}\n{hr|}\n {b|{b}:}{c} {per|{d}%} ',
  500. backgroundColor: '#F6F8FC',
  501. borderColor: '#8C8D8E',
  502. borderWidth: 1,
  503. borderRadius: 4,
  504. rich: {
  505. a: {
  506. color: '#6E7079',
  507. lineHeight: 22,
  508. align: 'center',
  509. },
  510. hr: {
  511. borderColor: '#8C8D8E',
  512. width: '100%',
  513. borderWidth: 1,
  514. height: 0,
  515. },
  516. b: {
  517. color: '#4C5058',
  518. fontSize: 14,
  519. fontWeight: 'bold',
  520. lineHeight: 33,
  521. },
  522. per: {
  523. color: '#fff',
  524. backgroundColor: '#4C5058',
  525. padding: [3, 4],
  526. borderRadius: 4,
  527. },
  528. },
  529. },
  530. data: outer,
  531. itemStyle: {
  532. color: function(colos) {
  533. return color[colos.dataIndex]
  534. },
  535. },
  536. },
  537. ],
  538. }
  539. this.echartsBar.setOption(option)
  540. this.isshowLoading1 = false
  541. // 添加尺寸变化监听
  542. window.addEventListener('resize', () => {
  543. this.echartsBar.resize()
  544. })
  545. },
  546. // 初始化折线图
  547. initLine() {
  548. const line = document.getElementById('echartsline')
  549. this.echartsLine = echarts.init(line)
  550. this.echartsLine.clear()
  551. // 如果data为空则不渲染
  552. let data = []
  553. if (this.trendData.length !== 0) {
  554. data = this.trendData[0].data.map((val) => {
  555. return {
  556. name: val.metric_name_cn,
  557. data: [],
  558. }
  559. })
  560. this.trendData.map((item) => {
  561. item.data.map((val, i) => {
  562. data[i].data.push((val.index_value * 1).toFixed(2) || 0)
  563. })
  564. })
  565. }
  566. // 排序
  567. // name不含率的靠前
  568. data.sort((a, b) => {
  569. return a.name.indexOf('率') - b.name.indexOf('率')
  570. })
  571. // {
  572. // name: data[0].name,
  573. // type: 'bar',
  574. // data: data[0].data,
  575. // barWidth: 30,
  576. // itemStyle: {
  577. // color: '#02a7f0',
  578. // },
  579. // },
  580. // {
  581. // name: data[1].name,
  582. // type: 'line',
  583. // yAxisIndex: 1,
  584. // data: data[1].data,
  585. // itemStyle: {
  586. // color: '#89bf80',
  587. // },
  588. // },
  589. const series = data.map((item, i) => {
  590. const setData = i === 0 ? item.data : item.data.map((val) => val * 100)
  591. return {
  592. name: item.name,
  593. type: i === 0 ? 'bar' : 'line',
  594. data: setData,
  595. yAxisIndex: i === 0 ? 0 : 1,
  596. barWidth: 30,
  597. itemStyle: {
  598. color: i === 0 ? '#02a7f0' : '#89bf80',
  599. },
  600. }
  601. })
  602. const year = this.trendData.map((item) => item.year)
  603. const option = {
  604. tooltip: {
  605. trigger: 'axis',
  606. axisPointer: {
  607. type: 'cross',
  608. crossStyle: {
  609. color: '#999',
  610. },
  611. },
  612. formatter: function(params) {
  613. let res = params[0].name
  614. res += '<br/>' + params[0].seriesName + ' : ' + params[0].value + '(万元)'
  615. if (params[1]) {
  616. res += '<br/>' + params[1].seriesName + ' : ' + params[1].value + '%'
  617. }
  618. return res
  619. },
  620. },
  621. legend: {
  622. data: data.map((item) => item.name),
  623. },
  624. grid: {
  625. left: '8%',
  626. containLabel: true,
  627. },
  628. dataZoom: {
  629. // 横向滚动,最多十年
  630. type: 'slider',
  631. show: true,
  632. },
  633. xAxis: [
  634. {
  635. type: 'category',
  636. data: year,
  637. axisPointer: {
  638. type: 'shadow',
  639. },
  640. },
  641. ],
  642. // {
  643. // type: 'value',
  644. // name: data[0].name,
  645. // interval: 100,
  646. // axisLabel: {
  647. // formatter: '{value} (万元)',
  648. // },
  649. // },
  650. // {
  651. // type: 'value',
  652. // name: data[1].name,
  653. // min: 0,
  654. // max: 100,
  655. // interval: 10,
  656. // axisLabel: {
  657. // formatter: '{value} %',
  658. // },
  659. // },
  660. yAxis: data.map((item, i) => {
  661. const obj = {
  662. type: 'value',
  663. name: item.name,
  664. // 单位
  665. axisLabel: {
  666. formatter: i === 0 ? '{value} (万元)' : '{value} %',
  667. },
  668. }
  669. // if (i === 1) {
  670. // obj.interval = 10
  671. // }
  672. return obj
  673. }),
  674. series: series,
  675. }
  676. this.echartsLine.setOption(option)
  677. this.isshowLoading2 = false
  678. // 添加尺寸变化监听
  679. window.addEventListener('resize', () => {
  680. this.echartsLine.resize()
  681. })
  682. },
  683. },
  684. }
  685. </script>
  686. <style module lang="scss">
  687. @use '@/common/design' as *;
  688. .bar {
  689. width: 100%;
  690. height: 550px;
  691. }
  692. .line {
  693. width: 100%;
  694. height: 600px;
  695. }
  696. .title {
  697. padding: 20px;
  698. background: #fff;
  699. }
  700. ::v-deep .ant-card-body {
  701. height: 100%;
  702. }
  703. .purchase-data {
  704. width: 80%;
  705. height: 40px;
  706. margin: 10px auto;
  707. font-size: 18px;
  708. line-height: 40px;
  709. color: #fff;
  710. text-align: center;
  711. background: #02a7f0;
  712. border-radius: 10px;
  713. }
  714. .content-view {
  715. display: flex;
  716. justify-content: space-between;
  717. .view-body {
  718. position: relative;
  719. flex: 1;
  720. width: 48%;
  721. height: 800px;
  722. border: 1px solid #0086d6;
  723. border-radius: 10px;
  724. &:last-child {
  725. margin-left: 20px;
  726. }
  727. // title居中浮动
  728. .content-title {
  729. position: absolute;
  730. top: -20px;
  731. left: calc(50% - 75px);
  732. width: 150px;
  733. height: 40px;
  734. font-size: 18px;
  735. font-weight: 600;
  736. line-height: 40px;
  737. color: #fff;
  738. text-align: center;
  739. background: #02a7f0;
  740. border-radius: 5px;
  741. }
  742. &:last-child .content-title {
  743. background-color: #00bfbf;
  744. }
  745. .searchform {
  746. padding: 25px 0 10px 15px;
  747. }
  748. }
  749. }
  750. .spicclasswrapper {
  751. height: 100%;
  752. ::v-deep .ant-spin-container {
  753. height: 100%;
  754. }
  755. }
  756. .spicclass {
  757. height: 100%;
  758. }
  759. </style>