15902849627 2 mesiacov pred
rodič
commit
2d1b3aff0f

+ 1 - 1
index.html

@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<html lang="">
+<html lang="" class="dark">
 
 <head>
   <meta charset="UTF-8">

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1065 - 49
package-lock.json


+ 2 - 0
package.json

@@ -11,8 +11,10 @@
   },
   "dependencies": {
     "@vitejs/plugin-legacy": "^7.1.0",
+    "ant-design-vue": "^4.2.6",
     "axios": "^1.10.0",
     "echarts": "^5.6.0",
+    "element-plus": "^2.11.4",
     "jquery": "^3.7.1",
     "moment": "^2.30.1",
     "vue": "^3.5.17",

+ 127 - 1
src/App.vue

@@ -57,7 +57,6 @@ export default {
 </template>
 
 <style lang="less">
-
 .amap-logo {
     display: none !important;
 }
@@ -82,4 +81,131 @@ body {
     width: 100%;
     height: 100%;
 }
+
+.wrapClassName {
+    .table-striped1 {
+        background: #2E3C4C;
+        color: #fff;
+    }
+
+    .ant-table-wrapper .ant-table {
+        background: inherit;
+    }
+
+    .ant-pagination .ant-pagination-disabled .ant-pagination-item-link {
+        background: #2E3C4C;
+        color: #FFFFFF;
+    }
+
+    .ant-pagination .ant-pagination-item-active {
+        background: #4680FF;
+
+        a {
+            color: #FFFFFF;
+        }
+    }
+
+    .ant-table-thead {
+        .ant-table-cell {
+            background: #2E3C4C;
+            color: #fff;
+            border: none;
+
+            &::before {
+                display: none;
+            }
+        }
+    }
+
+    .ant-modal {
+        top: 200px;
+    }
+
+    .ant-table-tbody>tr>td {
+        border: none !important;
+    }
+
+    .table-striped2 {
+        background: #020c2a;
+        color: #fff;
+    }
+
+    .ant-modal-header {
+        background: rgba(0, 0, 0, 0);
+    }
+
+    .ant-modal-close {
+        right: 28px;
+    }
+
+    .ant-modal-close-icon {
+        color: #fff;
+
+        svg {
+            width: 24px;
+            height: 24px;
+        }
+    }
+
+    .ant-modal-content {
+        padding: 0 45px;
+        padding-top: 45px;
+        width: 1197px;
+        height: 735px;
+        background: url(@/assets/img/popup_bg.png) no-repeat !important;
+        background-size: 100% 100% !important;
+    }
+
+    .ant-table-container {
+        ::-webkit-scrollbar {
+            width: 11px;
+            height: 11px;
+        }
+
+        ::-webkit-scrollbar-track {
+            background: #273957;
+            border-radius: 4px;
+        }
+
+        ::-webkit-scrollbar-thumb {
+            background: #3A93FF;
+            border-radius: 4px;
+        }
+
+        ::-webkit-scrollbar-thumb:hover {
+            background: #a8a8a8;
+        }
+    }
+    .ant-table-wrapper .ant-table-tbody >tr.ant-table-row:hover>td{
+        background: inherit;
+    }
+    .ant-table-wrapper .ant-table-tbody >tr.ant-table-row:hover>td, .ant-table-wrapper .ant-table-tbody >tr >td.ant-table-cell-row-hover{
+        background: #3A93FF;
+
+    }
+    .ant-table-wrapper .ant-table-tbody>tr.ant-table-row:hover>td {
+        background: #3A93FF;
+    }
+
+    .ant-pagination .ant-pagination-item {
+        background: #2E3C4C;
+
+        a {
+            color: #fff;
+        }
+    }
+    .ant-pagination-item-ellipsis,.ant-pagination-total-text{
+        color: #fff;
+    }
+    .ant-pagination-item-link{
+        span{
+            color: #fff !important;
+        }
+    }
+    .ant-table-wrapper .ant-table-pagination.ant-pagination {
+        li {
+            margin: 0 6px
+        }
+    }
+}
 </style>

BIN
src/assets/img/btn-ac.png


BIN
src/assets/img/btn.png


BIN
src/assets/img/guanbi.png


BIN
src/assets/img/popup_bg.png


BIN
src/assets/imgs/tits_bg2.png


+ 9 - 3
src/components/page/counts.vue

@@ -187,9 +187,15 @@ export default {
             return !isNaN(parseFloat(val));
         },
         formatNumber(num) {
-            num = num.toFixed(this.decimals);
-            num += '';
-            const x = num.split('.');
+            // 兼容字符串、null、undefined等非数字情况
+            const n = Number(num);
+            if (!isFinite(n)) {
+                const zeroFrac = this.decimals > 0 ? this.decimal + '0'.repeat(this.decimals) : '';
+                return this.prefix + '0' + zeroFrac + this.suffix;
+            }
+
+            const fixed = n.toFixed(this.decimals);
+            const x = fixed.split('.');
             let x1 = x[0];
             const x2 = x.length > 1 ? this.decimal + x[1] : '';
             const rgx = /(\d+)(\d{3})/;

+ 374 - 1
src/components/page/data.js

@@ -288,5 +288,378 @@ const sales_volumn_data = {
         }
     }
 };
-const data = { SaveInfo, ElectricCarData, CalciumOxideList, typeList, energy_consumption, yieldData, sales_volumn_data };
+const waybill = [
+    {
+        title: '运单编号',
+        key: 'code',
+        dataIndex: 'code',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '托运方',
+        key: 'shipperName',
+        dataIndex: 'shipperName',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '货物名称',
+        key: 'goodsName',
+        dataIndex: 'goodsName',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '发货所属区域',
+        key: 'sendArea',
+        dataIndex: 'sendArea',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '发货地址明细',
+        key: 'sendAddress',
+        dataIndex: 'sendAddress',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '收货所属区域',
+        key: 'receiveArea',
+        dataIndex: 'receiveArea',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '收货地址明细',
+        key: 'receiveAddress',
+        dataIndex: 'receiveAddress',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '承运人',
+        key: 'carrierName',
+        dataIndex: 'carrierName',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '车牌号',
+        key: 'licensePlate',
+        dataIndex: 'licensePlate',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '装货时间',
+        key: 'loadTime',
+        dataIndex: 'loadTime',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '卸货时间',
+        key: 'unloadTime',
+        dataIndex: 'unloadTime',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '托运方电话',
+        key: 'shipperPhone',
+        dataIndex: 'shipperPhone',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '线路名称',
+        key: 'lineName',
+        dataIndex: 'lineName',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '数据来源',
+        key: 'dataSource',
+        dataIndex: 'dataSource',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '创建时间',
+        key: 'createTime',
+        dataIndex: 'createTime',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '入库时间',
+        key: 'intoTime',
+        dataIndex: 'intoTime',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '数据批次',
+        key: 'batchNo',
+        dataIndex: 'batchNo',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    }
+]
+const carThead = [
+    {
+        title: '数据批次',
+        key: 'batchNumber',
+        dataIndex: 'batchNumber',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    
+    {
+        title: '车牌号',
+        key: 'licensePlate',
+        dataIndex: 'licensePlate',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '车牌颜色',
+        key: 'licensePlateColor',
+        dataIndex: 'licensePlateColor',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '归属地',
+        key: 'attribution',
+        dataIndex: 'attribution',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '车辆类型',
+        key: 'type',
+        dataIndex: 'type',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '能源类型',
+        key: 'energyType',
+        dataIndex: 'energyType',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '使用性质',
+        key: 'useNature',
+        dataIndex: 'useNature',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '注册日期',
+        key: 'loginDate',
+        dataIndex: 'loginDate',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '核定载质量',
+        key: 'loadCapacity',
+        dataIndex: 'loadCapacity',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '整备质量',
+        key: 'curbWeight',
+        dataIndex: 'curbWeight',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '总质量',
+        key: 'totalWeight',
+        dataIndex: 'totalWeight',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+   
+    {
+        title: '挂车牌照',
+        key: 'trailerLicensePlate',
+        dataIndex: 'trailerLicensePlate',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '挂车类型',
+        key: 'trailerType',
+        dataIndex: 'trailerType',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    
+    {
+        title: '轴数',
+        key: 'axle',
+        dataIndex: 'axle',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+   
+    {
+        title: '车辆所有人',
+        key: 'owner',
+        dataIndex: 'owner',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '车辆唯一识别码',
+        key: 'vin',
+        dataIndex: 'vin',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    
+    {
+        title: '数据来源',
+        key: 'source',
+        dataIndex: 'source',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '入库时间',
+        key: 'storageTime',
+        dataIndex: 'storageTime',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '备注',
+        key: 'remark',
+        dataIndex: 'remark',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    }
+]
+const driverThead = [
+    {
+        title: '数据批次',
+        key: 'batchNumber',
+        dataIndex: 'batchNumber',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '司机名称',
+        key: 'name',
+        dataIndex: 'name',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '性别',
+        key: 'sex',
+        dataIndex: 'sex',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '司机电话',
+        key: 'mobile',
+        dataIndex: 'mobile',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '年龄',
+        key: 'age',
+        dataIndex: 'age',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '身份证',
+        key: 'idCard',
+        dataIndex: 'idCard',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    
+    
+    {
+        title: '数据来源',
+        key: 'source',
+        dataIndex: 'source',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '入库时间',
+        key: 'storageTime',
+        dataIndex: 'storageTime',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    },
+    {
+        title: '备注',
+        key: 'remark',
+        dataIndex: 'remark',
+        align: 'center',
+        ellipsis: true,
+        width: 200
+    }
+]
+const data = { SaveInfo, ElectricCarData, CalciumOxideList, typeList, energy_consumption, yieldData, sales_volumn_data, waybill, carThead, driverThead };
 export default data;

+ 170 - 58
src/components/page/sindex.vue

@@ -107,14 +107,14 @@
                                 <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="" />
+                            <counts bg :startVal="0" :length="9" :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.toFixed(0)'
+                            <counts bg :startVal="0" :length="9" :endVal='totalStatistics.totalWeight.toFixed(0)'
                                 separator="" />
                         </div>
                         <div class="statistic-item">
@@ -122,7 +122,7 @@
                                 <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'
+                            <counts bg :startVal="0" :length="9" :endVal='totalStatistics.deliveringVehicles'
                                 separator="" />
                         </div>
                     </div>
@@ -132,6 +132,15 @@
                             <div id="amap-container" style="width: 100%; height: 100%;"></div>
                         </div>
                     </div>
+                    <div class="center-panel-bottom">
+                        <div class="section-title fontMF">智调数据库</div>
+                        <div class="btn-group">
+                            <div :class="{ 'act': btn_current == 1 }" @click="openFunction(1)">运单</div>
+                            <div :class="{ 'act': btn_current == 2 }" @click="openFunction(2)">车辆</div>
+                            <div :class="{ 'act': btn_current == 3 }" @click="openFunction(3)">司机</div>
+                        </div>
+                        <div class="section-title2 fontMF"></div>
+                    </div>
                 </div>
                 <div class="right-panel">
                     <div class="section-title fontMF" style="margin-top: 0px;margin-left: 0 !important;">车辆入驻统计</div>
@@ -213,6 +222,25 @@
                 </div>
             </div>
         </div>
+        <a-modal v-model:open="open" :footer="null" wrapClassName="wrapClassName" title="" :width="1197">
+            <a-table :dataSource="dataSource" :loading="tableLoading" :columns="columns" :scroll="{ x: 'max-content' }"
+                :pagination="{
+                    position: ['bottomRight'],
+                    showTotal: total => `共 ${totalCount} 条记录`,
+                    showSizeChanger: false,
+                    size: 'small',
+                    current: pageIndex,
+                    pageSize: pageSize,
+                    total: totalCount,
+                }" @change="handleChangePage"
+                :row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped1' : 'table-striped2')">
+                <template #bodyCell="{ column, record, index }">
+                    <template v-if="column.key === 'index'">
+                        <span>{{ (pageIndex - 1) * pageSize + index + 1 }}</span>
+                    </template>
+                </template>
+            </a-table>
+        </a-modal>
     </div>
 </template>
 
@@ -227,10 +255,11 @@ import { POST, GET } from '@/server/api/common';
 import * as echarts from "echarts";
 import { useRoute } from 'vue-router';
 import { getCurrentInstance } from 'vue';
+import axios from 'axios';
 import $ from 'jquery';
 const { appContext } = getCurrentInstance();
 const $config = appContext.config.globalProperties.$config;
-
+import data from './data'
 // 注册组件
 const components = { Charts, Chartsbar, count, counts };
 
@@ -239,7 +268,73 @@ const nowWeek = ref('');
 const nowDate = ref('');
 const nowTime = ref('');
 
+//智调数据库
+const btn_current = ref(1)
+const open = ref(false)
+const pageIndex = ref(1);
+const pageSize = ref(10);
+const totalCount = ref(0)
 const tabIndex = ref(1);
+const tableLoading = ref(false)
+const dataSource = ref([])
+
+const columns = ref(data.waybill)
+const handleChangePage = (page) => {
+    pageIndex.value = page.current
+    pageSize.value = page.pageSize
+    openFunction()
+}
+const openFunction = async (value) => {
+    if (value) {
+        pageIndex.value = 1
+        btn_current.value = value
+        dataSource.value = []
+        if (value == 1) {
+            columns.value = data.waybill
+        } else if (value == 2) {
+            columns.value = data.carThead
+        } else if (value == 3) {
+            columns.value = data.driverThead
+        }
+    }
+    tableLoading.value = true
+    open.value = true
+    let url, method
+    if (btn_current.value == 1) {
+        url = 'http://elms.sckaiwu.cn/api/elms-data/waybill/queryWaybillByPage2'
+        method = 'POST'
+    } else if (btn_current.value == 2) {
+        url = 'http://elms.sckaiwu.cn/api/elms-data/truck/page2'
+        method = 'GET'
+    } else if (btn_current.value == 3) {
+        url = 'http://elms.sckaiwu.cn/api/elms-data/driver/page2'
+        method = 'GET'
+    }
+    let res = await axios({
+        method: method,
+        url,
+        data: {
+            pageNo: pageIndex.value,
+            pageSize: pageSize.value
+        },
+        params: {
+            pageNo: pageIndex.value,
+            pageSize: pageSize.value
+        },
+        timeout: 10000,
+    })
+    tableLoading.value = false
+    if (res.data.code == 200) {
+        totalCount.value = res.data.data.total
+        dataSource.value = res.data.data.list
+    }
+}
+
+
+
+
+
+
 
 let newTimer = null;
 let time1 = null;
@@ -1227,6 +1322,76 @@ onBeforeUnmount(() => {
         }
 
         .center-panel {
+            .center-panel-bottom {
+                padding-top: 4px;
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+
+                .btn-group {
+                    display: flex;
+                    flex: 1;
+                    justify-content: space-between;
+                    position: relative;
+                    top: 14px;
+                    padding: 0 23px;
+                    align-items: center;
+
+                    div {
+                        width: 59px;
+                        height: 52px;
+                        background: url(../../assets/img/btn.png) no-repeat;
+                        background-size: 100% 100%;
+                        text-align: center;
+                        line-height: 52px;
+                        font-size: 13px;
+                        color: #FFFFFF;
+                        font-family: MFLiHei;
+                        color: #3A93FF;
+                        letter-spacing: 2px;
+                        cursor: pointer;
+                    }
+
+                    .act {
+                        width: 71px;
+                        height: 62px;
+                        background: url(../../assets/img/btn-ac.png) no-repeat;
+                        background-size: 100% 100%;
+                        font-size: 17px;
+                        line-height: 62px;
+                        color: #01ffff;
+                    }
+                }
+            }
+
+            .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;
+            }
+
+            .section-title2 {
+                width: 313px;
+                height: 24px;
+                background-image: url(../../assets/imgs/tits_bg2.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;
+            }
+
             .statistics-top {
                 width: 1018px;
                 height: 138px;
@@ -1266,7 +1431,7 @@ onBeforeUnmount(() => {
             .map-container {
                 margin-top: 14px;
                 width: 1018px;
-                height: 860px;
+                height: 770px;
                 // width: 1018px;
                 // height: 658px;
                 // background-image: url(../../assets/imgs/map_bg.png);
@@ -1448,57 +1613,4 @@ onBeforeUnmount(() => {
         flex: 1;
     }
 }
-
-#right_modal {
-    .mask {
-        position: fixed;
-        width: 100%;
-        height: 100%;
-        left: 0;
-        top: 0;
-        z-index: 19;
-        display: none;
-        background: rgba(0, 0, 0, 0.5);
-    }
-
-    .model_content {
-        position: fixed;
-        width: 930px;
-        height: 1030px;
-        right: -930px;
-        bottom: 10px;
-        background-image: url(https://ore-1302260927.cos.ap-chengdu.myqcloud.com/data_screen/image/23.png);
-        background-repeat: no-repeat;
-        background-size: 100% 100%;
-        overflow: hidden;
-        z-index: 20;
-
-        .model_title {
-            font-size: 18px;
-            font-weight: 400;
-            color: #ffffff;
-            text-align: center;
-            line-height: 32px;
-        }
-
-        .list {
-            display: flex;
-            align-items: center;
-            flex-wrap: wrap;
-            justify-content: space-between;
-            padding: 0 60px;
-
-            .list_item {
-                width: 48%;
-                margin-bottom: 20px;
-
-                .title {
-                    font-size: 14px;
-                    font-weight: bold;
-                    color: #ffffff;
-                }
-            }
-        }
-    }
-}
 </style>

+ 2 - 2
src/main.js

@@ -5,7 +5,7 @@ import App from './App.vue'
 import router from './router'
 import axios from 'axios'
 const app = createApp(App)
-
+import Antd from 'ant-design-vue';
 app.use(router)
 
 
@@ -13,7 +13,7 @@ function getServerConfig() {
     axios.get('./public.json').then(result => {
         let config = result.data;
         app.config.globalProperties.$config = config
-        app.mount('#app')
+        app.use(Antd).mount('#app')
     })
 }
 getServerConfig()

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 168 - 345
yarn.lock


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov