audit-supervise-view.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867
  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. console.log(this.projectOption)
  285. this.sumList = this.projectOption.map((item) => {
  286. return {
  287. name: item.name,
  288. key: item.id,
  289. value: 0,
  290. }
  291. })
  292. // 默认选择第一个领域
  293. this.searchForm.projdectList1 = this.projectOption.map((val) => val.id)
  294. this.searchForm.projdectList2 = this.projectOption.map((val) => val.id)
  295. this.searchForm.projdectList3 = this.projectOption.map((val) => val.id)
  296. // 调用查询问题推送数量接口
  297. this.getSumData()
  298. // 审计发现问题
  299. this.initBarData()
  300. this.initScatterData()
  301. this.initTable()
  302. })
  303. },
  304. // 查询问题推送数量
  305. getSumData() {
  306. this.scatterLoading = true
  307. AuditRiskbraryService.countStatistics(this.searchParams('list'))
  308. .then((res) => {
  309. const data = res.data
  310. this.totalAudit = data.total || 0
  311. // 如果data的key和sumList的key相同,就赋值
  312. this.sumList.forEach((item) => {
  313. data.auditTypeBeanList.forEach((val) => {
  314. if (item.key === val.auditType) {
  315. item.value = val.count
  316. }
  317. })
  318. })
  319. })
  320. .finally(() => {
  321. this.scatterLoading = false
  322. })
  323. },
  324. changecompany(data) {
  325. this.searchForm.unitName = data[0]?.name || ''
  326. this.searchForm.unitCode = data[0]?.orgCode || ''
  327. },
  328. // 获取数据
  329. searchParams(type) {
  330. // 如果包含领域,如果包含下钻
  331. const params = {}
  332. // 年份
  333. params.unitType = this.searchForm.unitType
  334. params.unitCode = this.searchForm.unitCode
  335. if (type === 'bar') {
  336. // 遍历去除C
  337. params.auditTypes = this.searchForm.projdectList1.map((item) => item)
  338. // 项目列表
  339. }
  340. if (type === 'scatter') {
  341. // 散点图
  342. params.auditTypes = this.searchForm.projdectList3.map((item) => item)
  343. }
  344. if (type === 'table') {
  345. // 表格
  346. params.auditTypes = this.searchForm.projdectList2.map((item) => item)
  347. }
  348. // 开始年份结束年份
  349. // 对年份进行排序
  350. const yearList = this.searchForm.year.sort((a, b) => a - b)
  351. params.yearSt = yearList[0] + ''
  352. params.yearEd = yearList[this.searchForm.year.length - 1] + ''
  353. return params
  354. },
  355. searchData() {
  356. // 最少选择一个年份
  357. // 请选择开始年份和结束年份
  358. if (this.searchForm.year.length === 0) {
  359. message.warn('请选择开始年份和结束年份')
  360. }
  361. this.getSumData()
  362. this.initBarData()
  363. this.initTable()
  364. this.initScatterData()
  365. },
  366. // 获取饼图数据
  367. // 初始化 ,领域分布 ,阶段分布
  368. initBarData() {
  369. // 外层
  370. this.barLoading = true
  371. AuditRiskbraryService.questionStatistics(this.searchParams('bar')).then((res) => {
  372. this.isshowbar = res.data.length !== 0
  373. this.barLoading = false
  374. this.barData = res.data
  375. // 根据年份进行排序
  376. this.barData.sort((a, b) => a.planYear * 1 - b.planYear * 1)
  377. // 遍历数据,给所有项目插入name
  378. this.barData.forEach((item) => {
  379. this.projectOption.map((val1) => {
  380. if (item.auditType === val1.id) {
  381. item.name = val1.name
  382. }
  383. })
  384. })
  385. this.$nextTick(() => {
  386. this.initBar()
  387. })
  388. })
  389. },
  390. // 初始化柱图
  391. initBar() {
  392. const bar = document.getElementById('bar')
  393. this.echartsBar = echarts.init(bar)
  394. // 所有的项目key
  395. const allKey = this.barData.map((item) => item.auditType)
  396. const proKeylist = Array.from(new Set(allKey))
  397. // 判断有哪些年份
  398. let years = this.barData.map((item) => item.planYear)
  399. // 去重年份
  400. years = Array.from(new Set(years)).sort((a, b) => a - b)
  401. // 按照项目顺序获取所有的name
  402. const names = []
  403. proKeylist.map((val) => {
  404. this.projectOption.map((item) => {
  405. if (val === item.id) {
  406. names.push(item.name)
  407. }
  408. })
  409. })
  410. // 按照年份,项目顺序,生成数据
  411. // [
  412. // {
  413. // year: 2020,
  414. // data: [
  415. // { name: '项目1', count: 10 },
  416. // { name: '项目2', count: 20 },
  417. // { name: '项目3', count: 30 },
  418. // ],
  419. // }
  420. // ]
  421. const data = years.map((year) => {
  422. const obj = {
  423. year,
  424. data: proKeylist.map((val) => {
  425. // 如有年份和类型一样的则插入对象
  426. let dataList = 0
  427. const findData = this.barData.find(
  428. (item) => item.auditType === val && year === item.planYear
  429. )
  430. if (findData) {
  431. dataList = findData.count
  432. }
  433. return dataList
  434. }),
  435. }
  436. return obj
  437. })
  438. // 生成数据
  439. // 根据年生成
  440. const series = data.map((item, index) => {
  441. return {
  442. name: item.year,
  443. type: 'bar',
  444. barWidth: 25,
  445. label: { show: true, position: 'top' },
  446. data: item.data,
  447. }
  448. })
  449. this.echartsBar.clear()
  450. const color = ['#5b9bd5', '#ed7d31', '#a5a5a5']
  451. const option = {
  452. color,
  453. legend: {
  454. data: years,
  455. },
  456. tooltip: {
  457. trigger: 'axis',
  458. axisPointer: {
  459. type: 'shadow',
  460. },
  461. },
  462. grid: {
  463. bottom: '10%',
  464. containLabel: true,
  465. },
  466. xAxis: {
  467. type: 'category',
  468. data: names,
  469. // 旋转角度
  470. axisLabel: {
  471. rotate: 45,
  472. },
  473. },
  474. dataZoom: [
  475. {
  476. type: 'slider',
  477. show: true,
  478. xAxisIndex: [0],
  479. start: 0,
  480. end: 60,
  481. },
  482. ],
  483. yAxis: [
  484. {
  485. type: 'value',
  486. },
  487. ],
  488. series: series,
  489. }
  490. this.echartsBar.setOption(option)
  491. // 监听外圈点击事件
  492. window.addEventListener('resize', () => {
  493. this.echartsBar.resize()
  494. })
  495. },
  496. // 初始化风险分布
  497. initScatterData() {
  498. this.scatterLoading = true
  499. AuditRiskbraryService.getRiskStatistics(this.searchParams('scatter'))
  500. .then((res) => {
  501. this.scatterList = res.data
  502. // 根据id添加名字
  503. this.scatterList.forEach((item) => {
  504. this.projectOption.map((val) => {
  505. if (item.auditType === val.id) {
  506. item.name = val.name || ''
  507. }
  508. })
  509. })
  510. //
  511. this.isshowscatter = this.scatterList.length !== 0
  512. this.$nextTick(() => {
  513. this.initScatter()
  514. })
  515. })
  516. .finally(() => {
  517. this.scatterLoading = false
  518. })
  519. },
  520. // 初始化散点图
  521. initScatter() {
  522. const scatter = document.getElementById('scatter')
  523. this.echartsScatter = echarts.init(scatter)
  524. this.echartsScatter.clear()
  525. const scatterData = this.scatterList.map((item) => {
  526. return [item.amount, item.count, item.name]
  527. })
  528. const legendData = scatterData.map((item) => item[2])
  529. const option = {
  530. xAxis: {
  531. // 问题金额
  532. name: '问题金额',
  533. },
  534. yAxis: {
  535. // 问题数量
  536. name: '问题数量',
  537. },
  538. legend: {
  539. type: 'scroll',
  540. orient: 'vertical', // 图例列表的布局朝向(垂直排列)
  541. right: 0,
  542. height: '80%',
  543. y: 'center',
  544. data: legendData,
  545. bottom: 10,
  546. itemGap: 15, // 图例的上下间距
  547. itemWidth: 10, // 图例左侧图块的长度
  548. padding: 5,
  549. textStyle: {
  550. fontSize: 16,
  551. fontWeight: 400,
  552. color: '#33333',
  553. },
  554. pageTextStyle: {
  555. // 设置分页的当前页与总页码的文本样式
  556. color: 'rgba(36, 196, 221, 0.95)',
  557. },
  558. pageIconColor: '#6495ed', // 翻页下一页的三角按钮颜色
  559. pageIconInactiveColor: '#aaa', // 翻页(即翻页到头时)
  560. pageIconSize: 20, // 翻页按钮大小
  561. pageButtonGap: 22, // 翻页按钮与图例的间距
  562. formatter: function(name) {
  563. // 截取字符串八个
  564. return name.length > 8 ? name.substring(0, 8) + '...' : name
  565. },
  566. },
  567. grid: {
  568. left: '10%',
  569. right: 200,
  570. },
  571. // 显示to
  572. tooltip: {
  573. formatter: function(data) {
  574. return `${data.seriesName}<br/>问题金额:${data.data[0]}<br/>问题数量:${data.data[1]}`
  575. },
  576. },
  577. color: ['#fac858', '#5470c6', '#91cc75', '#fac858', '#ee6666'],
  578. series: scatterData.map((item) => {
  579. return {
  580. name: item[2],
  581. data: [item],
  582. type: 'scatter',
  583. symbolSize: 30,
  584. label: {
  585. emphasis: {
  586. show: true,
  587. formatter: function(param) {
  588. return param.seriesName
  589. },
  590. position: 'top',
  591. },
  592. },
  593. }
  594. }),
  595. }
  596. this.echartsScatter.setOption(option)
  597. // 监听页面尺寸变化
  598. window.addEventListener('resize', () => {
  599. this.echartsScatter.resize()
  600. })
  601. },
  602. // 初始化表格
  603. initTable() {
  604. this.loadingTable1 = true
  605. this.loadingTable2 = true
  606. AuditRiskbraryService.getReformStatistics(this.searchParams('table'))
  607. .then((res) => {
  608. this.tableData1 = res.data.map((item, index) => {
  609. const reformRate = item.reformRate
  610. const reformRateNum = Number(reformRate.replace('%', ''))
  611. item.reformRate = reformRateNum.toFixed(2) + '%'
  612. return {
  613. ...item,
  614. id: index + 1,
  615. }
  616. })
  617. })
  618. .finally(() => {
  619. this.loadingTable1 = false
  620. })
  621. },
  622. changeProjdectList1() {
  623. this.initBarData()
  624. },
  625. changeProjdectList2() {
  626. this.initTable()
  627. },
  628. changeProjdectList3() {
  629. this.initScatterData()
  630. },
  631. // downLoad
  632. downLoadTableBar() {
  633. this.isshowLoading = true
  634. AuditRiskbraryService.exportquestionExport(this.searchParams('bar'))
  635. .then((res) => {
  636. if (res.status === 200) {
  637. const url = URL.createObjectURL(res.data)
  638. const filename = res.headers['content-disposition']
  639. const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
  640. download(url, decodeURI(fname))
  641. // 导出成功
  642. message.success('导出成功')
  643. } else {
  644. Modal.warning({
  645. title: '提示',
  646. content: '导出报错,请联系管理员!',
  647. })
  648. return false
  649. }
  650. })
  651. .finally(() => {
  652. this.isshowLoading = false
  653. })
  654. },
  655. downLoadTableScatter() {
  656. this.isshowLoading = true
  657. AuditRiskbraryService.exportriskExport(this.searchParams('scatter'))
  658. .then((res) => {
  659. if (res.status === 200) {
  660. const url = URL.createObjectURL(res.data)
  661. const filename = res.headers['content-disposition']
  662. const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
  663. download(url, decodeURI(fname))
  664. // 导出成功
  665. message.success('导出成功')
  666. } else {
  667. Modal.warning({
  668. title: '提示',
  669. content: '导出报错,请联系管理员!',
  670. })
  671. return false
  672. }
  673. })
  674. .finally(() => {
  675. this.isshowLoading = false
  676. })
  677. },
  678. },
  679. }
  680. </script>
  681. <style module lang="scss">
  682. @use '@/common/design' as *;
  683. .title {
  684. min-height: 100%;
  685. padding: 20px;
  686. background: #fff;
  687. }
  688. ::v-deep .ant-card-body {
  689. height: 100%;
  690. }
  691. .content-view {
  692. display: flex;
  693. justify-content: space-between;
  694. height: calc(100% - 70px);
  695. }
  696. .view-body {
  697. position: relative;
  698. // flex: 1;
  699. width: 68%;
  700. height: 500px;
  701. border: 1px solid #0086d6;
  702. border-radius: 10px;
  703. // title居中浮动
  704. .content-title {
  705. position: absolute;
  706. top: -20px;
  707. left: calc(50% - 75px);
  708. width: 150px;
  709. height: 40px;
  710. font-size: 18px;
  711. font-weight: 600;
  712. line-height: 40px;
  713. color: #fff;
  714. text-align: center;
  715. background: #02a7f0;
  716. border-radius: 5px;
  717. }
  718. .searchform {
  719. padding: 25px 0 10px 15px;
  720. }
  721. }
  722. .view-body-big {
  723. width: 100%;
  724. margin-top: 50px;
  725. .content-title {
  726. left: calc(50% - 140px);
  727. width: 280px;
  728. }
  729. }
  730. .view-body-small {
  731. width: 30%;
  732. margin-right: 2%;
  733. }
  734. .numberofissues {
  735. display: flex;
  736. flex-direction: column;
  737. align-items: center;
  738. justify-content: space-between;
  739. width: 90%;
  740. height: calc(100% - 50px);
  741. padding-top: 20px;
  742. margin: 10px auto;
  743. .auditsum {
  744. position: relative;
  745. width: 100%;
  746. height: 80px;
  747. font-weight: 600;
  748. color: #fff;
  749. text-align: center;
  750. background-color: #1c375e;
  751. border-radius: 10px;
  752. // 第一个span左上,第二个span中间
  753. span:nth-child(1) {
  754. position: absolute;
  755. top: 0;
  756. left: 5px;
  757. font-size: 20px;
  758. color: #fff;
  759. }
  760. span:nth-child(2) {
  761. position: absolute;
  762. top: 50%;
  763. left: 50%;
  764. font-size: 20px;
  765. transform: translate(-50%, -50%);
  766. }
  767. }
  768. // 分成两列 单数f2f2f2 双数045679
  769. .auditlist {
  770. display: flex;
  771. flex-wrap: wrap;
  772. justify-content: flex-start;
  773. width: 100%;
  774. height: calc(100% - 80px);
  775. margin-top: 20px;
  776. overflow-y: scroll;
  777. .audititem {
  778. position: relative;
  779. width: 48%;
  780. height: 20%;
  781. min-height: 40px;
  782. margin: 0 1% 10px 1%;
  783. border-radius: 10px;
  784. span:nth-child(1) {
  785. position: absolute;
  786. top: 5px;
  787. left: 10px;
  788. font-size: 16px;
  789. }
  790. span:nth-child(2) {
  791. position: absolute;
  792. top: 60%;
  793. left: 50%;
  794. font-size: 16px;
  795. transform: translate(-50%, -50%);
  796. }
  797. &:nth-child(4n + 1),
  798. &:nth-child(4n + 4) {
  799. color: #333;
  800. background-color: #f2f2f2;
  801. }
  802. &:nth-child(4n + 2),
  803. &:nth-child(4n + 3) {
  804. color: #fff;
  805. background-color: #045679;
  806. }
  807. }
  808. }
  809. }
  810. .bar,
  811. .scatter {
  812. width: 100%;
  813. height: calc(100% - 60px);
  814. margin-top: 40px;
  815. }
  816. // 右上角
  817. .download {
  818. position: absolute;
  819. top: 15px;
  820. right: 10px;
  821. z-index: 1;
  822. cursor: pointer;
  823. }
  824. .contentmargin {
  825. position: relative;
  826. margin-top: 50px;
  827. }
  828. .tablecontent {
  829. padding: 10px;
  830. padding-top: 20px;
  831. }
  832. // 筛选框宽度240px
  833. .searchselect {
  834. position: absolute;
  835. // 右上角
  836. top: 10px;
  837. right: 40px;
  838. width: 240px;
  839. }
  840. .searchselect2 {
  841. position: absolute;
  842. // 右上角
  843. top: 25px;
  844. right: 10px;
  845. width: 240px;
  846. }
  847. </style>