15902849627 há 5 meses atrás
pai
commit
f586b11b13

+ 1 - 0
.vercel/project.json

@@ -0,0 +1 @@
+{"projectName":"trae_te5smm8z"}

+ 21 - 11
index.html

@@ -1,13 +1,23 @@
 <!DOCTYPE html>
 <html lang="">
-  <head>
-    <meta charset="UTF-8">
-    <link rel="icon" href="/favicon.ico">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>矿拉拉-物流集散调度中心-4K</title>
-  </head>
-  <body>
-    <div id="app"></div>
-    <script type="module" src="/src/main.js"></script>
-  </body>
-</html>
+
+<head>
+  <meta charset="UTF-8">
+  <link rel="icon" href="/favicon.ico">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>矿拉拉-物流集散调度中心-4K</title>
+  <script type="text/javascript">
+    window._AMapSecurityConfig = {
+      securityJsCode: '9efc11f37ef661f53c0888463f8d9f7e',
+    }
+  </script>
+  <script type="text/javascript"
+    src="https://webapi.amap.com/maps?v=2.0&key=1bb842e2ef7bc5cc8d4d5aaa5de6b5c6&&plugin=AMap.Scale"></script>
+</head>
+
+<body>
+  <div id="app"></div>
+  <script type="module" src="/src/main.js"></script>
+</body>
+
+</html>

+ 29 - 70
public/public.json

@@ -1,73 +1,32 @@
 {
-    "api1": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte",
-    "time": 10,
-    "time1": 300,
-    "taskList":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/task",
-        "name": "运单简要"
-    },
-    "totalTasks":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=total_tasks",
-        "name": "累计运单"
-    },
-    "totalWeight":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=total_weight",
-        "name": "累计装载"
-    },
-    "totalRunnings":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=total_running",
-        "name": "运行中"
-    },
-    "totalEntry":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=wait_entry",
-        "name": "等待进场"
-    },
-    "running":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=running",
-        "name": "配送中"
-    },
-    "order":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/order",
-        "name": "订单"
-    },
-    "todayTasks":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=today_tasks",
-        "name": "今日运单"
-    },
-    "todayWeight":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=today_weight",
-        "name": "今日装载"
-    },
-    "customerTask":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/chart?type=customer_task",
-        "name": "车次排行"
-    },
-    "taskTable":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/chart?type=task_table",
-        "name": "运力车次趋势分析"
-    },
-    "truckRegister":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/chart?type=truck_register",
-        "name": "车辆入驻统计"
-    },
-    "newTruck":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=new_truck_ore",
-        "name": "新能源车辆"
-    },
-    "truckH2":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=truck_h2",
-        "name": "氢能源车辆"
-    },
-    "truckOre":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=truck_ore",
-        "name": "传统能源车辆"
-    },
-    "runningTruckType":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=running_truck_type",
-        "name": "运行中车辆分布:"
-    },
-    "registerTruckOption":{
-        "url": "https://saas.sckaiwu.cn/wfatnLZJFkYyDRte/bigscreen/logistics/total?type=register_truck",
-        "name": "入住车型分布图"
+    "api": "http://47.109.177.149:8080/hitf/v2p/public/rest/invoke/",
+    "time": 30,
+    "orders":{
+        "url": "http://47.109.177.149:8080/hitf/v2p/public/rest/invoke/SFpFUk86S1cuTk9USUNFQk9BUkQ6aHNzYy1vcC1idXNpbmVzcy5ub3RpY2Vib2FyZC5vcmRlclByb2dyZXNz",
+        "name": "订单执行情况"
+    },
+    "carStatistics":{
+        "url": "http://47.109.177.149:8080/hitf/v2p/public/rest/invoke/SFpFUk86S1cuTk9USUNFQk9BUkQ6aHNzYy1vcC1idXNpbmVzcy5ub3RpY2Vib2FyZC52ZWhpY2xlRW50cnlTdGF0",
+        "name": "车辆入驻统计(柱状图)"
+    },
+    "totalStatistics":{
+        "url": "http://47.109.177.149:8080/hitf/v2p/public/rest/invoke/SFpFUk86S1cuTk9USUNFQk9BUkQ6aHNzYy1vcC1idXNpbmVzcy5ub3RpY2Vib2FyZC5zdGF0aXN0aWNzU3VtbWFyeQ==",
+        "name": "累计运单/累计运载/配送中车辆数"
+    },
+    "mapData":{
+        "url": "http://47.109.177.149:8080/hitf/v2p/public/rest/invoke/SFpFUk86S1cuTk9USUNFQk9BUkQ6aHNzYy1vcC1idXNpbmVzcy5ub3RpY2Vib2FyZC5tYXBNYXJrZXJz",
+        "name": "地图车辆与企业分布"
+    },
+    "customerList":{
+        "url": "http://47.109.177.149:8080/hitf/v2p/public/rest/invoke/SFpFUk86S1cuTk9USUNFQk9BUkQ6aHNzYy1vcC1idXNpbmVzcy5ub3RpY2Vib2FyZC5jdXN0b21lckxpc3Q=",
+        "name": "客户列表"
+    },
+     "vehicleAnalysis":{
+        "url": "http://47.109.177.149:8080/hitf/v2p/public/rest/invoke/SFpFUk86S1cuTk9USUNFQk9BUkQ6aHNzYy1vcC1idXNpbmVzcy5ub3RpY2Vib2FyZC52ZWhpY2xlQW5hbHlzaXM=",
+        "name": "入驻车辆分析"
+    },
+    "enterpriseStatistics":{
+        "url": "http://47.109.177.149:8080/hitf/v2p/public/rest/invoke/SFpFUk86S1cuTk9USUNFQk9BUkQ6aHNzYy1vcC1idXNpbmVzcy5ub3RpY2Vib2FyZC5lbnRlcnByaXNlU3VtbWFyeQ==",
+        "name": "入驻企业统计"
     }
 }

