audit-supervise-view.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. <template>
  2. <a-spin :spinning="isshowLoading" tip="正在导出请稍等……" size="large">
  3. <div :class="$style.title">
  4. <a-form-model layout="inline">
  5. <a-form-model-item>
  6. <div style="width: 500px">
  7. <a-row>
  8. <a-col :span="6" style="padding-top: 2px">
  9. <a-select v-model="searchForm.unitType">
  10. <a-select-option key="0" value="0">审计单位</a-select-option>
  11. <a-select-option key="1" value="1">被审计单位</a-select-option>
  12. </a-select>
  13. </a-col>
  14. <a-col :span="18">
  15. <audit-two-unit
  16. ref="cRelSelect"
  17. v-model="companyUnit"
  18. :single="true"
  19. :root-node="userNodeTree"
  20. @change="changecompany"
  21. />
  22. </a-col>
  23. </a-row>
  24. </div>
  25. </a-form-model-item>
  26. <a-form-model-item label="年份">
  27. <div style="width:240px">
  28. <AuditYearTime v-model="searchForm.year" select-type="mode" />
  29. </div>
  30. </a-form-model-item>
  31. <a-form-model-item>
  32. <a-button type="primary" @click="searchData">查询</a-button>
  33. </a-form-model-item>
  34. </a-form-model>
  35. <a-divider></a-divider>
  36. <a-spin :spinning="scatterLoading && barLoading" tip="正在加载请稍等……" size="large">
  37. <div :class="$style.contentView">
  38. <div :class="[$style.viewBody, $style.viewBodySmall]">
  39. <div :class="$style.contentTitle">审计开展次数</div>
  40. <div :class="$style.numberofissues">
  41. <!-- 头部信息 -->
  42. <div :class="$style.auditsum">
  43. <span>
  44. 审计开展总次数:
  45. </span>
  46. <span>
  47. {{ totalAudit }}
  48. </span>
  49. </div>
  50. <!-- 总推送数量,问题数,非问题数 已整改数 未整改数 -->
  51. <div :class="$style.auditlist">
  52. <div v-for="(item, i) in sumList" :key="i" :class="$style.audititem">
  53. <span>{{ item.name }}:</span>
  54. <span>{{ item.value }}</span>
  55. </div>
  56. </div>
  57. </div>
  58. <!-- -->
  59. </div>
  60. <div :class="[$style.viewBody]">
  61. <div :class="$style.contentTitle">审计发现问题</div>
  62. <div :class="$style.searchselect">
  63. <audit-project-select
  64. v-model="searchForm.projdectList1"
  65. :options="projectOption"
  66. :field="{ key: 'id', name: 'name' }"
  67. @change="changeProjdectList1"
  68. />
  69. </div>
  70. <div v-if="isshowbar" id="bar" :class="$style.bar"></div>
  71. <a-empty
  72. v-else
  73. style="height: 400px;
  74. line-height: 400px;"
  75. />
  76. <div :class="$style.download" @click="downLoadTableBar">
  77. <a-icon type="vertical-align-bottom" :style="{ fontSize: '20px' }" />
  78. </div>
  79. </div>
  80. </div>
  81. <div :class="[$style.contentView, $style.contentmargin]">
  82. <div :class="[$style.viewBody, $style.viewBodySmall, $style.tablecontent]">
  83. <div :class="$style.contentTitle">整改情况</div>
  84. <h3>审计问题数量top20:</h3>
  85. <div :class="$style.searchselect2">
  86. <audit-project-select
  87. v-model="searchForm.projdectList2"
  88. :options="projectOption"
  89. :field="{ key: 'id', name: 'name' }"
  90. @change="changeProjdectList2"
  91. />
  92. </div>
  93. <sd-table
  94. :data-source="tableData1"
  95. :columns="column1"
  96. :scroll="{ y: tablHeight }"
  97. :loading="loadingTable1"
  98. :row-key="(row, i) => i"
  99. :pagination="false"
  100. ></sd-table>
  101. </div>
  102. <div ref="tableHeight" :class="[$style.viewBody]">
  103. <div :class="$style.contentTitle">风险分布</div>
  104. <div :class="$style.searchselect">
  105. <audit-project-select
  106. v-model="searchForm.projdectList3"
  107. :options="projectOption"
  108. :field="{ key: 'id', name: 'name' }"
  109. @change="changeProjdectList3"
  110. />
  111. </div>
  112. <div v-if="isshowscatter" id="scatter" :class="$style.scatter"></div>
  113. <a-empty
  114. v-else
  115. style="height: 400px;
  116. line-height: 400px;"
  117. />
  118. </div>
  119. <div :class="$style.download" @click="downLoadTableScatter">
  120. <a-icon type="vertical-align-bottom" :style="{ fontSize: '20px' }" />
  121. </div>
  122. </div>
  123. </a-spin>
  124. </div>
  125. </a-spin>
  126. </template>
  127. <script>
  128. import components from './_import-components/audit-supervise-view-import'
  129. import auditTwoUnit from './audit-two-unit.vue'
  130. import auditProjectSelect from './audit-project-select.vue'
  131. import AuditRiskbraryService from './riskLibrary'
  132. import DataService from '../dataUphold/data-config'
  133. import { getUserInfo } from '@/common/store-mixin'
  134. import echarts from 'echarts'
  135. import AuditYearTime from '../portrait/audit-year-time.vue'
  136. import download from '@/common/services/download'
  137. import { message, Modal } from 'ant-design-vue'
  138. export default {
  139. name: 'AuditSuperviseView',
  140. metaInfo: {
  141. title: '审计监督画像',
  142. },
  143. components: {
  144. ...components,
  145. auditTwoUnit,
  146. AuditYearTime,
  147. auditProjectSelect,
  148. },
  149. data() {
  150. return {
  151. searchForm: {
  152. projdectList1: [],
  153. projdectList2: [],
  154. projdectList3: [],
  155. // 单位
  156. unitName: '',
  157. unitCode: '',
  158. unitType: '0',
  159. year: [],
  160. },
  161. userNodeTree: [],
  162. projectOption: [],
  163. // 公司
  164. companyUnit: [],
  165. auditsum: 0,
  166. totalAudit: 0,
  167. sumList: [],
  168. barLoading: false,
  169. isshowbar: false,
  170. isshowscatter: false,
  171. scatterLoading: false,
  172. isshowLoading: false,
  173. // 下钻领域
  174. drillDomain: '',
  175. // 下钻数据
  176. // 领域
  177. domainData: [],
  178. // 阶段
  179. purchaseData: [],
  180. barData: [],
  181. statusData: [],
  182. // 散点图数据
  183. scatterList: [],
  184. echartsBar: null,
  185. echartsScatter: null,
  186. tableData1: [],
  187. tableData2: [],
  188. loadingTable1: false,
  189. loadingTable2: false,
  190. column1: [
  191. {
  192. title: '序号',
  193. dataIndex: 'id',
  194. width: '80px',
  195. },
  196. {
  197. title: '单位名称',
  198. dataIndex: 'unitName',
  199. width: '140px',
  200. // 溢出隐藏
  201. ellipsis: true,
  202. },
  203. {
  204. title: '审计问题数量',
  205. dataIndex: 'count',
  206. // 超出隐藏
  207. },
  208. {
  209. title: '整改完成率',
  210. dataIndex: 'reformRate',
  211. },
  212. ],
  213. tablHeight: 0,
  214. isJt: false,
  215. }
  216. },
  217. created() {},
  218. mounted() {
  219. this.tablHeight = this.$refs.tableHeight.clientHeight - 170
  220. this.searchForm.year = [2020, 2021, 2022]
  221. this.initUserCompany()
  222. },
  223. methods: {
  224. // 初始化个人公司
  225. initUserCompany() {
  226. const userInfo = getUserInfo()
  227. DataService.getCompany(userInfo.account).then((res) => {
  228. // 100000和100001
  229. const roleCompany = ['100000', '100001']
  230. this.userNodeTree.push({
  231. code: res.data.id,
  232. name: res.data.name,
  233. orgCode: res.data.code,
  234. type: 'Group',
  235. })
  236. this.companyUnit = [
  237. {
  238. code: res.data.id,
  239. name: res.data.name,
  240. orgCode: res.data.code,
  241. },
  242. ]
  243. if (roleCompany.includes(res.data.code)) {
  244. this.isJt = true
  245. this.userNodeTree = [
  246. {
  247. code: '28951',
  248. name: '国家电力投资集团有限公司',
  249. orgCode: '100000',
  250. },
  251. ]
  252. this.companyUnit = [
  253. {
  254. code: '28951',
  255. name: '国家电力投资集团有限公司',
  256. orgCode: '100000',
  257. },
  258. ]
  259. }
  260. this.searchForm.unitName = this.companyUnit[0].name
  261. this.searchForm.unitCode = this.companyUnit[0].orgCode
  262. // 调用接口
  263. this.initProjectData()
  264. })
  265. },
  266. // 获取项目信息
  267. initProjectData() {
  268. const data = {
  269. columns: 'keyId,id,index,name',
  270. maxResults: 9999,
  271. startPosition: 0,
  272. orderBy: 'keyId asc,index asc',
  273. expressions: [
  274. { dataType: 'long', name: 'belongOrgId', op: 'eq', longValue: '-1' },
  275. { dataType: 'str', name: 'keyId', op: 'eq', stringValue: 'CPRODUCT_IAM_AUDIT_TYPE' },
  276. ],
  277. buttonExpressions: [],
  278. }
  279. AuditRiskbraryService.getProject(data).then((res) => {
  280. res.data.data.forEach((item) => {
  281. item.id = item.id.replace('C', '')
  282. })
  283. this.projectOption = res.data.data
  284. this.sumList = this.projectOption.map((item) => {
  285. return {
  286. name: item.name,
  287. key: item.id,
  288. value: 0,
  289. }
  290. })
  291. // 默认选择第一个领域
  292. this.searchForm.projdectList1 = this.projectOption.map((val) => val.id)
  293. this.searchForm.projdectList2 = this.projectOption.map((val) => val.id)
  294. this.searchForm.projdectList3 = this.projectOption.map((val) => val.id)
  295. // 调用查询问题推送数量接口
  296. this.getSumData()
  297. // 审计发现问题
  298. this.initBarData()
  299. this.initScatterData()
  300. this.initTable()
  301. })
  302. },
  303. // 查询问题推送数量
  304. getSumData() {
  305. this.scatterLoading = true
  306. AuditRiskbraryService.countStatistics(this.searchParams('list'))
  307. .then((res) => {
  308. const data = res.data
  309. this.totalAudit = data.total || 0
  310. // 如果data的key和sumList的key相同,就赋值
  311. this.sumList.forEach((item) => {
  312. data.auditTypeBeanList.forEach((val) => {
  313. if (item.key === val.auditType) {
  314. item.value = val.count
  315. }
  316. })
  317. })
  318. })
  319. .finally(() => {
  320. this.scatterLoading = false
  321. })
  322. },
  323. changecompany(data) {
  324. this.searchForm.unitName = data[0]?.name || ''
  325. this.searchForm.unitCode = data[0]?.orgCode || ''
  326. },
  327. // 获取数据
  328. searchParams(type) {
  329. // 如果包含领域,如果包含下钻
  330. const params = {}
  331. // 年份
  332. params.unitType = this.searchForm.unitType
  333. params.unitCode = this.searchForm.unitCode
  334. if (type === 'bar') {
  335. // 遍历去除C
  336. params.auditTypes = this.searchForm.projdectList1.map((item) => item)
  337. // 项目列表
  338. }
  339. if (type === 'scatter') {
  340. // 散点图
  341. params.auditTypes = this.searchForm.projdectList3.map((item) => item)
  342. }
  343. if (type === 'table') {
  344. // 表格
  345. params.auditTypes = this.searchForm.projdectList2.map((item) => item)
  346. }
  347. // 开始年份结束年份
  348. // 对年份进行排序
  349. const yearList = this.searchForm.year.sort((a, b) => a - b)
  350. params.yearSt = yearList[0] + ''
  351. params.yearEd = yearList[this.searchForm.year.length - 1] + ''
  352. return params
  353. },
  354. searchData() {
  355. // 最少选择一个年份
  356. // 请选择开始年份和结束年份
  357. if (this.searchForm.year.length === 0) {
  358. message.warn('请选择开始年份和结束年份')
  359. }
  360. this.getSumData()
  361. this.initBarData()
  362. this.initTable()
  363. this.initScatterData()
  364. },
  365. // 获取饼图数据
  366. // 初始化 ,领域分布 ,阶段分布
  367. initBarData() {
  368. // 外层
  369. this.barLoading = true
  370. AuditRiskbraryService.questionStatistics(this.searchParams('bar')).then((res) => {
  371. this.isshowbar = res.data.length !== 0
  372. this.barLoading = false
  373. this.barData = res.data
  374. // 根据年份进行排序
  375. this.barData.sort((a, b) => a.planYear * 1 - b.planYear * 1)
  376. // 遍历数据,给所有项目插入name
  377. this.barData.forEach((item) => {
  378. this.projectOption.map((val1) => {
  379. if (item.auditType === val1.id) {
  380. item.name = val1.name
  381. }
  382. })
  383. })
  384. this.$nextTick(() => {
  385. this.initBar()
  386. })
  387. })
  388. },
  389. // 初始化柱图
  390. initBar() {
  391. const bar = document.getElementById('bar')
  392. this.echartsBar = echarts.init(bar)
  393. // 所有的项目key
  394. const allKey = this.barData.map((item) => item.auditType)
  395. const proKeylist = Array.from(new Set(allKey))
  396. // 判断有哪些年份
  397. let years = this.barData.map((item) => item.planYear)
  398. // 去重年份
  399. years = Array.from(new Set(years)).sort((a, b) => a - b)
  400. // 按照项目顺序获取所有的name
  401. const names = []
  402. proKeylist.map((val) => {
  403. this.projectOption.map((item) => {
  404. if (val === item.id) {
  405. names.push(item.name)
  406. }
  407. })
  408. })
  409. // 按照年份,项目顺序,生成数据
  410. // [
  411. // {
  412. // year: 2020,
  413. // data: [
  414. // { name: '项目1', count: 10 },
  415. // { name: '项目2', count: 20 },
  416. // { name: '项目3', count: 30 },
  417. // ],
  418. // }
  419. // ]
  420. const data = years.map((year) => {
  421. const obj = {
  422. year,
  423. data: proKeylist.map((val) => {
  424. // 如有年份和类型一样的则插入对象
  425. let dataList = 0
  426. const findData = this.barData.find(
  427. (item) => item.auditType === val && year === item.planYear
  428. )
  429. if (findData) {
  430. dataList = findData.count
  431. }
  432. return dataList
  433. }),
  434. }
  435. return obj
  436. })
  437. // 生成数据
  438. // 根据年生成
  439. const series = data.map((item, index) => {
  440. return {
  441. name: item.year,
  442. type: 'bar',
  443. barWidth: 25,
  444. label: { show: true, position: 'top' },
  445. data: item.data,
  446. }
  447. })
  448. this.echartsBar.clear()
  449. const color = ['#5b9bd5', '#ed7d31', '#a5a5a5']
  450. const option = {
  451. color,
  452. legend: {
  453. data: years,
  454. },
  455. tooltip: {
  456. trigger: 'axis',
  457. axisPointer: {
  458. type: 'shadow',
  459. },
  460. },
  461. grid: {
  462. bottom: '10%',
  463. containLabel: true,
  464. },
  465. xAxis: {
  466. type: 'category',
  467. data: names,
  468. // 旋转角度
  469. axisLabel: {
  470. rotate: 45,
  471. },
  472. },
  473. dataZoom: [
  474. {
  475. type: 'slider',
  476. show: true,
  477. xAxisIndex: [0],
  478. start: 0,
  479. end: 60,
  480. },
  481. ],
  482. yAxis: [
  483. {
  484. type: 'value',
  485. },
  486. ],
  487. series: series,
  488. }
  489. this.echartsBar.setOption(option)
  490. // 监听外圈点击事件
  491. window.addEventListener('resize', () => {
  492. this.echartsBar.resize()
  493. })
  494. },
  495. // 初始化风险分布
  496. initScatterData() {
  497. this.scatterLoading = true
  498. AuditRiskbraryService.getRiskStatistics(this.searchParams('scatter'))
  499. .then((res) => {
  500. this.scatterList = res.data
  501. // 根据id添加名字
  502. this.scatterList.forEach((item) => {
  503. this.projectOption.map((val) => {
  504. if (item.auditType === val.id) {
  505. item.name = val.name || ''
  506. }
  507. })
  508. })
  509. //
  510. this.isshowscatter = this.scatterList.length !== 0
  511. this.$nextTick(() => {
  512. this.initScatter()
  513. })
  514. })
  515. .finally(() => {
  516. this.scatterLoading = false
  517. })
  518. },
  519. // 初始化散点图
  520. initScatter() {
  521. const scatter = document.getElementById('scatter')
  522. this.echartsScatter = echarts.init(scatter)
  523. this.echartsScatter.clear()
  524. const scatterData = this.scatterList.map((item) => {
  525. return [item.amount, item.count, item.name]
  526. })
  527. const legendData = scatterData.map((item) => item[2])
  528. const option = {
  529. xAxis: {
  530. // 问题金额
  531. name: '问题金额',
  532. },
  533. yAxis: {
  534. // 问题数量
  535. name: '问题数量',
  536. },
  537. legend: {
  538. type: 'scroll',
  539. orient: 'vertical', // 图例列表的布局朝向(垂直排列)
  540. right: 0,
  541. height: '80%',
  542. y: 'center',
  543. data: legendData,
  544. bottom: 10,
  545. itemGap: 15, // 图例的上下间距
  546. itemWidth: 10, // 图例左侧图块的长度
  547. padding: 5,
  548. textStyle: {
  549. fontSize: 16,
  550. fontWeight: 400,
  551. color: '#33333',
  552. },
  553. pageTextStyle: {
  554. // 设置分页的当前页与总页码的文本样式
  555. color: 'rgba(36, 196, 221, 0.95)',
  556. },
  557. pageIconColor: '#6495ed', // 翻页下一页的三角按钮颜色
  558. pageIconInactiveColor: '#aaa', // 翻页(即翻页到头时)
  559. pageIconSize: 20, // 翻页按钮大小
  560. pageButtonGap: 22, // 翻页按钮与图例的间距
  561. formatter: function(name) {
  562. // 截取字符串八个
  563. return name.length > 8 ? name.substring(0, 8) + '...' : name
  564. },
  565. },
  566. grid: {
  567. left: '10%',
  568. right: 200,
  569. },
  570. // 显示to
  571. tooltip: {
  572. formatter: function(data) {
  573. return `${data.seriesName}<br/>问题金额:${data.data[0]}<br/>问题数量:${data.data[1]}`
  574. },
  575. },
  576. color: ['#fac858', '#5470c6', '#91cc75', '#fac858', '#ee6666'],
  577. series: scatterData.map((item) => {
  578. return {
  579. name: item[2],
  580. data: [item],
  581. type: 'scatter',
  582. symbolSize: 30,
  583. label: {
  584. emphasis: {
  585. show: true,
  586. formatter: function(param) {
  587. return param.seriesName
  588. },
  589. position: 'top',
  590. },
  591. },
  592. }
  593. }),
  594. }
  595. this.echartsScatter.setOption(option)
  596. // 监听页面尺寸变化
  597. window.addEventListener('resize', () => {
  598. this.echartsScatter.resize()
  599. })
  600. },
  601. // 初始化表格
  602. initTable() {
  603. this.loadingTable1 = true
  604. this.loadingTable2 = true
  605. AuditRiskbraryService.getReformStatistics(this.searchParams('table'))
  606. .then((res) => {
  607. this.tableData1 = res.data.map((item, index) => {
  608. const reformRate = item.reformRate
  609. const reformRateNum = Number(reformRate.replace('%', ''))
  610. item.reformRate = reformRateNum.toFixed(2) + '%'
  611. return {
  612. ...item,
  613. id: index + 1,
  614. }
  615. })
  616. })
  617. .finally(() => {
  618. this.loadingTable1 = false
  619. })
  620. },
  621. changeProjdectList1() {
  622. this.initBarData()
  623. },
  624. changeProjdectList2() {
  625. this.initTable()
  626. },
  627. changeProjdectList3() {
  628. this.initScatterData()
  629. },
  630. // downLoad
  631. downLoadTableBar() {
  632. this.isshowLoading = true
  633. AuditRiskbraryService.exportquestionExport(this.searchParams('bar'))
  634. .then((res) => {
  635. if (res.status === 200) {
  636. const url = URL.createObjectURL(res.data)
  637. const filename = res.headers['content-disposition']
  638. const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
  639. download(url, decodeURI(fname))
  640. // 导出成功
  641. message.success('导出成功')
  642. } else {
  643. Modal.warning({
  644. title: '提示',
  645. content: '导出报错,请联系管理员!',
  646. })
  647. return false
  648. }
  649. })
  650. .finally(() => {
  651. this.isshowLoading = false
  652. })
  653. },
  654. downLoadTableScatter() {
  655. this.isshowLoading = true
  656. AuditRiskbraryService.exportriskExport(this.searchParams('scatter'))
  657. .then((res) => {
  658. if (res.status === 200) {
  659. const url = URL.createObjectURL(res.data)
  660. const filename = res.headers['content-disposition']
  661. const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
  662. download(url, decodeURI(fname))
  663. // 导出成功
  664. message.success('导出成功')
  665. } else {
  666. Modal.warning({
  667. title: '提示',
  668. content: '导出报错,请联系管理员!',
  669. })
  670. return false
  671. }
  672. })
  673. .finally(() => {
  674. this.isshowLoading = false
  675. })
  676. },
  677. },
  678. }
  679. </script>
  680. <style module lang="scss">
  681. @use '@/common/design' as *;
  682. .title {
  683. min-height: 100%;
  684. padding: 20px;
  685. background: #fff;
  686. }
  687. ::v-deep .ant-card-body {
  688. height: 100%;
  689. }
  690. .content-view {
  691. display: flex;
  692. justify-content: space-between;
  693. height: calc(100% - 70px);
  694. }
  695. .view-body {
  696. position: relative;
  697. // flex: 1;
  698. width: 68%;
  699. height: 500px;
  700. border: 1px solid #0086d6;
  701. border-radius: 10px;
  702. // title居中浮动
  703. .content-title {
  704. position: absolute;
  705. top: -20px;
  706. left: calc(50% - 75px);
  707. width: 150px;
  708. height: 40px;
  709. font-size: 18px;
  710. font-weight: 600;
  711. line-height: 40px;
  712. color: #fff;
  713. text-align: center;
  714. background: #02a7f0;
  715. border-radius: 5px;
  716. }
  717. .searchform {
  718. padding: 25px 0 10px 15px;
  719. }
  720. }
  721. .view-body-big {
  722. width: 100%;
  723. margin-top: 50px;
  724. .content-title {
  725. left: calc(50% - 140px);
  726. width: 280px;
  727. }
  728. }
  729. .view-body-small {
  730. width: 30%;
  731. margin-right: 2%;
  732. }
  733. .numberofissues {
  734. display: flex;
  735. flex-direction: column;
  736. align-items: center;
  737. justify-content: space-between;
  738. width: 90%;
  739. height: calc(100% - 50px);
  740. padding-top: 20px;
  741. margin: 10px auto;
  742. .auditsum {
  743. position: relative;
  744. width: 100%;
  745. height: 80px;
  746. font-weight: 600;
  747. color: #fff;
  748. text-align: center;
  749. background-color: #1c375e;
  750. border-radius: 10px;
  751. // 第一个span左上,第二个span中间
  752. span:nth-child(1) {
  753. position: absolute;
  754. top: 0;
  755. left: 5px;
  756. font-size: 20px;
  757. color: #fff;
  758. }
  759. span:nth-child(2) {
  760. position: absolute;
  761. top: 50%;
  762. left: 50%;
  763. font-size: 20px;
  764. transform: translate(-50%, -50%);
  765. }
  766. }
  767. // 分成两列 单数f2f2f2 双数045679
  768. .auditlist {
  769. display: flex;
  770. flex-wrap: wrap;
  771. justify-content: flex-start;
  772. width: 100%;
  773. height: calc(100% - 80px);
  774. margin-top: 20px;
  775. overflow-y: scroll;
  776. .audititem {
  777. position: relative;
  778. width: 48%;
  779. height: 20%;
  780. min-height: 40px;
  781. margin: 0 1% 10px 1%;
  782. border-radius: 10px;
  783. span:nth-child(1) {
  784. position: absolute;
  785. top: 5px;
  786. left: 10px;
  787. font-size: 16px;
  788. }
  789. span:nth-child(2) {
  790. position: absolute;
  791. top: 60%;
  792. left: 50%;
  793. font-size: 16px;
  794. transform: translate(-50%, -50%);
  795. }
  796. &:nth-child(4n + 1),
  797. &:nth-child(4n + 4) {
  798. color: #333;
  799. background-color: #f2f2f2;
  800. }
  801. &:nth-child(4n + 2),
  802. &:nth-child(4n + 3) {
  803. color: #fff;
  804. background-color: #045679;
  805. }
  806. }
  807. }
  808. }
  809. .bar,
  810. .scatter {
  811. width: 100%;
  812. height: calc(100% - 60px);
  813. margin-top: 40px;
  814. }
  815. // 右上角
  816. .download {
  817. position: absolute;
  818. top: 15px;
  819. right: 10px;
  820. z-index: 1;
  821. cursor: pointer;
  822. }
  823. .contentmargin {
  824. position: relative;
  825. margin-top: 50px;
  826. }
  827. .tablecontent {
  828. padding: 10px;
  829. padding-top: 20px;
  830. }
  831. // 筛选框宽度240px
  832. .searchselect {
  833. position: absolute;
  834. // 右上角
  835. top: 10px;
  836. right: 40px;
  837. width: 240px;
  838. }
  839. .searchselect2 {
  840. position: absolute;
  841. // 右上角
  842. top: 25px;
  843. right: 10px;
  844. width: 240px;
  845. }
  846. </style>