dustWarn.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. <template>
  2. <customHeader :options="options" @change="getSelectRow" :optionValue="optionValue"> 粉尘监测预警 </customHeader>
  3. <div class="dustWarn">
  4. <div class="top-dust">
  5. <a-button preIcon="ant-design:rollback-outlined" type="text" size="small"
  6. style="position: absolute;left:15px;top:15px;color: #fff;" @click="getBack">返回</a-button>
  7. <div class="alarm-menu">
  8. <div class="card-btn">
  9. <div :class="activeIndex1 == ind ? 'btn1' : 'btn'" v-for="(item, ind) in menuList" :key="ind"
  10. @click="cardClick(ind, item)">
  11. <div class="text">{{ item.name }}</div>
  12. <div class="warn">{{ item.warn }}</div>
  13. </div>
  14. </div>
  15. </div>
  16. <div class="dust-content">
  17. <div class="content-left">
  18. <div :class="activeIndex == index ? 'content-left-item' : 'content-left-item1'"
  19. v-for="(item, index) in topAreaList" :key="index" @click="topAreaClick(index)">
  20. <div class="content-title">{{ item.title }}</div>
  21. <div class="content-items" v-for="(ite, ind) in item.content" :key="ind">
  22. <span>{{ ite.label }}</span>
  23. <span style="color:#01fefc">{{ ite.value }}</span>
  24. </div>
  25. </div>
  26. </div>
  27. <div class="content-right">
  28. <div class="title-t">
  29. <div class="text-t">粉尘信息状态监测</div>
  30. </div>
  31. <div class="echart-boxd">
  32. <echartLine :echartDataGq="echartDataFc" :maxY="maxY" :echartDw="echartDw" :gridV="gridV" />
  33. </div>
  34. </div>
  35. </div>
  36. </div>
  37. <div class="bot-dust">
  38. <div class="bot-area">
  39. <div class="title-b">
  40. <div class="text-b">粉尘监控测点信息</div>
  41. </div>
  42. <div class="content-b">
  43. <div class="card-b" v-for="(item, index) in cardListTf" :key="index">
  44. <div class="item-l">
  45. <div class="label-l">{{ item.label }}</div>
  46. <div class="value-l">{{ item.value }}</div>
  47. </div>
  48. <div class="item-r">
  49. <div class="content-r" v-for="(items, ind) in item.listR" :key="ind">
  50. <span>{{ `${items.label} : ` }}</span>
  51. <span :class="{
  52. 'status-f': items.value == 1,
  53. 'status-l': items.value == 0,
  54. }">{{ items.value == 1 ? '异常' : items.value == 0 ? '正常' : `${items.value}${items.dw}`
  55. }}</span>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </div>
  62. </div>
  63. </template>
  64. <script setup lang="ts">
  65. import { ref, reactive, onMounted, onUnmounted } from 'vue'
  66. import { sysTypeWarnList, sysWarn, getDevice } from '../common.api'
  67. import echartLine from '../common/echartLine.vue';
  68. import { useSystemSelect } from '/@/hooks/vent/useSystemSelect';
  69. import { useRouter } from 'vue-router';
  70. import CustomHeader from '/@/components/vent/customHeader.vue';
  71. const { options, optionValue, getSelectRow, getSysDataSource } = useSystemSelect('sys_surface_caimei'); // 参数为场景类型(设备类型管理中可以查询到)
  72. //左侧数据列表
  73. let menuList = reactive<any[]>([])
  74. //当前左侧激活菜单的索引
  75. let activeIndex1 = ref(0);
  76. //顶部区域激活选项
  77. let activeIndex = ref(0);
  78. //顶部区域数据
  79. let topAreaList = reactive<any[]>([]);
  80. let choiceData = reactive<any[]>([]);
  81. //粉尘图表数据
  82. let echartDataFc = reactive({
  83. maxData: {
  84. lengedData: '实时值(mg/m³)',
  85. data: [],
  86. },
  87. minData: {
  88. lengedData: '预测值(mg/m³)',
  89. data: [],
  90. },
  91. aveValue: {
  92. lengedData: '最新值(mg/m³)',
  93. data: [],
  94. },
  95. xData: [],
  96. });
  97. let maxY = ref(0);
  98. let echartDw = ref('(mg/m³)');
  99. let gridV = reactive({
  100. top: '12%',
  101. left: '1%',
  102. bottom: '5%',
  103. right: '2%',
  104. containLabel: true,
  105. })
  106. let cardListTf = reactive<any[]>([])
  107. let router = useRouter()
  108. let echartDatas = ref<any[]>([])
  109. let echartDat = reactive<any[]>([])
  110. // https获取监测数据
  111. let timer: null | NodeJS.Timeout = null;
  112. function getMonitor(deviceID, flag?) {
  113. timer = setTimeout(
  114. async () => {
  115. await getSysWarnList(deviceID, 'dust');
  116. if (timer) {
  117. timer = null;
  118. }
  119. getMonitor(deviceID);
  120. },
  121. flag ? 0 : 1000
  122. );
  123. }
  124. //返回首页
  125. function getBack() {
  126. router.push('/monitorChannel/monitor-alarm-home')
  127. }
  128. //菜单选项切换
  129. function cardClick(ind, item) {
  130. activeIndex1.value = ind;
  131. clearTimeout(timer);
  132. getMonitor(item.deviceID, true);
  133. }
  134. function uniqueObjects(arr, key) {
  135. const unique = arr.map((e) => e[key])
  136. // 存储每个属性值
  137. .map((e, i, final) => final.indexOf(e) === i && i)
  138. // 移除重复值的索引
  139. .filter((e) => arr[e])
  140. // 映射到对应的对象
  141. .map((e) => arr[e]);
  142. return unique;
  143. }
  144. //顶部区域选项切换
  145. function topAreaClick(index) {
  146. activeIndex.value = index;
  147. echartDataFc.maxData.data.length = 0;
  148. echartDataFc.minData.data.length = 0;
  149. echartDataFc.aveValue.data.length = 0;
  150. echartDataFc.xData.length = 0;
  151. echartDat.length = 0
  152. echartDatas.value = JSON.parse(choiceData[index].readData.expectInfo)['list']
  153. echartDat.push({ id: '1', time: JSON.parse(choiceData[index].readData.expectInfo)['aveTime'], value: JSON.parse(choiceData[index].readData.expectInfo)['aveVal'] })
  154. echartDat.push({ id: '2', time: JSON.parse(choiceData[index].readData.expectInfo)['nowTime'], value: JSON.parse(choiceData[index].readData.expectInfo)['nowVal'] })
  155. let unique = uniqueObjects(echartDat, 'time');
  156. let setData = [...echartDatas.value, ...unique]
  157. setData.forEach((m, n) => {
  158. echartDataFc.xData.push(m.time);
  159. if (unique.filter(t => t.time == m.time).length != 0 && m.id == '1') {
  160. echartDataFc.maxData.data.push(0);
  161. echartDataFc.minData.data.push(m.value);
  162. echartDataFc.aveValue.data.push(0);
  163. } else if (unique.filter(t => t.time == m.time).length != 0 && m.id == '2') {
  164. echartDataFc.maxData.data.push(0);
  165. echartDataFc.minData.data.push(0);
  166. echartDataFc.aveValue.data.push(m.value);
  167. } else {
  168. echartDataFc.maxData.data.push(m.value);
  169. echartDataFc.minData.data.push(0);
  170. echartDataFc.aveValue.data.push(0);
  171. }
  172. })
  173. // choiceData[index].history.forEach((el) => {
  174. // echartDataFc.maxData.data.push(el.dustval);
  175. // echartDataFc.xData.push(el.time);
  176. // });
  177. }
  178. function formatRoundNum(num) {
  179. let interger = Math.ceil(num);
  180. let leng = String(interger).length;
  181. return Math.ceil(interger / Math.pow(10, leng - 1)) * Math.pow(10, leng - 1);
  182. }
  183. //获取左侧菜单列表
  184. async function getMenuList() {
  185. let res = await sysTypeWarnList({ type: 'dust' })
  186. if (res.length != 0) {
  187. menuList.length = 0
  188. res.forEach((el) => {
  189. menuList.push({
  190. name: el.systemname,
  191. warn: '低风险',
  192. deviceID: el.id,
  193. strtype: el.strtype,
  194. });
  195. });
  196. getMonitor(menuList[0].deviceID, true);
  197. }
  198. }
  199. //获取预警详情弹窗右侧数据
  200. function getSysWarnList(id, type) {
  201. sysWarn({ sysid: id, type: type }).then((res) => {
  202. // listData.common = res;
  203. topAreaList.length = 0;
  204. echartDataFc.maxData.data.length = 0;
  205. echartDataFc.minData.data.length = 0;
  206. echartDataFc.aveValue.data.length = 0;
  207. echartDataFc.xData.length = 0;
  208. if (JSON.stringify(res) != '{}') {
  209. res.dust.forEach((el) => {
  210. topAreaList.push({
  211. title: el.strinstallpos,
  212. content: [
  213. { ids: 0, label: '温度(°C)', value: el.readData.temperature || '--' },
  214. { ids: 1, label: '粉尘浓度(mg/m³)', value: el.readData.dustval || '--' },
  215. { ids: 2, label: '喷雾水压(MPa)', value: el.readData.waterPressure || '--' },
  216. { ids: 3, label: '喷雾状态', value: el.readData.atomizingState || '--' },
  217. ],
  218. });
  219. });
  220. choiceData = res.dust;
  221. if (choiceData[activeIndex.value]) {
  222. echartDatas.value = JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['list']
  223. echartDat.push({ id: '1', time: JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['aveTime'], value: JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['aveVal'] })
  224. echartDat.push({ id: '2', time: JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['nowTime'], value: JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['nowVal'] })
  225. let unique = uniqueObjects(echartDat, 'time');
  226. let setData = [...echartDatas.value, ...unique]
  227. setData.forEach((m, n) => {
  228. echartDataFc.xData.push(m.time);
  229. if (unique.filter(t => t.time == m.time).length != 0 && m.id == '1') {
  230. echartDataFc.maxData.data.push(0);
  231. echartDataFc.minData.data.push(m.value);
  232. echartDataFc.aveValue.data.push(0);
  233. } else if (unique.filter(t => t.time == m.time).length != 0 && m.id == '2') {
  234. echartDataFc.maxData.data.push(0);
  235. echartDataFc.minData.data.push(0);
  236. echartDataFc.aveValue.data.push(m.value);
  237. } else {
  238. echartDataFc.maxData.data.push(m.value);
  239. echartDataFc.minData.data.push(0);
  240. echartDataFc.aveValue.data.push(0);
  241. }
  242. })
  243. // choiceData[activeIndex.value].history.forEach((el) => {
  244. // echartDataFc.maxData.data.push(el.dustval);
  245. // echartDataFc.xData.push(el.time);
  246. // });
  247. let max1 = echartDataFc.maxData.data.reduce((acr, cur) => {
  248. return acr > cur ? acr : cur;
  249. });
  250. maxY.value = formatRoundNum(max1 * 1.5);
  251. } else {
  252. activeIndex.value = 0;
  253. echartDatas.value = JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['list']
  254. echartDat.push({ id: '1', time: JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['aveTime'], value: JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['aveVal'] })
  255. echartDat.push({ id: '2', time: JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['nowTime'], value: JSON.parse(choiceData[activeIndex.value].readData.expectInfo)['nowVal'] })
  256. let unique = uniqueObjects(echartDat, 'time');
  257. let setData = [...echartDatas.value, ...unique]
  258. setData.forEach((m, n) => {
  259. echartDataFc.xData.push(m.time);
  260. if (unique.filter(t => t.time == m.time).length != 0 && m.id == '1') {
  261. echartDataFc.maxData.data.push(0);
  262. echartDataFc.minData.data.push(m.value);
  263. echartDataFc.aveValue.data.push(0);
  264. } else if (unique.filter(t => t.time == m.time).length != 0 && m.id == '2') {
  265. echartDataFc.maxData.data.push(0);
  266. echartDataFc.minData.data.push(0);
  267. echartDataFc.aveValue.data.push(m.value);
  268. } else {
  269. echartDataFc.maxData.data.push(m.value);
  270. echartDataFc.minData.data.push(0);
  271. echartDataFc.aveValue.data.push(0);
  272. }
  273. })
  274. // choiceData[activeIndex.value].history.forEach((el) => {
  275. // echartDataFc.maxData.data.push(el.dustval);
  276. // echartDataFc.xData.push(el.time);
  277. // });
  278. let max1 = echartDataFc.maxData.data.reduce((acr, cur) => {
  279. return acr > cur ? acr : cur;
  280. });
  281. maxY.value = formatRoundNum(max1 * 1.5);
  282. }
  283. }
  284. });
  285. }
  286. //获取粉尘监控测点信息
  287. async function getWindDeviceList() {
  288. cardListTf.length = 0
  289. let res = await getDevice({ devicetype: 'dusting', pagetype: 'normal' })
  290. if (res && res.msgTxt[0]) {
  291. let list = res.msgTxt[0].datalist || [];
  292. if (list.length > 0) {
  293. list.forEach((el: any) => {
  294. const readData = el.readData;
  295. el = Object.assign(el, readData);
  296. cardListTf.push({
  297. label: '通信状态',
  298. value: el.netStatus == '0' ? '断开' : '连接',
  299. listR: [
  300. { id: 0, label: '安装位置', dw: '', value: el.strinstallpos },
  301. { id: 1, label: '粉尘浓度', dw: '(mg/m³)', value: el.dustval },
  302. { id: 2, label: '巷道湿度', dw: '(RH)', value: el.humidity },
  303. { id: 4, label: '巷道温度', dw: '(℃)', value: el.temperature },
  304. { id: 3, label: '是否报警', dw: '', value: el.warnFlag == '0' ? '正常' : el.warnFlag == 1 ? '报警' : el.warnFlag == 2 ? '断开' : '未监测' },
  305. ],
  306. })
  307. });
  308. }
  309. }
  310. }
  311. onMounted(() => {
  312. getMenuList()
  313. getWindDeviceList()
  314. })
  315. onUnmounted(() => {
  316. if (timer) {
  317. clearTimeout(timer);
  318. timer = undefined;
  319. }
  320. });
  321. </script>
  322. <style lang="less" scoped>
  323. .dustWarn {
  324. width: 100%;
  325. height: 100%;
  326. padding: 80px 10px 15px 10px;
  327. box-sizing: border-box;
  328. .top-dust {
  329. display: flex;
  330. justify-content: space-between;
  331. height: 50%;
  332. margin-bottom: 15px;
  333. background: url('../../../../../assets/images/fire/border.png') no-repeat center;
  334. background-size: 100% 100%;
  335. .alarm-menu {
  336. height: 100%;
  337. width: 15%;
  338. padding: 10px;
  339. box-sizing: border-box;
  340. .card-btn {
  341. width: 100%;
  342. height: 100%;
  343. overflow-y: auto;
  344. .btn {
  345. position: relative;
  346. width: 81%;
  347. height: 24%;
  348. margin-bottom: 6%;
  349. font-family: 'douyuFont';
  350. background: url('../../../../../assets/images/fire/no-choice.png') no-repeat;
  351. background-size: 100% 100%;
  352. cursor: pointer;
  353. .text {
  354. width: 80%;
  355. position: absolute;
  356. left: 50%;
  357. top: 28px;
  358. font-size: 14px;
  359. color: #01fefc;
  360. text-align: center;
  361. transform: translate(-50%, 0);
  362. }
  363. .warn {
  364. width: 100%;
  365. position: absolute;
  366. left: 50%;
  367. bottom: 11px;
  368. font-size: 12px;
  369. color: #fff;
  370. text-align: center;
  371. transform: translate(-50%, 0);
  372. }
  373. }
  374. .btn1 {
  375. position: relative;
  376. width: 100%;
  377. height: 24%;
  378. margin-bottom: 6%;
  379. font-family: 'douyuFont';
  380. background: url('../../../../../assets/images/fire/choice.png') no-repeat;
  381. background-size: 100% 100%;
  382. cursor: pointer;
  383. .text {
  384. width: 80%;
  385. position: absolute;
  386. left: 50%;
  387. top: 28px;
  388. font-size: 14px;
  389. color: #01fefc;
  390. text-align: center;
  391. transform: translate(-62%, 0);
  392. }
  393. .warn {
  394. width: 100%;
  395. position: absolute;
  396. left: 50%;
  397. bottom: 11px;
  398. font-size: 14px;
  399. color: #fff;
  400. text-align: center;
  401. transform: translate(-60%, 0);
  402. }
  403. }
  404. }
  405. }
  406. .dust-content {
  407. display: flex;
  408. justify-content: space-between;
  409. height: 100%;
  410. width: 85%;
  411. padding: 10px 0px;
  412. box-sizing: border-box;
  413. .content-left {
  414. width: 280px;
  415. height: 100%;
  416. display: flex;
  417. flex-direction: column;
  418. justify-content: space-around;
  419. align-items: flex-start;
  420. overflow-y: auto;
  421. overflow-x: hidden;
  422. .content-left-item {
  423. position: relative;
  424. width: 272px;
  425. height: 173px;
  426. flex-shrink: 0;
  427. background: url('../../../../../assets/images/fire/dust-choice.png') no-repeat center;
  428. background-size: 100% 100%;
  429. margin: 5px 0px;
  430. .content-title {
  431. position: absolute;
  432. top: 3px;
  433. left: 50%;
  434. transform: translate(-78%, 0);
  435. font-size: 14px;
  436. color: #fff;
  437. }
  438. .content-items {
  439. position: absolute;
  440. left: 50%;
  441. transform: translate(-54%, 0);
  442. display: flex;
  443. justify-content: space-between;
  444. align-items: center;
  445. width: 240px;
  446. height: 26px;
  447. color: #fff;
  448. font-size: 14px;
  449. padding: 0px 5px;
  450. box-sizing: border-box;
  451. background: url('../../../../../assets/images/fire/dust-content.png') no-repeat center;
  452. background-size: 100% 100%;
  453. &:nth-child(2) {
  454. top: 32px;
  455. }
  456. &:nth-child(3) {
  457. top: 67px;
  458. }
  459. &:nth-child(4) {
  460. top: 102px;
  461. }
  462. &:nth-child(5) {
  463. top: 136px;
  464. }
  465. }
  466. }
  467. .content-left-item1 {
  468. position: relative;
  469. width: 250px;
  470. height: 173px;
  471. flex-shrink: 0;
  472. background: url('../../../../../assets/images/fire/dust-choice1.png') no-repeat center;
  473. background-size: 100% 100%;
  474. margin: 5px 0px;
  475. .content-title {
  476. position: absolute;
  477. top: 3px;
  478. left: 50%;
  479. transform: translate(-60%, 0);
  480. font-size: 14px;
  481. color: #fff;
  482. }
  483. .content-items {
  484. position: absolute;
  485. left: 50%;
  486. transform: translate(-54%, 0);
  487. display: flex;
  488. justify-content: space-between;
  489. align-items: center;
  490. width: 215px;
  491. height: 26px;
  492. color: #fff;
  493. font-size: 14px;
  494. padding: 0px 5px;
  495. box-sizing: border-box;
  496. background: url('../../../../../assets/images/fire/dust-content.png') no-repeat center;
  497. background-size: 100% 100%;
  498. &:nth-child(2) {
  499. top: 32px;
  500. }
  501. &:nth-child(3) {
  502. top: 67px;
  503. }
  504. &:nth-child(4) {
  505. top: 102px;
  506. }
  507. &:nth-child(5) {
  508. top: 136px;
  509. }
  510. }
  511. }
  512. }
  513. .content-right {
  514. width: calc(100% - 280px);
  515. height: 100%;
  516. .title-t {
  517. height: 30px;
  518. margin-bottom: 10px;
  519. display: flex;
  520. justify-content: space-between;
  521. align-items: center;
  522. .text-t {
  523. font-family: 'douyuFont';
  524. font-size: 14px;
  525. color: #fff;
  526. }
  527. }
  528. .echart-boxd {
  529. width: 100%;
  530. height: calc(100% - 40px);
  531. }
  532. }
  533. }
  534. }
  535. .bot-dust {
  536. height: calc(50% - 15px);
  537. background: url('../../../../../assets/images/fire/border.png') no-repeat center;
  538. background-size: 100% 100%;
  539. padding: 10px;
  540. box-sizing: border-box;
  541. .bot-area {
  542. height: 100%;
  543. padding: 10px;
  544. background: url('../../../../../assets/images/fire/bj1.png') no-repeat center;
  545. background-size: 100% 100%;
  546. box-sizing: border-box;
  547. .title-b {
  548. height: 30px;
  549. margin-bottom: 10px;
  550. display: flex;
  551. justify-content: space-between;
  552. align-items: center;
  553. .text-b {
  554. font-family: 'douyuFont';
  555. font-size: 14px;
  556. color: #fff;
  557. }
  558. }
  559. .content-b {
  560. height: calc(100% - 40px);
  561. display: flex;
  562. justify-content: flex-start;
  563. align-items: flex-start;
  564. flex-wrap: wrap;
  565. overflow-y: auto;
  566. .card-b {
  567. position: relative;
  568. width: 24%;
  569. height: 128px;
  570. margin: 0px 9px 10px 9px;
  571. background: url(/src/assets/images/fire/bot-area.png) no-repeat center;
  572. background-size: 100% 100%;
  573. .item-l {
  574. position: absolute;
  575. left: 32px;
  576. top: 50%;
  577. transform: translate(0, -50%);
  578. width: 89px;
  579. height: 98px;
  580. background: url('../../../../../assets/images/fire/bot-area1.png') no-repeat center;
  581. .label-l {
  582. width: 100%;
  583. position: absolute;
  584. top: 7px;
  585. color: #fff;
  586. font-size: 12px;
  587. text-align: center;
  588. }
  589. .value-l {
  590. width: 100%;
  591. position: absolute;
  592. top: 50px;
  593. font-family: 'douyuFont';
  594. font-size: 14px;
  595. color: #3df6ff;
  596. text-align: center;
  597. }
  598. }
  599. .item-r {
  600. position: absolute;
  601. left: 132px;
  602. top: 50%;
  603. transform: translate(0, -50%);
  604. height: 128px;
  605. padding: 5px 0px;
  606. display: flex;
  607. flex-direction: column;
  608. justify-content: space-around;
  609. box-sizing: border-box;
  610. .content-r {
  611. display: flex;
  612. span {
  613. font-size: 14px;
  614. color: #fff;
  615. &:first-child {
  616. display: inline-block;
  617. width: 68px;
  618. }
  619. &:last-child {
  620. display: inline-block;
  621. width: calc(100% - 68px);
  622. color: #01fefc;
  623. overflow: hidden;
  624. white-space: nowrap;
  625. /* 不换行 */
  626. /* 超出部分隐藏 */
  627. text-overflow: ellipsis;
  628. /* 使用省略符号 */
  629. }
  630. }
  631. .status-f {
  632. color: #ff0000;
  633. }
  634. .status-l {
  635. color: #3df6ff;
  636. }
  637. }
  638. }
  639. }
  640. }
  641. }
  642. }
  643. }
  644. </style>