ll
liukangdong
2024-12-25 328305d2e3fbac22e5c975b13667535b655ca445
ll
已添加1个文件
已修改30个文件
1488 ■■■■■ 文件已修改
admin/src/views/platform/LogisticsRecord/leaveAuth.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/operation.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/operationCity.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/subscribe.vue 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/waybill.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/waybillQuery.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/oil.vue 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/smokebox.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/water.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/statistics/platformRecord.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/statistics/platformStatic.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/publicMsg.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/smsMessage.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/driver.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/driver/login.vue 488 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/login/login.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/vDangetAppr.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staffLogin/login.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/package-lock.json 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/api/index.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/EnergyConsum.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/FireFighting.vue 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/LogisticsCenter.vue 222 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/LogisticsEfficiency.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/SecurityControl.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/TaskEfficiency.vue 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/leaveAuth.vue
@@ -237,6 +237,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/platform/LogisticsRecord/operation.vue
@@ -203,6 +203,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/platform/LogisticsRecord/operationCity.vue
@@ -1,12 +1,9 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @changeForm='changeForm' @handleQuery="getList(1)" @clear="clear">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @changeForm='changeForm' @handleQuery="getList(1)"
      @clear="clear">
      <template #fastdate>
        <el-radio-group
          v-model="filters.fastdate"
          size="small"
          @input="changeRadio"
        >
        <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>
@@ -14,7 +11,8 @@
      </template>
    </QueryForm>
    <div class="pt16">
      <el-button :loading="exLoading" @click="handleEx" v-permissions="['business:platformjob:exportExcel']">导出</el-button>
      <el-button :loading="exLoading" @click="handleEx"
        v-permissions="['business:platformjob:exportExcel']">导出</el-button>
    </div>
    <el-table class="mb20" v-loading="loading" :data="list" stripe>
      <el-table-column prop="contractNum" label="合同号" min-width="100" show-overflow-tooltip />