BIN
src/assets/car.png


BIN
src/assets/marker1.png


+ 1187 - 0
src/components/page/sindex copy 3.vue

@@ -0,0 +1,1187 @@
+<template>
+    <div class="dashboard-container">
+        <div class="background-wrapper" style="width: 2048px; height: 1152px; pointer-events: auto;z-index: 0;">
+            <img src="../../assets/imgs/bgimg.png" alt="" style="width: 2048px;height: 1152px;">
+        </div>
+        <div class="main-content">
+            <div class="header-background">
+                <div class="header-section">
+                    <div class="main-title fontMF">电氢智运-物流集散调度中心</div>
+                </div>
+
+                <div class="time-display fontFx">
+                    <span class="margin-right-10 fontMF">{{ nowWeek }}</span>
+                    <span class="margin-right-10">{{ nowDate }}</span>
+                    {{ nowTime }}
+                </div>
+            </div>
+            <div class="content-body">
+                <div class="left-panel">
+                    <div class="section-title fontMF">当前运力分析展示</div>
+                    <div class="enterprise-statistics">
+                        <img src="../../assets/enterprise.png" alt="" class="enterprise-icon">
+                        <p class="enterprise-title">入驻企业</p>
+                        <div class="enterprise-count">
+                            <counts bg :startVal="0" :length="6" :endVal='EnterpriseStatistics' separator="" />
+                            <span>家</span>
+                        </div>
+                    </div>
+                    <div class="vehicle-stats-row-1">
+                        <div class="stat-number">
+                            <count :startVal='0' :endVal='VehicleAnalysis.entryTruck' :decimals="0" />
+                            <p>入驻车辆/辆</p>
+                        </div>
+                        <div class="stat-number">
+                            <count :startVal='0' :endVal='VehicleAnalysis.entryUnmanned' :decimals="0" />
+                            <p>入驻无人车辆</p>
+                        </div>
+                    </div>
+                    <div class="vehicle-stats-row-2">
+                        <div class="stat-number">
+                            <count :startVal='0' :endVal='VehicleAnalysis.entryDriver' :decimals="0" />
+                            <p>入驻司机/人</p>
+                        </div>
+                        <div class="stat-number">
+                            <count :startVal='0' :endVal='VehicleAnalysis.entryTotal' :decimals="0" />
+                            <p>平台磅秤/座</p>
+                        </div>
+                    </div>
+                    <div class="section-title fontMF">客户列表展示</div>
+                    <div class="customer-table">
+                        <div class="table-header flex" style="padding-left: 28px;">
+                            <div style="width: 20%;text-align: center;">客户类型</div>
+                            <div style="width: 20%;text-align: center;">使用次数</div>
+                            <div style="width: 20%;text-align: center;">货物运输量</div>
+                            <div style="width: 20%;text-align: center;">服务车辆数</div>
+                            <div style="width: 20%;text-align: center;">车辆运营时长</div>
+                        </div>
+                        <div class="table-body" style="height:480px; overflow: hidden; position: relative;">
+                            <div class="scroll-content customer-scroll-content"
+                                :style="{ transform: `translateY(-${scrollTop}px)` }" ref="scrollContentRef"
+                                @mouseenter="pauseScroll" @mouseleave="resumeScroll">
+                                <div v-for="(item, i) in customerList" :key="i" class="table-row flex"
+                                    style="height: 28px;display: flex;" id="customerListRowE">
+                                    <div class="row-rank">{{ item.rank }}</div>
+                                    <div class="row-content">
+                                        <div class="table-cell" style="width: 20%;text-align: center;">{{ item.name }}</div>
+                                        <div class="table-cell" style="width: 20%;text-align: center;">{{ item.usageCount }}次
+                                        </div>
+                                        <div class="table-cell" style="width: 20%;text-align: center;">
+                                            {{ item.transportationVolume }}</div>
+                                        <div class="table-cell" style="width: 20%;text-align: center;">{{ item.serveCarCount }}
+                                        </div>
+                                        <div class="table-cell" style="width: 20%;text-align: center;">{{ item.duration }}</div>
+                                    </div>
+                                </div>
+                                <div v-for="(item, i) in customerList" :key="'copy-' + i" class="table-row flex"
+                                    style="height: 28px;">
+                                    <div class="row-rank">{{ item.rank }}</div>
+                                    <div class="row-content">
+                                        <div class="table-cell" style="width: 20%;text-align: center;">{{ item.name }}</div>
+                                        <div class="table-cell" style="width: 20%;text-align: center;">{{ item.usageCount }}次
+                                        </div>
+                                        <div class="table-cell" style="width: 20%;text-align: center;">
+                                            {{ item.transportationVolume }}</div>
+                                        <div class="table-cell" style="width: 20%;text-align: center;">{{ item.serveCarCount }}
+                                        </div>
+                                        <div class="table-cell" style="width: 20%;text-align: center;">{{ item.duration }}</div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+                <div class="center-panel">
+                    <div class="statistics-top">
+                        <div class="statistic-item">
+                            <div class="statistic-header">
+                                <img class="statistic-icon" src="../../assets/imgs/dot.png" alt="">
+                                <div class="statistic-label fontMF">累计运单/车</div>
+                            </div>
+                            <counts bg :startVal="0" :length="6" :endVal='totalStatistics.totalOrders' separator="" />
+                        </div>
+                        <div class="statistic-item">
+                            <div class="statistic-header">
+                                <img class="statistic-icon" src="../../assets/imgs/dot.png" alt="">
+                                <div class="statistic-label fontMF">累计运载/吨</div>
+                            </div>
+                            <counts bg :startVal="0" :length="6" :endVal='totalStatistics.totalWeight' separator="" />
+                        </div>
+                        <div class="statistic-item">
+                            <div class="statistic-header">
+                                <img class="statistic-icon" src="../../assets/imgs/dot.png" alt="">
+                                <div class="statistic-label fontMF">配送中车辆数/辆</div>
+                            </div>
+                            <counts bg :startVal="0" :length="6" :endVal='totalStatistics.deliveringVehicles'
+                                separator="" />
+                        </div>
+                    </div>
+                    <div class="map-container">
+                        <img src="../../assets/imgs/map_bg.png" alt="" class="map-background">
+                        <div class="iframe-wrapper">
+                            <iframe ref="iframe" id="iframe" src="https://saas.sckaiwu.cn/wyenuxmd4j.html"
+                                frameborder="0"></iframe>
+                        </div>
+                    </div>
+                </div>
+                <div class="right-panel">
+                    <div class="section-title fontMF" style="margin-top: 0px;margin-left: 0 !important;">车辆入驻统计</div>
+                    <div>
+                        <Charts :eOption="vehicleStatsOption" v-if="vehicleStatsOption"
+                            style="height: 424px; width: 450px;" />
+                    </div>
+                    <div class="section-title fontMF" style="margin-top: 30px;margin-left: 0 !important;">订单执行情况</div>
+                    <div class="order-table">
+                        <div class="table-header flex">
+                            <div style="width: 28%;text-align: center;">订单号</div>
+                            <div style="width: 18%;text-align: center;">计划量/吨</div>
+                            <div style="width: 18%;text-align: center;">已装载/吨</div>
+                            <div style="width: 18%;text-align: center;">车次</div>
+                            <div style="width: 18%;text-align: center;">完成率</div>
+                        </div>
+                        <div class="table-body" style="height: 400px; overflow: hidden; position: relative;">
+                            <div class="order-scroll-content" :style="{ transform: `translateY(-${scrollTop2}px)` }"
+                                ref="scrollContentRef2" @mouseenter="pauseScroll2" @mouseleave="resumeScroll2">
+                                <div v-for="(item, i) in orderList" :key="i" class="table-row flex" style="height: 40px;">
+                                    <div class="table-cell" style="width: 28%;text-align: center;">{{ item.orderId }}</div>
+                                    <div class="table-cell" style="width: 18%;text-align: center;">{{ item.totalWeight }}{{
+                                        item.unit }}</div>
+                                    <div class="table-cell" style="width: 18%;text-align: center;">{{ item.deliveredWeight }}{{
+                                        item.unit }}
+                                    </div>
+                                    <div class="table-cell" style="width: 18%;text-align: center;">{{ item.carNumber }}</div>
+                                    <div class="progress-cell" style="width: 18%;color: #fff;">
+                                        <div class="progress-bar" :style="{ width: getRadioWidth(item.progress.toFixed(0)) }">
+                                            <div class="progress-indicator"></div>
+                                        </div>
+                                        {{ item.progress.toFixed(0) }}
+                                    </div>
+                                </div>
+                                <div v-for="(item, i) in orderList" :key="'copy-' + i" class="table-row flex"
+                                    style="height: 40px;">
+                                    <div class="table-cell" style="width: 28%;text-align: center;">{{ item.orderId }}</div>
+                                    <div class="table-cell" style="width: 18%;text-align: center;">{{ item.totalWeight }}{{
+                                        item.unit }}</div>
+                                    <div class="table-cell" style="width: 18%;text-align: center;">{{ item.deliveredWeight }}{{
+                                        item.unit }}
+                                    </div>
+                                    <div class="table-cell" style="width: 18%;text-align: center;">{{ item.carNumber }}</div>
+                                    <div class="progress-cell" style="width: 18%;color: #fff;">
+                                        <div class="progress-bar" :style="{ width: getRadioWidth(item.progress.toFixed(0)) }">
+                                            <div class="progress-indicator"></div>
+                                        </div>
+                                        {{ item.progress.toFixed(0) }}
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { ref, reactive, computed, onMounted, onBeforeUnmount, defineComponent } from 'vue';
+import moment from 'moment';
+import Charts from '@/components/selfCP/charts.vue';
+import Chartsbar from '@/components/selfCP/chartsbar.vue';
+import count from './count.vue';
+import counts from './counts.vue';
+import { POST, GET } from '@/server/api/common';
+import * as echarts from "echarts";
+import { useRoute } from 'vue-router';
+import { getCurrentInstance } from 'vue';
+
+const { appContext } = getCurrentInstance();
+const $config = appContext.config.globalProperties.$config;
+
+// 注册组件
+const components = { Charts, Chartsbar, count, counts };
+
+// 响应式数据
+const nowWeek = ref('');
+const nowDate = ref('');
+const nowTime = ref('');
+
+const tabIndex = ref(1);
+
+let newTimer = null;
+let time1 = null;
+let time2 = null;
+let mineId = ref(null);
+
+const route = useRoute();
+
+
+function getNowTime() {
+    let date = new Date();
+    nowDate.value =
+        date.getFullYear() +
+        '.' +
+        (date.getMonth() + 1 >= 10 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1)) +
+        '.' +
+        (date.getDate() >= 10 ? date.getDate() : '0' + date.getDate());
+    nowTime.value =
+        date.getHours() +
+        ':' +
+        (date.getMinutes() >= 10 ? date.getMinutes() : '0' + date.getMinutes()) +
+        ':' +
+        (date.getSeconds() >= 10 ? date.getSeconds() : '0' + date.getSeconds());
+    let weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
+    nowWeek.value = weeks[date.getDay()];
+}
+
+function getApiUrl() {
+    getEnterpriseStatistics()
+    getVehicleAnalysis()
+    getCustomerList()
+    getTotalStatistics()
+    getCarStatistics()
+    getOrders()
+}
+
+const EnterpriseStatistics = ref(0)
+const orderSituationList = ref([])
+function getEnterpriseStatistics() {
+    GET($config.enterpriseStatistics.url).then((res) => {
+        EnterpriseStatistics.value = res.data.data.total
+    })
+}
+const VehicleAnalysis = ref({
+    "entryTruck": 0,
+    "entryDriver": 0,
+    "entryUnmanned": 0,
+    "entryTotal": 0
+})
+function getVehicleAnalysis() {
+    GET($config.vehicleAnalysis.url).then((res) => {
+        VehicleAnalysis.value = res.data.data
+    })
+}
+const customerList = ref([])
+function getCustomerList() {
+    GET($config.customerList.url).then((res) => {
+        customerList.value = res.data.data.list
+        setTimeout(() => {
+            startScroll();
+        }, 500);
+
+    })
+}
+const orderList = ref([])
+function getOrders() {
+    GET($config.orders.url).then((res) => {
+        orderList.value = res.data.data.orders
+        startScroll2();
+    })
+}
+const totalStatistics = ref({
+    "totalOrders": 0,
+    "totalWeight": 0,
+    "deliveringVehicles": 0
+})
+function getTotalStatistics() {
+    GET($config.totalStatistics.url).then((res) => {
+        totalStatistics.value = res.data.data
+    })
+}
+
+
+function getCarStatistics() {
+    GET($config.carStatistics.url).then((res) => {
+        console.log(res);
+
+        vehicleStatsOption.value = {
+            backgroundColor: 'transparent',
+            title: {
+                text: '入驻数量',
+                left: '20px',
+                top: '20px',
+                textStyle: {
+                    color: '#fff',
+                    fontSize: 16,
+                    fontWeight: 'normal'
+                }
+            },
+            legend: {
+                data: ['入驻司机', '登记车辆', '无人车辆'],
+                right: '20px',
+                top: '20px',
+                textStyle: {
+                    color: '#fff',
+                    fontSize: 12
+                },
+                itemWidth: 8,
+                itemHeight: 8,
+                icon: 'rect'
+            },
+            grid: {
+                left: '3%',
+                right: '5%',
+                bottom: '5%',
+                top: '20%',
+                containLabel: true
+            },
+            xAxis: {
+                type: 'category',
+                data: res.data.data.categories,
+                axisLine: {
+                    lineStyle: {
+                        color: '#2a4b7c'
+                    }
+                },
+                axisLabel: {
+                    color: '#8892b0',
+                    fontSize: 10
+                },
+                axisTick: {
+                    show: false
+                }
+            },
+            yAxis: {
+                type: 'value',
+                max: 800,
+                interval: 100,
+                axisLine: {
+                    show: false
+                },
+                axisTick: {
+                    show: false
+                },
+                axisLabel: {
+                    color: '#8892b0',
+                    fontSize: 12
+                },
+                splitLine: {
+                    show: true,
+                    lineStyle: {
+                        color: '#1e3a5f',
+                        type: 'solid',
+                        width: 1
+                    }
+                }
+            },
+            series: [
+                {
+                    name: '入驻司机',
+                    type: 'bar',
+                    data: res.data.data.series[0].data,
+                    barWidth: 9,
+                    barGap: '0%',
+                    itemStyle: {
+                        color: '#1890ff',
+                        borderRadius: [0, 0, 0, 0]
+                    },
+                    showBackground: true,  // 开启背景
+                    backgroundStyle: {
+                        color: 'rgba(180, 180, 180, 0.2)',  // 背景颜色
+                    },
+                },
+                {
+                    name: '登记车辆',
+                    type: 'bar',
+                    data: res.data.data.series[1].data,
+                    barWidth: 9,
+                    itemStyle: {
+                        color: '#52c41a',
+                        borderRadius: [0, 0, 0, 0]
+                    },
+                    showBackground: true,  // 开启背景
+                    backgroundStyle: {
+                        color: 'rgba(180, 180, 180, 0.2)',  // 背景颜色
+                    },
+                },
+                {
+                    name: '无人车辆',
+                    type: 'bar',
+                    data: res.data.data.series[2].data,
+                    barWidth: 9,
+                    itemStyle: {
+                        color: '#13c2c2',
+                        borderRadius: [0, 0, 0, 0]
+                    },
+                    showBackground: true,  // 开启背景
+                    backgroundStyle: {
+                        color: 'rgba(180, 180, 180, 0.2)',  // 背景颜色
+                    },
+                }
+            ]
+        }
+    })
+}
+function getRadioWidth(pct) {
+    let width = (76 / 100) * parseFloat(pct);
+    return width + 'px';
+}
+
+const scrollTop = ref(0);
+const scrollContentRef = ref(null);
+let scrollTimer = null;
+let rowHeight = 26; // 单行高度,和上面style一致
+let pause = false;
+
+function startScroll() {
+    
+    if (scrollTimer) clearInterval(scrollTimer);
+    scrollTimer = setInterval(() => {
+        if (pause) return;
+        scrollTop.value += 1;
+        // 滚动到一半(即原始数据高度)后重置
+        if (customerList.value.length > 0 && scrollTop.value >= rowHeight * customerList.value.length) {
+            scrollTop.value = 0;
+        }
+    }, 30); // 速度可调
+}
+
+function pauseScroll() {
+    pause = true;
+}
+function resumeScroll() {
+    pause = false;
+}
+
+const scrollTop2 = ref(0);
+const scrollContentRef2 = ref(null);
+let scrollTimer2 = null;
+const rowHeight2 = 40;
+let pause2 = false;
+
+function startScroll2() {
+    if (scrollTimer2) clearInterval(scrollTimer2);
+    scrollTimer2 = setInterval(() => {
+        if (pause2) return;
+        scrollTop2.value += 1;
+        if (orderList.value.length > 0 && scrollTop2.value >= rowHeight2 * orderList.value.length) {
+            scrollTop2.value = 0;
+        }
+    }, 30);
+}
+
+function pauseScroll2() {
+    pause2 = true;
+}
+function resumeScroll2() {
+    pause2 = false;
+}
+
+// script setup 区域增加车辆统计图表配置
+// 重新配置车辆统计图表,为每个柱子组合添加背景
+const vehicleStatsOption = ref(null);
+
+onMounted(() => {
+    getNowTime();
+    newTimer = setInterval(getNowTime, 1000);
+    if (route.query && route.query.companyId) {
+        mineId.value = route.query.companyId;
+    }
+    getApiUrl();
+    moment.locale('zh-cn');
+    // clearInterval(time1);
+    // clearInterval(time2);
+    // time1 = setInterval(getdata, $config.time * 1000);
+    // time2 = setInterval(getdatas, $config.time1 * 1000);
+
+});
+
+onBeforeUnmount(() => {
+    clearInterval(newTimer);
+    newTimer = null;
+    if (scrollTimer) clearInterval(scrollTimer);
+    if (scrollTimer2) clearInterval(scrollTimer2);
+});
+
+
+
+</script>
+<style lang="less" scoped>
+@font-face {
+    font-family: MFLiHei;
+    src: url('../../assets/font/MFLiHei_Noncommercial-Regular.otf') format('opentype');
+}
+
+@font-face {
+    font-family: FXLed;
+    src: url('../../assets/font/DSDIGI1.ttf');
+}
+
+.fontMF {
+    font-family: MFLiHei;
+}
+
+.fontFx {
+    font-family: FXLed;
+}
+
+.flex {
+    display: flex;
+    align-items: center;
+}
+
+.MR40 {
+    margin-right: 40px;
+}
+
+.margin-right-10 {
+    margin-right: 10px;
+}
+
+.vehicle-stats-row-2 {
+    height: 98px;
+    width: 398px;
+    background: url(../../assets/zhibiao2.png) no-repeat;
+    background-size: 100%;
+    display: flex;
+    color: #fff;
+    padding-right: 98px;
+    box-sizing: border-box;
+    margin: 0 auto;
+    padding-bottom: 4px;
+
+    .stat-number {
+        width: 50%;
+        text-align: center;
+        display: flex;
+        flex-direction: column;
+        font-family: FXLed;
+        font-weight: normal;
+        font-size: 23px;
+        color: #FFFFFF;
+        margin-bottom: 0;
+        align-items: center;
+        justify-content: center;
+        line-height: 23px;
+    }
+
+    p {
+        font-size: 12px;
+        line-height: 12px;
+        margin-top: 4px;
+    }
+}
+
+.enterprise-statistics {
+    width: 314px;
+    height: 95px;
+    background: rgba(255, 255, 255, 0.1);
+    padding-top: 12px;
+    padding-left: 75px;
+    box-sizing: border-box;
+    position: relative;
+    margin-left: 96px;
+    margin-top: 40px;
+
+    .enterprise-icon {
+        position: absolute;
+        width: 125px;
+        height: 125px;
+        left: -67.5px;
+        top: -20px;
+    }
+
+    .enterprise-title {
+        font-family: MFLiHei;
+        font-weight: 400;
+        font-size: 19px;
+        color: #FFFFFF;
+    }
+
+    .enterprise-count {
+        span {
+            color: #fff;
+            margin-left: 4px;
+            line-height: 40px;
+            position: relative;
+            top: 8px;
+        }
+    }
+}
+
+.vehicle-stats-row-1 {
+    margin-top: 10px;
+    height: 98px;
+    width: 398px;
+    background: url(../../assets/zhibiao1.png) no-repeat;
+    background-size: 100%;
+    display: flex;
+    color: #fff;
+    padding-left: 98px;
+    box-sizing: border-box;
+    margin: 0 auto;
+    padding-bottom: 4px;
+    margin-top: 20px;
+
+    .stat-number {
+        width: 50%;
+        text-align: center;
+        display: flex;
+        flex-direction: column;
+        font-family: FXLed;
+        font-weight: normal;
+        font-size: 23px;
+        color: #FFFFFF;
+        margin-bottom: 0;
+        align-items: center;
+        justify-content: center;
+        line-height: 23px;
+    }
+
+    p {
+        font-size: 12px;
+        line-height: 12px;
+        margin-top: 4px;
+    }
+}
+
+.dashboard-container {
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+    position: relative;
+
+    .main-content {
+        position: absolute;
+        top: 0;
+        left: 0;
+        height: 100%;
+        z-index: 1;
+        width: 100%;
+        padding: 0px;
+
+        .header-background {
+            width: 2048px;
+            height: 113px;
+            z-index: 0;
+            transform: rotate(0deg);
+            opacity: 1;
+            // pointer-events: none;
+            position: relative;
+        }
+
+        .header-section {
+            position: absolute !important;
+            margin: 0 !important;
+            width: 2048px;
+            height: 113px;
+            display: flex;
+            justify-content: space-between;
+            background-image: url(../../assets/imgs/title_bg.png);
+            background-repeat: no-repeat;
+            background-size: 100% 100%;
+
+            .main-title {
+                text-align: center;
+                line-height: 25px;
+                flex: 1;
+                padding: 25px 0;
+                pointer-events: auto;
+                color: rgb(255, 255, 255);
+                font-weight: 400;
+                font-size: 40px;
+                writing-mode: horizontal-tb;
+                letter-spacing: 0px;
+                text-overflow: ellipsis;
+                white-space: nowrap;
+                overflow: hidden;
+            }
+        }
+
+        .tab-button {
+            position: absolute;
+            width: 257px;
+            height: 39px;
+            background-size: 100% 100%;
+            background-repeat: no-repeat;
+            font-family: MF LiHei;
+            font-weight: 400;
+            font-size: 18px;
+            color: #FFFFFF;
+            line-height: 39px;
+            text-align: center;
+            cursor: pointer;
+        }
+
+        .left-tab {
+            background-image: url(../../assets/imgs/tab_l.png);
+            left: 270px;
+            top: 15px;
+            text-indent: 40px;
+        }
+
+        .left-tab-active {
+            background-image: url(../../assets/imgs/tab_led.png);
+        }
+
+        .right-tab {
+            background-image: url(../../assets/imgs/tab_r.png);
+            right: 270px;
+            top: 15px;
+            text-indent: -30px;
+        }
+
+        .right-tab-active {
+            background-image: url(../../assets/imgs/tab_red.png);
+        }
+
+        .time-display {
+            position: fixed;
+            right: 50px;
+            height: 30px;
+            line-height: 30px;
+            font-size: 16px;
+            top: 8px;
+            color: #fff;
+        }
+
+        .content-body {
+            display: flex;
+            justify-content: center;
+
+            .left-panel {
+                width: 484px;
+                height: 1010px;
+                background-image: url(../../assets/imgs/left_bg.png);
+                background-size: 100% 100%;
+                background-repeat: no-repeat;
+                padding: 20px;
+                box-sizing: border-box;
+
+                .quantity-display {
+                    color: #FFFFFF;
+                    font-size: 28px;
+                    font-weight: bold;
+                    letter-spacing: 0;
+                    display: flex;
+                    align-items: baseline;
+
+                    .quantity-prefix {
+                        font-size: 16px;
+                        margin-right: 8px;
+                    }
+
+                    .quantity-unit {
+                        margin-left: 8px;
+                        font-size: 14px;
+                        color: #FFFFFF;
+                        font-weight: bolder;
+                        vertical-align: super;
+                        font-family: Microsoft Yahei;
+                    }
+                }
+
+                .section-title {
+                    width: 313px;
+                    height: 24px;
+                    background-image: url(../../assets/imgs/tits_bg.png);
+                    background-size: 100% 100%;
+                    background-repeat: no-repeat;
+                    font-weight: 400;
+                    font-size: 18px;
+                    color: #FFFFFF;
+                    text-indent: 25px;
+                    margin-top: 10px;
+                    line-height: 15px;
+                }
+
+                .carbox {
+                    display: flex;
+                    align-items: center;
+                    padding-left: 40px;
+                    margin-top: 30px;
+
+                    .carimg {
+                        width: 97px;
+                        height: 88px;
+                    }
+
+                    .cardes {
+                        margin-left: 35px;
+
+                        .cart {
+                            font-weight: 400;
+                            font-size: 18px;
+                            color: #FFFFFF;
+                        }
+                    }
+                }
+
+                .z_box {
+                    margin-top: 30px;
+                    display: flex;
+                    align-items: center;
+
+                    .l_box {
+                        width: 190px;
+                        height: 160px;
+                        background: rgba(255, 255, 255, 0.1);
+                        display: flex;
+                        flex-flow: column;
+                        justify-content: center;
+                        align-items: center;
+
+                        .l_img {
+                            width: 156px;
+                            height: 86px;
+                        }
+
+                        .l_tit {
+                            font-weight: 400;
+                            font-size: 16px;
+                            color: #FFFFFF;
+                        }
+
+                    }
+
+                    .r_box {
+                        margin-left: 20px;
+
+                        .b_item {
+                            width: 200px;
+                            height: 70px;
+                            background: rgba(255, 255, 255, 0.1);
+                            display: flex;
+                            align-items: center;
+
+                            // justify-content: center;
+                            .l_img {
+                                width: 108px;
+                                height: 59px;
+                                margin-left: -20px;
+                            }
+
+                            .b_des {
+                                margin-left: 16px;
+
+                                .b_tit {
+                                    font-weight: 400;
+                                    font-size: 16px;
+                                    color: #FFFFFF;
+                                }
+                            }
+                        }
+                    }
+                }
+
+                .customer-table {
+                    width: 420px;
+                    margin: 0 auto;
+                    margin-top: 20px;
+                    height: 360px;
+
+                    .table-header {
+                        color: #ffffff;
+                        font-size: 12px;
+                        padding: 9px 0;
+                    }
+
+                    .table-body {
+                        .seamless-warp {
+                            overflow: hidden;
+                            height: 360px;
+                            // height: 390px;
+                            width: 100%;
+                        }
+                    }
+
+                    th {
+                        text-align: left;
+                        font-size: 12px;
+                        font-weight: 400;
+                        color: #ffffff;
+                        line-height: 30px;
+                        // background-color: rgb(0, 80, 179);
+                    }
+
+                    .table-cell {
+                        font-size: 12px;
+                        font-weight: 400;
+                        color: #ffffff;
+                        line-height: 30px;
+                    }
+
+                    .table-row:nth-child(2n+1) {
+                        // background-color: #032255;
+                        background-color: rgba(255, 255, 255, 0.1);
+                    }
+
+                    .progress-cell {
+                        display: flex;
+                        align-items: center;
+                        color: #ffffff;
+                        font-size: 12px;
+
+                        .progress-bar {
+                            position: relative;
+                            min-width: 6px;
+                            height: 10px;
+                            background: linear-gradient(90deg, #29abe3, #01ffff);
+                            margin-right: 4px;
+
+                            .progress-indicator {
+                                width: 6px;
+                                height: 16px;
+                                background: #ffffff;
+                                position: absolute;
+                                top: -3px;
+                                right: 0;
+                            }
+                        }
+                    }
+                }
+
+                .nitem {
+                    display: flex;
+                    align-items: center;
+
+                    .nimg {
+                        width: 216px;
+                        height: 122px;
+                        position: relative;
+                        z-index: 2;
+                    }
+
+                    .ndes {
+                        width: 220px;
+                        height: 70px;
+                        background: rgba(255, 255, 255, 0.1);
+                        display: flex;
+                        margin-left: -50px;
+                        position: relative;
+                        z-index: 1;
+                    }
+
+                    .mc {
+                        margin-left: 30px;
+                        margin-top: 24px;
+                    }
+                }
+            }
+        }
+
+        .center-panel {
+            .statistics-top {
+                width: 1018px;
+                height: 138px;
+                background-image: url(../../assets/imgs/mid_tbg.png);
+                background-size: 100% 100%;
+                background-repeat: no-repeat;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+
+                .statistic-item {
+                    display: flex;
+                    flex-flow: column;
+                    align-items: center;
+                    flex: 1;
+
+                    .statistic-header {
+                        display: flex;
+                        align-items: center;
+                        margin-bottom: 12px;
+
+                        .statistic-icon {
+                            width: 20px;
+                            height: 20px;
+                        }
+
+                        .statistic-label {
+                            margin-left: 8px;
+                            font-weight: 500;
+                            font-size: 18px;
+                            color: #FFFFFF;
+                        }
+                    }
+                }
+            }
+
+            .map-container {
+                margin-top: 14px;
+                width: 1018px;
+                height: 860px;
+                // width: 1018px;
+                // height: 658px;
+                // background-image: url(../../assets/imgs/map_bg.png);
+                // background-size: 100% 100%;
+                // background-repeat: no-repeat;
+                // margin-top: 14px;
+                position: relative;
+                box-sizing: border-box;
+
+                .map-background {
+                    width: 1018px;
+                    height: 100%;
+                    position: absolute;
+                    z-index: 1;
+                    pointer-events: none;
+                }
+
+                .iframe-wrapper {
+                    position: absolute;
+                    // background-image: url(../../assets/img/iframe_bg.png);
+                    // background-repeat: no-repeat;
+                    // background-size: 100% 100%;
+                    overflow: hidden;
+                    height: 100%;
+                    padding-bottom: 20px;
+                    box-sizing: border-box;
+
+                    #iframe {
+                        // margin: 10px 12px;
+                        margin: 0 auto;
+                        margin-left: 10px;
+                        margin-top: 10px;
+                        width: 998px;
+                        height: 100%;
+                        z-index: 0;
+                        // border-radius: 30px;
+                    }
+                }
+            }
+
+            .mid_b {
+                padding: 20px;
+                box-sizing: border-box;
+                width: 1018px;
+                height: 190px;
+                background-image: url(../../assets/imgs/mid_bbg.png);
+                background-size: 100% 100%;
+                background-repeat: no-repeat;
+                margin-top: 10px;
+
+                .tt {
+                    width: 313px;
+                    height: 24px;
+                    background-image: url(../../assets/imgs/tits_bg.png);
+                    background-size: 100% 100%;
+                    background-repeat: no-repeat;
+                    font-weight: 400;
+                    font-size: 18px;
+                    color: #FFFFFF;
+                    text-indent: 25px;
+                    line-height: 15px;
+                    margin-top: 10px;
+                    margin-left: 10px;
+                }
+            }
+        }
+
+        .right-panel {
+            width: 484px;
+            height: 1010px;
+            background-image: url(../../assets/imgs/right_bg.png);
+            background-size: 100% 100%;
+            background-repeat: no-repeat;
+            padding: 30px;
+            box-sizing: border-box;
+
+            .section-title {
+                width: 313px;
+                height: 24px;
+                background-image: url(../../assets/imgs/tits_bg.png);
+                background-size: 100% 100%;
+                background-repeat: no-repeat;
+                font-weight: 400;
+                font-size: 18px;
+                color: #FFFFFF;
+                text-indent: 25px;
+                line-height: 15px;
+                margin-top: 10px;
+                margin-left: 10px;
+            }
+
+            .order-table {
+                width: 424px;
+                margin: 0 auto;
+
+                .table-header {
+                    color: #fff;
+                    padding: 9px 0;
+                    font-size: 12px;
+                }
+
+                .table-body {
+                    .seamless-warp {
+                        overflow: hidden;
+                        height: 900px;
+                        width: 424px;
+                    }
+                }
+
+                th {
+                    text-align: left;
+                    font-size: 12px;
+                    font-weight: 400;
+                    color: #ffffff;
+                    line-height: 30px;
+                }
+
+                .table-cell {
+                    font-size: 12px;
+                    font-weight: 400;
+                    color: #ffffff;
+                    line-height: 30px;
+                }
+
+                .table-row:nth-child(even) {
+                    background-color: rgba(255, 255, 255, 0.1);
+                    // background-color: rgba(255, 255, 255, 0.399);
+                }
+
+                .progress-cell {
+                    display: flex;
+                    align-items: center;
+                    font-size: 12px;
+
+                    .progress-bar {
+                        position: relative;
+                        min-width: 6px;
+                        height: 10px;
+                        background: linear-gradient(90deg, #29abe3, #01ffff);
+                        margin-right: 4px;
+
+                        .progress-indicator {
+                            width: 6px;
+                            height: 16px;
+                            background: #ffffff;
+                            position: absolute;
+                            top: -3px;
+                            right: 0;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+.scroll-content {
+    transition: transform 0.1s linear;
+    will-change: transform;
+}
+
+.order-scroll-content {
+    transition: transform 0.1s linear;
+    will-change: transform;
+}
+
+.customer-scroll-content {
+
+    .row-rank {
+        width: 28px;
+        height: 28px;
+        background: linear-gradient(90deg, #0067FF, #3A93FF);
+        text-align: center;
+        color: #fff;
+    }
+
+    .row-content {
+        display: flex;
+        flex: 1;
+    }
+}
+</style>

Diff do ficheiro suprimidas por serem muito extensas
+ 549 - 524
src/components/page/sindex copy.vue


Diff do ficheiro suprimidas por serem muito extensas
+ 463 - 419
src/components/page/sindex.vue


+ 3 - 3
src/server/response/request.js

@@ -26,7 +26,7 @@ async function service(method, url, params, type = 'application/x-www-form-urlen
 		timeout: 10000,
 		headers: {
 			'X-Requested-With': 'XMLHttpRequest',
-			"Access-Control-Allow-Origin":'*'
+			"Access-Control-Allow-Origin": '*'
 		},
 		withCredentials: false
 	}).then(
@@ -40,12 +40,12 @@ async function serviceGet(method, url, params, type = 'application/x-www-form-ur
 	return axios({
 		method: method,
 		//拼接参数
-		url: url,
+		url: url+`?key=kw-noticeboard@KWsecret`,
 		data: params,
 		timeout: 10000,
 		headers: {
 			'X-Requested-With': 'XMLHttpRequest',
-			"Access-Control-Allow-Origin":'*'
+			"Access-Control-Allow-Origin": '*'
 		},
 		withCredentials: false
 	}).then(

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff