MrShi
2025-05-07 569c6b3e6b28b2808d22af4656c8f65a973c345e
提交
已添加2个文件
已修改11个文件
1472 ■■■■■ 文件已修改
admin/.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/index.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/platform/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaPlatformWindow.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/admissionStatistics.vue 537 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/carStatistics.vue 537 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/dangerStatic.vue 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visits.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/api/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/center.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -2,7 +2,7 @@
NODE_ENV = 'development'
# VUE_APP_API_URL  = 'https://atwl.ahzyssl.com/zhyq_interface'
#  VUE_APP_API_URL  = 'http://localhost:10010'
VUE_APP_API_URL  = 'https://atwl.ahzyssl.com/zhyq_interface'
VUE_APP_API_URL  = 'http://192.168.0.103:10010'
# VUE_APP_API_URL  = 'https://atwl.ahzyssl.com/zhyq_interface'
# VUE_APP_API_URL  = 'http://10.50.250.253:8088/gateway_interface'
admin/src/api/business/index.js
@@ -14,4 +14,21 @@
export function approveTemplById (id) {
  return request.get(`/visitsAdmin/cloudService/business/approveTempl/findById/${id}`)
}
// åŸºç¡€æ•°æ®
export function getInParkUserData (data) {
  return request.post('/visitsAdmin/cloudService/business/inoutRecord/getInParkUserData', data)
}
// å æ¯”数据
export function getRataList (data) {
  return request.post('/visitsAdmin/cloudService/business/inoutRecord/getRataList', data)
}
// æŠ¥è¡¨æ•°æ®
export function getReportList (data) {
  return request.post('/visitsAdmin/cloudService/business/inoutRecord/getReportList', data)
}
// å…¥å›­æ•°æ®åˆ†æž-导出Excel
export function reportExportExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/inoutRecord/reportExportExcel', data)
}
export const uploadUrl = 'visitsAdmin/cloudService/public/upload'
admin/src/api/platform/index.js
@@ -132,3 +132,7 @@
export function dealJobFinish (data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/dealJobFinish', data)
}
// æ¢å¤ä½œä¸š
export function restoreWork (data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/restoreWork', data)
}
admin/src/components/business/OperaPlatformWindow.vue
@@ -41,6 +41,9 @@
      <el-form-item label="停留超时报警时间(分钟):" prop="stayTimeoutAlarmTime">
        <el-input type="number" v-model="form.stayTimeoutAlarmTime" placeholder="请输入停留超时报警时间(分钟)" v-trim />
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input type="number" v-model="form.sortnum" placeholder="请输入排序码" v-trim />
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
@@ -75,10 +78,12 @@
        workRate: '',
        stayTimeoutAlarmTime: '',
        workTimeoutAlarmTime: '',
        sortnum: ''
      },
      // éªŒè¯è§„则
      rules: {
        workingNum: [{ required: true, validator: numRuleGtZero, message: '请输入同时作业数量,必须大于0! ', trigger: 'blur' }]
        workingNum: [{ required: true, validator: numRuleGtZero, message: '请输入同时作业数量,必须大于0! ', trigger: 'blur' }],
        sortnum: [{ required: true, message: '排序码不能为空!', trigger: 'blur' }]
      }
    }
  },
admin/src/views/business/admissionStatistics.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,537 @@
<template>
    <div class="main_app1" v-if="info">
        <div class="main_head">
            <div class="main_head_title">
                <span>入园人员统计总览</span>
                <el-radio-group v-model="isGroupBy" size="mini" @change="getData(), getRataLists(), getReportLists()">
                    <el-radio-button :label="0">按车次统计</el-radio-button>
                    <el-radio-button :label="1">按车辆统计</el-radio-button>
                </el-radio-group>
            </div>
            <div class="main_head_bottom">
                <div class="main_head_item blue">
                    <span>{{info.todayTotal}}</span>
                    <span>今日</span>
                </div>
                <div class="main_head_item red">
                    <span>{{info.yesterdayTotal}}</span>
                    <span>昨日</span>
                </div>
                <div class="main_head_item yellow">
                    <span>{{info.weekTotal}}</span>
                    <span>本周</span>
                </div>
                <div class="main_head_item orange">
                    <span>{{info.monthTotal}}</span>
                    <span>本月</span>
                </div>
                <div class="main_head_item darkBlue">
                    <span>{{info.yearTotal}}</span>
                    <span>本年</span>
                </div>
            </div>
        </div>
        <div class="main_content">
            <div class="type_wrap">
                <div class="title">全年入园人员趋势</div>
                <div class="echart1" ref="typeRef" v-if="info.cumulativeDataList"></div>
                <div style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;" v-else>
                    <img style="width: 200px;" src="@/assets/images/default_homeimg.png" alt="">
                </div>
            </div>
            <div class="dept_wrap">
                <div class="title">
                    <span>人员分类统计</span>
                    <el-radio-group style="margin-left: 20px;" v-model="dateType" size="mini" @change="changeDateType">
                        <el-radio-button label="month">月</el-radio-button>
                        <el-radio-button label="year">å¹´</el-radio-button>
                    </el-radio-group>
                    <el-date-picker
                        v-model="value"
                        :type="dateType"
                        size="mini"
                        @change="getRataLists()"
                        :value-format="dateType === 'month' ? 'yyyy-MM' : 'yyyy'"
                        style="margin-left: 20px; width: 130px;"
                        placeholder="请选择">
                    </el-date-picker>
                </div>
                <div id="echart2" ref="deptRef" v-if="listZB.length > 0"></div>
                <div style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;" v-else>
                    <img style="width: 200px;" src="@/assets/images/default_homeimg.png" alt="">
                </div>
            </div>
        </div>
        <div class="main_table">
            <div class="main_table_list">
                <div class="title" style="display: flex; align-items: center; justify-content: space-between;">
                    <div>
                        <span>入园人员统计表</span>
                        <el-radio-group style="margin-left: 20px;" v-model="radio" size="mini" @change="changeBB">
                            <el-radio-button label="month">月</el-radio-button>
                            <el-radio-button label="year">å¹´</el-radio-button>
                        </el-radio-group>
                        <el-date-picker
                            v-model="date1"
                            :type="radio"
                            size="mini"
                            @change="getReportLists()"
                            :value-format="radio === 'month' ? 'yyyy-MM' : 'yyyy'"
                            style="margin-left: 20px; width: 130px;"
                            placeholder="请选择">
                        </el-date-picker>
                    </div>
                    <el-button type="primary" size="mini" style="margin-left: 20px;" @click="daochu">导出</el-button>
                </div>
                <div class="list_head">
                    <div class="list_head_item" v-for="(item, index) in column" :key="index">{{item}}</div>
                </div>
                <div class="table_box">
                    <div class="list_content" v-for="(item, index) in list" :key="index">
                        <div class="list_head_item">储运科</div>
                        <div class="list_head_item">联合工房</div>
                        <div class="list_head_item">232</div>
                        <div class="list_head_item">储运科</div>
                        <div class="list_head_item">联合工房</div>
                        <div class="list_head_item">232</div>
                        <div class="list_head_item">储运科</div>
                        <div class="list_head_item">联合工房</div>
                        <div class="list_head_item">232</div>
                        <div class="list_head_item">232</div>
                    </div>
                </div>
            </div>
            <div class="main_table_list1">
                <div class="title">
                    <span>本年人员累计入园统计</span>
                </div>
                <div class="list_head">
                    <div class="list_head_item">车辆分类</div>
                    <div class="list_head_item">入局次数</div>
                </div>
                <div class="table_box">
                    <div class="list_content" v-for="(item, index) in info.yearSortList" :key="index">
                        <div class="list_head_item">{{item.name}}</div>
                        <div class="list_head_item">{{item.total}}</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>
