projectPipeSpeedInfoCheck.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. <template>
  2. <transition
  3. appear
  4. name="animate__animated animate__move"
  5. enter-active-class="animate__zoomIn"
  6. leave-active-class="animate__zoomOut"
  7. >
  8. <div class="widget-ProjectPipeSpeedInfoCheck" v-drag>
  9. <div class="header">
  10. <span class="close">
  11. <i class="el-icon-close" @click="close()" />
  12. </span>
  13. <el-select
  14. v-model="selectPrj"
  15. placeholder="请选择"
  16. :popper-append-to-body="false"
  17. size="small"
  18. filterable
  19. clearable
  20. @change="prjChange"
  21. >
  22. <el-option
  23. v-for="item in prjOptions"
  24. :key="item.name + item.code"
  25. :label="item.name + item.code"
  26. :value="item.name"
  27. >
  28. </el-option>
  29. </el-select>
  30. <div class="title">日期选择:</div>
  31. <el-date-picker
  32. style="width: 220px"
  33. :picker-options="pickerOptions"
  34. v-model="dateValue"
  35. type="datetimerange"
  36. range-separator="-"
  37. start-placeholder="开始日期"
  38. end-placeholder="结束日期"
  39. value-format="yyyy-MM-dd HH:mm:ss"
  40. :default-time="['00:00:00', '23:59:59']"
  41. size="mini"
  42. @change="dateChange"
  43. >
  44. </el-date-picker>
  45. </div>
  46. <div class="content" v-show="dateValue">
  47. <div class="left">
  48. <img class="operationBtn" :src="buttonImg" @click="play()" />
  49. </div>
  50. <div class="right">
  51. <el-steps :active="active" finish-status="success">
  52. <el-step :title="item[0].split(' ')[0]" v-for="(item, index) in timeSteps" :key="index"></el-step>
  53. </el-steps>
  54. </div>
  55. </div>
  56. </div>
  57. </transition>
  58. </template>
  59. <script lang="ts">
  60. import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
  61. import { pbsTreeList_api, GetProgress, PipeAndNodeProcess } from '@/api/APIs'
  62. import { queryMapByAttribute } from '@/views/groupPage/util'
  63. import _ from 'lodash'
  64. import config from '@/views/groupPage/districtPageModules/customTools/config.json'
  65. import pipeInfo from '@/views/groupPage/districtPageModules/customTools/infoComponents/pipeInfo.vue'
  66. const gPipe = config.gPipe
  67. const SuperMap = (window as any).SuperMap
  68. const Cesium = (window as any).Cesium
  69. let gCustomDataSource = null
  70. let gPrimitiveCollection = null
  71. let gPpostUpdate = undefined
  72. let gHandler = null
  73. //进度查看模块
  74. @Component({ name: 'ProjectPipeSpeedInfoCheck' })
  75. export default class ProjectPipeSpeedInfoCheck extends Vue {
  76. viewer
  77. apiurls = {
  78. sjfw: '',
  79. smiddtfw: ''
  80. }
  81. pipeInfo = null
  82. prjOptions = []
  83. selectPrj: string = ''
  84. //时间戳值
  85. active: number = 0
  86. //播放变量
  87. buttonImg = ''
  88. playButtonImg = require('@/views/groupPage/images/工具栏/play.png')
  89. pauseButtonImg = require('@/views/groupPage/images/工具栏/stop.png')
  90. isPlaying = false
  91. isShowCompletion = false
  92. //日期控件
  93. dateValue = ''
  94. pickerOptions = {
  95. shortcuts: [
  96. {
  97. text: '最近一周',
  98. onClick(picker) {
  99. const end = new Date()
  100. const start = new Date()
  101. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
  102. picker.$emit('pick', [start, end])
  103. }
  104. },
  105. {
  106. text: '最近一个月',
  107. onClick(picker) {
  108. const end = new Date()
  109. const start = new Date()
  110. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
  111. picker.$emit('pick', [start, end])
  112. }
  113. },
  114. {
  115. text: '最近三个月',
  116. onClick(picker) {
  117. const end = new Date()
  118. const start = new Date()
  119. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
  120. picker.$emit('pick', [start, end])
  121. }
  122. }
  123. ]
  124. }
  125. //
  126. timeSteps: Array<string> = []
  127. //播放监听
  128. @Watch('isPlaying', { immediate: true })
  129. activeChangeMethod(val) {
  130. this.buttonImg = val ? this.pauseButtonImg : this.playButtonImg
  131. }
  132. get mapConfig() {
  133. return this.$store.state.bigScreen.mapConfig
  134. }
  135. mounted() {
  136. this.viewer = (window as any).viewer
  137. this.init()
  138. this.initPrjInfo()
  139. }
  140. //初始化数据服务地址
  141. init() {
  142. this.apiurls.sjfw = this.mapConfig.gisResource.tiplayers.config['sjfw'].url
  143. this.apiurls.smiddtfw = this.mapConfig.gisResource.tiplayers.config['bjsmidfw'].url
  144. gCustomDataSource = new Cesium.CustomDataSource('displaycontrol')
  145. this.viewer.dataSources.add(gCustomDataSource)
  146. }
  147. // 获取树状结构列表
  148. async initPrjInfo() {
  149. let res = await pbsTreeList_api({ prjId: 45 })
  150. let { result } = res
  151. this.prjOptions = result[0].structures.filter(
  152. (item) => item.levelname !== '分部工程(专业)' && item.levelname !== '部件类型'
  153. )
  154. }
  155. //开始播放
  156. play() {
  157. this.isPlaying = !this.isPlaying
  158. if (this.isPlaying) {
  159. this.loopPlayback()
  160. } else {
  161. }
  162. }
  163. @Watch('isShowCompletion')
  164. onchangeMethod(n, o) {
  165. if (n && this.isPlaying) {
  166. this.loopPlayback()
  167. }
  168. }
  169. loopPlayback() {
  170. //长度减一是因为timeSteps存储的是时间间隔
  171. if (this.active > this.timeSteps.length - 1) {
  172. this.active = 0
  173. }
  174. this.isShowCompletion = false
  175. const start = this.timeSteps[this.active][0]
  176. const end = this.timeSteps[this.active][1]
  177. const data2 = {
  178. beginDate: start.replaceAll('-', ''),
  179. endDate: end.replaceAll('-', '')
  180. }
  181. this.clearSpeedInfos()
  182. setTimeout(() => {
  183. this.initScanTimes(data2)
  184. this.active += 1
  185. }, 500)
  186. }
  187. prjChange() {
  188. this.clearSpeedInfos()
  189. this.initScanTimes({ queryText: this.selectPrj })
  190. }
  191. //时间改变
  192. dateChange() {
  193. if (!this.dateValue) {
  194. this.active = 0
  195. this.isPlaying = false
  196. this.clearSpeedInfos()
  197. return
  198. } else {
  199. this.splitTime()
  200. const start = this.dateValue[0]
  201. const end = this.dateValue[1]
  202. const data2 = {
  203. queryText: this.selectPrj,
  204. beginDate: start.replaceAll('-', ''),
  205. endDate: end.replaceAll('-', '')
  206. }
  207. this.clearSpeedInfos()
  208. this.initScanTimes(data2)
  209. // this.showSpeedInfos(start, end)
  210. }
  211. }
  212. //时间分割函数
  213. splitTime() {
  214. let start = this.dateValue[0]
  215. let end = this.dateValue[1]
  216. const startTime = start.split(' ')[0]
  217. const endTime = end.split(' ')[0]
  218. const intervalDay = (getDate(endTime).getTime() - getDate(startTime).getTime()) / (1000 * 60 * 60 * 24)
  219. if (intervalDay >= 1) {
  220. let timeArr = formatEveryDay(startTime, endTime)
  221. this.timeSteps = group(timeArr, 2)
  222. }
  223. function formatEveryDay(s, e) {
  224. let dateList = []
  225. let startTimeC = getDate(s)
  226. let endTimeC = getDate(e)
  227. while (endTimeC.getTime() - startTimeC.getTime() >= 0) {
  228. let year = startTimeC.getFullYear()
  229. let month = startTimeC.getMonth() + 1 < 10 ? '0' + (startTimeC.getMonth() + 1) : startTimeC.getMonth() + 1
  230. let day = startTimeC.getDate().toString().length == 1 ? '0' + startTimeC.getDate() : startTimeC.getDate()
  231. dateList.push(year + '-' + month + '-' + day + ' ' + start.split(' ')[1])
  232. startTimeC.setDate(startTimeC.getDate() + 1)
  233. }
  234. dateList[dateList.length - 1] = endTime + ' ' + end.split(' ')[1]
  235. return dateList
  236. }
  237. function getDate(datestr) {
  238. let temp = datestr.split('-')
  239. let date = new Date(temp[0], temp[1] - 1, temp[2])
  240. return date
  241. }
  242. function group(array, subGroupLength) {
  243. let index = 0
  244. let newArray = []
  245. while (index < array.length - 1) {
  246. newArray.push(array.slice(index, index + subGroupLength))
  247. index += 1
  248. }
  249. return newArray
  250. }
  251. }
  252. //进度信息查询
  253. initScanTimes(dateRange) {
  254. const pipe = gPipe
  255. const that = this
  256. const fieldName = 'CODE'
  257. const geourl = this.apiurls.smiddtfw
  258. PipeAndNodeProcess(dateRange)
  259. .then((result) => {
  260. console.log(result)
  261. if (result.code !== 1 || result.result.length === 0) {
  262. that.isShowCompletion = true
  263. return
  264. }
  265. const filters = []
  266. const cwpInfos = []
  267. const len = result.result.length
  268. for (let i = 0; i < len; i++) {
  269. const item = result.result[i]
  270. const pipename = item.firstLayerName.split(',')[0]
  271. const layer = _.find(pipe, function (pipeItem) {
  272. return pipeItem.origindataset === pipename
  273. })
  274. if (!layer) {
  275. continue
  276. }
  277. //组装
  278. let cwpInfo = {
  279. name: '',
  280. roadName: '',
  281. code: '',
  282. dateRange: '',
  283. design: {
  284. name: '',
  285. total: 0,
  286. pipe: 0,
  287. node: 0
  288. },
  289. spv: {
  290. name: '',
  291. pipeLen: 0,
  292. times: 0,
  293. part: 0,
  294. pictures: 0
  295. },
  296. con: {
  297. name: '',
  298. pipeLen: 0,
  299. times: 0,
  300. part: 0,
  301. pictures: 0,
  302. totalLen: 0
  303. }
  304. }
  305. cwpInfo.dateRange = dateRange.beginDate + '~' + dateRange.endDate
  306. cwpInfo.code = item.firstPbs
  307. cwpInfo.name = item.zdwName
  308. cwpInfo.roadName = item.roadName
  309. //设计
  310. const design = _.find(item.tjData, (djData) => {
  311. return djData.dataType === 'DESIGN'
  312. })
  313. if (design) {
  314. cwpInfo.design.name = design.designUnit
  315. cwpInfo.design.total = design.tfPipeLength
  316. cwpInfo.design.pipe = design.tfPipeCount
  317. cwpInfo.design.node = design.tfNodeCount
  318. }
  319. //施工
  320. const con = _.find(item.tjData, (djData) => {
  321. return djData.dataType === 'CON'
  322. })
  323. if (con) {
  324. cwpInfo.con.name = con.buildUnit
  325. cwpInfo.con.pipeLen = con.smLength
  326. cwpInfo.con.times = con.scanTimes
  327. cwpInfo.con.part = con.partsTotal
  328. cwpInfo.con.pictures = con.pictures
  329. cwpInfo.con.totalLen = con.builtLength
  330. }
  331. //监理
  332. const spv = _.find(item.tjData, (djData) => {
  333. return djData.dataType === 'SPV'
  334. })
  335. if (spv) {
  336. cwpInfo.spv.name = spv.supervisionUnit
  337. cwpInfo.spv.pipeLen = spv.smLength
  338. cwpInfo.spv.times = spv.scanTimes
  339. cwpInfo.spv.part = spv.partsTotal
  340. cwpInfo.spv.pictures = spv.pictures
  341. }
  342. cwpInfos.push(cwpInfo)
  343. //多图层搜索
  344. const queryname = layer.smidmapnameNT ? layer.smidmapnameNT : layer.smidmapname
  345. const JGFilter = new SuperMap.REST.FilterParameter({
  346. name: queryname,
  347. attributeFilter: fieldName + " = '" + item['firstPbs'] + "'",
  348. fields: [fieldName]
  349. })
  350. filters.push(JGFilter)
  351. }
  352. const onComplete = function (geoResult) {
  353. console.log('地图查询结果', geoResult)
  354. //交互事件
  355. that.getCurrentInfo()
  356. geoResult.originResult.recordsets.forEach((record) => {
  357. const features = record.features
  358. if (features.length > 1) {
  359. console.log('pbs重复')
  360. return true
  361. }
  362. if (features.length == 0) {
  363. return true
  364. }
  365. const scanProj = _.find(cwpInfos, function (scanItem) {
  366. return scanItem.code === features[0]['fieldValues'][0]
  367. })
  368. let labelText = dateRange.beginDate + '~' + dateRange.endDate
  369. let position = features[0].geometry.points[0]
  370. position = Cesium.Cartesian3.fromDegrees(position.x, position.y, position.z)
  371. that.addUnitBillboard({
  372. id: scanProj.code,
  373. name: scanProj.code,
  374. text: labelText,
  375. position: position,
  376. scanProj: scanProj
  377. })
  378. })
  379. that.isShowCompletion = true
  380. }
  381. queryMapByAttribute({
  382. url: geourl,
  383. filterParameters: filters,
  384. completed: onComplete.bind(this),
  385. failed: function (err) {
  386. console.log(err)
  387. }
  388. })
  389. })
  390. .catch((err) => {
  391. console.log(err)
  392. })
  393. }
  394. /**
  395. * 该方法用于生成部件定位指示牌
  396. * @param options entity信息
  397. * @param options.id entity ID
  398. * @param options.text 站点信息
  399. * @param options.name 站点信息
  400. * @param options.position 位置
  401. */
  402. addUnitBillboard(options) {
  403. var bottomPosition = Cesium.Cartographic.fromCartesian(options.position)
  404. var topPosition = Cesium.Cartographic.fromRadians(
  405. bottomPosition.longitude,
  406. bottomPosition.latitude,
  407. bottomPosition.height + 40
  408. )
  409. var bPosition = Cesium.Cartographic.toCartesian(bottomPosition)
  410. var tPosition = Cesium.Cartographic.toCartesian(topPosition)
  411. options.text =
  412. options.scanProj.roadName + '(' + options.scanProj.con.pipeLen + 'm,' + options.scanProj.con.part + '个)'
  413. var color = 'rgb(56, 136, 205)'
  414. var canvas = document.createElement('canvas')
  415. const ratio = 2.0
  416. let height = 50
  417. const realHeight = 48
  418. //临时数值
  419. let width = 100
  420. canvas.width = width * ratio
  421. canvas.height = height * ratio
  422. const fonttxt = '50px Arial'
  423. var ctx = canvas.getContext('2d')
  424. //ctx.scale(ratio, ratio)
  425. var img = new Image()
  426. img.src = require('@/views/groupPage/images/back.png')
  427. img.onload = function () {
  428. ctx.lineWidth = 10
  429. ctx.strokeStyle = color
  430. ctx.font = '24px Arial'
  431. const realWidth = ctx.measureText(options.text).width
  432. ctx.font = fonttxt
  433. width = ctx.measureText(options.text).width + 100
  434. canvas.width = width
  435. ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
  436. ctx.font = fonttxt
  437. ctx.fillStyle = 'rgb(255,255,255)'
  438. ctx.textBaseline = 'middle'
  439. ctx.fillText(options.text, 50, height)
  440. //ctx.fillText(options.text, (canvas.width - width) / 2, (canvas.height + 15) / 2);
  441. var entity = new Cesium.Entity({
  442. id: options.id,
  443. name: options.name,
  444. show: true,
  445. position: Cesium.Cartographic.toCartesian(topPosition),
  446. polyline: {
  447. positions: [bPosition, tPosition],
  448. material: Cesium.Color.fromBytes(56, 136, 205, 255),
  449. width: 3
  450. },
  451. billboard: {
  452. sizeInMeters: false,
  453. image: canvas,
  454. //scale:0.2,
  455. width: realWidth,
  456. height: realHeight,
  457. scaleByDistance: new Cesium.NearFarScalar(10000, 1.0, 10100, 0.5),
  458. verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  459. horizontalOrigin: Cesium.HorizontalOrigin.CENTER
  460. }
  461. })
  462. entity.displayData = options.scanProj
  463. if (!gCustomDataSource.entities.getById(options.id)) {
  464. gCustomDataSource.entities.add(entity)
  465. }
  466. }
  467. }
  468. /**
  469. * 获取当前情况
  470. */
  471. getCurrentInfo() {
  472. const pipeInfoConstructor = Vue.extend(pipeInfo)
  473. const that = this
  474. if (!this.pipeInfo) {
  475. this.pipeInfo = new pipeInfoConstructor({
  476. store: this.$store
  477. }).$mount()
  478. }
  479. this.removeLabels()
  480. gHandler = new Cesium.ScreenSpaceEventHandler(this.viewer.canvas)
  481. gHandler.setInputAction(
  482. function (movement) {
  483. var pickedObject = this.viewer.scene.pick(movement.endPosition)
  484. // 使用时,最好利用pickPositionSupported判断一下浏览器是否支持模型高度拾取
  485. if (this.viewer.scene.pickPositionSupported && Cesium.defined(pickedObject)) {
  486. let info = pickedObject.id
  487. if (info && info.displayData) {
  488. this.pipeInfo.$set(this.pipeInfo, 'displayData', info.displayData)
  489. this.pipeInfo.$set(this.pipeInfo, 'isShow', true)
  490. this.pipeInfo.$refs['widget-pipeInfo'].style.setProperty('--left', `${movement.endPosition.x}px`)
  491. this.pipeInfo.$refs['widget-pipeInfo'].style.setProperty('--top', `${movement.endPosition.y}px`)
  492. }
  493. } else {
  494. this.pipeInfo.$set(this.pipeInfo, 'isShow', false)
  495. }
  496. }.bind(this),
  497. Cesium.ScreenSpaceEventType.MOUSE_MOVE
  498. )
  499. }
  500. //清除进度信息
  501. clearSpeedInfos() {
  502. this.viewer.scene.layers.releaseSelection()
  503. this.removeLabels()
  504. this.clearPrimitives()
  505. // if (gPpostUpdate) {
  506. // gPpostUpdate()
  507. // gPpostUpdate = undefined
  508. // }
  509. }
  510. //该方法用于清除entity label
  511. removeLabels() {
  512. if (Cesium.defined(gCustomDataSource)) {
  513. gCustomDataSource.entities.removeAll()
  514. }
  515. this.otherDestroy()
  516. }
  517. otherDestroy() {
  518. if (gHandler != null && !gHandler.isDestroyed()) {
  519. gHandler.destroy()
  520. }
  521. }
  522. //该方法用于清除primitivecollection
  523. clearPrimitives() {
  524. if (gPrimitiveCollection) {
  525. gPrimitiveCollection.removeAll()
  526. const isDel = this.viewer.scene.primitives.remove(gPrimitiveCollection)
  527. if (isDel) gPrimitiveCollection = null
  528. }
  529. }
  530. close() {
  531. this.$store.state.bigScreen.isShowPipeSpeedInfoCheck = false
  532. if (this.pipeInfo) {
  533. this.pipeInfo.remove()
  534. }
  535. this.clearSpeedInfos()
  536. }
  537. }
  538. </script>
  539. <style lang='scss' scoped>
  540. .animate__zoomIn,
  541. .animate__zoomOut {
  542. animation-duration: 1s; //动画持续时间
  543. animation-delay: 0s; //动画延迟时间
  544. }
  545. .widget-ProjectPipeSpeedInfoCheck {
  546. bottom: 0.520833rem /* 100/192 */;
  547. left: calc(50% - 1.5625rem);
  548. // margin-left: -1.5625rem /* 300/192 */;
  549. width: 3.125rem /* 600/192 */;
  550. height: 0.833333rem /* 160/192 */;
  551. position: absolute;
  552. font-family: Source Han Sans CN;
  553. z-index: 999;
  554. //
  555. background: rgba(0, 60, 98, 0.7);
  556. border-radius: 4px;
  557. .header {
  558. width: 100%;
  559. height: 0.208333rem /* 40/192 */;
  560. border-bottom: 1px solid rgba(41, 177, 255, 0.3);
  561. display: flex;
  562. align-items: center;
  563. /deep/ .el-select {
  564. width: 100px;
  565. .el-input__inner {
  566. background-color: transparent;
  567. border: none;
  568. font-size: 0.072917rem /* 14/192 */;
  569. font-family: Source Han Sans CN;
  570. font-weight: 500;
  571. color: #2ba7ff;
  572. position: relative;
  573. }
  574. .el-icon-arrow-up:before {
  575. content: '';
  576. display: block;
  577. // 定义元素宽高
  578. margin-top: 0.041667rem /* 8/192 */;
  579. width: 0.130208rem /* 25/192 */;
  580. height: 0.078125rem /* 15/192 */;
  581. background: url('~@/views/groupPage/images/三角下.png') no-repeat center center;
  582. background-size: 100% 100%;
  583. transform: rotate(180deg);
  584. }
  585. }
  586. .close {
  587. position: absolute;
  588. right: 0.052083rem /* 10/192 */;
  589. color: #a3d3ff;
  590. font-size: 0.083333rem /* 16/192 */;
  591. z-index: 10;
  592. cursor: pointer;
  593. }
  594. .title {
  595. font-family: Source Han Sans CN;
  596. font-size: 0.072917rem /* 14/192 */;
  597. color: #2ba7ff;
  598. }
  599. }
  600. .content {
  601. width: 100%;
  602. height: calc(100% - 0.208333rem /* 40/192 */);
  603. display: flex;
  604. .left {
  605. width: 0.572917rem /* 110/192 */;
  606. height: 100%;
  607. display: flex;
  608. align-items: center;
  609. justify-content: center;
  610. .operationBtn {
  611. cursor: pointer;
  612. width: 0.255208rem /* 49/192 */;
  613. height: 0.255208rem /* 49/192 */;
  614. }
  615. }
  616. .right {
  617. width: calc(100% - 0.572917rem /* 110/192 */);
  618. height: 100%;
  619. padding: 0.052083rem /* 10/192 */;
  620. display: flex;
  621. align-items: flex-end;
  622. overflow-y: auto;
  623. /deep/ .el-steps {
  624. width: 100%;
  625. .el-step__icon-inner {
  626. color: transparent;
  627. }
  628. .el-step__line {
  629. top: 0.03125rem /* 6/192 */;
  630. height: 0.020833rem /* 4/192 */;
  631. background: #0ea7ff;
  632. }
  633. .el-step__head.is-success {
  634. .el-step__icon.is-text {
  635. width: 0.083333rem /* 16/192 */;
  636. height: 0.083333rem /* 16/192 */;
  637. border: 3px solid #04eaff;
  638. box-shadow: 0 0 5px #04eaff;
  639. }
  640. }
  641. .el-step__title.is-success {
  642. font-family: Source Han Sans CN;
  643. font-size: 0.0625rem /* 12/192 */;
  644. font-weight: 500;
  645. color: #04eaff;
  646. padding: 0 0.026042rem /* 5/192 */;
  647. white-space: nowrap;
  648. }
  649. .el-step__head.is-wait .el-step__icon.is-text,
  650. .el-step__head.is-process .el-step__icon.is-text {
  651. width: 0.083333rem /* 16/192 */;
  652. height: 0.083333rem /* 16/192 */;
  653. border: 3px solid #0ea7ff;
  654. }
  655. .el-step__title.is-process,
  656. .el-step__title.is-wait {
  657. font-size: 0.0625rem /* 12/192 */;
  658. font-family: Source Han Sans CN;
  659. font-weight: 500;
  660. color: #ffffff;
  661. padding: 0 0.026042rem /* 5/192 */;
  662. white-space: nowrap;
  663. }
  664. }
  665. }
  666. }
  667. }
  668. </style>