ll
liukangdong
2024-10-30 fb8960f8c094f4905ee37ceb09dc6e22d276e8b6
ll
已修改17个文件
923 ■■■■■ 文件已修改
admin/src/api/business/company.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHiddenDangerParamWindow.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/operaVisitsReportWindow.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/operaVisitsWindow.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/operation/HiddenDangerParam.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/router/index.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/utils/request.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/relativeMember.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/danger/areaSet.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/danger/record.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/waybill.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/api/index.js 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/FireFighting.vue 427 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/LogisticsEfficiency.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/TaskEfficiency.vue 230 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/company.js
@@ -41,6 +41,10 @@
export function companyGetList (data) {
  return request.post('/visitsAdmin/cloudService/business/company/page', data)
}
// 查询所有部门
export function companyGetListPost (data) {
  return request.post('/visitsAdmin/cloudService/business/company/list', data)
}
// 删除
export function deleteById (id) {
admin/src/components/business/OperaHiddenDangerParamWindow.vue
@@ -1,27 +1,22 @@
<template>
    <GlobalWindow
        :title="title"
        width="500px"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
  <GlobalWindow :title="title" width="500px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
      <el-form :model="form" ref="form" :rules="rules">
          <el-form-item label="名称" prop="name">
            <el-input v-model="form.name" placeholder="请输入名称" v-trim/>
          </el-form-item>
          <el-form-item label="排序码(升序)" prop="sortnum">
            <el-input v-model="form.sortnum" type="number"  placeholder="请输入排序码" v-trim/>
      <el-form-item label="责任部门" prop="companyId">
        <el-select @change="loadMember" v-model="form.companyId">
          <el-option v-for="op in department" :key="op.id" :label="op.name" :value="op.id"></el-option>
        </el-select>
          </el-form-item>
          <el-form-item v-if="form.type==0" label="选择安全员:" prop="memberIdList">
      <el-form-item v-if="form.type == 0" label="选择安全员" prop="memberIdList">
            <el-select v-model="form.memberIdList" filterable multiple clearable placeholder="请选择">
              <el-option
                  v-for="item in memberList"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
          <el-option v-for="item in memberList" :key="item.id" :label="item.name" :value="item.id">
              </el-option>
            </el-select>
      </el-form-item>
      <el-form-item label="排序码(升序)" prop="sortnum">
        <el-input v-model="form.sortnum" type="number" placeholder="请输入排序码" v-trim />
          </el-form-item>
        </el-form>
    </GlobalWindow>
@@ -31,6 +26,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/member'
import { companyGetListPost } from '@/api/business/company'
export default {
  name: 'OperaHiddenDangerParamWindow',
  extends: BaseOpera,
@@ -39,18 +35,25 @@
    return {
      // 表单数据
      memberList: [],
      department: [],
      departprops: {
        label: 'name',
        value: 'id',
        checkStrictly: true
      },
      form: {
        id: null,
        name: null,
        companyId: null,
        memberIdList: null,
        type: null,
        sortnum: null
      },
      // 验证规则
      rules: {
        name: [
          { required: true, message: '请输入名称' }
        ]
        name: [{ required: true, message: '请输入名称' }],
        companyId: [{ required: true, message: '请选择' }],
        memberIdList: [{ required: true, message: '请选择', type: 'array' }],
      }
    }
  },
@@ -65,7 +68,7 @@
      this.title = title
      this.visible = true
      this.form.type = type
      this.loadMember()
      this.getfindCompanyTreePage()
      // 新建组织
      if (target == null) {
        this.$nextTick(() => {
@@ -90,10 +93,19 @@
        }
      })
    },
    getfindCompanyTreePage() {
      companyGetListPost({})
        .then(res => {
          if (res && res.length > 0) {
            this.department = res
          }
        })
    },
    loadMember () {
      allList({
        type: 2,
        companyType: 1
        companyType: 1,
        companyId: this.form.companyId
      })
        .then(res => {
          this.memberList = res
admin/src/components/business/operaVisitsReportWindow.vue
@@ -55,7 +55,7 @@
        ></el-input>
      </el-form-item>
      <el-form-item label="入园车辆" prop="carNos">
        <el-input v-model="param.carNos" placeholder="请输入车牌号"></el-input>
        <el-input v-model.trim="param.carNos" placeholder="请输入车牌号"></el-input>
      </el-form-item>
      <el-form-item label="随车人数" prop="memberNum">
        <el-input
@@ -205,6 +205,11 @@
        if (!valid) {
          return
        }
        const { param } = this
        if(param.carNos){
          param.carNos = param.carNos.replace(/\s*/g,"")
          param.carNos = param.carNos.replace(/[\r\n]/g, "")
        }
        // 调用新建接口
        this.isWorking = true
        createVisit({
admin/src/components/business/operaVisitsWindow.vue
@@ -117,7 +117,7 @@
        ></el-input>
      </el-form-item>
      <el-form-item label="随行车辆">
        <el-input v-model="param.carNos" placeholder="请输入车牌号"></el-input>
        <el-input v-model.trim="param.carNos" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" placeholder="请输入车牌号"></el-input>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -135,6 +135,7 @@
    GlobalWindow,
    UploadFaceImg
  },
  data () {
    return {
      isShowModal: false,
@@ -257,6 +258,10 @@
          return
        }
        const { param } = this
        if(param.carNos){
          param.carNos = param.carNos.replace(/\s*/g,"")
          param.carNos = param.carNos.replace(/[\r\n]/g, "")
        }
        if (param.starttime.slice(0, 10) !== param.endtime.slice(0, 10)) return this.$tip.error('入园时间和离园时间不可跨天')
        // 调用新建接口
        this.isWorking = true
admin/src/components/operation/HiddenDangerParam.vue
@@ -22,6 +22,11 @@
          default-time="08:00:00"
        />
      </el-form-item>
      <el-form-item label="责任部门" prop="companyId">
        <el-select  v-model="param.companyId">
          <el-option v-for="op in department" :key="op.id" :label="op.name" :value="op.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="隐患区域" prop="areaId">
        <el-select v-model="param.areaId" @change="changeArea" placeholder="请选择">
          <el-option
@@ -106,6 +111,7 @@
import { allList, memberList } from '@/api/business/hiddenDangerParam'
import { create } from '@/api/business/hiddenDanger'
import { Loading } from 'element-ui'
import { companyGetListPost } from '@/api/business/company'
export default {
  extends: BaseOpera,
  components: {
@@ -126,11 +132,13 @@
      uploadData: {
        folder: 'HIDDEN_DANGER_FILE'
      },
      department: [],
      rules: {
        // starttime: [{ required: true, message: '请选择日期', trigger: 'change' }],
        areaId: [{ required: true, message: '请选择', trigger: 'change' }],
        cateId: [{ required: true, message: '请选择', trigger: 'change' }],
        checkUserId: [{ required: true, message: '请选择', trigger: 'change' }],
        companyId: [{ required: true, message: '请选择', trigger: 'change' }],
        faceImgUrl: [{ required: true, message: '请上传', trigger: 'change' }],
        content: [{ required: true, message: '请输入', trigger: 'blur' }]
@@ -142,6 +150,7 @@
    this.initData()
  },
  methods: {
    initData () {
      allList({ type: 1 }).then(res => { // 类型
        this.typeList = res || []
@@ -152,6 +161,15 @@
      memberList({}).then(res => {
        this.memberList = res || []
      })
      this.getfindCompanyTreePage()
    },
    getfindCompanyTreePage() {
      companyGetListPost({})
        .then(res => {
          if (res && res.length > 0) {
            this.department = res
          }
        })
    },
    changeArea (e) {
      const item = this.addrList.find(i => i.id === e)
admin/src/router/index.js
@@ -60,10 +60,10 @@
      return
    }
    // 如果访问的是登录页面,则直接跳转至首页
    if (to.name === 'login') {
      next({ name: 'index' })
      return
    }
    // if (to.name === 'login') {
    //   next({ name: 'index' })
    //   return
    // }
    next()
    return
  }
admin/src/utils/request.js
@@ -4,6 +4,7 @@
import { trim } from './util'
import cache from '../plugins/cache'
import { Message } from 'element-ui'
import router from '@/router'
axios.defaults.headers.common['Content-Type'] = 'application/json;charset=UTF-8'
const axiosInstance = axios.create({
@@ -41,6 +42,7 @@
// 新建响应拦截器
axiosInstance.interceptors.response.use((response) => {
  // 请求失败
  if (response.status !== 200) {
    return Promise.reject(new Error('服务器繁忙,请稍后再试'))
@@ -54,10 +56,10 @@
    return Promise.reject(new Error('服务器繁忙,请稍后再试'))
  }
  if (response.data.code === 401 || response.data.code === 5112) {
    if (response.config.autoLogin !== false) {
    // if (response.config.autoLogin !== false) {
      Cookies.set('dm_user_token','')
      window.location.href = process.env.VUE_APP_ROUTER_MODE === 'hash' ? (process.env.VUE_APP_CONTEXT_PATH +'/#/login') : (process.env.VUE_APP_CONTEXT_PATH+'/login')
    }
      router.replace({name: 'login'})
    // }
    return Promise.reject(response.data)
  }
  // 业务失败
admin/src/views/business/relativeMember.vue
@@ -119,6 +119,7 @@
            <span v-if="row.status == 2" style="color: red">拉黑/冻结</span>
          </template>
        </el-table-column>-->
        <el-table-column prop="trainEndTime" label="培训有效期" min-width="100px">  </el-table-column>
        <el-table-column label="部门类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.companyType == 0">相关方组织</span>
admin/src/views/login.vue
@@ -3,6 +3,7 @@
    <img src="@/assets/images/bg@2x.png" class="main_bg" alt="">
    <div class="login_wrap">
      <div class="login_img">
        <div class="h2">安徽安泰物流有限责任公司</div>
        <div class="h3">智慧物流园区安消一体化系统</div>
      </div>
      <div class="form_wrap">
@@ -264,8 +265,19 @@
      background: url("../assets/images/login_img@2x.png");
      background-size: 100% 100%;
      padding-left: 40px;
      padding-top: 80px;
      padding-top: 60px;
      .h2{
        color: $primary-color;
        background-color: #fff;
        height: 24px;
        display: flex;
        align-items: center;
        justify-content: center;
        border-radius: 4px;
        width: 186px;
        display: flex;
        margin-bottom: 12px;
      }
      .h3 {
        font-size: 28px;
        font-weight: 700;
admin/src/views/operation/danger/areaSet.vue
@@ -5,6 +5,9 @@
      <el-form-item label="隐患区域" prop="name">
        <el-input v-model="searchForm.name" clearable placeholder="请输入隐患区域" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="责任部门" prop="companyName">
        <el-input v-model="searchForm.companyName" clearable placeholder="请输入部门名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
@@ -23,14 +26,15 @@
          @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="隐患区域" min-width="200px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码"  min-width="100px"></el-table-column>
        <el-table-column prop="memberNames" label="安全员" min-width="200px"></el-table-column>
        <el-table-column prop="editDate" label="操作时间" min-width="200px"></el-table-column>
        <el-table-column prop="name" label="隐患区域" min-width="120px"></el-table-column>
        <el-table-column prop="companyName" label="责任部门" min-width="120px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码"  min-width="70px"></el-table-column>
        <el-table-column prop="memberNames" label="安全员" min-width="80px"></el-table-column>
        <el-table-column prop="editDate" label="操作时间" min-width="160px"></el-table-column>
        <el-table-column
            v-if="containPermissions(['business:hiddendangerparam:update', 'business:hiddendangerparam:delete' ])"
            label="操作"
            min-width="250"
            min-width="140"
            fixed="right"
        >
          <template slot-scope="{row}">
admin/src/views/operation/danger/record.vue
@@ -8,6 +8,9 @@
      <el-form-item label="提报人组织" prop="companyName">
        <el-input v-model="searchForm.companyName" placeholder="请输入" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="责任部门" prop="companyName">
        <el-input v-model="searchForm.companyName" placeholder="请输入" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="隐患区域" prop="areaId">
        <el-select v-model="searchForm.areaId" placeholder="请选择隐患区域" clearable  @change="search">
          <el-option
@@ -72,6 +75,7 @@
          @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="companyName" label="责任部门" min-width="150px"></el-table-column>
        <el-table-column prop="areaName" label="隐患区域" min-width="150px"></el-table-column>
        <el-table-column prop="categoryName" label="隐患类型" min-width="150px"></el-table-column>
        <el-table-column prop="memberName" label="提报人" min-width="80px"></el-table-column>
@@ -128,6 +132,7 @@
        memberName: '',
        companyName: '',
        queryStartTime: '',
        companyName: '',
        queryEndTime: '',
        areaId: null,
        cateId: null,
admin/src/views/platform/LogisticsRecord/waybill.vue
@@ -109,6 +109,9 @@
            type: 'select',
            label: '作业状态',
            options: [
              { value: 0, label: '待确认' },
              { value: 1, label: '待签到' },
              { value: 2, label: '等待叫号' },
              { value: 3, label: '入园等待' },
              { value: 4, label: '月台等待' },
              { value: 5, label: '作业中' },
screen/src/api/index.js
@@ -26,24 +26,74 @@
}
// 消防管控大屏 报警信息
export const getStoreTaskList = (data) => {
  return request('visitsAdmin/cloudService/board/api/wholeProvince/transportTaskList', data)
export const getFightingalarmData = (data) => {
  return request('visitsAdmin/cloudService/board/api/fightingAdmin/alarmData', data)
}
// 消防管控大屏 告警处理分析
export const getStoreTaskList = (data) => {
  return request('visitsAdmin/cloudService/board/api/wholeProvince/transportTaskList', data)
export const getFightingHandle = (data) => {
  return request('visitsAdmin/cloudService/board/api/fightingAdmin/alarmHandleData', data)
}
// 消防管控大屏 中心数据
export const getStoreTaskList = (data) => {
  return request('visitsAdmin/cloudService/board/api/wholeProvince/transportTaskList', data)
export const getFightingcenterData = (data) => {
  return request('visitsAdmin/cloudService/board/api/fightingAdmin/centerData', data)
}
// 消防管控大屏 今日各系统设备状态及告警数量
export const getStoreTaskList = (data) => {
  return request('visitsAdmin/cloudService/board/api/wholeProvince/transportTaskList', data)
export const getFightingDeAlarm = (data) => {
  return request('visitsAdmin/cloudService/board/api/fightingAdmin/deviceAlarmData', data)
}
// 消防管控大屏 本年消防设备-设施维护情况
export const getStoreTaskList = (data) => {
  return request('visitsAdmin/cloudService/board/api/wholeProvince/transportTaskList', data)
export const getFightingDeviceY = (data) => {
  return request('visitsAdmin/cloudService/board/api/fightingAdmin/yearDeviceData', data)
}
// 场内调度看板 今日月台完成订单统计
export const cnplatformGroupFinish = (data) => {
  return request('visitsAdmin/cloudService/board/api/onSitDispatch/platformGroupFinish', data)
}
// 场内调度看板 今日月台工作时长趋势
export const cnplatformDuration = (data) => {
  return request('visitsAdmin/cloudService/board/api/onSitDispatch/platformDuration', data)
}
// 场内调度看板 实时月台作业信息
export const cnplatformWorkData = (data) => {
  return request('visitsAdmin/cloudService/board/api/onSitDispatch/platformWorkData', data)
}
// 场内调度看板 中心数据
export const cncenterData = (data) => {
  return request('visitsAdmin/cloudService/board/api/onSitDispatch/centerData', data)
}
// 场内调度看板 今日车辆作业情况
export const cncarWorkSituation  = (data) => {
  return request('visitsAdmin/cloudService/board/api/onSitDispatch/carWorkSituation', data)
}
// 场内调度看板 实时作业效率
export const cnworkEfficiency = (data) => {
  return request('visitsAdmin/cloudService/board/api/onSitDispatch/workEfficiency', data)
}
// 物流运行调度看板 中心数据
export const wlcenterData = (data) => {
  return request('visitsAdmin/cloudService/board/api/platformJobRun/centerData', data)
}
// 物流运行调度看板 出入库任务量
export const wljobData = (data) => {
  return request('visitsAdmin/cloudService/board/api/platformJobRun/jobData', data)
}
// 物流运行调度看板 当日运输任务
export const wlplatformJobList = (data) => {
  return request('visitsAdmin/cloudService/board/api/platformJobRun/platformJobList', data)
}
// 物流运行调度看板 库存情况
export const wlstockList = (data) => {
  return request('visitsAdmin/cloudService/board/api/platformJobRun/stockList', data)
}
// 物流运行调度看板 今日入库量统计
export const wltotalInList = (data) => {
  return request('visitsAdmin/cloudService/board/api/platformJobRun/totalInList', data)
}
// 物流运行调度看板 运输任务分析
export const wltransportMeasure = (data) => {
  return request('visitsAdmin/cloudService/board/api/platformJobRun/transportMeasure', data)
}
screen/src/router/index.js
@@ -5,7 +5,7 @@
  routes: [
    {
      path: '/',
      component: () => import('../views/FireFighting.vue')
      component: () => import('../views/SecurityControl.vue')
    },
    {
      path: '/PlatformCall', // 月台叫号大屏
screen/src/views/FireFighting.vue
@@ -31,14 +31,14 @@
                  <span class="item">故障</span>
                  <span class="item">离线</span>
                </div>
                <template v-for="i in 5">
                <template v-for="(item, i) in dataList1" :key="i">
                  <div class="line">
                    <span class="item name">火灶报警系统</span>
                    <span class="item">11</span>
                    <span class="item">11</span>
                    <span class="item">11</span>
                    <span class="item">11</span>
                    <span class="item">11</span>
                    <span class="item name">{{ item.deviceTypeName }}</span>
                    <span class="item">{{ item.statusTotal }}</span>
                    <span class="item">{{ item.alarmNum }}</span>
                    <span class="item">{{ item.shieldNum }}</span>
                    <span class="item">{{ item.errNum }}</span>
                    <span class="item">{{ item.offlineNum }}</span>
                  </div>
                  <div class="separate"></div>
                </template>
@@ -54,12 +54,12 @@
              <img src="@/assets/images/title@2x.png" class="bg" alt="" />
            </div>
            <div class="police_wrap">
              <div class="item" v-for="(ind, i) in 4">
              <div class="item" v-for="(item, i) in dataList2">
                <div class="head">
                  <div class="name">真实报警数</div>
                  <div class="name">{{ i }}次</div>
                  <div class="name">{{ item.name }}</div>
                  <div class="name">{{ item.num }}次</div>
                </div>
                <FirePercent :color="policeColors[i]" :rate="40" />
                <FirePercent :color="policeColors[i]" :rate="item.rate" />
              </div>
            </div>
@@ -84,35 +84,35 @@
                <img src="@/assets/images/FireFighting/xiaofang_ic_zaixian@2x.png" alt="">
                <div class="content">
                  <div class="name">在线</div>
                  <div class="num">1000</div>
                  <div class="num">{{ dataList4.onlineDeviceNum }}</div>
                </div>
              </div>
              <div class="item">
                <img src="@/assets/images/FireFighting/xiaofang_ic_baojing@2x.png" alt="">
                <div class="content">
                  <div class="name">报警</div>
                  <div class="num num2">12</div>
                  <div class="num num2">{{ dataList4.alarmDeviceNum }}</div>
                </div>
              </div>
              <div class="item">
                <img src="@/assets/images/FireFighting/xiaofang_ic_guzhang@2x.png" alt="">
                <div class="content">
                  <div class="name">故障</div>
                  <div class="num num3">12</div>
                  <div class="num num3">{{ dataList4.errDeviceNum }}</div>
                </div>
              </div>
              <div class="item">
                <img src="@/assets/images/FireFighting/xiaofang_ic_lixian@2x.png" alt="">
                <div class="content">
                  <div class="name">离线</div>
                  <div class="num num4">12</div>
                  <div class="num num4">{{ dataList4.offlineDeviceNum }}</div>
                </div>
              </div>
              <div class="item">
                <img src="@/assets/images/FireFighting/xiaofang_ic_pingbi@2x.png" alt="">
                <div class="content">
                  <div class="name">屏蔽</div>
                  <div class="num num5">12</div>
                  <div class="num num5">{{ dataList4.shieldDeviceNum }}</div>
                </div>
              </div>
            </div>
@@ -206,20 +206,26 @@
            </div>
            <div class="content_wrap">
              <div class="list">
                <template v-for="i in 3">
                  <div class="item">
                    <div>已维保</div>
                    <div class="num active">500</div>
                  <div class="num active">{{ dataList5.protectNum }}</div>
                  </div>
                  <div v-if="i < 3" class="separate"></div>
                </template>
                <div class="separate"></div>
                <div class="item">
                  <div>计划维保</div>
                  <div class="num active">{{ dataList5.planProtectTotal }}</div>
                </div>
                <div class="separate"></div>
                <div class="item">
                  <div>维保率</div>
                  <div v-if="dataList5.protectNum && dataList5.planProtectTotal" class="num active">{{ ((dataList5.protectNum / dataList5.planProtectTotal) * 100).toFixed(0) }}%</div>
                </div>
              </div>
              <div class="footer">
                <img src="@/assets/images/FireFighting/ic_weixiu@2x.png" class="icon" alt="">
                <div class="content">
                  <div>本月新增维保</div>
                  <div class="num">40 <span>个</span></div>
                  <div class="num">{{ dataList5.monthAddNum }} <span>个</span></div>
                </div>
              </div>
            </div>
@@ -241,14 +247,14 @@
                <img src="@/assets/images/FireFighting/ic_tibao@2x.png" alt="">
                <div class="content">
                  <div class="name">提报隐患数</div>
                  <div class="num"><span>10</span>个</div>
                  <div class="num"><span>{{ dataList4.todayDangerNum }}</span>个</div>
                </div>
              </div>
              <div class="item">
                <img src="@/assets/images/FireFighting/ic_chuli@2x.png" alt="">
                <div class="content">
                  <div class="name">处理隐患数</div>
                  <div class="num"><span class="today">3</span>个</div>
                  <div class="num"><span class="today">{{ dataList4.dealDangerNum }}</span>个</div>
                </div>
              </div>
            </div>
@@ -277,7 +283,7 @@
                    </div>
                    <div class="title">
                      <img class="addr" src="@/assets/images/FireFighting/xiaofang_ic_weizhi@2x.png" alt="">
                      <span>address</span>
                      <span>A厂房3车间门口</span>
                    </div>
                  </div>
                </div>
@@ -295,8 +301,15 @@
import VScaleScreen from 'v-scale-screen'
import FirePercent from '@/components/FirePercent.vue'
import dayjs from 'dayjs'
import * as echarts from 'echarts'
import {
  getFightingalarmData,
  getFightingHandle,
  getFightingcenterData,
  getFightingDeAlarm,
  getFightingDeviceY,
} from '@/api'
const colors = ['#FEAF01', '#01ABFE', '#51F9E4']
const weekMap = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六',]
const date = ref(dayjs().format('YYYY.MM.DD'))
@@ -309,166 +322,7 @@
}, 1000)
const arr = ['#68e2e3', '#50afd3', '#377cdb', '#d5ae3a']
const initEchart2 = () => {
  var myChart = echarts.init(document.querySelector('.echart2'))
  // 生成数据和日期
  function getLastSevenDays() {
    const days = []
    const today = new Date()
    for (let i = 10; i >= 0; i--) {
      days.push(`${i + 1}月`) // 格式化日期为 "X月X日"
    }
    return days
  }
  // 示例数据
  const data1 = [13, 14, 14, 14, 14, 12, 11, 23, 12, 1] // 准时
  const data2 = [1, 1, 2, 1, 1, 2, 2, 3, 2, 1, 5] // 迟到
  const data3 = [1, 0, 0, 0, 0, 0, 2, 2, 3, 1, 2] // 请假
  const data4 = [8, 5, 4, 7, 4, 5, 7, 4, 2, 1, 3] // 加班
  const option = {
    legend: {
      x: "center",
      textStyle: {
        color: "#FFFFFF", // 图例文字设为白色
        fontSize: 12
      },
      icon: 'circle',
      top: '6%',
      itemWidth: 8,
      itemHeight: 8,
      itemGap: 20,
      data: ['告警数', '进行中', '已处理', '误报数'] // 更新图例名称
    },
    grid: {
      left: '2%',
      right: '0%',
      top: '18%',
      bottom: '10%',
      containLabel: true,
    },
    tooltip: {
      trigger: "axis",
      axisPointer: {
        type: "shadow"
      },
      textStyle: {
        color: "rgba(255, 255, 255, 1)"
      },
      backgroundColor: "rgba(0,0,0,0.8)",
      borderColor: "rgba(219, 230, 255, 0.8)",
    },
    xAxis: {
      data: getLastSevenDays(), // 使用近七天日期
      axisLabel: {
        color: "#FFFFFF", // X 轴文字设为白色
        fontSize: 14,
      },
      axisLine: {
        lineStyle: {
          color: '#1E294C'
        }
      },
      axisTick: {
        show: false
      }
    },
    yAxis: {
      show: true,
      axisLabel: {
        color: "#FFFFFF", // Y 轴文字设为白色
        fontSize: 12,
      },
      axisLine: {
        lineStyle: {
          color: '#A9AEB2'
        }
      },
      axisTick: {
        lineStyle: {
          color: '#A9AEB2'
        }
      },
      splitLine: {
        show: true,
        lineStyle: {
          color: ["#0f1d27"],
          width: 1
        },
      },
    },
    series: [
      {
        name: "告警数",
        type: "bar",
        stack: "attendance",
        data: data1,
        itemStyle: {
          color: '#FEAF01',
        },
        label: {
          show: false,
          color: "#FFFFFF",
        },
        emphasis: {
          focus: "series",
        },
        barWidth: 6,
      },
      {
        name: "进行中", // 迟到数据
        type: "bar",
        stack: "attendance",
        data: data2,
        itemStyle: {
          color: '#28F0C4', // 迟到的颜色
        },
        label: {
          show: false,
          color: "#FFFFFF",
        },
        emphasis: {
          focus: "series",
        },
      },
      {
        name: "已处理", // 请假数据
        type: "bar",
        stack: "attendance",
        data: data3,
        itemStyle: {
          color: '#0193FE', // 请假的颜色
        },
        label: {
          show: false,
          color: "#FFFFFF",
        },
        emphasis: {
          focus: "series",
        },
      },
      {
        name: "误报数", // 单独的加班柱子
        type: "bar",
        data: data4,
        barWidth: 6,
        itemStyle: {
          color: '#FEED01', // 高亮的紫色
        },
        emphasis: {
          focus: "series",
        },
      },
    ],
  }
  myChart.setOption(option)
  window.addEventListener('resize', function () {//执行
    myChart.resize()
  })
}
const policeColors = ['#01D9FE', '#FE5501', '#0193FE', '#28F0C4']
const initWatergage = () => {
  const myChart = echarts.init(document.getElementById('watergage'))
  var data_value = 2
@@ -834,8 +688,209 @@
  })
}
onMounted(() => {
const dataList1 = ref([])
const getData1 = () => {
  getFightingDeAlarm().then(res => {
    dataList1.value = res.data
  })
}
const policeColors = ['#01D9FE', '#FE5501', '#0193FE', '#28F0C4']
const dataList2 = ref([])
const getData2 = () => {
  getFightingalarmData().then(res => {
    const result = res.data || {}
    let temp = []
    temp.push({ name: '真实报警数', num: result.realNum, rate: (result.realNum / result.totalNum) * 100 })
    temp.push({ name: '误报警数', num: result.errNum, rate: (result.errNum / result.totalNum) * 100 })
    temp.push({ name: '已解除', num: result.liftNum, rate: (result.liftNum / result.totalNum) * 100 })
    temp.push({ name: '处理中', num: result.processingNum, rate: (result.processingNum / result.totalNum) * 100 })
    dataList2.value = temp
  })
}
const dataList3 = ref([])
const getData3 = () => {
  getFightingHandle({ type: 0 }).then(res => {
    dataList3.value = res.data || []
  initEchart2()
  })
}
const initEchart2 = () => {
  var myChart = echarts.init(document.querySelector('.echart2'))
  // 生成数据和日期
  // 示例数据
  const data1 = dataList3.value.map(i => i.alarmNum)
  const data2 = dataList3.value.map(i => i.processingNum)
  const data3 = dataList3.value.map(i => i.liftNum)
  const data4 = dataList3.value.map(i => i.errNum)
  const option = {
    legend: {
      x: "center",
      textStyle: {
        color: "#FFFFFF", // 图例文字设为白色
        fontSize: 12
      },
      icon: 'circle',
      top: '6%',
      itemWidth: 8,
      itemHeight: 8,
      itemGap: 20,
      data: ['告警数', '进行中', '已处理', '误报数'] // 更新图例名称
    },
    grid: {
      left: '2%',
      right: '0%',
      top: '20%',
      bottom: '10%',
      containLabel: true,
    },
    tooltip: {
      trigger: "axis",
      axisPointer: {
        type: "shadow"
      },
      textStyle: {
        color: "rgba(255, 255, 255, 1)"
      },
      backgroundColor: "rgba(0,0,0,0.8)",
      borderColor: "rgba(219, 230, 255, 0.8)",
    },
    xAxis: {
      data: dataList3.value.map(i => i.monthStr),
      axisLabel: {
        color: "#FFFFFF", // X 轴文字设为白色
        fontSize: 14,
      },
      axisLine: {
        lineStyle: {
          color: '#1E294C'
        }
      },
      axisTick: {
        show: false
      }
    },
    yAxis: {
      show: true,
      axisLabel: {
        color: "#FFFFFF", // Y 轴文字设为白色
        fontSize: 12,
      },
      axisLine: {
        lineStyle: {
          color: '#A9AEB2'
        }
      },
      axisTick: {
        lineStyle: {
          color: '#A9AEB2'
        }
      },
      splitLine: {
        show: true,
        lineStyle: {
          color: ["#0f1d27"],
          width: 1
        },
      },
    },
    series: [
      {
        name: "告警数",
        type: "bar",
        stack: "attendance",
        data: data1,
        itemStyle: {
          color: '#FEAF01',
        },
        label: {
          show: false,
          color: "#FFFFFF",
        },
        emphasis: {
          focus: "series",
        },
        barWidth: 6,
      },
      {
        name: "进行中", // 迟到数据
        type: "bar",
        stack: "attendance",
        data: data2,
        itemStyle: {
          color: '#28F0C4', // 迟到的颜色
        },
        label: {
          show: false,
          color: "#FFFFFF",
        },
        emphasis: {
          focus: "series",
        },
      },
      {
        name: "已处理", // 请假数据
        type: "bar",
        stack: "attendance",
        data: data3,
        itemStyle: {
          color: '#0193FE', // 请假的颜色
        },
        label: {
          show: false,
          color: "#FFFFFF",
        },
        emphasis: {
          focus: "series",
        },
      },
      {
        name: "误报数", // 单独的加班柱子
        type: "bar",
        data: data4,
        barWidth: 6,
        itemStyle: {
          color: '#FEED01', // 高亮的紫色
        },
        emphasis: {
          focus: "series",
        },
      },
    ],
  }
  myChart.setOption(option)
  window.addEventListener('resize', function () {//执行
    myChart.resize()
  })
}
const dataList4 = ref({})
const getData4 = () => {
  getFightingcenterData().then(res => {
    dataList4.value = res.data || {}
  })
}
const dataList5 = ref({}) // 维保
const getData5 = () => {
  getFightingDeviceY().then(res => {
    dataList5.value = res.data || {}
  })
}
const dataList6 = ref([])
const getData6 = () => {
  getFightingHandle({type: 1}).then(res => {
    dataList6.value = res.data
  })
}
onMounted(() => {
  getData1()
  getData2()
  getData3()
  getData4()
  getData5()
  getData6()
  initWatergage()
  initLiquidlevel()
})
screen/src/views/LogisticsEfficiency.vue
@@ -248,6 +248,14 @@
import dayjs from 'dayjs'
import * as echarts from 'echarts'
import ahJSON from '@/assets/anhui.json'
import {
  wlcenterData,
  wljobData,
  wlplatformJobList,
  wlstockList,
  wltotalInList,
  wltransportMeasure,
} from '@/api'
const colors = ['#FEAF01', '#01ABFE', '#51F9E4']
const weekMap = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六',]
@@ -626,7 +634,50 @@
  })
}
const dataList1 = ref([])
const getData1 = () => {
  wlcenterData().then(res => {
    const result = res
  })
}
const dataList2 = ref([])
const getData2 = () => {
  wlcenterData().then(res => {
    const result = res
  })
}
const dataList3 = ref([])
const getData3 = () => {
  wlcenterData().then(res => {
    const result = res
  })
}
const dataList4 = ref([])
const getData4 = () => {
  wlcenterData().then(res => {
    const result = res
  })
}
const dataList5 = ref([])
const getData5 = () => {
  wlcenterData().then(res => {
    const result = res
  })
}
const dataList6 = ref([])
const getData6 = () => {
  wlcenterData().then(res => {
    const result = res
  })
}
onMounted(() => {
  getData1()
  getData2()
  getData3()
  getData4()
  getData5()
  getData6()
  return
  initEnergy()
  initEchart1()
  initMap()
screen/src/views/TaskEfficiency.vue
@@ -24,20 +24,20 @@
            <div class="car_static">
              <div class="echart_wrap">
                <div class="pie_text">
                  <div class="fs30"><strong>300</strong></div>
                  <div class="fs30"><strong>{{ data1 }}</strong></div>
                  <div>完成量</div>
                </div>
                <div class="echart1" id="echart1"></div>
              </div>
              <div class="list">
                <div class="item">
                <div class="item" v-for="item, i in dataList1" :key="i">
                  <div class="line">
                    <div :style="{ background: colors[0] }" class="icon"></div>
                    <div class="text">安泰物流装货月台组</div>
                    <div :style="{ background: colors[i] }" class="icon"></div>
                    <div class="text">{{ item.name }}</div>
                  </div>
                  <div :style="{ color: colors[0] }" class="num">100万支</div>
                  <div :style="{ color: colors[i] }" class="num">{{ item.value }}万支</div>
                </div>
                <div class="item">
                <!-- <div class="item">
                  <div class="line">
                    <div :style="{ background: colors[1] }" class="icon"></div>
                    <div class="text">安泰物流卸货月台组</div>
@@ -50,7 +50,7 @@
                    <div class="text">市公司卸货月台组</div>
                  </div>
                  <div :style="{ color: colors[2] }" class="num">100万支</div>
                </div>
                </div> -->
              </div>
            </div>
          </div>
@@ -63,13 +63,13 @@
              <img src="@/assets/images/title@2x.png" class="bg" alt="" />
            </div>
            <div class="list">
              <div class="line" v-for="item, i in 5">
              <div class="line" v-for="item, i in dataList2" :key="i">
                <div class="top"><span v-if="i < 3">top</span>{{ i }}</div>
                <div class="id_card">皖A12313</div>
                <div class="id_card">{{ item.platformName }}</div>
                <div class="wrap">
                  <ChargeRate :rate="15" :color />
                  <ChargeRate :rate="item.rate" />
                </div>
                <div class="num">6小时34分钟</div>
                <div class="num">{{ item.workTotalTimeT }}</div>
              </div>
            </div>
          </div>
@@ -80,9 +80,9 @@
                <div>实时作业效率</div>
              </div>
              <div class="tabs">
                <div class="tab active">出库</div>
                <div class="tab" :class="{ active: activeTab3 == 1 }" @click="tabClick3(1)">出库</div>
                <div class="separate"></div>
                <div class="tab">入库</div>
                <div class="tab" :class="{ active: activeTab3 == 0 }" @click="tabClick3(0)">入库</div>
              </div>
              <img src="@/assets/images/title@2x.png" class="bg" alt="" />
            </div>
@@ -96,32 +96,32 @@
            <div class="static_wrap">
              <div class="item">
                <div class="name">月台数量</div>
                <div class="nums">
                  <div class="num" v-for="i in '010'">{{ i }}</div>
                <div v-if="data4.platformTotal" class="nums">
                  <div class="num" v-for="n, i in data4.platformTotal + ''" :key="i">{{ n }}</div>
                </div>
              </div>
              <div class="item">
                <div class="name">空闲月台</div>
                <div class="nums">
                  <div class="num" v-for="i in '010'">{{ i }}</div>
                <div v-if="data4.freePlatform" class="nums">
                  <div class="num" v-for="n, i in data4.freePlatform + ''" :key="i">{{ n }}</div>
                </div>
              </div>
              <div class="item">
                <div class="name">预约车辆</div>
                <div class="nums">
                  <div class="num" v-for="i in '010'">{{ i }}</div>
                <div v-if="data4.reservationCar" class="nums">
                  <div class="num" v-for="n, i in data4.reservationCar + ''" :key="i">{{ n }}</div>
                </div>
              </div>
              <div class="item">
                <div class="name">作业车辆</div>
                <div class="nums">
                  <div class="num" v-for="i in '010'">{{ i }}</div>
                <div v-if="data4.workingCar" class="nums">
                  <div class="num" v-for="n, i in data4.workingCar + ''" :key="i">{{ n }}</div>
                </div>
              </div>
              <div class="item">
                <div class="name">排队车辆</div>
                <div class="nums">
                  <div class="num" v-for="i in '010'">{{ i }}</div>
                <div class="nums" v-if="data4.lineUpCar">
                  <div class="num" v-for="n, i in data4.lineUpCar + ''" :key="i">{{ n }}</div>
                </div>
              </div>
            </div>
@@ -139,13 +139,15 @@
                <div>预计完成时间</div>
                <div>月台状态</div>
              </div>
              <div class="line" v-for="i in 6">
                <div>月台名称</div>
                <div>作业车辆</div>
                <div>作业量</div>
                <div>作业时长</div>
                <div>预计完成时间</div>
                <div>月台状态</div>
              <div class="line" v-for="item, i in dataList5" :key="i">
                <div>{{ item.platformName }}</div>
                <div>{{ item.carNo || '-' }}</div>
                <div>{{ item.workNum }}{{ item.workNum ? '万支' : '-' }}</div>
                <div>{{ item.workTime || '-' }}</div>
                <div>{{ item.finishTime || '-' }}</div>
                <div :style="{
                  color: item.status == 1 ? '#869CC9' : item.status == 2 ? '#FE5501' : '#D2E0FF'
                }">{{ item.statusTemp }}</div>
              </div>
            </div>
          </div>
@@ -162,34 +164,34 @@
            <div class="static_wrap">
              <div class="item">
                <div class="name">签到数</div>
                <div class="num">1</div>
                <div class="num">{{ data6.inNum || 0 }}</div>
              </div>
              <div class="item">
                <div class="name">已叫号</div>
                <div class="num">1</div>
                <div class="num">{{ data6.callNum || 0 }}</div>
              </div>
              <div class="item">
                <div class="name">已作业</div>
                <div class="num">1</div>
                <div class="num">{{ data6.workingNum || 0 }}</div>
              </div>
              <div class="item">
                <div class="name">已完成</div>
                <div class="num">1</div>
                <div class="num">{{ data6.finishNum || 0 }}</div>
              </div>
            </div>
            <div class="echart_wrap">
              <div class="echart3" id="echart3"></div>
            </div>
            <div class="list">
              <div class="line" v-for=" i in 7">
              <div class="line" v-for="item, i in data6.platformLogList">
                <div class="time_wrap">
                  <div class="time">12.40</div>
                  <div class="time" v-if="item.createDate">{{ item.createDate.slice(11, 16) }}</div>
                  <div class="sp"></div>
                  <div class="dian"></div>
                </div>
                <div class="id_card">皖A12313</div>
                <div class="id_card">{{ item.carCodeFront }}</div>
                <div class="status">开始作业</div>
                <div class="desc">排队等待叫号</div>
                <div class="desc">{{ item.content }}</div>
              </div>
            </div>
          </div>
@@ -242,6 +244,14 @@
import dayjs from 'dayjs'
import ChargeRate from '@/components/ChargeRate.vue'
import * as echarts from 'echarts'
import {
  cnplatformGroupFinish,
  cnplatformDuration,
  cnplatformWorkData,
  cncenterData,
  cncarWorkSituation,
  cnworkEfficiency,
} from '@/api'
const weekMap = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六',]
@@ -275,11 +285,7 @@
        labelLine: {
          show: false
        },
        data: [
          { value: 1048, name: 'Search Engine' },
          { value: 735, name: 'Direct' },
          { value: 580, name: 'Email' }
        ]
        data: dataList1.value
      }
    ]
  }
@@ -336,7 +342,7 @@
      axisTick: {
        show: false,
      },
      data: ['2017', '2018', '2019', '2020', '2021', '2022', '2023',],
      data: dataList3.value.map(i => i.workTime),
    }],
    yAxis: [
      {
@@ -424,7 +430,7 @@
          shadowColor: 'rgba(124,248,255, 0)',
          shadowBlur: 20
        },
        data: [393, 438, 485, 631, 389, 224, 287]
        data: dataList3.value.map(i => i.workNum)
      },
      {
        name: '累计作业量',
@@ -452,7 +458,7 @@
          },
          barBorderRadius: [30, 30, 0, 0],
        },
        data: [393, 438, 485, 631, 689, 524, 687]
        data: dataList3.value.map(i => i.totalWorkNum)
      },
    ]
  }
@@ -493,6 +499,13 @@
      offset: 1,
      color: '#61d3f9'
    }])]
  const temp = []
  temp.push({ name: '预约数', value: data6.value.reservationNum || 0 })
  temp.push({ name: '已进场', value: data6.value.inNum || 0 })
  temp.push({ name: '已作业', value: data6.value.workingNum || 0 })
  temp.push({ name: '已离场', value: data6.value.leaveNum || 0 })
  console.log('temp', temp);
  const option = {
    color: colors,
    tooltip: {
@@ -519,12 +532,7 @@
          borderWidth: 0,
          borderColor: '#fff'
        },
        data: [
          { value: 100, name: '预约数', },
          { value: 50, name: '已进场' },
          { value: 20, name: '已作业' },
          { value: 30, name: '已离场' },
        ]
        data: temp
      },
      {
        type: 'funnel',
@@ -570,12 +578,7 @@
            opacity: 1
          }
        },
        data: [
          { value: 100, name: '预约数', },
          { value: 50, name: '已进场' },
          { value: 20, name: '已作业' },
          { value: 30, name: '已离场' },
        ]
        data: temp
      },
    ]
  }
