sindex copy 3.vue 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187
  1. <template>
  2. <div class="dashboard-container">
  3. <div class="background-wrapper" style="width: 2048px; height: 1152px; pointer-events: auto;z-index: 0;">
  4. <img src="../../assets/imgs/bgimg.png" alt="" style="width: 2048px;height: 1152px;">
  5. </div>
  6. <div class="main-content">
  7. <div class="header-background">
  8. <div class="header-section">
  9. <div class="main-title fontMF">电氢智运-物流集散调度中心</div>
  10. </div>
  11. <div class="time-display fontFx">
  12. <span class="margin-right-10 fontMF">{{ nowWeek }}</span>
  13. <span class="margin-right-10">{{ nowDate }}</span>
  14. {{ nowTime }}
  15. </div>
  16. </div>
  17. <div class="content-body">
  18. <div class="left-panel">
  19. <div class="section-title fontMF">当前运力分析展示</div>
  20. <div class="enterprise-statistics">
  21. <img src="../../assets/enterprise.png" alt="" class="enterprise-icon">
  22. <p class="enterprise-title">入驻企业</p>
  23. <div class="enterprise-count">
  24. <counts bg :startVal="0" :length="6" :endVal='EnterpriseStatistics' separator="" />
  25. <span>家</span>
  26. </div>
  27. </div>
  28. <div class="vehicle-stats-row-1">
  29. <div class="stat-number">
  30. <count :startVal='0' :endVal='VehicleAnalysis.entryTruck' :decimals="0" />
  31. <p>入驻车辆/辆</p>
  32. </div>
  33. <div class="stat-number">
  34. <count :startVal='0' :endVal='VehicleAnalysis.entryUnmanned' :decimals="0" />
  35. <p>入驻无人车辆</p>
  36. </div>
  37. </div>
  38. <div class="vehicle-stats-row-2">
  39. <div class="stat-number">
  40. <count :startVal='0' :endVal='VehicleAnalysis.entryDriver' :decimals="0" />
  41. <p>入驻司机/人</p>
  42. </div>
  43. <div class="stat-number">
  44. <count :startVal='0' :endVal='VehicleAnalysis.entryTotal' :decimals="0" />
  45. <p>平台磅秤/座</p>
  46. </div>
  47. </div>
  48. <div class="section-title fontMF">客户列表展示</div>
  49. <div class="customer-table">
  50. <div class="table-header flex" style="padding-left: 28px;">
  51. <div style="width: 20%;text-align: center;">客户类型</div>
  52. <div style="width: 20%;text-align: center;">使用次数</div>
  53. <div style="width: 20%;text-align: center;">货物运输量</div>
  54. <div style="width: 20%;text-align: center;">服务车辆数</div>
  55. <div style="width: 20%;text-align: center;">车辆运营时长</div>
  56. </div>
  57. <div class="table-body" style="height:480px; overflow: hidden; position: relative;">
  58. <div class="scroll-content customer-scroll-content"
  59. :style="{ transform: `translateY(-${scrollTop}px)` }" ref="scrollContentRef"
  60. @mouseenter="pauseScroll" @mouseleave="resumeScroll">
  61. <div v-for="(item, i) in customerList" :key="i" class="table-row flex"
  62. style="height: 28px;display: flex;" id="customerListRowE">
  63. <div class="row-rank">{{ item.rank }}</div>
  64. <div class="row-content">
  65. <div class="table-cell" style="width: 20%;text-align: center;">{{ item.name }}</div>
  66. <div class="table-cell" style="width: 20%;text-align: center;">{{ item.usageCount }}次
  67. </div>
  68. <div class="table-cell" style="width: 20%;text-align: center;">
  69. {{ item.transportationVolume }}</div>
  70. <div class="table-cell" style="width: 20%;text-align: center;">{{ item.serveCarCount }}
  71. </div>
  72. <div class="table-cell" style="width: 20%;text-align: center;">{{ item.duration }}</div>
  73. </div>
  74. </div>
  75. <div v-for="(item, i) in customerList" :key="'copy-' + i" class="table-row flex"
  76. style="height: 28px;">
  77. <div class="row-rank">{{ item.rank }}</div>
  78. <div class="row-content">
  79. <div class="table-cell" style="width: 20%;text-align: center;">{{ item.name }}</div>
  80. <div class="table-cell" style="width: 20%;text-align: center;">{{ item.usageCount }}次
  81. </div>
  82. <div class="table-cell" style="width: 20%;text-align: center;">
  83. {{ item.transportationVolume }}</div>
  84. <div class="table-cell" style="width: 20%;text-align: center;">{{ item.serveCarCount }}
  85. </div>
  86. <div class="table-cell" style="width: 20%;text-align: center;">{{ item.duration }}</div>
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. </div>
  92. </div>
  93. <div class="center-panel">
  94. <div class="statistics-top">
  95. <div class="statistic-item">
  96. <div class="statistic-header">
  97. <img class="statistic-icon" src="../../assets/imgs/dot.png" alt="">
  98. <div class="statistic-label fontMF">累计运单/车</div>
  99. </div>
  100. <counts bg :startVal="0" :length="6" :endVal='totalStatistics.totalOrders' separator="" />
  101. </div>
  102. <div class="statistic-item">
  103. <div class="statistic-header">
  104. <img class="statistic-icon" src="../../assets/imgs/dot.png" alt="">
  105. <div class="statistic-label fontMF">累计运载/吨</div>
  106. </div>
  107. <counts bg :startVal="0" :length="6" :endVal='totalStatistics.totalWeight' separator="" />
  108. </div>
  109. <div class="statistic-item">
  110. <div class="statistic-header">
  111. <img class="statistic-icon" src="../../assets/imgs/dot.png" alt="">
  112. <div class="statistic-label fontMF">配送中车辆数/辆</div>
  113. </div>
  114. <counts bg :startVal="0" :length="6" :endVal='totalStatistics.deliveringVehicles'
  115. separator="" />
  116. </div>
  117. </div>
  118. <div class="map-container">
  119. <img src="../../assets/imgs/map_bg.png" alt="" class="map-background">
  120. <div class="iframe-wrapper">
  121. <iframe ref="iframe" id="iframe" src="https://saas.sckaiwu.cn/wyenuxmd4j.html"
  122. frameborder="0"></iframe>
  123. </div>
  124. </div>
  125. </div>
  126. <div class="right-panel">
  127. <div class="section-title fontMF" style="margin-top: 0px;margin-left: 0 !important;">车辆入驻统计</div>
  128. <div>
  129. <Charts :eOption="vehicleStatsOption" v-if="vehicleStatsOption"
  130. style="height: 424px; width: 450px;" />
  131. </div>
  132. <div class="section-title fontMF" style="margin-top: 30px;margin-left: 0 !important;">订单执行情况</div>
  133. <div class="order-table">
  134. <div class="table-header flex">
  135. <div style="width: 28%;text-align: center;">订单号</div>
  136. <div style="width: 18%;text-align: center;">计划量/吨</div>
  137. <div style="width: 18%;text-align: center;">已装载/吨</div>
  138. <div style="width: 18%;text-align: center;">车次</div>
  139. <div style="width: 18%;text-align: center;">完成率</div>
  140. </div>
  141. <div class="table-body" style="height: 400px; overflow: hidden; position: relative;">
  142. <div class="order-scroll-content" :style="{ transform: `translateY(-${scrollTop2}px)` }"
  143. ref="scrollContentRef2" @mouseenter="pauseScroll2" @mouseleave="resumeScroll2">
  144. <div v-for="(item, i) in orderList" :key="i" class="table-row flex" style="height: 40px;">
  145. <div class="table-cell" style="width: 28%;text-align: center;">{{ item.orderId }}</div>
  146. <div class="table-cell" style="width: 18%;text-align: center;">{{ item.totalWeight }}{{
  147. item.unit }}</div>
  148. <div class="table-cell" style="width: 18%;text-align: center;">{{ item.deliveredWeight }}{{
  149. item.unit }}
  150. </div>
  151. <div class="table-cell" style="width: 18%;text-align: center;">{{ item.carNumber }}</div>
  152. <div class="progress-cell" style="width: 18%;color: #fff;">
  153. <div class="progress-bar" :style="{ width: getRadioWidth(item.progress.toFixed(0)) }">
  154. <div class="progress-indicator"></div>
  155. </div>
  156. {{ item.progress.toFixed(0) }}
  157. </div>
  158. </div>
  159. <div v-for="(item, i) in orderList" :key="'copy-' + i" class="table-row flex"
  160. style="height: 40px;">
  161. <div class="table-cell" style="width: 28%;text-align: center;">{{ item.orderId }}</div>
  162. <div class="table-cell" style="width: 18%;text-align: center;">{{ item.totalWeight }}{{
  163. item.unit }}</div>
  164. <div class="table-cell" style="width: 18%;text-align: center;">{{ item.deliveredWeight }}{{
  165. item.unit }}
  166. </div>
  167. <div class="table-cell" style="width: 18%;text-align: center;">{{ item.carNumber }}</div>
  168. <div class="progress-cell" style="width: 18%;color: #fff;">
  169. <div class="progress-bar" :style="{ width: getRadioWidth(item.progress.toFixed(0)) }">
  170. <div class="progress-indicator"></div>
  171. </div>
  172. {{ item.progress.toFixed(0) }}
  173. </div>
  174. </div>
  175. </div>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. </div>
  182. </template>
  183. <script setup>
  184. import { ref, reactive, computed, onMounted, onBeforeUnmount, defineComponent } from 'vue';
  185. import moment from 'moment';
  186. import Charts from '@/components/selfCP/charts.vue';
  187. import Chartsbar from '@/components/selfCP/chartsbar.vue';
  188. import count from './count.vue';
  189. import counts from './counts.vue';
  190. import { POST, GET } from '@/server/api/common';
  191. import * as echarts from "echarts";
  192. import { useRoute } from 'vue-router';
  193. import { getCurrentInstance } from 'vue';
  194. const { appContext } = getCurrentInstance();
  195. const $config = appContext.config.globalProperties.$config;
  196. // 注册组件
  197. const components = { Charts, Chartsbar, count, counts };
  198. // 响应式数据
  199. const nowWeek = ref('');
  200. const nowDate = ref('');
  201. const nowTime = ref('');
  202. const tabIndex = ref(1);
  203. let newTimer = null;
  204. let time1 = null;
  205. let time2 = null;
  206. let mineId = ref(null);
  207. const route = useRoute();
  208. function getNowTime() {
  209. let date = new Date();
  210. nowDate.value =
  211. date.getFullYear() +
  212. '.' +
  213. (date.getMonth() + 1 >= 10 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1)) +
  214. '.' +
  215. (date.getDate() >= 10 ? date.getDate() : '0' + date.getDate());
  216. nowTime.value =
  217. date.getHours() +
  218. ':' +
  219. (date.getMinutes() >= 10 ? date.getMinutes() : '0' + date.getMinutes()) +
  220. ':' +
  221. (date.getSeconds() >= 10 ? date.getSeconds() : '0' + date.getSeconds());
  222. let weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  223. nowWeek.value = weeks[date.getDay()];
  224. }
  225. function getApiUrl() {
  226. getEnterpriseStatistics()
  227. getVehicleAnalysis()
  228. getCustomerList()
  229. getTotalStatistics()
  230. getCarStatistics()
  231. getOrders()
  232. }
  233. const EnterpriseStatistics = ref(0)
  234. const orderSituationList = ref([])
  235. function getEnterpriseStatistics() {
  236. GET($config.enterpriseStatistics.url).then((res) => {
  237. EnterpriseStatistics.value = res.data.data.total
  238. })
  239. }
  240. const VehicleAnalysis = ref({
  241. "entryTruck": 0,
  242. "entryDriver": 0,
  243. "entryUnmanned": 0,
  244. "entryTotal": 0
  245. })
  246. function getVehicleAnalysis() {
  247. GET($config.vehicleAnalysis.url).then((res) => {
  248. VehicleAnalysis.value = res.data.data
  249. })
  250. }
  251. const customerList = ref([])
  252. function getCustomerList() {
  253. GET($config.customerList.url).then((res) => {
  254. customerList.value = res.data.data.list
  255. setTimeout(() => {
  256. startScroll();
  257. }, 500);
  258. })
  259. }
  260. const orderList = ref([])
  261. function getOrders() {
  262. GET($config.orders.url).then((res) => {
  263. orderList.value = res.data.data.orders
  264. startScroll2();
  265. })
  266. }
  267. const totalStatistics = ref({
  268. "totalOrders": 0,
  269. "totalWeight": 0,
  270. "deliveringVehicles": 0
  271. })
  272. function getTotalStatistics() {
  273. GET($config.totalStatistics.url).then((res) => {
  274. totalStatistics.value = res.data.data
  275. })
  276. }
  277. function getCarStatistics() {
  278. GET($config.carStatistics.url).then((res) => {
  279. console.log(res);
  280. vehicleStatsOption.value = {
  281. backgroundColor: 'transparent',
  282. title: {
  283. text: '入驻数量',
  284. left: '20px',
  285. top: '20px',
  286. textStyle: {
  287. color: '#fff',
  288. fontSize: 16,
  289. fontWeight: 'normal'
  290. }
  291. },
  292. legend: {
  293. data: ['入驻司机', '登记车辆', '无人车辆'],
  294. right: '20px',
  295. top: '20px',
  296. textStyle: {
  297. color: '#fff',
  298. fontSize: 12
  299. },
  300. itemWidth: 8,
  301. itemHeight: 8,
  302. icon: 'rect'
  303. },
  304. grid: {
  305. left: '3%',
  306. right: '5%',
  307. bottom: '5%',
  308. top: '20%',
  309. containLabel: true
  310. },
  311. xAxis: {
  312. type: 'category',
  313. data: res.data.data.categories,
  314. axisLine: {
  315. lineStyle: {
  316. color: '#2a4b7c'
  317. }
  318. },
  319. axisLabel: {
  320. color: '#8892b0',
  321. fontSize: 10
  322. },
  323. axisTick: {
  324. show: false
  325. }
  326. },
  327. yAxis: {
  328. type: 'value',
  329. max: 800,
  330. interval: 100,
  331. axisLine: {
  332. show: false
  333. },
  334. axisTick: {
  335. show: false
  336. },
  337. axisLabel: {
  338. color: '#8892b0',
  339. fontSize: 12
  340. },
  341. splitLine: {
  342. show: true,
  343. lineStyle: {
  344. color: '#1e3a5f',
  345. type: 'solid',
  346. width: 1
  347. }
  348. }
  349. },
  350. series: [
  351. {
  352. name: '入驻司机',
  353. type: 'bar',
  354. data: res.data.data.series[0].data,
  355. barWidth: 9,
  356. barGap: '0%',
  357. itemStyle: {
  358. color: '#1890ff',
  359. borderRadius: [0, 0, 0, 0]
  360. },
  361. showBackground: true, // 开启背景
  362. backgroundStyle: {
  363. color: 'rgba(180, 180, 180, 0.2)', // 背景颜色
  364. },
  365. },
  366. {
  367. name: '登记车辆',
  368. type: 'bar',
  369. data: res.data.data.series[1].data,
  370. barWidth: 9,
  371. itemStyle: {
  372. color: '#52c41a',
  373. borderRadius: [0, 0, 0, 0]
  374. },
  375. showBackground: true, // 开启背景
  376. backgroundStyle: {
  377. color: 'rgba(180, 180, 180, 0.2)', // 背景颜色
  378. },
  379. },
  380. {
  381. name: '无人车辆',
  382. type: 'bar',
  383. data: res.data.data.series[2].data,
  384. barWidth: 9,
  385. itemStyle: {
  386. color: '#13c2c2',
  387. borderRadius: [0, 0, 0, 0]
  388. },
  389. showBackground: true, // 开启背景
  390. backgroundStyle: {
  391. color: 'rgba(180, 180, 180, 0.2)', // 背景颜色
  392. },
  393. }
  394. ]
  395. }
  396. })
  397. }
  398. function getRadioWidth(pct) {
  399. let width = (76 / 100) * parseFloat(pct);
  400. return width + 'px';
  401. }
  402. const scrollTop = ref(0);
  403. const scrollContentRef = ref(null);
  404. let scrollTimer = null;
  405. let rowHeight = 26; // 单行高度,和上面style一致
  406. let pause = false;
  407. function startScroll() {
  408. if (scrollTimer) clearInterval(scrollTimer);
  409. scrollTimer = setInterval(() => {
  410. if (pause) return;
  411. scrollTop.value += 1;
  412. // 滚动到一半(即原始数据高度)后重置
  413. if (customerList.value.length > 0 && scrollTop.value >= rowHeight * customerList.value.length) {
  414. scrollTop.value = 0;
  415. }
  416. }, 30); // 速度可调
  417. }
  418. function pauseScroll() {
  419. pause = true;
  420. }
  421. function resumeScroll() {
  422. pause = false;
  423. }
  424. const scrollTop2 = ref(0);
  425. const scrollContentRef2 = ref(null);
  426. let scrollTimer2 = null;
  427. const rowHeight2 = 40;
  428. let pause2 = false;
  429. function startScroll2() {
  430. if (scrollTimer2) clearInterval(scrollTimer2);
  431. scrollTimer2 = setInterval(() => {
  432. if (pause2) return;
  433. scrollTop2.value += 1;
  434. if (orderList.value.length > 0 && scrollTop2.value >= rowHeight2 * orderList.value.length) {
  435. scrollTop2.value = 0;
  436. }
  437. }, 30);
  438. }
  439. function pauseScroll2() {
  440. pause2 = true;
  441. }
  442. function resumeScroll2() {
  443. pause2 = false;
  444. }
  445. // script setup 区域增加车辆统计图表配置
  446. // 重新配置车辆统计图表,为每个柱子组合添加背景
  447. const vehicleStatsOption = ref(null);
  448. onMounted(() => {
  449. getNowTime();
  450. newTimer = setInterval(getNowTime, 1000);
  451. if (route.query && route.query.companyId) {
  452. mineId.value = route.query.companyId;
  453. }
  454. getApiUrl();
  455. moment.locale('zh-cn');
  456. // clearInterval(time1);
  457. // clearInterval(time2);
  458. // time1 = setInterval(getdata, $config.time * 1000);
  459. // time2 = setInterval(getdatas, $config.time1 * 1000);
  460. });
  461. onBeforeUnmount(() => {
  462. clearInterval(newTimer);
  463. newTimer = null;
  464. if (scrollTimer) clearInterval(scrollTimer);
  465. if (scrollTimer2) clearInterval(scrollTimer2);
  466. });
  467. </script>
  468. <style lang="less" scoped>
  469. @font-face {
  470. font-family: MFLiHei;
  471. src: url('../../assets/font/MFLiHei_Noncommercial-Regular.otf') format('opentype');
  472. }
  473. @font-face {
  474. font-family: FXLed;
  475. src: url('../../assets/font/DSDIGI1.ttf');
  476. }
  477. .fontMF {
  478. font-family: MFLiHei;
  479. }
  480. .fontFx {
  481. font-family: FXLed;
  482. }
  483. .flex {
  484. display: flex;
  485. align-items: center;
  486. }
  487. .MR40 {
  488. margin-right: 40px;
  489. }
  490. .margin-right-10 {
  491. margin-right: 10px;
  492. }
  493. .vehicle-stats-row-2 {
  494. height: 98px;
  495. width: 398px;
  496. background: url(../../assets/zhibiao2.png) no-repeat;
  497. background-size: 100%;
  498. display: flex;
  499. color: #fff;
  500. padding-right: 98px;
  501. box-sizing: border-box;
  502. margin: 0 auto;
  503. padding-bottom: 4px;
  504. .stat-number {
  505. width: 50%;
  506. text-align: center;
  507. display: flex;
  508. flex-direction: column;
  509. font-family: FXLed;
  510. font-weight: normal;
  511. font-size: 23px;
  512. color: #FFFFFF;
  513. margin-bottom: 0;
  514. align-items: center;
  515. justify-content: center;
  516. line-height: 23px;
  517. }
  518. p {
  519. font-size: 12px;
  520. line-height: 12px;
  521. margin-top: 4px;
  522. }
  523. }
  524. .enterprise-statistics {
  525. width: 314px;
  526. height: 95px;
  527. background: rgba(255, 255, 255, 0.1);
  528. padding-top: 12px;
  529. padding-left: 75px;
  530. box-sizing: border-box;
  531. position: relative;
  532. margin-left: 96px;
  533. margin-top: 40px;
  534. .enterprise-icon {
  535. position: absolute;
  536. width: 125px;
  537. height: 125px;
  538. left: -67.5px;
  539. top: -20px;
  540. }
  541. .enterprise-title {
  542. font-family: MFLiHei;
  543. font-weight: 400;
  544. font-size: 19px;
  545. color: #FFFFFF;
  546. }
  547. .enterprise-count {
  548. span {
  549. color: #fff;
  550. margin-left: 4px;
  551. line-height: 40px;
  552. position: relative;
  553. top: 8px;
  554. }
  555. }
  556. }
  557. .vehicle-stats-row-1 {
  558. margin-top: 10px;
  559. height: 98px;
  560. width: 398px;
  561. background: url(../../assets/zhibiao1.png) no-repeat;
  562. background-size: 100%;
  563. display: flex;
  564. color: #fff;
  565. padding-left: 98px;
  566. box-sizing: border-box;
  567. margin: 0 auto;
  568. padding-bottom: 4px;
  569. margin-top: 20px;
  570. .stat-number {
  571. width: 50%;
  572. text-align: center;
  573. display: flex;
  574. flex-direction: column;
  575. font-family: FXLed;
  576. font-weight: normal;
  577. font-size: 23px;
  578. color: #FFFFFF;
  579. margin-bottom: 0;
  580. align-items: center;
  581. justify-content: center;
  582. line-height: 23px;
  583. }
  584. p {
  585. font-size: 12px;
  586. line-height: 12px;
  587. margin-top: 4px;
  588. }
  589. }
  590. .dashboard-container {
  591. width: 100%;
  592. height: 100%;
  593. overflow: hidden;
  594. position: relative;
  595. .main-content {
  596. position: absolute;
  597. top: 0;
  598. left: 0;
  599. height: 100%;
  600. z-index: 1;
  601. width: 100%;
  602. padding: 0px;
  603. .header-background {
  604. width: 2048px;
  605. height: 113px;
  606. z-index: 0;
  607. transform: rotate(0deg);
  608. opacity: 1;
  609. // pointer-events: none;
  610. position: relative;
  611. }
  612. .header-section {
  613. position: absolute !important;
  614. margin: 0 !important;
  615. width: 2048px;
  616. height: 113px;
  617. display: flex;
  618. justify-content: space-between;
  619. background-image: url(../../assets/imgs/title_bg.png);
  620. background-repeat: no-repeat;
  621. background-size: 100% 100%;
  622. .main-title {
  623. text-align: center;
  624. line-height: 25px;
  625. flex: 1;
  626. padding: 25px 0;
  627. pointer-events: auto;
  628. color: rgb(255, 255, 255);
  629. font-weight: 400;
  630. font-size: 40px;
  631. writing-mode: horizontal-tb;
  632. letter-spacing: 0px;
  633. text-overflow: ellipsis;
  634. white-space: nowrap;
  635. overflow: hidden;
  636. }
  637. }
  638. .tab-button {
  639. position: absolute;
  640. width: 257px;
  641. height: 39px;
  642. background-size: 100% 100%;
  643. background-repeat: no-repeat;
  644. font-family: MF LiHei;
  645. font-weight: 400;
  646. font-size: 18px;
  647. color: #FFFFFF;
  648. line-height: 39px;
  649. text-align: center;
  650. cursor: pointer;
  651. }
  652. .left-tab {
  653. background-image: url(../../assets/imgs/tab_l.png);
  654. left: 270px;
  655. top: 15px;
  656. text-indent: 40px;
  657. }
  658. .left-tab-active {
  659. background-image: url(../../assets/imgs/tab_led.png);
  660. }
  661. .right-tab {
  662. background-image: url(../../assets/imgs/tab_r.png);
  663. right: 270px;
  664. top: 15px;
  665. text-indent: -30px;
  666. }
  667. .right-tab-active {
  668. background-image: url(../../assets/imgs/tab_red.png);
  669. }
  670. .time-display {
  671. position: fixed;
  672. right: 50px;
  673. height: 30px;
  674. line-height: 30px;
  675. font-size: 16px;
  676. top: 8px;
  677. color: #fff;
  678. }
  679. .content-body {
  680. display: flex;
  681. justify-content: center;
  682. .left-panel {
  683. width: 484px;
  684. height: 1010px;
  685. background-image: url(../../assets/imgs/left_bg.png);
  686. background-size: 100% 100%;
  687. background-repeat: no-repeat;
  688. padding: 20px;
  689. box-sizing: border-box;
  690. .quantity-display {
  691. color: #FFFFFF;
  692. font-size: 28px;
  693. font-weight: bold;
  694. letter-spacing: 0;
  695. display: flex;
  696. align-items: baseline;
  697. .quantity-prefix {
  698. font-size: 16px;
  699. margin-right: 8px;
  700. }
  701. .quantity-unit {
  702. margin-left: 8px;
  703. font-size: 14px;
  704. color: #FFFFFF;
  705. font-weight: bolder;
  706. vertical-align: super;
  707. font-family: Microsoft Yahei;
  708. }
  709. }
  710. .section-title {
  711. width: 313px;
  712. height: 24px;
  713. background-image: url(../../assets/imgs/tits_bg.png);
  714. background-size: 100% 100%;
  715. background-repeat: no-repeat;
  716. font-weight: 400;
  717. font-size: 18px;
  718. color: #FFFFFF;
  719. text-indent: 25px;
  720. margin-top: 10px;
  721. line-height: 15px;
  722. }
  723. .carbox {
  724. display: flex;
  725. align-items: center;
  726. padding-left: 40px;
  727. margin-top: 30px;
  728. .carimg {
  729. width: 97px;
  730. height: 88px;
  731. }
  732. .cardes {
  733. margin-left: 35px;
  734. .cart {
  735. font-weight: 400;
  736. font-size: 18px;
  737. color: #FFFFFF;
  738. }
  739. }
  740. }
  741. .z_box {
  742. margin-top: 30px;
  743. display: flex;
  744. align-items: center;
  745. .l_box {
  746. width: 190px;
  747. height: 160px;
  748. background: rgba(255, 255, 255, 0.1);
  749. display: flex;
  750. flex-flow: column;
  751. justify-content: center;
  752. align-items: center;
  753. .l_img {
  754. width: 156px;
  755. height: 86px;
  756. }
  757. .l_tit {
  758. font-weight: 400;
  759. font-size: 16px;
  760. color: #FFFFFF;
  761. }
  762. }
  763. .r_box {
  764. margin-left: 20px;
  765. .b_item {
  766. width: 200px;
  767. height: 70px;
  768. background: rgba(255, 255, 255, 0.1);
  769. display: flex;
  770. align-items: center;
  771. // justify-content: center;
  772. .l_img {
  773. width: 108px;
  774. height: 59px;
  775. margin-left: -20px;
  776. }
  777. .b_des {
  778. margin-left: 16px;
  779. .b_tit {
  780. font-weight: 400;
  781. font-size: 16px;
  782. color: #FFFFFF;
  783. }
  784. }
  785. }
  786. }
  787. }
  788. .customer-table {
  789. width: 420px;
  790. margin: 0 auto;
  791. margin-top: 20px;
  792. height: 360px;
  793. .table-header {
  794. color: #ffffff;
  795. font-size: 12px;
  796. padding: 9px 0;
  797. }
  798. .table-body {
  799. .seamless-warp {
  800. overflow: hidden;
  801. height: 360px;
  802. // height: 390px;
  803. width: 100%;
  804. }
  805. }
  806. th {
  807. text-align: left;
  808. font-size: 12px;
  809. font-weight: 400;
  810. color: #ffffff;
  811. line-height: 30px;
  812. // background-color: rgb(0, 80, 179);
  813. }
  814. .table-cell {
  815. font-size: 12px;
  816. font-weight: 400;
  817. color: #ffffff;
  818. line-height: 30px;
  819. }
  820. .table-row:nth-child(2n+1) {
  821. // background-color: #032255;
  822. background-color: rgba(255, 255, 255, 0.1);
  823. }
  824. .progress-cell {
  825. display: flex;
  826. align-items: center;
  827. color: #ffffff;
  828. font-size: 12px;
  829. .progress-bar {
  830. position: relative;
  831. min-width: 6px;
  832. height: 10px;
  833. background: linear-gradient(90deg, #29abe3, #01ffff);
  834. margin-right: 4px;
  835. .progress-indicator {
  836. width: 6px;
  837. height: 16px;
  838. background: #ffffff;
  839. position: absolute;
  840. top: -3px;
  841. right: 0;
  842. }
  843. }
  844. }
  845. }
  846. .nitem {
  847. display: flex;
  848. align-items: center;
  849. .nimg {
  850. width: 216px;
  851. height: 122px;
  852. position: relative;
  853. z-index: 2;
  854. }
  855. .ndes {
  856. width: 220px;
  857. height: 70px;
  858. background: rgba(255, 255, 255, 0.1);
  859. display: flex;
  860. margin-left: -50px;
  861. position: relative;
  862. z-index: 1;
  863. }
  864. .mc {
  865. margin-left: 30px;
  866. margin-top: 24px;
  867. }
  868. }
  869. }
  870. }
  871. .center-panel {
  872. .statistics-top {
  873. width: 1018px;
  874. height: 138px;
  875. background-image: url(../../assets/imgs/mid_tbg.png);
  876. background-size: 100% 100%;
  877. background-repeat: no-repeat;
  878. display: flex;
  879. align-items: center;
  880. justify-content: center;
  881. .statistic-item {
  882. display: flex;
  883. flex-flow: column;
  884. align-items: center;
  885. flex: 1;
  886. .statistic-header {
  887. display: flex;
  888. align-items: center;
  889. margin-bottom: 12px;
  890. .statistic-icon {
  891. width: 20px;
  892. height: 20px;
  893. }
  894. .statistic-label {
  895. margin-left: 8px;
  896. font-weight: 500;
  897. font-size: 18px;
  898. color: #FFFFFF;
  899. }
  900. }
  901. }
  902. }
  903. .map-container {
  904. margin-top: 14px;
  905. width: 1018px;
  906. height: 860px;
  907. // width: 1018px;
  908. // height: 658px;
  909. // background-image: url(../../assets/imgs/map_bg.png);
  910. // background-size: 100% 100%;
  911. // background-repeat: no-repeat;
  912. // margin-top: 14px;
  913. position: relative;
  914. box-sizing: border-box;
  915. .map-background {
  916. width: 1018px;
  917. height: 100%;
  918. position: absolute;
  919. z-index: 1;
  920. pointer-events: none;
  921. }
  922. .iframe-wrapper {
  923. position: absolute;
  924. // background-image: url(../../assets/img/iframe_bg.png);
  925. // background-repeat: no-repeat;
  926. // background-size: 100% 100%;
  927. overflow: hidden;
  928. height: 100%;
  929. padding-bottom: 20px;
  930. box-sizing: border-box;
  931. #iframe {
  932. // margin: 10px 12px;
  933. margin: 0 auto;
  934. margin-left: 10px;
  935. margin-top: 10px;
  936. width: 998px;
  937. height: 100%;
  938. z-index: 0;
  939. // border-radius: 30px;
  940. }
  941. }
  942. }
  943. .mid_b {
  944. padding: 20px;
  945. box-sizing: border-box;
  946. width: 1018px;
  947. height: 190px;
  948. background-image: url(../../assets/imgs/mid_bbg.png);
  949. background-size: 100% 100%;
  950. background-repeat: no-repeat;
  951. margin-top: 10px;
  952. .tt {
  953. width: 313px;
  954. height: 24px;
  955. background-image: url(../../assets/imgs/tits_bg.png);
  956. background-size: 100% 100%;
  957. background-repeat: no-repeat;
  958. font-weight: 400;
  959. font-size: 18px;
  960. color: #FFFFFF;
  961. text-indent: 25px;
  962. line-height: 15px;
  963. margin-top: 10px;
  964. margin-left: 10px;
  965. }
  966. }
  967. }
  968. .right-panel {
  969. width: 484px;
  970. height: 1010px;
  971. background-image: url(../../assets/imgs/right_bg.png);
  972. background-size: 100% 100%;
  973. background-repeat: no-repeat;
  974. padding: 30px;
  975. box-sizing: border-box;
  976. .section-title {
  977. width: 313px;
  978. height: 24px;
  979. background-image: url(../../assets/imgs/tits_bg.png);
  980. background-size: 100% 100%;
  981. background-repeat: no-repeat;
  982. font-weight: 400;
  983. font-size: 18px;
  984. color: #FFFFFF;
  985. text-indent: 25px;
  986. line-height: 15px;
  987. margin-top: 10px;
  988. margin-left: 10px;
  989. }
  990. .order-table {
  991. width: 424px;
  992. margin: 0 auto;
  993. .table-header {
  994. color: #fff;
  995. padding: 9px 0;
  996. font-size: 12px;
  997. }
  998. .table-body {
  999. .seamless-warp {
  1000. overflow: hidden;
  1001. height: 900px;
  1002. width: 424px;
  1003. }
  1004. }
  1005. th {
  1006. text-align: left;
  1007. font-size: 12px;
  1008. font-weight: 400;
  1009. color: #ffffff;
  1010. line-height: 30px;
  1011. }
  1012. .table-cell {
  1013. font-size: 12px;
  1014. font-weight: 400;
  1015. color: #ffffff;
  1016. line-height: 30px;
  1017. }
  1018. .table-row:nth-child(even) {
  1019. background-color: rgba(255, 255, 255, 0.1);
  1020. // background-color: rgba(255, 255, 255, 0.399);
  1021. }
  1022. .progress-cell {
  1023. display: flex;
  1024. align-items: center;
  1025. font-size: 12px;
  1026. .progress-bar {
  1027. position: relative;
  1028. min-width: 6px;
  1029. height: 10px;
  1030. background: linear-gradient(90deg, #29abe3, #01ffff);
  1031. margin-right: 4px;
  1032. .progress-indicator {
  1033. width: 6px;
  1034. height: 16px;
  1035. background: #ffffff;
  1036. position: absolute;
  1037. top: -3px;
  1038. right: 0;
  1039. }
  1040. }
  1041. }
  1042. }
  1043. }
  1044. }
  1045. }
  1046. .scroll-content {
  1047. transition: transform 0.1s linear;
  1048. will-change: transform;
  1049. }
  1050. .order-scroll-content {
  1051. transition: transform 0.1s linear;
  1052. will-change: transform;
  1053. }
  1054. .customer-scroll-content {
  1055. .row-rank {
  1056. width: 28px;
  1057. height: 28px;
  1058. background: linear-gradient(90deg, #0067FF, #3A93FF);
  1059. text-align: center;
  1060. color: #fff;
  1061. }
  1062. .row-content {
  1063. display: flex;
  1064. flex: 1;
  1065. }
  1066. }
  1067. </style>