<script>
  import * as echarts from 'echarts'
  import { getInParkUserData, getRataList, getReportList, reportExportExcel } from '@/api/business'
  export default {
    data() {
      return {
        info: null,
        isGroupBy: 0,
        radio: 'month',
        value: '',
        dateType: 'month',
        date: '',
        date1: '',
        listZB: [],
        column: [],
        list: []
      }
    },
    mounted() {
      var now = new Date();
      var year = now.getFullYear();
      var month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
      this.value = `${year}-${month}`
      this.date1 = `${year}-${month}`
      this.getData()
      this.getRataLists()
      this.getReportLists()
    },
    methods: {
      // å¯¼å‡º
      daochu() {
        reportExportExcel({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 }).then(res => {
          this.download(res)
          console.log(res.data)
        })
      },
      changeBB() {
        if (this.radio === 'month') {
          let now = new Date();
          let year = now.getFullYear();
          let month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
          this.date1 = `${year}-${month}`
        } else {
          let now = new Date();
          let year = now.getFullYear();
          this.date1 = `${year}`
        }
        this.getReportLists()
      },
      // å…¥å›­è½¦è¾†ç»Ÿè®¡è¡¨
      getReportLists() {
        getReportList({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 })
          .then(res => {
            console.log(res)
            this.column = res.data.map(item => item[0])
            const keys = res.data.map(row => row[0]); // èŽ·å–é”®å
            const values = res.data.map(row => row.slice(1, row.length)); // èŽ·å–å€¼
            this.list = values[0].map((_, index) => {
              return keys.reduce((obj, key, i) => {
                obj[key] = values[i][index];
                return obj;
              }, {});
            });
          })
      },
      changeDateType() {
        if (this.dateType === 'month') {
          let now = new Date();
          let year = now.getFullYear();
          let month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
          this.value = `${year}-${month}`
        } else {
          let now = new Date();
          let year = now.getFullYear();
          this.value = `${year}`
        }
        this.getRataLists()
      },
      // è½¦è¾†åˆ†ç±»ç»Ÿè®¡
      getRataLists() {
        getRataList({ dateStr: this.value, isGroupBy: this.isGroupBy, type: 1 })
          .then(res => {
            console.log(res)
            this.listZB = res
            this.$nextTick(() => {
              this.initDept()
            })
          })
      },
      // åŸºç¡€æ•°æ®
      getData() {
        getInParkUserData({ isGroupBy: this.isGroupBy, type: 1 }).then(res => {
          this.info = res
          this.$nextTick(() => {
            this.initType()
          })
        })
      },
      // å…¨å¹´å…¥å›­è½¦è¾†è¶‹åŠ¿
      initType() {
        if (!this.info.cumulativeDataList) return
        const myChart = echarts.init(document.querySelector('.echart1'))
        let names = this.info.cumulativeDataList.map(item => item.name)
        let datas = this.info.cumulativeDataList.map(item => item.total)
        let option = {
          grid: {
            left: '5%',
            right: '10%',
            bottom: '0%',
            top: '20%',
            containLabel: true
          },
          xAxis: {
            type: 'category',
            data: names
          },
          yAxis: {
            type: 'value'
          },
          series: [
            {
              data: datas,
              type: 'line'
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
      },
      // è½¦è¾†åˆ†ç±»ç»Ÿè®¡
      initDept() {
        if (!this.listZB) return
        const myChart = echarts.init(document.querySelector('#echart2'))
        let data = this.listZB.map(item => {
          return {
            value: item.total,
            name: item.name
          }
        })
        let option = {
          series : [
            {
              name: '访问来源',
              type: 'pie',
              radius: '55%',
              data: data
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
      },
      initDept3() {
        const myChart = echarts.init(document.querySelector('#echart3'))
        let option = {
          grid: {
            left: '5%',
            right: '10%',
            bottom: '0%',
            top: '20%',
            containLabel: true
          },
          xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
          },
          yAxis: {
            type: 'value'
          },
          series: [
            {
              data: [150, 230, 224, 218, 135, 147, 260],
              type: 'line'
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
      }
    }
  }
</script>
<style lang="scss" scoped>
    .main_app1 {
        width: 100%;
        height: calc(100% - 44px);
        overflow-y: auto;
        overflow-x: hidden;
        padding: 15px;
        box-sizing: border-box;
        background-color: #ffffff;
        .main_head {
            width: 100%;
            display: flex;
            align-items: center;
            flex-direction: column;
            margin-bottom: 20px;
            .main_head_title {
                width: 100%;
                display: flex;
                align-items: center;
                margin-bottom: 20px;
                span {
                    font-weight: 600;
                    font-size: 16px;
                    color: #222222;
                    margin-right: 30px;
                }
            }
            .main_head_bottom {
                width: 100%;
                display: flex;
                align-items: center;
                justify-content: space-between;
                .blue {
                    border-left: 5px solid blue;
                }
                .red {
                    border-left: 5px solid red;
                }
                .yellow {
                    border-left: 5px solid yellow;
                }
                .orange {
                    border-left: 5px solid orange;
                }
                .darkBlue {
                    border-left: 5px solid #0000a8;
                }
                .main_head_item {
                    width: 19%;
                    height: 70px;
                    display: flex;
                    flex-direction: column;
                    align-items: center;
                    justify-content: center;
                    box-sizing: border-box;
                    border-radius: 5px;
                    background-color: #ffffff;
                    span {
                        &:nth-child(1) {
                            font-size: 22px;
                            color: black;
                            font-weight: bold;
                        }
                        &:nth-child(2) {
                            font-size: 16px;
                            color: black;
                        }
                    }
                }
            }
        }
        .main_table {
            display: flex;
            align-items: center;
            justify-content: space-between;
            height: 300px;
            .main_table_list {
                margin-left: 20px;
                flex: 1;
                .title {
                    display: flex;
                    align-items: center;
                    span {
                        font-weight: 600;
                        font-size: 16px;
                        color: #222222;
                    }
                }
                .list_head {
                    width: 100%;
                    height: 35px;
                    display: flex;
                    align-items: center;
                    background-color: #ececec;
                    margin-top: 15px;
                    .list_head_item {
                        flex: 1;
                        height: 100%;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        font-size: 13px;
                        color: #222222;
                    }
                }
                .table_box {
                    width: 100%;
                    height: 234px;
                    .list_content {
                        width: 100%;
                        height: 40px;
                        display: flex;
                        align-items: center;
                        .list_head_item {
                            flex: 1;
                            height: 100%;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            font-size: 13px;
                            color: #222222;
                        }
                    }
                }
            }
            .main_table_list1 {
                margin-left: 20px;
                width: 300px;
                flex-shrink: 0;
                .title {
                    font-weight: 600;
                    font-size: 16px;
                    color: #222222;
                }
                .list_head {
                    width: 100%;
                    height: 35px;
                    display: flex;
                    align-items: center;
                    background-color: #ececec;
                    margin-top: 15px;
                    .list_head_item {
                        flex: 1;
                        height: 100%;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        font-size: 13px;
                        color: #222222;
                    }
                }
                .table_box {
                    width: 100%;
                    height: 234px;
                    .list_content {
                        width: 100%;
                        height: 40px;
                        display: flex;
                        align-items: center;
                        .list_head_item {
                            flex: 1;
                            height: 100%;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            text-align: center;
                            font-size: 13px;
                            color: #222222;
                        }
                    }
                }
            }
        }
        .main_content {
            display: flex;
            height: 400px;
            .title {
                font-weight: 600;
                font-size: 16px;
                color: #222222;
                /*margin-bottom: 20px;*/
                margin-top: 20px;
            }
            .type_wrap {
                flex: 11;
                flex-shrink: 0;
                height: calc(100% - 20px);
                /*border-right: 12px solid #f7f7f7;*/
                .echart1 {
                    width: 100%;
                    height: calc(100% - 60px);
                }
            }
            .dept_wrap {
                flex: 8;
                flex-shrink: 0;
                height: calc(100% - 20px);
                padding-left: 20px;
                #echart2 {
                    width: 100%;
                    height: calc(100% - 60px);
                }
            }
        }
    }
</style>
admin/src/views/business/carStatistics.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,537 @@
<template>
    <div class="main_app1" v-if="info">
        <div class="main_head">
            <div class="main_head_title">
                <span>入园车辆统计总览</span>
                <el-radio-group v-model="isGroupBy" size="mini" @change="getData(), getRataLists(), getReportLists()">
                    <el-radio-button :label="0">按车次统计</el-radio-button>
                    <el-radio-button :label="1">按车辆统计</el-radio-button>
                </el-radio-group>
            </div>
            <div class="main_head_bottom">
                <div class="main_head_item blue">
                    <span>{{info.todayTotal}}</span>
                    <span>今日</span>
                </div>
                <div class="main_head_item red">
                    <span>{{info.yesterdayTotal}}</span>
                    <span>昨日</span>
                </div>
                <div class="main_head_item yellow">
                    <span>{{info.weekTotal}}</span>
                    <span>本周</span>
                </div>
                <div class="main_head_item orange">
                    <span>{{info.monthTotal}}</span>
                    <span>本月</span>
                </div>
                <div class="main_head_item darkBlue">
                    <span>{{info.yearTotal}}</span>
                    <span>本年</span>
                </div>
            </div>
        </div>
        <div class="main_content">
            <div class="type_wrap">
                <div class="title">全年入园车辆趋势</div>
                <div id="echart1" ref="typeRef" v-if="info.cumulativeDataList"></div>
                <div style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;" v-else>
                    <img style="width: 200px;" src="@/assets/images/default_homeimg.png" alt="">
                </div>
            </div>
            <div class="dept_wrap">
                <div class="title">
                    <span>车辆分类统计</span>
                    <el-radio-group style="margin-left: 20px;" v-model="dateType" size="mini" @change="changeDateType">
                        <el-radio-button label="month">月</el-radio-button>
                        <el-radio-button label="year">å¹´</el-radio-button>
                    </el-radio-group>
                    <el-date-picker
                        v-model="value"
                        :type="dateType"
                        size="mini"
                        @change="getRataLists()"
                        :value-format="dateType === 'month' ? 'yyyy-MM' : 'yyyy'"
                        style="margin-left: 20px; width: 130px;"
                        placeholder="请选择">
                    </el-date-picker>
                </div>
                <div id="echart2" ref="deptRef" v-if="listZB.length > 0"></div>
                <div style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;" v-else>
                    <img style="width: 200px;" src="@/assets/images/default_homeimg.png" alt="">
                </div>
            </div>
        </div>
        <div class="main_table">
            <div class="main_table_list">
                <div class="title" style="display: flex; align-items: center; justify-content: space-between;">
                    <div>
                        <span>入园车辆统计表</span>
                        <el-radio-group style="margin-left: 20px;" v-model="radio" size="mini" @change="changeBB">
                            <el-radio-button label="month">月</el-radio-button>
                            <el-radio-button label="year">å¹´</el-radio-button>
                        </el-radio-group>
                        <el-date-picker
                                v-model="date1"
                                :type="radio"
                                size="mini"
                                @change="getReportLists()"
                                :value-format="radio === 'month' ? 'yyyy-MM' : 'yyyy'"
                                style="margin-left: 20px; width: 130px;"
                                placeholder="请选择">
                        </el-date-picker>
                    </div>
                    <el-button type="primary" size="mini" style="margin-left: 20px;" @click="daochu">导出</el-button>
                </div>
                <div class="list_head">
                    <div class="list_head_item" v-for="(item, index) in column" :key="index">{{item}}</div>
                </div>
                <div class="table_box">
                    <div class="list_content" v-for="(item, index) in list" :key="index">
                        <div class="list_head_item">储运科</div>
                        <div class="list_head_item">联合工房</div>
                        <div class="list_head_item">232</div>
                        <div class="list_head_item">储运科</div>
                        <div class="list_head_item">联合工房</div>
                        <div class="list_head_item">232</div>
                        <div class="list_head_item">储运科</div>
                        <div class="list_head_item">联合工房</div>
                        <div class="list_head_item">232</div>
                        <div class="list_head_item">232</div>
                    </div>
                </div>
            </div>
            <div class="main_table_list1">
                <div class="title">
                    <span>本年车辆累计入园统计</span>
                </div>
                <div class="list_head">
                    <div class="list_head_item">车辆分类</div>
                    <div class="list_head_item">入局次数</div>
                </div>
                <div class="table_box">
                    <div class="list_content" v-for="(item, index) in info.yearSortList" :key="index">
                        <div class="list_head_item">{{item.name}}</div>
                        <div class="list_head_item">{{item.total}}</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>
<script>
  import * as echarts from 'echarts'
  import { getInParkUserData, getRataList, getReportList, reportExportExcel } from '@/api/business'
  export default {
    data() {
      return {
        info: null,
        isGroupBy: 0,
        radio: 'month',
        value: '',
        dateType: 'month',
        date: '',
        date1: '',
        listZB: [],
        column: [],
        list: []
      }
    },
    mounted() {
      var now = new Date();
      var year = now.getFullYear();
      var month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
      this.value = `${year}-${month}`
      this.date1 = `${year}-${month}`
      this.getData()
      this.getRataLists()
      this.getReportLists()
    },
    methods: {
      // å¯¼å‡º
      daochu() {
        reportExportExcel({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 0 }).then(res => {
          this.download(res)
          console.log(res.data)
        })
      },
      changeBB() {
        if (this.radio === 'month') {
          let now = new Date();
          let year = now.getFullYear();
          let month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
          this.date1 = `${year}-${month}`
        } else {
          let now = new Date();
          let year = now.getFullYear();
          this.date1 = `${year}`
        }
        this.getReportLists()
      },
      // å…¥å›­è½¦è¾†ç»Ÿè®¡è¡¨
      getReportLists() {
        getReportList({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 0 })
            .then(res => {
              console.log(res)
              this.column = res.data.map(item => item[0])
              const keys = res.data.map(row => row[0]); // èŽ·å–é”®å
              const values = res.data.map(row => row.slice(1, row.length)); // èŽ·å–å€¼
              this.list = values[0].map((_, index) => {
                return keys.reduce((obj, key, i) => {
                  obj[key] = values[i][index];
                  return obj;
                }, {});
              });
            })
      },
      changeDateType() {
        if (this.dateType === 'month') {
          let now = new Date();
          let year = now.getFullYear();
          let month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
          this.value = `${year}-${month}`
        } else {
          let now = new Date();
          let year = now.getFullYear();
          this.value = `${year}`
        }
        this.getRataLists()
      },
      // è½¦è¾†åˆ†ç±»ç»Ÿè®¡
      getRataLists() {
        getRataList({ dateStr: this.value, isGroupBy: this.isGroupBy, type: 0 })
            .then(res => {
              console.log(res)
              this.listZB = res
              this.$nextTick(() => {
                this.initDept()
              })
            })
      },
      // åŸºç¡€æ•°æ®
      getData() {
        getInParkUserData({ isGroupBy: this.isGroupBy, type: 0 }).then(res => {
          this.info = res
          this.$nextTick(() => {
            this.initType()
          })
        })
      },
      // å…¨å¹´å…¥å›­è½¦è¾†è¶‹åŠ¿
      initType() {
        if (!this.info.cumulativeDataList) return
        const myChart = echarts.init(document.querySelector('#echart1'))
        let names = this.info.cumulativeDataList.map(item => item.name)
        let datas = this.info.cumulativeDataList.map(item => item.total)
        let option = {
          grid: {
            left: '5%',
            right: '10%',
            bottom: '0%',
            top: '20%',
            containLabel: true
          },
          xAxis: {
            type: 'category',
            data: names
          },
          yAxis: {
            type: 'value'
          },
          series: [
            {
              data: datas,
              type: 'line'
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
      },
      // è½¦è¾†åˆ†ç±»ç»Ÿè®¡
      initDept() {
        if (!this.listZB) return
        const myChart = echarts.init(document.querySelector('#echart2'))
        let data = this.listZB.map(item => {
          return {
            value: item.total,
            name: item.name
          }
        })
        let option = {
          series : [
            {
              name: '访问来源',
              type: 'pie',
              radius: '55%',
              data: data
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
      },
      initDept3() {
        const myChart = echarts.init(document.querySelector('#echart3'))
        let option = {
          grid: {
            left: '5%',
            right: '10%',
            bottom: '0%',
            top: '20%',
            containLabel: true
          },
          xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
          },
          yAxis: {
            type: 'value'
          },
          series: [
            {
              data: [150, 230, 224, 218, 135, 147, 260],
              type: 'line'
            }
          ]
        }
        myChart.setOption(option)
        window.addEventListener('resize', function () { // æ‰§è¡Œ
          myChart.resize()
        })
      }
    }
  }
</script>
<style lang="scss" scoped>
    .main_app1 {
        width: 100%;
        height: calc(100% - 44px);
        overflow-y: auto;
        overflow-x: hidden;
        padding: 15px;
        box-sizing: border-box;
        background-color: #ffffff;
        .main_head {
            width: 100%;
            display: flex;
            align-items: center;
            flex-direction: column;
            margin-bottom: 20px;
            .main_head_title {
                width: 100%;
                display: flex;
                align-items: center;
                margin-bottom: 20px;
                span {
                    font-weight: 600;
                    font-size: 16px;
                    color: #222222;
                    margin-right: 30px;
                }
            }
            .main_head_bottom {
                width: 100%;
                display: flex;
                align-items: center;
                justify-content: space-between;
                .blue {
                    border-left: 5px solid blue;
                }
                .red {
                    border-left: 5px solid red;
                }
                .yellow {
                    border-left: 5px solid yellow;
                }
                .orange {
                    border-left: 5px solid orange;
                }
                .darkBlue {
                    border-left: 5px solid #0000a8;
                }
                .main_head_item {
                    width: 19%;
                    height: 70px;
                    display: flex;
                    flex-direction: column;
                    align-items: center;
                    justify-content: center;
                    box-sizing: border-box;
                    border-radius: 5px;
                    background-color: #ffffff;
                    span {
                        &:nth-child(1) {
                            font-size: 22px;
                            color: black;
                            font-weight: bold;
                        }
                        &:nth-child(2) {
                            font-size: 16px;
                            color: black;
                        }
                    }
                }
            }
        }
        .main_table {
            display: flex;
            align-items: center;
            justify-content: space-between;
            height: 300px;
            .main_table_list {
                margin-left: 20px;
                flex: 1;
                .title {
                    display: flex;
                    align-items: center;
                    span {
                        font-weight: 600;
                        font-size: 16px;
                        color: #222222;
                    }
                }
                .list_head {
                    width: 100%;
                    height: 35px;
                    display: flex;
                    align-items: center;
                    background-color: #ececec;
                    margin-top: 15px;
                    .list_head_item {
                        flex: 1;
                        height: 100%;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        font-size: 13px;
                        color: #222222;
                    }
                }
                .table_box {
                    width: 100%;
                    height: 234px;
                    .list_content {
                        width: 100%;
                        height: 40px;
                        display: flex;
                        align-items: center;
                        .list_head_item {
                            flex: 1;
                            height: 100%;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            font-size: 13px;
                            color: #222222;
                        }
                    }
                }
            }
            .main_table_list1 {
                margin-left: 20px;
                width: 300px;
                flex-shrink: 0;
                .title {
                    font-weight: 600;
                    font-size: 16px;
                    color: #222222;
                }
                .list_head {
                    width: 100%;
                    height: 35px;
                    display: flex;
                    align-items: center;
                    background-color: #ececec;
                    margin-top: 15px;
                    .list_head_item {
                        flex: 1;
                        height: 100%;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        font-size: 13px;
                        color: #222222;
                    }
                }
                .table_box {
                    width: 100%;
                    height: 234px;
                    .list_content {
                        width: 100%;
                        height: 40px;
                        display: flex;
                        align-items: center;
                        .list_head_item {
                            flex: 1;
                            height: 100%;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            text-align: center;
                            font-size: 13px;
                            color: #222222;
                        }
                    }
                }
            }
        }
        .main_content {
            display: flex;
            height: 400px;
            .title {
                font-weight: 600;
                font-size: 16px;
                color: #222222;
                /*margin-bottom: 20px;*/
                margin-top: 20px;
            }
            .type_wrap {
                flex: 11;
                flex-shrink: 0;
                height: calc(100% - 20px);
                /*border-right: 12px solid #f7f7f7;*/
                #echart1 {
                    width: 100%;
                    height: calc(100% - 60px);
                }
            }
            .dept_wrap {
                flex: 8;
                flex-shrink: 0;
                height: calc(100% - 20px);
                padding-left: 20px;
                #echart2 {
                    width: 100%;
                    height: calc(100% - 60px);
                }
            }
        }
    }
</style>
admin/src/views/business/dangerStatic.vue
@@ -1,15 +1,37 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getData(1)" @clear="clear"
      @changeForm='changeForm'>
      <template #fastdate>
        <el-radio-group v-model="filters.fastdate" size="small" @input="changeRadio">
          <el-radio-button label="0">当天</el-radio-button>
          <el-radio-button label="6">近7天</el-radio-button>
          <el-radio-button label="29">近30天</el-radio-button>
        </el-radio-group>
      </template>
    </QueryForm>
  <div class="main_app1">
    <div class="main_head">
      <div class="main_head_item blue">
        <span>{{totalList.total}}</span>
        <span>总隐患数</span>
      </div>
      <div class="main_head_item red">
        <span>{{totalList.waitDeal}}</span>
        <span>待处理</span>
      </div>
      <div class="main_head_item yellow">
        <span>{{totalList.dealFinish}}</span>
        <span>已整改</span>
      </div>
      <div class="main_head_item orange">
        <span>{{totalList.back}}</span>
        <span>已退回</span>
      </div>
      <div class="main_head_item darkBlue">
        <span>{{totalList.todayNew}}</span>
        <span>今日新增</span>
      </div>
    </div>
<!--    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getData(1)" @clear="clear"-->
<!--      @changeForm='changeForm'>-->
<!--      <template #fastdate>-->
<!--        <el-radio-group v-model="filters.fastdate" size="small" @input="changeRadio">-->
<!--          <el-radio-button label="0">当天</el-radio-button>-->
<!--          <el-radio-button label="6">近7天</el-radio-button>-->
<!--          <el-radio-button label="29">近30天</el-radio-button>-->
<!--        </el-radio-group>-->
<!--      </template>-->
<!--    </QueryForm>-->
    <div class="main_content">
      <div class="type_wrap">
        <div class="title">隐患类型统计</div>
@@ -24,6 +46,30 @@
        <div v-show="deptList && deptList.length > 0" class="echart2" ref="deptRef"></div>
        <div v-show="deptList.length == 0" style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;">
          <img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt="">
        </div>
      </div>
    </div>
    <div class="main_table">
      <div class="main_table_echart">
        <div class="title">本年隐患趋势</div>
        <div id="echart3" v-if="yearList.length > 0"></div>
        <div v-else style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;">
          <img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt="">
        </div>
      </div>
      <div class="main_table_list">
        <div class="title">本月频繁发生隐患区域Top10</div>
        <div class="list_head">
          <div class="list_head_item">责任部门</div>
          <div class="list_head_item">隐患区域</div>
          <div class="list_head_item">隐患数量</div>
        </div>
        <div class="table_box">
          <div class="list_content" v-for="(item, index) in departmentList" :key="index">
            <div class="list_head_item">{{item.name}}</div>
            <div class="list_head_item">{{item.categoryName}}</div>
            <div class="list_head_item">{{item.total}}</div>
          </div>
        </div>
      </div>
    </div>
@@ -74,10 +120,20 @@
      },
      typeList: [],
      deptList: [],
      totalList: {
        total: 0,
        waitDeal: 0,
        dealFinish: 0,
        back: 0,
        todayNew: 0
      },
      yearList: [],
      departmentList: []
    }
  },
  mounted() {
    this.changeRadio('29')
    this.initDept3()
    // this.getData()
  },
  methods: {
@@ -90,11 +146,22 @@
    getData(page) {
      hiddenDangerDataPost({ ...this.filters }).then(res => {
        if (res) {
          this.totalList.total = res.total || 0
          this.totalList.waitDeal = res.waitDeal || 0
          this.totalList.dealFinish = res.dealFinish || 0
          this.totalList.back = res.back || 0
          this.totalList.todayNew = res.todayNew || 0
          this.yearList = res.yearList
          this.departmentList = res.departmentList.slice(0, 10)
          this.typeList = res.cateList || []
          this.deptList = res.departmentList || []
          this.$nextTick(() => {
            this.initType()
            this.initDept()
            this.initDept3()
          })
        }
@@ -114,8 +181,8 @@
      let option = {
        grid: {
          left: '0%',
          // right: '4%',
          // bottom: '3%',
          right: '0%',
          bottom: '0%',
          top: '0%',
          containLabel: true
        },
@@ -126,7 +193,7 @@
            left: '45%',
            textStyle: {
              color: '#666666',
              fontSize: 16,
              fontSize: 13,
            },
          }, {
            text: total,
@@ -134,7 +201,7 @@
            left: '47.6%',
            textStyle: {
              color: '#080404',
              fontSize: 24,
              fontSize: 16,
              fontWeight: 'bold',
            },
          }],
@@ -157,7 +224,7 @@
        series: [
          {
            type: 'pie',
            radius: ['24%', '40%'],
            radius: ['34%', '50%'],
            label: {
              formatter: "{a|{b}}\n\n{c} | {d}%",
              rich: {
@@ -198,6 +265,13 @@
      const myChart = echarts.init(document.querySelector('.echart2'))
      let option = {
        grid: {
          left: '10%',
          right: '10%',
          bottom: '0%',
          top: '20%',
          containLabel: true
        },
        xAxis: {
          type: 'category',
          data: this.deptList.map(i => i.name),
@@ -241,6 +315,41 @@
        myChart.resize()
      })
    },
    initDept3() {
      if (this.yearList.length === 0) return
      const myChart = echarts.init(document.querySelector('#echart3'))
      let names = this.yearList.map(item => item.name)
      let datas = this.yearList.map(item => item.total)
      let option = {
        grid: {
          left: '5%',
          right: '10%',
          bottom: '0%',
          top: '20%',
          containLabel: true
        },
        xAxis: {
          type: 'category',
          data: names
        },
        yAxis: {
          type: 'value'
        },
        series: [
          {
            data: datas,
            type: 'line'
          }
        ]
      }
      myChart.setOption(option)
      window.addEventListener('resize', function () { // æ‰§è¡Œ
        myChart.resize()
      })
    },
    clear() {
      this.filters = {}
      this.getData()
@@ -253,16 +362,132 @@
/*.main_app {
  height: 100%;
}*/
.main_app1 {
  width: 100%;
  height: calc(100% - 44px);
  overflow-y: auto;
  overflow-x: hidden;
  padding: 15px;
  box-sizing: border-box;
  background-color: #ffffff;
  .main_head {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 20px;
    .blue {
      border-left: 5px solid blue;
    }
    .red {
      border-left: 5px solid red;
    }
    .yellow {
      border-left: 5px solid yellow;
    }
    .orange {
      border-left: 5px solid orange;
    }
    .darkBlue {
      border-left: 5px solid #0000a8;
    }
    .main_head_item {
      width: 19%;
      height: 70px;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      box-sizing: border-box;
      border-radius: 5px;
      background-color: #ffffff;
      span {
        &:nth-child(1) {
          font-size: 22px;
          color: black;
          font-weight: bold;
        }
        &:nth-child(2) {
          font-size: 16px;
          color: black;
        }
      }
    }
  }
  .main_table {
    display: flex;
    align-items: start;
    justify-content: space-between;
    .main_table_echart {
      flex: 1;
      height: 400px;
      .title {
        font-weight: 600;
        font-size: 16px;
        color: #222222;
      }
      #echart3 {
        width: 100%;
        height: calc(100% - 33px);
      }
    }
    .main_table_list {
      margin-left: 20px;
      flex-shrink: 0;
      width: 500px;
      .title {
        font-weight: 600;
        font-size: 16px;
        color: #222222;
      }
      .list_head {
        width: 100%;
        height: 35px;
        display: flex;
        align-items: center;
        background-color: #ececec;
        margin-top: 15px;
        .list_head_item {
          flex: 1;
          height: 100%;
          display: flex;
          align-items: center;
          justify-content: center;
          font-size: 13px;
          color: #222222;
        }
      }
      .table_box {
        width: 100%;
        .list_content {
          width: 100%;
          height: 35px;
          display: flex;
          align-items: center;
          .list_head_item {
            flex: 1;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 13px;
            color: #222222;
          }
        }
      }
    }
  }
.main_content {
  display: flex;
  height: calc(100% - 100px);
    height: 500px;
  .title {
    font-weight: 600;
    font-size: 16px;
    color: #222222;
    margin-bottom: 20px;
      /*margin-bottom: 20px;*/
    margin-top: 20px;
  }
@@ -270,7 +495,7 @@
    flex: 11;
    flex-shrink: 0;
    height: calc(100% - 20px);
    border-right: 12px solid #f7f7f7;
      /*border-right: 12px solid #f7f7f7;*/
    .echart1 {
@@ -291,4 +516,6 @@
    }
  }
}
}
</style>
admin/src/views/business/visits.vue
@@ -12,6 +12,17 @@
        <el-form-item label="访客单位" prop="companyName">
          <el-input v-model="searchForm.companyName" placeholder="请输入访客单位" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <el-form-item label="起始时间" prop="date">
          <el-date-picker
            v-model="searchForm.date"
            type="daterange"
            @change="changeDate"
            value-format="yyyy-MM-dd"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="审批状态" prop="status">
          <el-select v-model="searchForm.status" placeholder="请选择">
            <el-option label="待提交审批" value="0"></el-option>
@@ -128,7 +139,10 @@
        companyName: '',
        idcardNo: '',
        status: '',
        type: 0
        type: 0,
        queryStarttime: '',
        queryEndtime: '',
        date: []
      }
    }
  },
@@ -150,6 +164,23 @@
    })
  },
  methods: {
    // æœç´¢æ¡†é‡ç½®
    reset () {
      this.$refs.searchForm.resetFields()
      this.searchForm.queryStarttime = ''
      this.searchForm.queryEndtime = ''
      this.search()
    },
    changeDate(e) {
      if (e) {
        this.searchForm.queryStarttime = e[0]
        this.searchForm.queryEndtime = e[1]
      } else {
        this.searchForm.queryStarttime = ''
        this.searchForm.queryEndtime = ''
      }
      this.search()
    },
    handleDetail(row) {
      this.isShowDetail = true
      console.log('row', row)
admin/src/views/index.vue
@@ -32,8 +32,8 @@
              <img src="@/assets/icons/home_icon2.png" alt="" />
            </div>
            <div class="content">
              <div>访客人次(人):{{ headerData.visitUserNum }}</div>
              <div>签离人次(人):{{ headerData.signLevelNum }}</div>
              <div>入园人次(人):{{ headerData.visitUserNum }}</div>
              <div>出园人次(人):{{ headerData.signLevelNum }}</div>
            </div>
          </div>
          <div class="card">
@@ -100,7 +100,11 @@
            </div>
            <div class="wrap static2">
              <div class="header">
                <div class="home_title">长期相关方分布</div>
<!--                <div class="home_title">长期相关方分布</div>-->
                <el-radio-group v-model="tabPosition" @change="changeType">
                  <el-radio-button label="top">长期相关方分布</el-radio-button>
                  <el-radio-button label="right">内部人员分布</el-radio-button>
                </el-radio-group>
                <!-- <div class="df_ac more">
                  æ›´å¤š<i class="el-icon-arrow-right"></i>
                </div> -->
@@ -226,6 +230,7 @@
  },
  data () {
    return {
      tabPosition: 'top',
      colors,
      nowDate: '',
      nowWeek: '',
@@ -264,6 +269,10 @@
    this.initData()
  },
  methods: {
    changeType(e) {
      console.log(e)
      this.initEchart2()
    },
    getNoticeList(){
      syncHkNotice().then(res => {
@@ -393,8 +402,9 @@
        this.headerData = res || {}
        const arr = []
        arr.push({ name: '访客', value: this.headerData.inParkVisitUserNum })
        arr.push({ name: '内部员工', value: this.headerData.todayInParkUserNum - this.headerData.inParkLwUserNum - this.headerData.inParkVisitUserNum })
        arr.push({ name: '内部员工', value: this.headerData.todayInParkUserNum - this.headerData.inParkLwUserNum - this.headerData.inParkVisitUserNum - this.headerData.inParkDriverUserNum })
        arr.push({ name: '长期相关方', value: this.headerData.inParkLwUserNum })
        arr.push({ name: '货运司机', value: this.headerData.inParkDriverUserNum })
        arr.sort((a, b) => b.value - a.value)
        this.manningRatio = arr
        this.initEchart1()
@@ -497,6 +507,7 @@
      })
    },
    initEchart2 () {
      console.log('initEchart2')
      const myChart = echarts.init(document.getElementById('echart2'))
      const that = this
      myChart.setOption({
@@ -526,11 +537,11 @@
        },
        yAxis: {
          type: 'category',
          data: that.staticData.lwList.map(i => i.name)
          data: that.tabPosition === 'top' ? that.staticData.lwList.map(i => i.name) : that.staticData.internalList.map(i => i.name)
        },
        series: [
          {
            data: that.staticData.lwList.map(i => i.num),
            data: that.tabPosition === 'top' ? that.staticData.lwList.map(i => i.num) : that.staticData.internalList.map(i => i.num),
            type: 'bar',
            barWidth: 10,
            itemStyle: {
admin/src/views/platform/index.vue
@@ -95,6 +95,7 @@
              </div>
              <div class="right">
                <el-button v-if="task.status == 5" plain @click="handleErr(task)">异常挂起</el-button>
                <el-button v-if="task.status == 8" plain @click="restore(task)">恢复作业</el-button>
                <el-button v-if="task.status == 5 || task.status == 8" plain
                  @click="handleTransform(item, task)">转移月台</el-button>
                <el-button v-if="task.status == 4" plain @click="handlePass(task)">过号</el-button>
@@ -163,7 +164,8 @@
  platformMove,
  updUserPlatformConfig,
  listByGroupId
  listByGroupId,
  restoreWork
} from '@/api'
import PlatformQueuing from './components/PlatformQueuing.vue'
import WaybillDetail from './components/WaybillDetail.vue'
@@ -280,6 +282,18 @@
        })
      })
    },
    restore(item) {
      this.$confirm('您确认要对该任务进行恢复作业吗', '温馨提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        restoreWork({ jobId: item.id }).then(ress => {
          Message.success('恢复作业成功')
          this.getPlatGroupList()
        })
      })
    },
    platgroupClick(item) {
      this.activeGroup = { ...item }
      this.circulInitTaskList()
pda/api/index.js
@@ -167,3 +167,11 @@
    data
  })
}
//  æ¢å¤ä½œä¸š
export const restoreWork = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/platformJob/restoreWork',
    method: 'post',
    data
  })
}
pda/pages/index/center.vue
@@ -63,6 +63,7 @@
                    <view v-if="item.status == 4" class="btn active" @click="handleWork(item)">开始作业</view>
                    <view v-if="item.status == 5" class="btn" @click="handleErr(item)">异常挂起</view>
                    <view v-if="item.status == 8" class="btn" @click="restore(item)">异常挂起</view>
                    <view v-if="item.status == 5 || item.status == 8" class="btn" @click="handleTransform(item)">转移月台</view>
                    <view v-if="item.status == 5 || item.status == 8" class="btn active" @click="handleFinish(item)">作业完成</view>
                </view>
@@ -227,7 +228,8 @@
        platformMove,
        platformErr,
        platformOverNumber,
        wmsJobDetail
        wmsJobDetail,
        restoreWork
    } from '@/api'
    import {
        statusMap
@@ -565,6 +567,21 @@
                        }
                    }
                })
            },
            restore(item) {
                uni.showModal({
                    content: '您确认要对该任务进行恢复作业吗',
                    success: (res) => {
                        if (res.confirm) {
                            restoreWork({
                                jobId: item.id
                            }).then(ress => {
                                this.showToast('恢复作业成功')
                                this.getPlatformTask()
                            })
                        }
                    }
                })
            }
        }
    }
screen/index.html
@@ -4,7 +4,7 @@
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>安泰物流月台叫号大屏</title>
    <title>安泰智慧物流园区系统</title>
  </head>
  <body>
    <div id="app"></div>