@@ -49,7 +47,7 @@
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import { platformJobPage,  platformJobExport,platformJobDel } from '@/api'
import { platformJobPage, platformJobExport, platformJobDel } from '@/api'
import { statusMap } from '../config'
import DriverDetail from "@/views/task/driverDetail"
import GlobalWindow from '@/components/common/GlobalWindow'
@@ -57,7 +55,7 @@
import { Message } from 'element-ui'
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration);
dayjs.extend(duration)
export default {
  components: {
    Pagination,
@@ -84,7 +82,7 @@
      list: [],
      queryFormConfig: {
        formItems: [
        {
          {
            filed: 'contractNum',
            type: 'input',
            label: '合同号'
@@ -120,12 +118,12 @@
    this.getList()
  },
  methods: {
    changeRadio (day) {
    changeRadio(day) {
      const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD') + ' 00:00:00', dayjs().format('YYYY-MM-DD') + ' 23:59:59']
      this.$set(this.filters, 'selDate', arr)
      this.getList()
    },
    changeForm (str) {
    changeForm(str) {
      if (str === 'selDate') {
        this.$set(this.filters, 'fastdate', null)
        this.getList()
@@ -149,7 +147,7 @@
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
          item.workTime = dayjs.duration(item.workTime, 'seconds').format('H时m分s秒');
          item.workTime = dayjs.duration(item.workTime, 'seconds').format('H时m分s秒')
        })
        this.pagination.total = res.total || 0
      }, () => {
@@ -204,6 +202,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/platform/LogisticsRecord/subscribe.vue
@@ -1,12 +1,9 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @changeForm='changeForm' @handleQuery="getList(1)" @clear="clear">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @changeForm='changeForm' @handleQuery="getList(1)"
      @clear="clear">
      <template #fastdate>
        <el-radio-group
          v-model="filters.fastdate"
          size="small"
          @input="changeRadio"
        >
        <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>
@@ -16,7 +13,8 @@
    <div class="pt16">
      <el-button type="primary" @click="handleEdit" icon="el-icon-plus"
        v-permissions="['business:platformbooks:create']">新建</el-button>
      <el-button :loading="exLoading" @click="handleEx" v-permissions="['business:platformbooks:exportExcel']">导出</el-button>
      <el-button :loading="exLoading" @click="handleEx"
        v-permissions="['business:platformbooks:exportExcel']">导出</el-button>
    </div>
    <el-table class="mb20" v-loading="loading" :data="list" stripe>
      <el-table-column prop="contractNum" label="合同单号" min-width="100" show-overflow-tooltip />
@@ -62,8 +60,8 @@
          <el-input v-model="param.contractNum" class="w300" placeholder="请输入合同号"></el-input>
        </el-form-item>
        <el-form-item label="到场时间" prop="arriveDate">
          <el-date-picker v-model="param.arriveDate" @change="checkSurplus" value-format="yyyy-MM-dd HH:mm:ss" type="datetime" class="w300"
            placeholder="请选择">
          <el-date-picker v-model="param.arriveDate" @change="checkSurplus" value-format="yyyy-MM-dd HH:mm:ss"
            type="datetime" class="w300" placeholder="请选择">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="入库类型" prop="inType">
@@ -73,7 +71,8 @@
          </div>
        </el-form-item>
        <el-form-item label="总运输量" prop="totalNum">
          <el-input @blur="checkSurplus" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 10)" v-model="param.totalNum" placeholder="请输入" class="w300"></el-input>
          <el-input @blur="checkSurplus" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 10)"
            v-model="param.totalNum" placeholder="请输入" class="w300"></el-input>
          <span class="ml10">万支</span>
        </el-form-item>
        <el-form-item label="准运证照片" prop="transportImg">
@@ -86,7 +85,8 @@
          <el-input v-model="param.driverName" placeholder="请输入" class="w300"></el-input>
        </el-form-item>
        <el-form-item label="司机手机号" prop="driverPhone">
          <el-input oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 11)" v-model="param.driverPhone" placeholder="请输入" class="w300"></el-input>
          <el-input oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 11)" v-model="param.driverPhone"
            placeholder="请输入" class="w300"></el-input>
        </el-form-item>
        <el-form-item label="车前牌照号" prop="carCodeFront">
          <el-input v-model="param.carCodeFront" placeholder="请输入" class="w300"></el-input>
@@ -105,7 +105,7 @@
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import { platformBooksPage, platformReasonList, platformBooksApply, platformBooksExport } from '@/api'
import { checkSurplusNum } from '@/api/platform/platform'
import { checkSurplusNum } from '@/api/platform/platform'
import DriverDetail from "@/views/task/driverDetail"
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
@@ -207,25 +207,25 @@
  methods: {
    checkSurplus() {
      const { arriveDate, reasonId, totalNum } = this.param
      if(!arriveDate || !reasonId || !totalNum) return
      if (!arriveDate || !reasonId || !totalNum) return
      checkSurplusNum({
        arriveDate,
        reasonId,
        totalNum
      }).then(res => {
        console.log('res', res);
        if( res == 0 ||  res < Number(totalNum)){
        console.log('res', res)
        if (res == 0 || res < Number(totalNum)) {
          Message.error(`当日剩余可预约作业量${res}万支不足请选择其他到场日期`)
        }
      })
    },
    changeRadio (day) {
    changeRadio(day) {
      const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD') + ' 00:00:00', dayjs().format('YYYY-MM-DD') + ' 23:59:59']
      this.$set(this.filters, 'selDate', arr)
      this.getList()
    },
    changeForm (str) {
    changeForm(str) {
      if (str === 'selDate') {
        this.$set(this.filters, 'fastdate', null)
        this.getList()
@@ -336,6 +336,7 @@
    handleDel() { },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/platform/LogisticsRecord/waybill.vue
@@ -23,7 +23,7 @@
      <el-table-column prop="driverName" label="司机" min-width="100" show-overflow-tooltip />
      <el-table-column prop="drivierPhone" label="司机电话" min-width="100" show-overflow-tooltip />
      <el-table-column prop="inTypeTemp" label="作业类型" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
        <template v-slot="scope">
          <span v-if="scope.row.type == '0'">自有车卸货</span>
          <span v-if="scope.row.type == '1'">自有车装货</span>
          <span v-if="scope.row.type == '2'">外协车卸货</span>
@@ -39,8 +39,8 @@
      </el-table-column>
      <el-table-column prop="name" label="操作" min-width="120" align="center" fixed="right" show-overflow-tooltip>
        <template v-slot="scope">
          <el-button v-if="scope.row.status == '12'" type="text" class="red" v-permissions="['business:platformjob:delete']"
            @click="handleDel(scope.row)">删除</el-button>
          <el-button v-if="scope.row.status == '12'" type="text" class="red"
            v-permissions="['business:platformjob:delete']" @click="handleDel(scope.row)">删除</el-button>
          <el-button v-if="scope.row != 12" type="text" v-permissions="['business:platformjob:query']"
            @click="handleDetail(scope.row)">运单详情</el-button>
        </template>
@@ -226,6 +226,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/platform/LogisticsRecord/waybillQuery.vue
@@ -15,8 +15,8 @@
      <el-table-column prop="driverName" label="最后更新时间" min-width="100" show-overflow-tooltip />
      <el-table-column prop="name" label="操作" min-width="120" align="center" fixed="right" show-overflow-tooltip>
        <template v-slot="scope">
          <el-button v-if="scope.row.status == '12'" type="text" class="red" v-permissions="['business:platformjob:delete']"
            @click="handleDel(scope.row)">删除</el-button>
          <el-button v-if="scope.row.status == '12'" type="text" class="red"
            v-permissions="['business:platformjob:delete']" @click="handleDel(scope.row)">删除</el-button>
          <el-button v-if="scope.row != 12" type="text" v-permissions="['business:platformjob:query']"
            @click="handleDetail(scope.row)">编辑</el-button>
        </template>
@@ -167,6 +167,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/platform/oil.vue
@@ -1,30 +1,17 @@
<template>
  <TableLayout :permissions="['business:platformwatergas:query']">
    <SearchFormCollapse slot="search-form" :need-more="false">
      <el-form ref="searchForm" :model="searchForm"  label-width="100px" inline >
          <el-form-item title="请输入车牌号"  >
            <el-input v-model="searchForm.carCode" clearable placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item  label="使用时间:"  >
            <el-date-picker
                @change="search"
                v-model="searchForm.startTime"
                format="yyyy-MM"
                style="width: 140px"
                placeholder="开始时间"
                value-format="yyyy-MM-dd HH:mm:ss"
                type="month"
            />~
              <el-date-picker
                  @change="search"
                  v-model="searchForm.endTime"
                  format="yyyy-MM"
                  style="width: 140px"
                  placeholder="结束时间"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  type="month"
              />
          </el-form-item>
      <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
        <el-form-item title="请输入车牌号">
          <el-input v-model="searchForm.carCode" clearable placeholder="请输入车牌号"
            @keypress.enter.native="search"></el-input>
        </el-form-item>
        <el-form-item label="使用时间:">
          <el-date-picker @change="search" v-model="searchForm.startTime" format="yyyy-MM" style="width: 140px"
            placeholder="开始时间" value-format="yyyy-MM-dd HH:mm:ss" type="month" /> ~
          <el-date-picker @change="search" v-model="searchForm.endTime" format="yyyy-MM" style="width: 140px"
            placeholder="结束时间" value-format="yyyy-MM-dd HH:mm:ss" type="month" />
        </el-form-item>
        <section>
          <el-button type="primary" @click="search">搜索</el-button>
          <el-button @click="reset">重置</el-button>
@@ -33,51 +20,45 @@
    </SearchFormCollapse>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:platformwatergas:create','business:platformwatergas:delete','business:notice:exportExcel']">
        <li><el-button type="primary" @click="$refs.OperaPlatformOilWindow.open('新建油耗')" icon="el-icon-plus" v-permissions="['business:platformwatergas:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:platformwatergas:delete']">删除</el-button></li>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:platformwatergas:exportExcel']" @click="exportExcel">导出</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:platformwatergas:exportExcel']" @click="handleImport">导入</el-button>
      <ul class="toolbar"
        v-permissions="['business:platformwatergas:create', 'business:platformwatergas:delete', 'business:notice:exportExcel']">
        <li><el-button type="primary" @click="$refs.OperaPlatformOilWindow.open('新建油耗')" icon="el-icon-plus"
            v-permissions="['business:platformwatergas:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:platformwatergas:delete']">删除</el-button></li>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:platformwatergas:exportExcel']"
          @click="exportExcel">导出</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:platformwatergas:exportExcel']"
          @click="handleImport">导入</el-button>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="carCode" label="车牌号" fixed min-width="150px"></el-table-column>
        <el-table-column prop="timeInfo" label="使用月份" fixed min-width="100px">
          <template slot-scope="{row}">
              {{(row.timeInfo || row.timeInfo.length >7 )?row.timeInfo.substr(0,7):'-'}}
            {{ (row.timeInfo || row.timeInfo.length > 7) ? row.timeInfo.substr(0, 7) : '-' }}
          </template>
        </el-table-column>
        <el-table-column prop="num" label="油耗(升)" fixed min-width="150px"></el-table-column>
        <el-table-column prop="content" label="说明" min-width="120px"></el-table-column>
        <el-table-column prop="editDate" label="最近操作时间" min-width="140px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:platformwatergas:update', 'business:platformwatergas:delete'])"
          label="操作"
          align="center"
          min-width="150"
          fixed="right"
        >
          v-if="containPermissions(['business:platformwatergas:update', 'business:platformwatergas:delete'])" label="操作"
          align="center" min-width="150" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.OperaPlatformOilWindow.open('编辑油耗', row)" icon="el-icon-edit" v-permissions="['business:platformwatergas:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:platformwatergas:delete']">删除</el-button>
            <el-button type="text" @click="$refs.OperaPlatformOilWindow.open('编辑油耗', row)" icon="el-icon-edit"
              v-permissions="['business:platformwatergas:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:platformwatergas:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaPlatformOilWindow ref="OperaPlatformOilWindow" @success="handlePageChange"/>
    <oilImportTem ref="oilImportTem" @success="handlePageChange"/>
    <OperaPlatformOilWindow ref="OperaPlatformOilWindow" @success="handlePageChange" />
    <oilImportTem ref="oilImportTem" @success="handlePageChange" />
  </TableLayout>
</template>
@@ -93,21 +74,21 @@
  name: 'Platform',
  extends: BaseTable,
  components: { SearchFormCollapse, TableLayout, Pagination, OperaPlatformOilWindow, oilImportTem },
  data () {
  data() {
    return {
      groupList: [],
      // æœç´¢
      working: false,
      working1: false,
      searchForm: {
        carCode:'',
        carCode: '',
        startTime: '',
        endTime: '',
        type: 2
      }
    }
  },
  created () {
  created() {
    this.config({
      module: '油耗信息表',
      api: '/platform/platformWaterGas',
@@ -118,16 +99,25 @@
    this.loadGroupList()
  },
  methods: {
    reset() {
      this.searchForm = {
        carCode: '',
        startTime: '',
        endTime: '',
        type: 2
      }
      this.search()
    },
    handleImport() {
      this.$refs.oilImportTem.open('批量导入')
    },
    loadGroupList () {
    loadGroupList() {
      allList({})
        .then(res => {
          this.groupList = res || []
        })
    },
    changeStatus (e, row) {
    changeStatus(e, row) {
      this.api.updateStatusById({
        id: row.id,
        status: e
admin/src/views/platform/smokebox.vue
@@ -2,7 +2,7 @@
  <TableLayout :permissions="['business:platformwatergas:query']">
    <SearchFormCollapse slot="search-form" :need-more="false">
      <el-form ref="searchForm" :model="searchForm"  label-width="100px" inline>
          <el-form-item title="请选择年月时间" label=""   >
          <el-form-item title="请选择年月时间" label=""  prop="timeInfo" >
            <el-date-picker
                @change="search"
                clearable
admin/src/views/platform/water.vue
@@ -2,7 +2,7 @@
  <TableLayout :permissions="['business:platformwatergas:query']">
    <SearchFormCollapse slot="search-form" :need-more="false">
      <el-form ref="searchForm" :model="searchForm"  label-width="100px" inline>
          <el-form-item title="请选择年月时间" label=""   >
          <el-form-item title="请选择年月时间" label="" prop="timeInfo"   >
            <el-date-picker
                @change="search"
                clearable
admin/src/views/statistics/platformRecord.vue
@@ -9,8 +9,7 @@
      <el-table-column prop="param1" label="作业开始" min-width="100" show-overflow-tooltip />
      <el-table-column prop="param2" label="作业结束" min-width="100" show-overflow-tooltip />
      <el-table-column prop="workTime" label="作业时长" min-width="100" show-overflow-tooltip />
      <el-table-column prop="name"
        label="运输单号/合同号" min-width="100" show-overflow-tooltip>
      <el-table-column prop="name" label="运输单号/合同号" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <span>{{ scope.row.billCode || scope.row.contractNum }}</span>
        </template>
@@ -117,11 +116,11 @@
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
          // item.workTime = dayjs.duration(item.param3, 'seconds').format('H时m分s秒')
          if(item.param3 > 3600){
          if (item.param3 > 3600) {
            item.workTime = Math.ceil(item.param3 / 3600) + '时' + Math.ceil(Math.ceil(item.param3 % 3600) / 60) + '分' + item.param3 % 60 + '秒'
          }else if(item.param3 > 60){
          } else if (item.param3 > 60) {
            item.workTime = Math.ceil(item.param3 / 60) + '分' + item.param3 % 60 + '秒'
          }else{
          } else {
            item.workTime = item.param3 + '秒'
          }
        })
@@ -138,6 +137,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/statistics/platformStatic.vue
@@ -130,6 +130,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/system/publicMsg.vue
@@ -145,6 +145,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/system/smsMessage.vue
@@ -3,8 +3,7 @@
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear">
    </QueryForm>
    <div class="pt16 mb10">
      <el-button type="primary" @click="batchStatus(0)"
        v-permissions="['business:platformjob:update']">批量启用</el-button>
      <el-button type="primary" @click="batchStatus(0)" v-permissions="['business:platformjob:update']">批量启用</el-button>
      <el-button @click="batchStatus(1)" v-permissions="['business:platformjob:update']">批量禁用</el-button>
    </div>
    <el-table @selection-change="handleSelectionChange" class="mb20" v-loading="loading" :data="list" stripe>
@@ -15,7 +14,8 @@
      <el-table-column prop="content" label="消息模板" min-width="300" show-overflow-tooltip />
      <el-table-column label="状态" width="120" align="center" fixed="right">
        <template v-slot="scope">
          <el-switch v-permissions="['business:platformjob:update']" v-model="scope.row.status" @change="changeStatus(scope.row)" :active-value="0" :inactive-value="1">
          <el-switch v-permissions="['business:platformjob:update']" v-model="scope.row.status"
            @change="changeStatus(scope.row)" :active-value="0" :inactive-value="1">
          </el-switch>
        </template>
      </el-table-column>
@@ -145,6 +145,7 @@
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
      this.getList()
    }
  }
}
admin/src/views/vehicle/driver.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear">
    </QueryForm>
    <el-table v-loading="loading" :data="list" stripe row-key="id" class="mb20" default-expand-all>
      <el-table-column prop="realname" label="姓名" min-width="100"></el-table-column>
      <el-table-column prop="mobile" label="手机号" min-width="100"></el-table-column>
    </el-table>
    <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import { fetchList } from '@/api/system/user.js'
export default {
  components: {
    QueryForm,
    Pagination
  },
  data() {
    return {
      filters: {},
      list: [],
      queryFormConfig: {
        formItems: [
          {
            type: 'input',
            filed: 'realname',
            label: '姓名'
          },
          {
            type: 'input',
            filed: 'username',
            label: '手机号'
          },
        ],
        online: true
      },
      pagination: {
        capacity: 10,
        page: 1,
        total: 0,
      },
      loading: false,
    }
  },
  created() {
    this.getList()
  },
  methods: {
    getList(page) {
      const { filters, pagination } = this
      pagination.page = page || pagination.page
      fetchList({
        model: {
          ...filters,
          //  memberType: 0
        },
        ...pagination
      }).then(res => {
        console.log('res', res)
        this.list = res.records || []
        this.pagination.total = res.total || 0
      })
    },
    clear() {
      this.filters = {}
      this.getList(0)
    },
    handleSizeChange(capacity) {
      this.pagination.capacity = capacity
      this.getList(0)
    }
  }
}
</script>
<style lang="scss" scoped></style>
h5/App.vue
@@ -8,6 +8,7 @@
                window.location.href = app_url
            }
    })
        console.log('onLaunch')
  },
  onShow: function () {
    console.log('App Show')
h5/manifest.json
@@ -128,8 +128,8 @@
                "/zhyq_interface" : {
                    // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    // "target" : "http://172.20.10.7:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://192.168.0.107:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://10.50.250.253:8088/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://192.168.0.102:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://10.50.250.253:8088/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "https://atwl.ahzyssl.com/zhyq_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "changeOrigin" : true, // å…è®¸è·¨åŸŸ 
                    "pathRewrite" : {
h5/pages/driver/login.vue
@@ -1,228 +1,260 @@
<template>
  <view class="login">
    <image class="login_bg" src="@/static/login_bg@2x.png" mode="widthFix" />
    <image class="login_logo" src="@/static/logo@2x.png" mode="widthFix" />
    <view class="login_title">安泰物流智慧园区</view>
    <view class="login_title">物流车司机登录</view>
    <view class="login_list">
      <view class="login_list_item">
        <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
        <input v-model="form.username"  type="tel"  @focus="showKeyboard = true" @blur="showKeyboard = false" maxlength="18" placeholder="手机号" />
      </view>
      <view class="login_list_item">
        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
        <input
          v-model="form.password"
                    @focus="showKeyboard = true" @blur="showKeyboard = false"
          type="password"
          placeholder="密码"
        />
      </view>
    </view>
    <view class="login_btn">
      <view class="login_btn_n" @click="onLogin">立即登录</view>
    </view>
    <!--  -->
        <view class="btns" v-if="!showKeyboard">
            <view class="btn" @click="handleRegister">立即注册</view>
            <view class="btn separate"> | </view>
            <view class="btn" @click="handleSetPsd">忘记密码</view>
        </view>
  </view>
</template>
<script>
import { driverLogin, loginCaptcha, getUserInfo } from '@/api'
import { mapState, mapMutations } from 'vuex'
export default {
  data() {
    return {
      form: {
                username: '',
                password: ''
      },
      isShowProtocol: false,
            showKeyboard: false,
      countDown: 0
    }
  },
  onLoad() {
        this.initCaptcha()
  },
  methods: {
        ...mapMutations(["setToken", "setDriverInfo"]),
        handleRegister() {
            uni.navigateTo({
                url: "/pages/driver/register"
            })
        },
        handleSetPsd() {
            uni.navigateTo({
                url: "/pages/driver/forgetPsd?phone=" + this.form.username
            })
        },
    dealChange(e) {
      console.log(e)
    },
    initCaptcha() {
      loginCaptcha().then(res => {
        this.captcha = res.data
      })
    },
    onLogin() {
      const { form } = this
      if (!form.username) return uni.showToast({
        title: '手机号不能为空',
        icon: 'none'
      })
      if (!form.password) return uni.showToast({
        title: '密码不能为空',
        icon: 'none'
      })
      driverLogin({
        ...form,
                uuid: this.captcha.uuid,
                openid: this.$store.state.openId,
                code: '1'
      }).then(res => {
        if (res.code === 200) {
          this.setToken(res.data)
          getUserInfo().then(ress => {
                        setTimeout(() => {
                            this.showToast('登录成功')
                        })
            this.setDriverInfo(ress.data)
            uni.redirectTo({
              url: "/pages/driver/index"
            })
          })
        }
      })
    }
  }
}
</script>
<style lang="scss" scoped>
.login {
  width: 100%;
  display: flex;
  padding-top: 100rpx;
  box-sizing: border-box;
  align-items: center;
  flex-direction: column;
  background: linear-gradient(
    180deg,
    rgba(39, 155, 170, 0.2) 0%,
    rgba(39, 155, 170, 0) 100%
  );
  .login_logo {
    width: 180rpx;
    height: 180rpx;
        margin-bottom: 40rpx;
  }
  .login_bg {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      z-index: -1;
  }
  .login_title {
    font-size: 44rpx;
    font-weight: 600;
    color: #333333;
  }
  .login_list {
        margin-top: 60rpx;
    width: 100%;
    padding: 0 60rpx;
    box-sizing: border-box;
    .login_list_item {
      width: 100%;
      border-radius: 50rpx;
      height: 98rpx;
      padding: 0 40rpx;
      box-sizing: border-box;
      background: #ffffff;
      margin-bottom: 40rpx;
      display: flex;
      align-items: center;
      justify-content: space-between;
      &:last-child {
        margin-bottom: 0 !important;
      }
      image {
        flex-shrink: 0;
        width: 40rpx;
        height: 40rpx;
      }
      .captcha {
        color: $uni-color-primary;
      }
      input {
        flex: 1;
        height: 100%;
        color: #666666;
        margin-left: 24rpx;
        border: none;
      }
    }
  }
  .login_btn {
    width: 100%;
    padding: 0 60rpx;
    box-sizing: border-box;
    margin-top: 80rpx;
    .for_psd {
      color: $uni-color-primary;
      margin-top: 40rpx;
      width: 140rpx;
      text-align: center;
      margin: 40rpx auto;
    }
    .login_btn_n {
      width: 100%;
      height: 98rpx;
      background: $uni-color-primary;
      box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: 600;
      font-size: 32rpx;
      color: #ffffff;
      border-radius: 50rpx;
    }
  }
  .deal_wrap {
    position: absolute;
    width: 100%;
    left: 0;
    text-align: center;
    bottom: 108rpx;
    .deal {
      color: $uni-color-primary;
    }
  }
    .btns{
        display: flex;
        align-items: center;
        justify-content: center;
        position: fixed;
        bottom: 60rpx;
        left: 0;
        width: 100%;
        .btn{
            font-size: 30rpx;
            color: $uni-color-primary;
        }
        .separate{ margin: 0 8rpx; }
    }
}
.modal {
  padding: 32rpx;
}
</style>
<template>
    <view class="login">
        <image class="login_bg" src="@/static/login_bg@2x.png" mode="widthFix" />
        <image class="login_logo" src="@/static/logo@2x.png" mode="widthFix" />
        <view class="login_title">安泰物流智慧园区</view>
        <view class="login_title">物流车司机登录</view>
        <view class="login_list">
            <view class="login_list_item">
                <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
                <input v-model="form.username" type="tel" @focus="showKeyboard = true" @blur="showKeyboard = false"
                    maxlength="18" placeholder="手机号" />
            </view>
            <view class="login_list_item">
                <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
                <input v-model="form.password" @focus="showKeyboard = true" @blur="showKeyboard = false" type="password"
                    placeholder="密码" />
            </view>
        </view>
        <view class="login_btn">
            <view class="login_btn_n" @click="onLogin">立即登录</view>
        </view>
        <!--  -->
        <view class="btns" v-if="!showKeyboard">
            <view class="btn" @click="handleRegister">立即注册</view>
            <view class="btn separate"> | </view>
            <view class="btn" @click="handleSetPsd">忘记密码</view>
        </view>
    </view>
</template>
<script>
    import {
        driverLogin,
        loginCaptcha,
        getUserInfo
    } from '@/api'
    import {
        mapState,
        mapMutations
    } from 'vuex'
    export default {
        data() {
            return {
                form: {
                    username: '',
                    password: ''
                },
                isShowProtocol: false,
                showKeyboard: false,
                countDown: 0,
                ywinfo: {}
            }
        },
        onLoad() {
            this.initCaptcha()
            const ywinfo = uni.getStorageSync('ywinfo') || {}
            if (ywinfo.ywid && ywinfo.type == 0) {
                this.ywinfo = ywinfo
                uni.setStorageSync('ywinfo', {})
            }
        },
        methods: {
            ...mapMutations(["setToken", "setDriverInfo"]),
            handleRegister() {
                uni.navigateTo({
                    url: "/pages/driver/register"
                })
            },
            handleSetPsd() {
                uni.navigateTo({
                    url: "/pages/driver/forgetPsd?phone=" + this.form.username
                })
            },
            dealChange(e) {
                console.log(e)
            },
            initCaptcha() {
                loginCaptcha().then(res => {
                    this.captcha = res.data
                })
            },
            onLogin() {
                const {
                    form
                } = this
                if (!form.username) return uni.showToast({
                    title: '手机号不能为空',
                    icon: 'none'
                })
                if (!form.password) return uni.showToast({
                    title: '密码不能为空',
                    icon: 'none'
                })
                driverLogin({
                    ...form,
                    uuid: this.captcha.uuid,
                    openid: this.$store.state.openId,
                    code: '1'
                }).then(res => {
                    if (res.code === 200) {
                        this.setToken(res.data)
                        getUserInfo().then(ress => {
                            setTimeout(() => {
                                this.showToast('登录成功')
                            })
                            uni.setStorageSync('ywinfo', this.ywinfo)
                            this.setDriverInfo(ress.data)
                            uni.redirectTo({
                                url: "/pages/driver/index"
                            })
                        })
                    }
                })
            }
        }
    }
</script>
<style lang="scss" scoped>
    .login {
        width: 100%;
        display: flex;
        padding-top: 100rpx;
        box-sizing: border-box;
        align-items: center;
        flex-direction: column;
        background: linear-gradient(180deg,
                rgba(39, 155, 170, 0.2) 0%,
                rgba(39, 155, 170, 0) 100%);
        .login_logo {
            width: 180rpx;
            height: 180rpx;
            margin-bottom: 40rpx;
        }
        .login_bg {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            z-index: -1;
        }
        .login_title {
            font-size: 44rpx;
            font-weight: 600;
            color: #333333;
        }
        .login_list {
            margin-top: 60rpx;
            width: 100%;
            padding: 0 60rpx;
            box-sizing: border-box;
            .login_list_item {
                width: 100%;
                border-radius: 50rpx;
                height: 98rpx;
                padding: 0 40rpx;
                box-sizing: border-box;
                background: #ffffff;
                margin-bottom: 40rpx;
                display: flex;
                align-items: center;
                justify-content: space-between;
                &:last-child {
                    margin-bottom: 0 !important;
                }
                image {
                    flex-shrink: 0;
                    width: 40rpx;
                    height: 40rpx;
                }
                .captcha {
                    color: $uni-color-primary;
                }
                input {
                    flex: 1;
                    height: 100%;
                    color: #666666;
                    margin-left: 24rpx;
                    border: none;
                }
            }
        }
        .login_btn {
            width: 100%;
            padding: 0 60rpx;
            box-sizing: border-box;
            margin-top: 80rpx;
            .for_psd {
                color: $uni-color-primary;
                margin-top: 40rpx;
                width: 140rpx;
                text-align: center;
                margin: 40rpx auto;
            }
            .login_btn_n {
                width: 100%;
                height: 98rpx;
                background: $uni-color-primary;
                box-shadow: 0rpx 12rpx 24rpx 0rpx rgba(39, 155, 170, 0.2);
                display: flex;
                align-items: center;
                justify-content: center;
                font-weight: 600;
                font-size: 32rpx;
                color: #ffffff;
                border-radius: 50rpx;
            }
        }
        .deal_wrap {
            position: absolute;
            width: 100%;
            left: 0;
            text-align: center;
            bottom: 108rpx;
            .deal {
                color: $uni-color-primary;
            }
        }
        .btns {
            display: flex;
            align-items: center;
            justify-content: center;
            position: fixed;
            bottom: 60rpx;
            left: 0;
            width: 100%;
            .btn {
                font-size: 30rpx;
                color: $uni-color-primary;
            }
            .separate {
                margin: 0 8rpx;
            }
        }
    }
    .modal {
        padding: 32rpx;
    }
</style>
h5/pages/login/login.vue
@@ -41,10 +41,11 @@
    export default {
        data() {
            return {
                code: ''
                code: 'qqq'
            }
        },
        onLoad(option) {
            console.log('onLoad');
            if(option.ywid){
                uni.setStorageSync('ywinfo', {
                    type: option.type,
h5/pages/staff/task/vDangetAppr.vue
@@ -14,7 +14,7 @@
                        class="img" />
                    <view v-if="item.type == 1" @click="videoClick(item, i)" class="video_wrap">
                        <video :src="item.fileurlFull" initial-time="0.01" :show-center-play-btn="false" :controls="false"
                            class="video" :enable-progress-gesture="false" autoplay muted />
                            class="video" :enable-progress-gesture="false" muted />
                        <image src="@/static/play.png" class="play" mode=""></image>
                    </view>
                </view>
h5/pages/staffLogin/login.vue
@@ -86,7 +86,9 @@
      ProtocolFlag: false,
      captcha: {},
      htmlText: '',
            windowHeight: ''
            windowHeight: '',
            ywinfo: {}
    }
  },
@@ -94,7 +96,12 @@
    this.initCaptcha()
        const result = uni.getWindowInfo()
        this.windowHeight = result.windowHeight
        console.log('result', result);
        const ywinfo = uni.getStorageSync('ywinfo') || {}
        if (ywinfo.ywid && ywinfo.type == 2) {
            this.ywinfo = ywinfo
            uni.setStorageSync('ywinfo', {})
        }
  },
  onBackPress(options) {
    uni.redirectTo({
@@ -151,6 +158,7 @@
        if (res.code === 200) {
          this.setToken(res.data)
          getUserInfo().then(ress => {
                        uni.setStorageSync('ywinfo', this.ywinfo)
            this.setUserInfo(ress.data)
            uni.redirectTo({
              url: "/pages/staff/index"
h5/utils/config.js
@@ -1,8 +1,8 @@
// export const baseUrl = 'zhyq_interface/'
export const baseUrl = 'zhyq_interface/'
// export const baseUrl = 'http://192.168.0.173/gateway_interface/'
// export const baseUrl = 'http://10.50.250.253:8088/gateway_interface/'
export const baseUrl = 'https://atwl.ahzyssl.com/zhyq_interface/'
// export const baseUrl = 'https://atwl.ahzyssl.com/zhyq_interface/'
export const app_url = 'https://atwl.ahzyssl.com/zhyq_h5/#/'
screen/package-lock.json
@@ -18,7 +18,6 @@
        "uqrcodejs": "^4.0.7",
        "v-scale-screen": "^2.0.0",
        "vue": "^3.4.21",
        "vue-loading-overlay": "^6.0.6",
        "vue-router": "^4.3.0"
      },
      "devDependencies": {
@@ -3167,9 +3166,9 @@
      }
    },
    "node_modules/sass": {
      "version": "1.82.0",
      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.82.0.tgz",
      "integrity": "sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q==",
      "version": "1.83.0",
      "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz",
      "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==",
      "dev": true,
      "dependencies": {
        "chokidar": "^4.0.0",
@@ -3718,17 +3717,6 @@
        "@vue/composition-api": {
          "optional": true
        }
      }
    },
    "node_modules/vue-loading-overlay": {
      "version": "6.0.6",
      "resolved": "https://registry.npmjs.org/vue-loading-overlay/-/vue-loading-overlay-6.0.6.tgz",
      "integrity": "sha512-ZPrWawjCoNKGbCG9z4nePgbs/K9KXPa1j1oAJXP6T8FQho3NO+/chhjx4MLYFzfpwr+xkiQ8SNrV1kUG1bZPAw==",
      "engines": {
        "node": ">=12.13.0"
      },
      "peerDependencies": {
        "vue": "^3.2.0"
      }
    },
    "node_modules/vue-router": {
screen/package.json
@@ -20,7 +20,6 @@
    "uqrcodejs": "^4.0.7",
    "v-scale-screen": "^2.0.0",
    "vue": "^3.4.21",
    "vue-loading-overlay": "^6.0.6",
    "vue-router": "^4.3.0"
  },
  "devDependencies": {
screen/src/api/index.js
@@ -83,6 +83,9 @@
export const getTemperatureHumidityData = (data) => {
  return request('visitsAdmin/cloudService/board/api/fightingAdmin/getTemperatureHumidityData', data)
}
export const monitorDataListP = (data) => {
  return request('visitsAdmin/cloudService/board/api/fightingAdmin/monitorDataList', data)
}
// åœºå†…调度看板 ä»Šæ—¥æœˆå°å®Œæˆè®¢å•统计
@@ -142,6 +145,10 @@
export const carsListPost = (data) => {
  return request('/visitsAdmin/cloudService/board/api/platformJobRun/carsList', data)
}
// ç‰©æµè¿è¡Œè°ƒåº¦çœ‹æ¿ æŠ¥è­¦ä¿¡æ¯
export const carsEventListP = (data) => {
  return request('/visitsAdmin/cloudService/board/api/platformJobRun/carsEventList', data)
}
// ç‰©æµè¿è¡Œè°ƒåº¦çœ‹æ¿ æ ¹æ®è½¦è¾†æŸ¥ä¿¡æ¯
export const getCarsJobDetails = (data) => {
  return request('/visitsAdmin/cloudService/board/api/platformJobRun/getCarsJobDetails', data, 'POST')
screen/src/router/index.js
@@ -43,7 +43,7 @@
      path: '/LogisticsCenter', //全省物流在途-物流中心
      name: 'LogisticsCenter',
      meta: {
        title: '全省物流在途'
        title: '安徽中烟成品集控大屏'
      },
      component: () => import('../views/LogisticsCenter.vue')
    },
screen/src/views/EnergyConsum.vue
@@ -255,7 +255,7 @@
            <div v-if="data3 && data3.length > 0" class="list">
              <template v-for="item, i in data3">
                <div v-if="i < 6" class="line">
                  <div class="top"><span v-if="i < 3">top</span>{{ i + 1 }}</div>
                  <div class="top" :class="{top3: i < 3}"><span v-if="i < 3">top</span>{{ i + 1 }}</div>
                  <div class="id_card">{{ item.carNo }}</div>
                  <div class="wrap">
                    <ChargeRate :rate="item.rate" :color="i > 2 ? 'cyan' : '#e3a83a'" />
@@ -1013,6 +1013,9 @@
            box-shadow: inset 0px 0px 3px 0px #01D9FE;
            margin-right: 10px;
          }
          .top3{
            box-shadow: inset 0px 0px 3px 0px #FEAF01;
          }
          .id_card {
            color: #DBEAEA;
screen/src/views/FireFighting.vue
@@ -30,7 +30,7 @@
                  <span class="item">报警</span>
                  <span class="item">屏蔽</span>
                  <span class="item">故障</span>
                  <span class="item">离线</span>
                  <span class="item">正常</span>
                </div>
                <div class="one-swiper list_content">
                  <div class="swiper-wrapper">
@@ -89,7 +89,7 @@
              <div class="item">
                <img src="@/assets/images/FireFighting/xiaofang_ic_zaixian@2x.png" alt="">
                <div class="content">
                  <div class="name">在线</div>
                  <div class="name">总数</div>
                  <div class="num">{{ dataList4.onlineDeviceNum }}</div>
                </div>
              </div>
@@ -110,7 +110,7 @@
              <div class="item">
                <img src="@/assets/images/FireFighting/xiaofang_ic_lixian@2x.png" alt="">
                <div class="content">
                  <div class="name">离线</div>
                  <div class="name">正常</div>
                  <div class="num num4">{{ dataList4.offlineDeviceNum }}</div>
                </div>
              </div>
@@ -131,29 +131,33 @@
                  <span>温度/湿度传感器</span>
                </div>
                <div class="right">
                  <img @click="changeData8(-1)" class="icon" src="@/assets/images/FireFighting/xiaofang_ar_left@2x.png" alt="">
                  <div class="num">{{dataIndex8 + 1}}/{{ dataList8.length }}</div>
                  <img @click="changeData8(1)" class="icon" src="@/assets/images/FireFighting/xiaofang_ar_right@2x.png" alt="">
                  <img @click="changeData8(-1)" class="icon" src="@/assets/images/FireFighting/xiaofang_ar_left@2x.png"
                    alt="">
                  <div class="num">{{ dataIndex8 + 1 }}/{{ dataList8.length }}</div>
                  <img @click="changeData8(1)" class="icon" src="@/assets/images/FireFighting/xiaofang_ar_right@2x.png"
                    alt="">
                </div>
              </div>
              <div class="list_wrap">
                <div class="title">
                  <img class="icon" src="@/assets/images/FireFighting/ic_location@2x.png" alt="">
                  <span>卸货区1</span>
                  <span v-if="dataList8 && dataList8.length > 0">{{ dataList8[dataIndex8].humidityData.name }}</span>
                </div>
                <div class="list" v-if="dataList8 && dataList8.length > 0">
                  <div class="item">
                    <img class="icon" src="@/assets/images/FireFighting/ic_wendu@2x.png" alt="">
                    <div class="content">
                      <div class="num">{{ dataList8[dataIndex8].temperatureData?.latestValue }}<span>°C</span></div>
                      <div class="la">阈值 {{ dataList8[dataIndex8].temperatureData?.alarmLow }}~{{ dataList8[dataIndex8].temperatureData?.alarmHigh }}°C</div>
                      <div class="la">阈值 {{ dataList8[dataIndex8].temperatureData?.alarmLow }}~{{
                        dataList8[dataIndex8].temperatureData?.alarmHigh }}°C</div>
                    </div>
                  </div>
                  <div class="item">
                    <img class="icon" src="@/assets/images/FireFighting/ic_shidu@2x.png" alt="">
                    <div class="content">
                      <div class="num">{{ dataList8[dataIndex8].humidityData?.latestValue }}<span>%</span></div>
                      <div class="la">阈值 {{ dataList8[dataIndex8].humidityData?.alarmLow }}~{{ dataList8[dataIndex8].humidityData?.alarmHigh }}</div>
                      <div class="la">阈值 {{ dataList8[dataIndex8].humidityData?.alarmLow }}~{{
                        dataList8[dataIndex8].humidityData?.alarmHigh }}</div>
                    </div>
                  </div>
                </div>
@@ -166,35 +170,30 @@
                  <span>实时传感器检测</span>
                </div>
                <div class="right">
                  <img class="icon" src="@/assets/images/FireFighting/xiaofang_ar_left@2x.png" alt="">
                  <div class="num">1/5</div>
                  <img class="icon" src="@/assets/images/FireFighting/xiaofang_ar_right@2x.png" alt="">
                  <img @click="changeData9(-1)" class="icon" src="@/assets/images/FireFighting/xiaofang_ar_left@2x.png"
                    alt="">
                  <div class="num">{{ dataIndex9 + 1 }}/{{ dataTotal9 }}</div>
                  <img @click="changeData9(1)" class="icon" src="@/assets/images/FireFighting/xiaofang_ar_right@2x.png"
                    alt="">
                </div>
              </div>
              <div class="list_wrap">
                <div class="title_wrap">
              <div class="list_wrap2">
                <div class="item" v-for="item, i in dataListTemp9">
                  <div class="title">
                    <img class="icon" src="@/assets/images/FireFighting/ic_location@2x.png" alt="">
                    <span>1è·¯/水压</span>
                    <span>{{ item.name }}</span>
                  </div>
                  <div class="title">
                    <img class="icon" src="@/assets/images/FireFighting/ic_location@2x.png" alt="">
                    <span>2è·¯/液位</span>
                  <div class="watergage_wrap" v-if="item.obj.typeCode == 253958">
                    <div class="watergage" :id="'watergage' + i"></div>
                    <div class="unit">{{ item.obj.value }}</div>
                    <div class="place">阈值 {{ item.level }}</div>
                  </div>
                </div>
                <div class="list">
                  <div class="watergage_wrap">
                    <div class="watergage" id="watergage"></div>
                    <div class="unit">2.50 <span>Mpa</span></div>
                    <div class="place">阈值 0~2.5Mpa</div>
                  </div>
                  <div class="item">
                    <div class="liquidlevel_wrap">
                      <div class="liquidlevel" id="liquidlevel"></div>
                      <div class="unit">3.45 <span>M</span></div>
                      <div class="placeT">阈值</div>
                  <div v-if="item.obj.typeCode == 254001" class="liquidlevel_wrap">
                    <div class="liquidlevel" :id="'liquidlevel' + i"></div>
                    <div class="liquidle_te">
                      <div class="unit">{{ item.obj.value }}</div>
                      <div class="placeT">阈值{{ item.level }}</div>
                    </div>
                    <div class="place">阈值 0~4.50M</div>
                  </div>
                </div>
              </div>
@@ -312,7 +311,7 @@
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ref, onMounted, nextTick } from 'vue'
import VScaleScreen from 'v-scale-screen'
import FirePercent from '@/components/FirePercent.vue'
import dayjs from 'dayjs'
@@ -328,7 +327,8 @@
  getFightingDeAlarm,
  getFightingDeviceY,
  getFighalarmDataList,
  getTemperatureHumidityData
  getTemperatureHumidityData,
  monitorDataListP
} from '@/api'
const colors = ['#FEAF01', '#01ABFE', '#51F9E4']
@@ -344,9 +344,14 @@
}, 1000)
const initWatergage = () => {
  const myChart = echarts.init(document.getElementById('watergage'))
  var data_value = 1
const initWatergage = (id, item) => {
  const myChart = echarts.init(document.getElementById(id))
  var data_value = item.obj.value.replaceAll('Mpa', '')
  const startI = item.level.indexOf('-')
  const endI = item.level.indexOf('Mpa')
  let maxNum = item.level.slice(startI + 1, endI)
  let minNum = item.level.slice(0, startI)
  // let maxNum =
  const option = {
    barMaxWidth: 3,
    polar: {
@@ -373,8 +378,8 @@
    series: [
      {
        type: 'gauge',
        min: 0,
        max: 2.50,
        min: minNum,
        max: maxNum,
        splitNumber: 5,
        radius: '100%',
        center: ['50%', '50%'],
@@ -506,9 +511,17 @@
    myChart.resize()
  })
}
const initLiquidlevel = () => {
  const myChart = echarts.init(document.getElementById('liquidlevel'))
  var data = 65
const initLiquidlevel = (id, item) => {
  const myChart = echarts.init(document.getElementById(id))
  const startI = item.level.indexOf('-')
  const endI = item.level.indexOf('M')
  let maxNum = item.level.slice(startI + 1, endI)
  let minNum = item.level.slice(0, startI)
  let conNum = maxNum - minNum
  let acNum = item.obj.value.replaceAll('M', '')
  var data = (((acNum - minNum) / conNum) * 100).toFixed(0)
  console.log('data', data);
  const option = {
    tooltip: {
      trigger: 'none',
@@ -924,20 +937,69 @@
const dataList8 = ref([])
const dataIndex8 = ref(0)
const dataList9 = ref([])
const dataListTemp9 = ref([])
const dataIndex9 = ref(0)
const dataTotal9 = ref(0)
const getData8 = () => {
  getTemperatureHumidityData().then(res => {
    dataList8.value = res.data || []
  })
  monitorDataListP().then(res => {
    dataList9.value = res.data || []
    dataList9.value.forEach(item => {
      if (item.dataList && item.dataList.length > 0) {
        item.obj = item.dataList[0]
      }
    })
    if (dataList9.value.length > 0) {
      dataTotal9.value = Math.ceil(dataList9.value.length / 2)
      dataListTemp9.value = dataList9.value.slice(0, 2)
    }
    initEcharts9()
  })
}
const changeData8 = (num) => {
  if(dataIndex8.value == dataList8.value.length - 1  && num > 0){
  if (dataIndex8.value == dataList8.value.length - 1 && num > 0) {
    dataIndex8.value = 0
  }else if (dataIndex8.value == 0 && num < 0){
  } else if (dataIndex8.value == 0 && num < 0) {
    dataIndex8.value = dataList8.value.length - 1
  }else{
    dataIndex8.value =  dataIndex8.value + num
  } else {
    dataIndex8.value = dataIndex8.value + num
  }
}
const changeData9 = (num) => {
  // return
  if (dataIndex9.value == dataTotal9.value - 1 && num > 0) {
    dataIndex9.value = 0
    dataListTemp9.value = dataList9.value.slice(0, 2)
  } else if (dataIndex9.value == 0 && num < 0) {
    dataIndex9.value = dataTotal9.value - 1
    dataListTemp9.value = dataList9.value.slice(dataList9.value.length - 2, dataList9.value.length)
  } else {
    dataIndex9.value = dataIndex9.value + num
    dataListTemp9.value = dataList9.value.slice(dataIndex9.value * 2, (dataIndex9.value + 1) * 2)
  }
  initEcharts9()
}
const initEcharts9 = () => {
  dataListTemp9.value.forEach((item, i) => {
    if (item.obj && item.obj.typeCode == 253958) {
      nextTick(() => {
        initWatergage('watergage' + i, item)
      })
    }
    if (item.obj && item.obj.typeCode == 254001) {
      nextTick(() => {
        initLiquidlevel('liquidlevel' + i, item)
      })
    }
  })
}
const autoplayFlag = (list = [], leng = 4, time = 2000) => {
  if (list.length > leng) {
@@ -987,9 +1049,6 @@
    getData8()
  }, 60 * 60 * 1000)
  initWatergage()
  initLiquidlevel()
  setTimeout(() => {
    loopFn1()
@@ -1273,7 +1332,8 @@
              display: flex;
              align-items: center;
              position: relative;
              .place{
              .place {
                position: absolute;
                top: 120px;
                right: 70px;
@@ -1283,6 +1343,7 @@
                width: 120px;
                text-align: center;
              }
              .icon {
                width: 70px;
                height: 70px;
@@ -1307,76 +1368,111 @@
              }
            }
          }
        }
          .watergage_wrap {
            text-align: center;
            position: relative;
            left: 30px;
            .watergage {
              width: 130px;
              height: 112px;
            }
        .list_wrap2 {
          display: flex;
          align-items: center;
          height: 206px;
          background-image: url('@/assets/images/FireFighting/bg_wendu@2x.png');
          background-size: cover;
            .unit {
              font-weight: 500;
              font-size: 18px;
              position: relative;
              bottom: 16px;
              left: 4px;
          .item {
            width: 50%;
            height: 100%;
              span {
                font-size: 12px;
                font-weight: 400;
            .title {
              height: 46px;
              display: flex;
              align-items: center;
              color: #D2E0FF;
              padding-left: 20px;
              .icon {
                width: 16px;
                margin-right: 8px;
              }
            }
            .place {
            .watergage_wrap {
              text-align: center;
              position: relative;
              bottom: 16px;
              left: 4px;
              font-size: 13px;
              color: #869CC9;
            }
          }
              left: 30px;
          .liquidlevel_wrap {
            transform: scale(0.24);
            color: #fff;
            text-align: center;
            position: relative;
            left: 20px;
            bottom: 10px;
              .watergage {
                width: 130px;
                height: 112px;
              }
            .unit {
              font-weight: 500;
              font-size: 80px;
              position: relative;
              bottom: 24px;
              left: 4px;
              .unit {
                font-weight: 500;
                font-size: 18px;
                position: relative;
                bottom: 16px;
                left: 4px;
                width: 130px;
                margin-bottom: 6px;
                margin-top: 2px;
              span {
                font-size: 52px;
                font-weight: 400;
                span {
                  font-size: 12px;
                  font-weight: 400;
                }
              }
              .place {
                position: relative;
                bottom: 16px;
                left: 4px;
                width: 130px;
                font-size: 13px;
                color: #869CC9;
              }
            }
            .placeT {
            .liquidlevel_wrap {
              position: relative;
              bottom: 10px;
              left: 4px;
              font-size: 44px;
              color: #869CC9;
              opacity: 0;
            }
            .liquidlevel {
              width: 300px;
              height: 396px;
              /* border: 6px solid red; */
              .liquidle_te {
                font-weight: 500;
                font-size: 16px;
                position: absolute;
                top: 102px;
                left: 0;
                width: 214px;
                display: flex;
                flex-direction: column;
                align-items: center;
                .placeT {
                  font-size: 12px;
                  color: #869CC9;
                  margin-top: 4px;
                }
              }
              /* .placeT {
                position: relative;
                bottom: 10px;
                left: 4px;
                font-size: 74px;
                color: #869CC9;
                opacity: 0;
              } */
              .liquidlevel {
                width: 300px;
                height: 400px;
                transform: scale(0.24);
                color: #fff;
                text-align: center;
                position: relative;
                left: -42px;
                top: -140px;
              }
            }
          }
        }
      }
screen/src/views/LogisticsCenter.vue
@@ -4,7 +4,7 @@
      <img src="@/assets/images/LogisticsCenter/bg@2x.png" class="main_bg" alt="" />
      <div class="main_header">
        <img src="@/assets/images/maintitle.gif" class="main_header_bg" alt="" />
        <div class="title">全省物流在途</div>
        <div class="title">安徽中烟成品集控大屏</div>
        <div class="time_wrap">
          <span class="date">{{ date }}</span>
          <span class="week">{{ week }}</span>
@@ -101,9 +101,9 @@
            </div>
            <div class="list_wrap">
              <div class="header line">
                <span class="item">运输车辆</span>
                <span class="item status">状态</span>
                <span class="item">位置</span>
                <span class="item">合同号</span>
                <span class="item status">订单状态</span>
                <span class="item">目的地</span>
                <span class="item">任务下达时间</span>
              </div>
              <div class="one-swiper list">
@@ -225,17 +225,19 @@
          </div>
          <div class="center_box_two">
            <div class="echart_map" ref="mapEchart" id="echart_map"></div>
            <div v-if="showModal1" @click="showModal1 = false" class="modal1">
              <div class="list">
            <div v-if="showModal1" class="modal1">
              <div class="content">
                <div class="head line">
                  <div class="item">车牌号</div>
                  <div class="item">合同号</div>
                  <div class="item addr">目的地</div>
                </div>
                <div class="line" v-for="item in active1List">
                  <div class="item">{{ item.platNumber }}</div>
                  <div class="item">{{ item.contractNumber }}</div>
                  <div class="item addr">{{ item.repertotyName }}</div>
                <div class="list">
                  <div class="line" v-for="item in active1List">
                    <div class="item">{{ item.platNumber }}</div>
                    <div class="item">{{ item.contractNumber }}</div>
                    <div class="item addr">{{ item.repertotyName }}</div>
                  </div>
                </div>
              </div>
            </div>
@@ -305,7 +307,7 @@
            <div class="second_title">
              <div class="title">
                <img src="@/assets/images/LogisticsCenter/ic_title@2x.png" class="icon" alt="" />
                <div>运用资源利用率</div>
                <div>运力资源利用率</div>
              </div>
              <div class="side">
                å…¨çœï¼š
@@ -323,8 +325,11 @@
      <!--  -->
      <div class="modal_wrap" v-if="showModal">
        <div class="title_head">
          <img src="@/assets/images/energy_ef/chuku_ic_car@2x.png" alt="">
          <span>合同号:{{ modalInfo.contractNumber }}</span>
          <div class="left">
            <img src="@/assets/images/energy_ef/chuku_ic_car@2x.png" alt="">
            <span>合同号:{{ modalInfo.contractNumber }}</span>
          </div>
          <div class="tit_status">{{ modalInfo.orderStatusDesc }}</div>
        </div>
        <div class="info">
          <div class="item">
@@ -366,6 +371,7 @@
          <div id="map-container" ref="mapContainer"></div>
          <div class="fu_list">
            <div class="fu_item" v-for="item, k in modalInfo.cicleStatusList">
              <view v-if="k != modalInfo.cicleStatusList.length - 1" class="separate"></view>
              <div class="item_title">
                <div class="icon">
                  <img v-if="item.key == 0 && k != 0" src="@/assets/images/LogisticsCenter/ic_dingdan@2x.png"
@@ -400,7 +406,7 @@
                  <div v-else class="icon_wrap"></div>
                  <div class="text" :class="{ placeholder3: k == 0 && i == 0 }">
                    {{ ite.orderStatusDes }}
                    <text v-if="ite.tel">,发货仓库电话:</text>
                    <text v-if="ite.tel">,发货仓库电话:</text>
                    <text v-if="ite.tel" class="primaryColor">{{ ite.tel }}</text>
                  </div>
                </div>
@@ -411,7 +417,7 @@
        </div>
        <Loading v-if="modalLoading" />
      </div>
      <div class="modal_mask" v-if="showModal" @click="closeModal"></div>
      <div class="modal_mask" v-if="showModal || showModal1" @click="closeModal"></div>
    </div>
  </v-scale-screen>
</template>
@@ -517,7 +523,7 @@
    item.yearNum = 0
    mapList.value.forEach(ite => {
      if (item.name == ite.name) {
        item.value = ite.value
        item.value = ite.yearNum
        item.monthNum = ite.monthNum
        item.yearNum = ite.yearNum
      }
@@ -612,11 +618,12 @@
          },
          itemStyle: {
            show: true,
            color: '#00114F', // é«˜äº®æ–‡å­—颜色
            color: '#fff', // é«˜äº®æ–‡å­—颜色
            borderColor: '#a4d0ec', // é«˜äº®è¾¹æ¡†é¢œè‰²
            areaColor: '#63d5c1', //高亮区域颜色
            areaColor: '#0056FF', //高亮区域颜色
          },
        },
        selectedMode: false,
        label: {
          // åœ°å›¾æ ‡æ³¨
          show: false,
@@ -747,7 +754,7 @@
          show: true,
          textStyle: {
            color: '#000000',
            fontSize: 10
            fontSize: 12
          }
        },
        emphasis: {
@@ -783,7 +790,11 @@
        stack: 'total',
        barWidth: 14,
        label: {
          show: true
          show: true,
          textStyle: {
            color: '#000000',
            fontSize: 12
          }
        },
        emphasis: {
          focus: 'series'
@@ -818,7 +829,11 @@
        barWidth: 14,
        stack: 'total',
        label: {
          show: true
          show: true,
          textStyle: {
            color: '#000000',
            fontSize: 12
          }
        },
        textStyle: {
          color: '#000000',
@@ -834,13 +849,13 @@
              y2: 0,
              colorStops: [{
                offset: 0,
                color: '#71f3ce'
                color: '#73f7d1'
              }, {
                offset: 1,
                color: '#4da999'
                color: '#58beaa'
              }]
            }
          }
          },
        },
        emphasis: {
          focus: 'series'
@@ -900,6 +915,7 @@
}
const closeModal = () => {
  showModal.value = false
  showModal1.value = false
  modalInfo.value = {}
}
@@ -1153,7 +1169,33 @@
      containLabel: true
    },
    tooltip: {
      trigger: 'axis'
      trigger: 'axis',
      formatter: function (params) {
        // éåŽ†æ‚¬æµ®æ—¶çš„æ‰€æœ‰ç‚¹ï¼Œå®šåˆ¶åŒ–æ˜¾ç¤ºå†…å®¹
        let result = `<div style="width: 160px">${params[0].name}</div>`
        params.forEach((item) => {
          if (item.seriesName === '总库存') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #5e9bca;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}</strong></div>
            </div>`
          } else if (item.seriesName === '当前库存') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px;  border-radius: 50%;background-color: #e2a44f;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}</strong></div>
            </div>`
          } else if (item.seriesName === '库存利用率') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #5a6fc0;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}%</strong></div>
            </div>`
          }
        })
        return result
      }
    },
    xAxis: [{
      nameGap: 5,
@@ -1165,7 +1207,7 @@
        },
      },
      axisLabel: {
        color: '#D2E0FF'
        color: '#869CC9'
      },
      axisTick: {
        show: false,
@@ -1285,11 +1327,14 @@
          color: "#9eabc2"
        },
        yAxisIndex: 1,
        tooltip: {
          show: true,
          formatter: '{c}' + '%',
        },
        label: {
          show: false,
          position: 'top',
          color: '#fff',
          // formatter: '{c}' + '%',
        },
        data: data5.value.detailList.map(i => i.useRate)
      }
@@ -1318,15 +1363,41 @@
        borderColor: '#fff'
      },
    },
    tooltip: {
      trigger: 'axis',
      formatter: function (params) {
        // éåŽ†æ‚¬æµ®æ—¶çš„æ‰€æœ‰ç‚¹ï¼Œå®šåˆ¶åŒ–æ˜¾ç¤ºå†…å®¹
        let result = `<div style="width: 160px">${params[0].name}</div>`
        params.forEach((item) => {
          if (item.seriesName === '出库能力') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #487af3;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}</strong></div>
            </div>`
          } else if (item.seriesName === '当日出库量') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px;  border-radius: 50%;background-color: #e2a44f;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}</strong></div>
            </div>`
          } else if (item.seriesName === '出库利用率') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #b0bcd3;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}%</strong></div>
            </div>`
          }
        })
        return result
      }
    },
    grid: {
      left: '3%',
      right: '0%',
      bottom: '3%',
      top: '18%',
      containLabel: true
    },
    tooltip: {
      trigger: 'axis'
    },
    xAxis: [{
      nameGap: 5,
@@ -1468,7 +1539,6 @@
          show: false,
          position: 'top',
          color: '#fff',
          // formatter: '{c}' + '%',
        },
        data: data6.value.detailList.map(i => i.useRate)
      }
@@ -1497,15 +1567,41 @@
        borderColor: '#fff'
      },
    },
    tooltip: {
      trigger: 'axis',
      formatter: function (params) {
        // éåŽ†æ‚¬æµ®æ—¶çš„æ‰€æœ‰ç‚¹ï¼Œå®šåˆ¶åŒ–æ˜¾ç¤ºå†…å®¹
        let result = `<div style="width: 160px">${params[0].name}</div>`
        params.forEach((item) => {
          if (item.seriesName === '总运力资源') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #88d9cc;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}</strong></div>
            </div>`
          } else if (item.seriesName === '当日提报运力') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px;  border-radius: 50%;background-color: #e2a44f;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}</strong></div>
            </div>`
          } else if (item.seriesName === '车辆利用率') {
            result += `
            <div style="display: flex;align-items: center;justify-content: space-between;margin-top: 2px;">
              <div style="display: flex;align-items: center;"><div style="width: 10px;height: 10px; border-radius: 50%;background-color: #b0bcd3;margin-right: 4px;"></div><div>${item.seriesName}</div></div>
              <div><strong>${item.value}%</strong></div>
            </div>`
          }
        })
        return result
      }
    },
    grid: {
      left: '3%',
      right: '0%',
      bottom: '3%',
      top: '18%',
      containLabel: true
    },
    tooltip: {
      trigger: 'axis'
    },
    xAxis: [{
      nameGap: 5,
@@ -1645,7 +1741,6 @@
          show: false,
          position: 'top',
          color: '#fff',
          // formatter: '{c}' + '%',
        },
        data: data7.value.detailList.map(i => i.useRate)
      }
@@ -2226,7 +2321,7 @@
      .modal1 {
        width: 500px;
        height: 224px;
        height: 192px;
        background: rgba(0, 86, 255, 0.1);
        backdrop-filter: blur(5px);
        padding: 12px 30px;
@@ -2234,10 +2329,13 @@
        top: 36px;
        left: 12px;
        border: 1px solid #4ba7f7;
        z-index: 999999;
        .list {
          height: 192px;
          overflow: auto;
        .content {
          .list {
            height: 128px;
            overflow: auto;
          }
          .line {
            display: flex;
@@ -2399,7 +2497,7 @@
  width: 600px;
  height: 556px;
  background: rgba(0, 30, 63, 0.5);
  border: 1px solid #c6eef7;
  /* border: 1px solid #c6eef7; */
  backdrop-filter: blur(5px);
  position: fixed;
  top: 20%;
@@ -2409,12 +2507,13 @@
  padding: 24px;
  #map-container {
    width: 300px;
    height: 180px;
    width: 260px;
    height: 320px;
    position: absolute;
    top: 220px;
    right: 10px;
    top: 190px;
    right: 20px;
    z-index: 999999;
    border-radius: 2px;
    :deep(.amap-markers) {
      left: -12px !important;
@@ -2425,9 +2524,19 @@
  .title_head {
    display: flex;
    align-items: center;
    font-weight: bold;
    font-size: 17px;
    justify-content: space-between;
    margin-bottom: 20px;
    .left {
      display: flex;
      align-items: center;
      font-weight: bold;
      font-size: 17px;
    }
    .tit_status {
      color: #af8832;
    }
    img {
      width: 20px;
@@ -2484,11 +2593,13 @@
    .fu_list {
      height: 310px;
      width: 290px;
      margin-top: 20px;
      overflow: auto;
      .fu_item {
        position: relative;
        .item_title {
          margin-bottom: 6px;
@@ -2505,12 +2616,13 @@
      }
      .separate {
        height: calc(100% - 125px);
        width: 1px;
        border: 1px dashed #CCCCCC;
        height: calc(100% - 8px);
        /* width: 1px; */
        border: 1px dashed #576783;
        /* border: 1px dashed red; */
        position: absolute;
        left: 26px;
        top: 51px;
        left: 10px;
        top: 20px;
        z-index: -1;
      }
@@ -2565,6 +2677,8 @@
        .text {
          color: #b1bfdc;
          margin-bottom: 6px;
          width: 100%;
        }
        .icon {
@@ -2577,7 +2691,6 @@
        .h2 {
          display: flex;
          align-items: center;
          height: 24px;
        }
        .h1 {}
@@ -2585,7 +2698,6 @@
        .time {
          padding-left: 39px;
          font-size: 12px;
          margin-top: 3px;
        }
      }
    }
@@ -2601,7 +2713,7 @@
  top: 0;
  left: 0;
  z-index: 9999;
  background-color: rgba(0, 0, 0, 0.1);
  /* background-color: rgba(0, 0, 0, 0.0); */
  /* background-color: red; */
}
screen/src/views/LogisticsEfficiency.vue
@@ -101,7 +101,7 @@
                </div>
                <div class="one-swiper list_temp">
                  <div class="swiper-wrapper">
                    <div class="line swiper-slide one-swiper-slide" v-for="item in dataList3">
                    <div @click="taskClick(item)" class="line swiper-slide one-swiper-slide" v-for="item in dataList3">
                      <span class="item flag"><span :class="{ flag_bg: item.type == 1 || item.type == 3 }">{{ item.type
                        == 1
                        || item.type == 3 ? '出' : '入' }}</span></span>
@@ -151,7 +151,7 @@
                        data1.currentInDoneNum
                    }}</span>
                    <span v-else>0</span>
                    <span>万支</span>
                    ä¸‡æ”¯
                  </div>
                </div>
              </div>
@@ -161,9 +161,10 @@
                  <div class="name">已完成比例</div>
                  <div class="num">
                    <span v-if="activeTab4 == 0 && data1.currentOutNum" class="finish">{{ ((data1.currentOutDoneNum /
                      data1.currentOutNum) * 100).toFixed(1) }}%</span>
                      data1.currentOutNum) * 100).toFixed(1) }}</span>
                    <span v-if="activeTab4 == 1 && data1.currentInNum" class="finish">{{ ((data1.currentInDoneNum /
                      data1.currentInNum) * 100).toFixed(1) }}%</span>
                      data1.currentInNum) * 100).toFixed(1) }}</span>
                    %
                  </div>
                </div>
              </div>
@@ -193,7 +194,7 @@
                <span>车辆报警</span>
              </div>
              <div v-if="isShowCarW" class="war_list">
                <div class="line" v-for="item in data7.eventList">
                <div class="line" v-for="item in eventList">
                  <div class="id_card">{{ item.carCode }}</div>
                  <div class="title">{{ item.title }}</div>
                  <div v-if="item.time">{{ item.time.slice(11) }}</div>
@@ -282,7 +283,8 @@
              </div>
              <div class="list two-swiper">
                <div class="swiper-wrapper">
                  <div class="item two-swiper-slide swiper-slide" v-for="item in data6.stockList">
                  <div :class="{ orange: item.num < 200 }" class="item two-swiper-slide swiper-slide"
                    v-for="item in data6.stockList">
                    <div class="la">{{ item.name }}</div>
                    <div class="val">{{ item.num }}万支</div>
                  </div>
@@ -325,7 +327,7 @@
              <div class="icon_wrap">
                <img v-if="i != 0" class="dian" src="@/assets/images/ic_dangqian@2x.png" alt="">
                <img v-else src="@/assets/images/ic_jindu@2x.png" class="dian_ac" alt="">
                <div class="line"></div>
                <div v-if="i != activeCar.logList.length - 1" class="line"></div>
              </div>
              <div class="content">
                <div class="status" :class="{ ac: i == 0 }">{{ statusMapD[item.objType] }}</div>
@@ -381,7 +383,8 @@
  wltotalInList,
  wltransportMeasure,
  carsListPost,
  getCarsJobDetails
  getCarsJobDetails,
  carsEventListP
} from '@/api'
import 'swiper/css/swiper.min.css'
import Swiper from 'swiper'
@@ -452,26 +455,6 @@
    yAxis: [
      {
        type: 'value',
        name: '个',
        min: 0,
        axisLabel: {
          color: '#869CC9'
        },
        nameTextStyle: {
          color: '#869CC9',
          padding: [0, 0, 0, -18]    // å››ä¸ªæ•°å­—分别为上右下左与原位置距离
        },
        splitLine: {
          show: true,
          lineStyle: {
            width: 1,
            color: "rgba(49,105,129,0.4)",
            type: 'dashed'
          }
        },
      },
      {
        type: 'value',
        name: '万支',
        offset: 0,
        type: 'value',
@@ -494,6 +477,26 @@
          padding: [0, 0, 0, 12]    // å››ä¸ªæ•°å­—分别为上右下左与原位置距离
        },
      },
      {
        type: 'value',
        name: '个',
        min: 0,
        axisLabel: {
          color: '#869CC9'
        },
        nameTextStyle: {
          color: '#869CC9',
          padding: [0, 0, 0, -18]    // å››ä¸ªæ•°å­—分别为上右下左与原位置距离
        },
        splitLine: {
          show: false,
          lineStyle: {
            width: 1,
            color: "rgba(49,105,129,0.4)",
            type: 'dashed'
          }
        },
      },
    ],
    series: [
      {
@@ -506,7 +509,7 @@
          position: 'top',
          color: '#fff',
        },
        yAxisIndex: 1,
        yAxisIndex: 0,
        itemStyle: {
          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
            {
@@ -530,7 +533,7 @@
        name: '任务完成量',
        type: 'bar',
        barWidth: 10,
        yAxisIndex: 1,
        yAxisIndex: 0,
        label: {
          show: false,
          position: 'top',
@@ -560,7 +563,7 @@
        type: 'line',
        smooth: false,
        showAllSymbol: true,
        yAxisIndex: 0,
        yAxisIndex: 1,
        symbol: 'none',
        lineStyle: {
          color: "#1a43bc"
@@ -590,7 +593,19 @@
          show: false,
          position: 'center'
        },
        padAngle: 5,
        tooltip: {
          trigger: 'none'
        },
        emphasis: {
          // è®¾ç½®æ‚¬æµ®æ—¶æ ·å¼ä¸ºç©º
          scale: false, // å…³é—­æ”¾å¤§æ•ˆæžœ
          itemStyle: {
            shadowBlur: 0, // é˜´å½±æ¨¡ç³Šåº¦ä¸º 0
            shadowOffsetX: 0,
            shadowColor: 'rgba(0, 0, 0, 0)',
          },
        },
        padAngle: 3,
        itemStyle: {
          borderRadius: 10
        },
@@ -827,6 +842,13 @@
  showModal.value = false
  activeCar.value = {}
}
const taskClick = (item) => {
  getCarsJobDetails({ carCode: item.carCodeFront }).then(res => {
    // getCarsJobDetails({ carCode: '皖AE5277' }).then(res => {
    showModal.value = true
    activeCar.value = { ...res.data, carCode: item.carCodeFront }
  })
}
const data1 = ref({})
@@ -916,11 +938,15 @@
const isShowCarW = ref(false)
const data7 = ref({})
const eventList = ref([])
const getData7 = () => {
  carsListPost().then(res => {
    const result = res.data || {}
    data7.value = result
    initMap()
  })
  carsEventListP().then(res => {
    eventList.value = res.data || []
  })
}
@@ -1106,6 +1132,7 @@
            align-items: center;
            padding: 0 10px;
            font-size: 12px;
            cursor: pointer;
            &:nth-of-type(2n) {
              background: rgba(27, 64, 97, 0.52);
@@ -1295,13 +1322,13 @@
        bottom: 0;
        border-top: 1px solid #5ecbce;
        border-bottom: 1px solid #5ecbce;
        background: rgba(0, 30, 63, 0.4);
        /* backdrop-filter: blur(5px); */
        .head {
          display: flex;
          width: 280px;
          height: 57px;
          background: rgba(0, 30, 63, 0.4);
          backdrop-filter: blur(5px);
          display: flex;
          align-items: center;
          padding-left: 10px;
@@ -1318,7 +1345,8 @@
        .war_list {
          max-height: 300px;
          overflow: auto;
          padding-left: 10px;
          padding-bottom: 12px;
          .line {
            font-size: 13px;
            color: #D2E0FF;
@@ -1505,6 +1533,7 @@
            height: 36px !important;
            display: flex;
            align-items: center;
            font-size: 14px;
            &:nth-of-type(2n+1) {
              background: rgba(0, 152, 255, 0.13);
@@ -1519,6 +1548,10 @@
              flex: 2;
            }
          }
          .orange {
            color: #FF5728;
          }
        }
      }
    }
screen/src/views/SecurityControl.vue
@@ -164,7 +164,7 @@
                  <img src="@/assets/images/SecurityControl/title_short@2x.png" class="bg" alt="">
                </div>
                <div class="num_wrap">
                  <div class="num">{{ data.internalCarTotal }}</div>
                  <div class="num">{{ data.inParkCarTotal || 0 }}</div>
                  <img src="@/assets/images/SecurityControl/anfang_ic_data@2x.png" class="bg" alt="">
                </div>
              </div>
@@ -423,7 +423,7 @@
              </div>
              <div class="list two-swiper">
                <div class="swiper-wrapper">
                  <template v-for="item, i in dataList2.filter(i => i.total > 0)">
                  <template v-for="item, i in dataList2.filter(i => i.totalNum > 0)">
                    <div class="item two-swiper-slide swiper-slide">
                      <div class="line">
                        <div class="driver">{{ item.deviceType }}</div>
@@ -826,6 +826,8 @@
        }
        return item
      })
      console.log('dataList2', dataList2.value);
      data2.value = total
      if (online >= outline) {
        temp.push({ name: '在线', value: online, rate: ((online / (online + outline)) * 100).toFixed(1) })
screen/src/views/TaskEfficiency.vue
@@ -65,7 +65,7 @@
            <div class="list one-swiper">
              <div class="swiper-wrapper">
                <div class="line one-swiper-slide swiper-slide" v-for="item, i in dataList2" :key="i">
                  <div class="top"><span v-if="i < 3">top</span>{{ i + 1 }}</div>
                  <div class="top" :class="{top3: i < 3}"><span v-if="i < 3">top</span>{{ i + 1 }}</div>
                  <div class="id_card">{{ item.platformName }}</div>
                  <div class="wrap">
                    <ChargeRate :rate="item.rate" />
@@ -163,7 +163,7 @@
                <div class="val">{{ workModalParam.finishTimeStr }}</div>
              </div>
            </div>
            <div class="modal_bg" v-if="showWorkModal" @click="showWorkModal = false"></div>
            <div class="modal_bg" v-if="showWorkModal" @click="closeModal"></div>
          </div>
          <div class="center_box_two">
            <div v-if="data4.videoIndexCodes && data4.videoIndexCodes.length > 0" class="videos">
@@ -342,6 +342,18 @@
        label: {
          show: false,
          position: 'center'
        },
        tooltip: {
          trigger: 'none'
        },
        emphasis: {
          // è®¾ç½®æ‚¬æµ®æ—¶æ ·å¼ä¸ºç©º
          scale: false, // å…³é—­æ”¾å¤§æ•ˆæžœ
          itemStyle: {
            shadowBlur: 0, // é˜´å½±æ¨¡ç³Šåº¦ä¸º 0
            shadowOffsetX: 0,
            shadowColor: 'rgba(0, 0, 0, 0)',
          },
        },
        padAngle: 2,
        itemStyle: {
@@ -755,7 +767,6 @@
      i.finishTime = dayjs(i.finishTime).format('HH:mm')
      return i
    })
    console.log('dataList5', dataList5.value)
  })
}
@@ -801,7 +812,15 @@
const platformClick = (val) => {
  const index = pointList.findIndex(i => i.name == val.platformName)
  workModalParam.value = { ...val, ...pointList[index], index: pointList }
  if(workModalParam.value.workTime){
    workModalParam.value.workTime = workModalParam.value.workTime.replaceAll('m', '分钟')
    workModalParam.value.workTime = workModalParam.value.workTime.replaceAll('h', '小时')
  }
  showWorkModal.value = true
}
const closeModal = () => {
  showWorkModal.value = false
  workModalParam.value = {}
}
const loopFn2 = () => {
  var newSwiper1 = new Swiper('.one-swiper', {
@@ -1002,7 +1021,9 @@
            box-shadow: inset 0px 0px 3px 0px #01D9FE;
            margin-right: 10px;
          }
          .top3{
            box-shadow: inset 0px 0px 3px 0px #FEAF01;
          }
          .one-swiper-slide {
            height: 40px !important;
          }
@@ -1131,7 +1152,7 @@
        padding: 22px 20px;
        left: 850px;
        top: 60px;
        z-index: 99999999;
        .head {
          display: flex;
          justify-content: space-between;