index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. <template>
  2. <div class="table-box">
  3. <div class="card table-search" style="overflow: hidden;">
  4. <el-form ref="formRef" :model="pageable" :inline="true" label-width="auto">
  5. <el-form-item label="所属基地:" prop="base">
  6. <el-select v-model="pageable.base" placeholder="请选择" style="width: 200px" @change="changeBase">
  7. <el-option v-for="item in baseList" :key="item.value" :label="item.label" :value="item.value" />
  8. </el-select>
  9. </el-form-item>
  10. <el-form-item>
  11. <div>
  12. <el-button type="primary" @click="handleSearch">查询</el-button>
  13. <el-button plain @click="resetForm(formRef)">重置</el-button>
  14. </div>
  15. </el-form-item>
  16. </el-form>
  17. </div>
  18. <div class="main_list ">
  19. <el-row :gutter="15">
  20. <el-col :xs="24" :sm="12" :md="8" :lg="8">
  21. <div class="chart_item zhuti">
  22. <div style="font-weight: bold;" class="item_title">
  23. <span>设备工况(单位:台)</span>
  24. </div>
  25. <div class="mt5">
  26. <div ref="device" class="ve-ring" style="height: 200px" v-if="stateList"></div>
  27. <div v-else
  28. style="height: 200px; display: flex; justify-content: center; align-items: center; font-size: 20px;">
  29. 暂无数据</div>
  30. </div>
  31. </div>
  32. </el-col>
  33. <el-col :xs="24" :sm="12" :md="8" :lg="8">
  34. <div class="chart_item zhuti">
  35. <div style="font-weight: bold;" class="item_title">
  36. <span>检定周期(单位:台)</span>
  37. </div>
  38. <div class="mt5">
  39. <div ref="period" class="ve-ring" style="height: 200px"></div>
  40. </div>
  41. </div>
  42. </el-col>
  43. <el-col :xs="24" :sm="12" :md="8" :lg="8">
  44. <div class="chart_item zhuti">
  45. <div style="font-weight: bold;" class="item_title">
  46. <span>FTP链路</span>
  47. </div>
  48. <div class="mt5">
  49. <div class="FTP_box" style="height: 200px">
  50. <div class="FTP_item">
  51. <img src="@/assets/images/centerStation.png" alt="">
  52. <div>正常FTP({{ FTPList && FTPList.true ? FTPList?.true.length : 0 }})</div>
  53. </div>
  54. <div class="FTP_item" @click="gotoFTP">
  55. <img src="@/assets/images/areaStation.png" alt="">
  56. <div>异常FTP({{ FTPList && FTPList.false ? FTPList?.false.length : 0 }})</div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </el-col>
  62. </el-row>
  63. <el-row :gutter="15">
  64. <el-col :span="24">
  65. <div class="chart_item zhuti">
  66. <div style="font-weight: bold;" class="item_title">
  67. <span>危险天气</span>
  68. </div>
  69. <el-row :gutter="15">
  70. <el-col :span="8">
  71. <div class="mt5">
  72. <div ref="weather" class="ve-ring" style="height: 300px"></div>
  73. </div>
  74. </el-col>
  75. <el-col :span="16" style="margin-bottom: 0;">
  76. <div>
  77. <div ref="element" class="ve-ring" style="height: 300px"></div>
  78. </div>
  79. </el-col>
  80. </el-row>
  81. </div>
  82. </el-col>
  83. </el-row>
  84. <el-row :gutter="15">
  85. <el-col :span="24">
  86. <div class="chart_item zhuti">
  87. <div style="font-weight: bold;" class="item_title">
  88. <span>到报监控</span>
  89. </div>
  90. <div class="mt5">
  91. <div ref="control" class="ve-ring" style="height: 300px"></div>
  92. </div>
  93. </div>
  94. </el-col>
  95. </el-row>
  96. </div>
  97. </div>
  98. </template>
  99. <script setup lang="ts" name="allDevice">
  100. import * as echarts from 'echarts';
  101. import { isToday, isWithinThirtyMinutes, getTimeStamp, getStamp, isDateFuture, isDateRangeWithinDays, groupByType } from "@/utils/dateTime";
  102. import { ElMessage } from "element-plus";
  103. import { useGlobalStore } from "@/stores/modules/global";
  104. import { ref, computed, onMounted, reactive, watch, onDeactivated, onActivated, nextTick } from "vue";
  105. import { getDataItemList, getPlatformList, getRgDataList, getTacRecordList, getFTPList, getCertificateList, getStaitemList, getArriveList } from "@/api/modules/allData";
  106. import { Platform } from "@/api/interface";
  107. import { parseTime } from '@/utils/index';
  108. import { useRouter } from "vue-router";
  109. const router = useRouter();
  110. const gotoFTP = () => {
  111. router.push({
  112. path: '/system/disposition',
  113. query: {
  114. status: 'distributionAutomatic',
  115. }
  116. })
  117. }
  118. // 查询自动站列表
  119. const queryas = ref<Platform>({
  120. pageSize: 5000,
  121. pageNum: 1,
  122. currentpage: 1
  123. })
  124. const pageable = ref({
  125. data_type: true,
  126. time_order: 1,
  127. time_space: 1,
  128. base: undefined,
  129. as_code_list: [],
  130. data_items: [
  131. {
  132. data_r_table: "SHI_SHI_LIU_YAO_SU_SHU_JU",
  133. data_id: 101,
  134. data_type: "温湿度",
  135. data_item: "QI_WEN",
  136. data_name: "气温",
  137. data_unit: "℃",
  138. data_h_table: "LI_SHI_LIU_YAO_SU_SHU_JU",
  139. data_value: "",
  140. data_order: 1,
  141. data_condition: 0
  142. }
  143. ],
  144. });
  145. const platformList = ref<any>([])
  146. const baseList = ref<any>([])
  147. const selectPlatform = ref()
  148. const getPlatforms = async () => {
  149. const { data } = await getPlatformList(queryas.value);
  150. platformList.value = data.list
  151. baseList.value = groupByType(data.list)
  152. pageable.value.base = baseList.value[0].value
  153. pageable.value.as_code_list = baseList.value[0].children
  154. selectPlatform.value = baseList.value[0]
  155. // getDeviceStatus()
  156. // getArrive()
  157. // getHistoryList()
  158. };
  159. const changeBase = (e) => {
  160. const item = baseList.value.find(item => item.value === e);
  161. pageable.value.as_code_list = item.children
  162. // getCertificate()
  163. // getFTP()
  164. // getDeviceStatus()
  165. // getArrive()
  166. // getHistoryList()
  167. }
  168. watch(() => pageable.value.as_code_list, (newValue, oldValue) => {
  169. if (newValue) {
  170. weatherInfo()
  171. getCertificate();
  172. getFTP();
  173. getDeviceStatus();
  174. getArrive();
  175. // getHistoryList();
  176. }
  177. });
  178. const formRef = ref()
  179. const device = ref()
  180. const period = ref()
  181. const weather = ref()
  182. const element = ref()
  183. const control = ref()
  184. const searchParam = reactive({
  185. base: undefined,
  186. })
  187. // 获取到报监控
  188. const arriveList = ref<any>({ aa: [], bb: [], cc: [] })
  189. const arriveTime = ref<any>()
  190. const getArrive = async () => {
  191. const { data } = await getArriveList({ ...pageable.value, time_space: 60, data_type: false, end_time: getStamp(parseTime(new Date(), '{y}-{m}-{d} {h}') + ':00'), begin_time: getStamp(parseTime(new Date(), '{y}-{m}-{d}') + ' 00:00') })
  192. arriveTime.value = Object.keys(data)
  193. const arr = <any>{ aa: [], bb: [], cc: [] }
  194. arriveTime.value?.forEach((item, index) => {
  195. arr.aa.push(pageable.value.as_code_list.length)
  196. arr.bb.push(data[item].length)
  197. arr.cc.push(pageable.value.as_code_list.length - data[item].length)
  198. });
  199. arriveList.value = arr
  200. nextTick(() => {
  201. showControl()
  202. })
  203. // arriveList.value=data
  204. };
  205. // 查询危险天气
  206. const dataTypeList = [
  207. {
  208. value: 0,
  209. label: '能见度',
  210. },
  211. {
  212. value: 1,
  213. label: '风速',
  214. },
  215. {
  216. value: 2,
  217. label: '大气电场',
  218. }, {
  219. value: 3,
  220. label: '云量',
  221. }, {
  222. value: 4,
  223. label: '云高',
  224. }, {
  225. value: 5,
  226. label: '温度',
  227. }, {
  228. value: 6,
  229. label: '湿度',
  230. }, {
  231. value: 7,
  232. label: '小时雨量',
  233. }
  234. ]
  235. const wertherColumns = ref<any>({
  236. tact_state_on: true,
  237. tact_data_on: false,
  238. tact_state: 0,
  239. // tact_state: 0,
  240. // tact_data: 0,
  241. pageNum: 1,
  242. pageSize: 999,
  243. });
  244. const weatherInfoArr = ref()
  245. const dangetWeatherNum = ref(0)
  246. const weatherNormal = ref()
  247. const weatherWarning = ref()
  248. const weatherInfo = async () => {
  249. const { data } = await getTacRecordList({ ...wertherColumns.value, as_code_list: pageable.value.as_code_list });
  250. dangetWeatherNum.value = [...new Set(data.list?.map(obj => obj.as_code))].length
  251. weatherInfoArr.value = data.list
  252. let arr2 = new Array(8).fill(0);
  253. let arr1 = new Array(8).fill(pageable.value.as_code_list.length);
  254. data.list?.forEach((item, index) => {
  255. arr1[item.data_type]--
  256. arr2[item.data_type]++
  257. })
  258. weatherNormal.value = arr1
  259. weatherWarning.value = arr2
  260. nextTick(() => {
  261. showWeather()
  262. showElement()
  263. })
  264. };
  265. // 获取自动站定检证书
  266. // 返回两个数组中相同的个数
  267. function findCommonCount(arr1, arr2) {
  268. const common = arr1.filter(item => arr2.includes(item));
  269. return common.length;
  270. }
  271. const certificateList = ref<any>({})
  272. const getCertificate = async () => {
  273. const { data } = await getCertificateList()
  274. // certificateList.value.a = data[0]?.length || 0
  275. certificateList.value.a = findCommonCount(pageable.value.as_code_list, data[0]?.length?data[0]:[])
  276. certificateList.value.b = findCommonCount(pageable.value.as_code_list, data[1]?.length?data[1]:[])
  277. certificateList.value.c = findCommonCount(pageable.value.as_code_list, data[2]?.length?data[2]:[])
  278. nextTick(() => {
  279. showPeriod()
  280. })
  281. // certificateList.value=data.list
  282. };
  283. // 获取FTP链路
  284. const FTPList = ref<any>({})
  285. const getFTP = async () => {
  286. const { data } = await getFTPList()
  287. FTPList.value = data
  288. };
  289. // 获取设备工况
  290. const stateList = ref<any>()
  291. const getDeviceStatus = async () => {
  292. const { data } = await getStaitemList(pageable.value);
  293. const state = { normal: 0, warning: 0, error: 0 }
  294. data?.list?.forEach(item => {
  295. const staList = item.sta_list;
  296. staList.forEach(sta => {
  297. if (sta.state === 0) {
  298. state.normal++;
  299. } else if (sta.state === 2) { // 注意:你的要求中提到了state为2的个数,但原始数据中并没有state为2的例子,这里我假设你需要统计它
  300. state.warning++;
  301. } else if (sta.state === 3) {
  302. state.error++;
  303. }
  304. // 对于其他state值,这里不做处理,如果需要可以添加额外的条件分支
  305. });
  306. });
  307. stateList.value = state
  308. nextTick(() => {
  309. showDevice()
  310. })
  311. };
  312. const handleSearch = () => {
  313. getArrive()
  314. weatherInfo()
  315. getCertificate()
  316. getFTP()
  317. getDeviceStatus()
  318. }
  319. // resetForm
  320. const resetForm = (formEl) => {
  321. if (!formEl) return;
  322. formEl.resetFields();
  323. };
  324. const globalStore = useGlobalStore();
  325. const isDark = computed(() => globalStore.isDark);
  326. const showDevice = () => {
  327. let mychart = echarts.init(device.value);
  328. let option = {
  329. tooltip: {
  330. trigger: 'item',
  331. formatter: "{a} <br/>{b}: {c}台"
  332. },
  333. legend: {
  334. bottom: '0%',
  335. left: 'center',
  336. textStyle: {//图例文字的样式
  337. color: isDark.value ? '#fff' : "#000",
  338. }
  339. },
  340. series: [
  341. {
  342. name: '设备工况',
  343. type: 'pie',
  344. radius: ['50%', '68%'],
  345. center: ['50%', '45%'],
  346. hoverAnimation: false,
  347. itemStyle: {
  348. borderRadius: 3,
  349. borderColor: '#fff',
  350. borderWidth: 1
  351. },
  352. label: {
  353. normal: {
  354. show: true,
  355. position: 'outer',
  356. formatter: '{b}:{c}',
  357. overflow: 'none',
  358. fontSize: 15,
  359. },
  360. },
  361. emphasis: {
  362. label: {
  363. show: true,
  364. fontSize: 20,
  365. fontWeight: 'bold'
  366. }
  367. },
  368. //设置提示线
  369. labelLine: {
  370. normal: {
  371. show: true,//开启提示线展示
  372. length: 10,//设置第一条提示线长度
  373. length2: 30,//设置第二条提示线长度
  374. }
  375. },
  376. data: [
  377. {
  378. value: stateList.value ? stateList.value.normal : 0,
  379. name: '正常',
  380. itemStyle: { color: '#00C4B3' },
  381. label: { color: '#00C4B3' }
  382. },
  383. {
  384. value: stateList.value ? stateList.value.warning : 0,
  385. name: '告警',
  386. itemStyle: { color: '#EF6666' },
  387. label: { color: '#EF6666' }
  388. },
  389. {
  390. value: stateList.value ? stateList.value.error : 0,
  391. name: '故障',
  392. itemStyle: { color: '#FAC858' },
  393. label: { color: '#FAC858' }
  394. }
  395. ]
  396. }
  397. ]
  398. };
  399. mychart.setOption(option)
  400. window.addEventListener("resize", function () {
  401. mychart.resize();
  402. });
  403. }
  404. const showPeriod = () => {
  405. let mychart = echarts.init(period.value);
  406. let option = {
  407. tooltip: {
  408. trigger: 'item',
  409. formatter: "{a} <br/>{b}: {c}台"
  410. },
  411. legend: {
  412. bottom: 0,
  413. left: 'center',
  414. textStyle: {//图例文字的样式
  415. color: isDark.value ? '#fff' : "#000",
  416. }
  417. },
  418. series: [
  419. {
  420. name: '检定周期',
  421. type: 'pie',
  422. radius: '65%',
  423. center: ['50%', '45%'],
  424. label: {
  425. normal: {
  426. show: true,
  427. position: 'outer',
  428. formatter: '{b}:{c}',
  429. fontSize: 14,
  430. },
  431. },
  432. data: [
  433. { value: certificateList.value.c ? certificateList.value.c : 0, name: '剩余31-60天', itemStyle: { color: '#5470C6' } },
  434. { value: certificateList.value.b ? certificateList.value.b : 0, name: '剩余1-30天', itemStyle: { color: '#FAC858' } },
  435. { value: certificateList.value.a ? certificateList.value.a : 0, name: '已过检', itemStyle: { color: '#EF6666' } }
  436. ],
  437. emphasis: {
  438. itemStyle: {
  439. shadowBlur: 10,
  440. shadowOffsetX: 0,
  441. shadowColor: 'rgba(0, 0, 0, 0.5)'
  442. }
  443. }
  444. }
  445. ]
  446. };
  447. mychart.setOption(option)
  448. window.addEventListener("resize", function () {
  449. mychart.resize();
  450. });
  451. }
  452. const allSataion = ref(5)
  453. const showWeather = () => {
  454. let mychart = echarts.init(weather.value);
  455. let option = {
  456. title: {
  457. text: `${pageable.value.as_code_list.length} \n 总站数 `,
  458. left: "center",
  459. top: "38%",
  460. textStyle: {
  461. fontSize: 20,
  462. color: '#000',
  463. },
  464. },
  465. tooltip: {
  466. trigger: 'item',
  467. formatter: "{a} <br/>{b}: {c}"
  468. },
  469. legend: {
  470. bottom: '1%',
  471. left: 'center',
  472. textStyle: {//图例文字的样式
  473. color: isDark.value ? '#fff' : "#000",
  474. }
  475. },
  476. series: [
  477. {
  478. name: '设备工况',
  479. type: 'pie',
  480. radius: ['50%', '70%'],
  481. center: ['50%', '45%'],
  482. hoverAnimation: false,
  483. itemStyle: {
  484. borderRadius: 3,
  485. borderColor: '#fff',
  486. borderWidth: 1
  487. },
  488. label: {
  489. normal: {
  490. show: true,
  491. position: 'outer',
  492. formatter: '{b}:{c}',
  493. overflow: 'none',
  494. fontSize: 15,
  495. },
  496. },
  497. emphasis: {
  498. label: {
  499. show: true,
  500. fontSize: 20,
  501. fontWeight: 'bold'
  502. }
  503. },
  504. //设置提示线
  505. labelLine: {
  506. normal: {
  507. show: true,//开启提示线展示
  508. length: 15,//设置第一条提示线长度
  509. length2: 30,//设置第二条提示线长度
  510. }
  511. },
  512. data: [
  513. {
  514. value: pageable.value.as_code_list.length - dangetWeatherNum.value,
  515. name: '正常',
  516. itemStyle: { color: '#5470C6' },
  517. label: { color: '#5470C6' }
  518. },
  519. {
  520. value: dangetWeatherNum.value,
  521. name: '告警',
  522. itemStyle: { color: '#EF6666' },
  523. label: { color: '#EF6666' }
  524. }
  525. ]
  526. }
  527. ]
  528. };
  529. mychart.setOption(option)
  530. window.addEventListener("resize", function () {
  531. mychart.resize();
  532. });
  533. }
  534. const showElement = () => {
  535. let mychart = echarts.init(element.value);
  536. let option = {
  537. tooltip: {
  538. trigger: 'axis',
  539. axisPointer: {
  540. type: 'shadow'
  541. }
  542. },
  543. grid: {
  544. top: '3%',
  545. left: '3%',
  546. right: '4%',
  547. bottom: '0%',
  548. containLabel: true
  549. },
  550. xAxis: [
  551. {
  552. type: 'category',
  553. data: [
  554. '能见度',
  555. '风速',
  556. '大气电场',
  557. '云量',
  558. '云高',
  559. '温度',
  560. '湿度',
  561. '小时雨量'
  562. ]
  563. }
  564. ],
  565. yAxis: [
  566. {
  567. type: 'value'
  568. }
  569. ],
  570. series: [
  571. {
  572. name: '正常',
  573. barWidth: '50%',
  574. type: 'bar',
  575. stack: 'Ad',
  576. emphasis: {
  577. focus: 'series'
  578. },
  579. itemStyle: {
  580. color: '#5470C6'
  581. },
  582. data: weatherNormal.value
  583. },
  584. {
  585. name: '告警',
  586. barWidth: '50%',
  587. type: 'bar',
  588. stack: 'Ad',
  589. emphasis: {
  590. focus: 'series'
  591. },
  592. itemStyle: {
  593. color: '#EF6666'
  594. },
  595. data: weatherWarning.value
  596. }
  597. ]
  598. };
  599. mychart.setOption(option)
  600. window.addEventListener("resize", function () {
  601. mychart.resize();
  602. });
  603. }
  604. const showControl = () => {
  605. let mychart = echarts.init(control.value);
  606. let option = {
  607. tooltip: {
  608. trigger: 'axis',
  609. axisPointer: {
  610. type: 'shadow'
  611. }
  612. },
  613. legend: {
  614. textStyle: {//图例文字的样式
  615. color: isDark.value ? '#fff' : "#000",
  616. }
  617. },
  618. grid: {
  619. left: '15',
  620. right: '15',
  621. bottom: '3%',
  622. containLabel: true
  623. },
  624. xAxis: [
  625. {
  626. type: 'category',
  627. data: arriveTime.value
  628. }
  629. ],
  630. yAxis: [
  631. {
  632. type: 'value'
  633. }
  634. ],
  635. series: [
  636. {
  637. name: '应报情况',
  638. type: 'bar',
  639. stack: 'Ad',
  640. emphasis: {
  641. focus: 'series'
  642. },
  643. itemStyle: {
  644. color: '#3BA272' // 蓝色
  645. },
  646. data: arriveList.value.aa.length ? arriveList.value.aa : [],
  647. },
  648. {
  649. name: '实报情况',
  650. type: 'bar',
  651. stack: 'Ad',
  652. emphasis: {
  653. focus: 'series'
  654. },
  655. itemStyle: {
  656. color: '#5470C6' // 绿色
  657. },
  658. data: arriveList.value.bb.length ? arriveList.value.bb : [],
  659. },
  660. {
  661. name: '未报情况',
  662. type: 'bar',
  663. stack: 'Ad',
  664. emphasis: {
  665. focus: 'series'
  666. },
  667. itemStyle: {
  668. color: '#EF6666' // 红色
  669. },
  670. data: arriveList.value.cc.length ? arriveList.value.cc : [],
  671. },
  672. ]
  673. };
  674. mychart.setOption(option)
  675. window.addEventListener("resize", function () {
  676. mychart.resize();
  677. });
  678. }
  679. watch(isDark, () => { showDevice(), showPeriod(), showWeather(), showElement(), showControl() });
  680. onMounted(() => {
  681. getFTP()
  682. // getCertificate()
  683. getPlatforms()
  684. // showDevice()
  685. // showPeriod()
  686. // showWeather()
  687. // showElement()
  688. // showControl()
  689. })
  690. </script>
  691. <style scoped lang="scss">
  692. .el-row .el-col {
  693. margin-bottom: 15px;
  694. }
  695. .main_list {
  696. background: transparent !important;
  697. box-shadow: none !important;
  698. padding: 0 !important;
  699. height: calc(100vh - 150px);
  700. margin-bottom: 10px;
  701. overflow-y: scroll;
  702. overflow-x: hidden;
  703. .chart_item {
  704. border-radius: 10px;
  705. padding: 10px;
  706. background-color: #fff;
  707. // height: 100%;
  708. // margin-bottom: 15px;
  709. .item_title {
  710. display: flex;
  711. justify-content: space-between;
  712. align-items: center;
  713. }
  714. .FTP_box {
  715. padding: 0 50px;
  716. display: flex;
  717. align-items: center;
  718. justify-content: space-between;
  719. .FTP_item {
  720. flex: 1;
  721. flex-shrink: 0;
  722. display: flex;
  723. flex-direction: column;
  724. justify-content: center;
  725. align-items: center;
  726. img {
  727. width: 56px;
  728. margin-bottom: 20px;
  729. }
  730. }
  731. }
  732. }
  733. .info_box {
  734. .info_title {
  735. color: #999999;
  736. font-size: 16px;
  737. }
  738. .info_content {
  739. height: 40px;
  740. font-weight: bold;
  741. color: #000;
  742. font-size: 26px;
  743. }
  744. }
  745. }
  746. </style>