@@ -585,13 +588,102 @@
  })
}
const dataList1 = ref([])
const data1 = ref(0)
const getData1 = () => {
  cnplatformGroupFinish().then(res => {
    const result = res.data || []
    let count = 0
    dataList1.value = result.map(i => {
      count += i.finishData
      return {
        value: i.finishData,
        name: i.platformGroupName
      }
    })
    data1.value = count
    initEchart1()
  })
}
const dataList2 = ref([])
const getData2 = () => {
  cnplatformDuration().then(res => {
    const result = res.data || []
    dataList2.value = result.map(item => {
      if (item.workTotalTime) {
        if (item.workTotalTime > 60) {
          item.workTotalTimeT = (item.workTotalTime / 60).toFixed(0) + '小时' + item.workTotalTime % 60 + '分钟'
        } else {
          item.workTotalTimeT = item.workTotalTime
        }
      }
      item.rate = ((item.workTotalTime / item.openTotalTime) * 30).toFixed(0)
      return item
    })
  })
}
const dataList3 = ref([])
const activeTab3 = ref(1)
const tabClick3 = (val) => {
  activeTab3.value = val
  getData3()
}
const getData3 = () => {
  cnworkEfficiency({ type: activeTab3.value }).then(res => {
    const result = res.data
    dataList3.value = result
    initEchart2()
  })
}
const data4 = ref({})
const getData4 = () => {
  cncenterData().then(res => {
    const result = res.data
    data4.value = result
  })
}
const dataList5 = ref([])
const getData5 = () => {
  cnplatformWorkData().then(res => {
    const result = res.data || []
    dataList5.value = result.map(i => {
      i.statusTemp = i.status == 0 ? '作业中' : i.status == 1 ? '空闲中' : '作业超时'
      if (i.workTime) {
        if (item.workTime > 60) {
          item.workTime = (item.workTime / 60).toFixed(0) + 'h' + item.workTime % 60 + 'm'
        } else {
          item.workTime = item.workTime
        }
      }
      i.finishTime = dayjs(i.finishTime).format('HH:mm')
      return i
    })
  })
}
const data6 = ref({})
const getData6 = () => {
  cncarWorkSituation().then(res => {
    const result = res.data
    data6.value = result
    initEchart3()
  })
}
onMounted(() => {
  // initEnergy()
  initEchart1()
  initEchart2()
  initEchart3()
  getData1()
  getData2()
  getData3()
  getData4()
  getData5()
  getData6()
  // initEchart1()
  // initEchart2()
  // initEchart3()
})
@@ -613,7 +705,6 @@
    .left_box_one {
      width: 100%;
      margin-bottom: 20px;
      border: 1px solid;
      .car_static {
        display: flex;
@@ -692,7 +783,6 @@
      .list {
        padding: 20px 24px 4px;
        height: 227px;
        border: 1px solid;
        .line {
          display: flex;
@@ -715,15 +805,21 @@
          .id_card {
            color: #DBEAEA;
            font-weight: 500;
            margin-right: 14px;
            margin-right: 2px;
            font-size: 14px;
            width: 80px;
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
          }
          .num {
            font-weight: 500;
            width: 82px;
            text-align: right;
            font-size: 13px;
            color: #DBEAEA;
            margin-left: 15px;
            margin-left: 2px;
          }
          .wrap {
@@ -1161,6 +1257,10 @@
      margin: 0 6px;
    }
    .tab {
      cursor: pointer;
    }
    .active {
      color: #0094eb;
    }