whychdw
2022-01-06 fb2fd6c1c20d77cc3c0022193fc41415b32bbc0a
提交内容
4个文件已添加
6个文件已修改
706 ■■■■■ 已修改文件
src/assets/css/m-elementui.css 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/config.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/const/const_ld_nine.js 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/tools/getPageMenu.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/tools/updateTable.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/home.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/jobManage/api/index.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/jobManage/dialog/updateDev.vue 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/jobManage/nineDevUpdate.vue 400 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/routes.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/css/m-elementui.css
@@ -116,3 +116,8 @@
.el-popper.weather-popover[x-placement^=bottom] .popper__arrow::after {
    border-bottom-color: #FFFFFF !important;
}
/*进度条颜色*/
.black-font-color .el-progress-bar__innerText {
    color: #000;
}
src/assets/js/config.js
@@ -2,7 +2,7 @@
    logo: {
        label: '平台logo',
        des: '显示平台logo状态',
        fileName: 'gjdw',       // gjdw, nfdw, gjdx, qwh
        fileName: 'gjdx',       // gjdw, nfdw, gjdx, qwh
        value: false,
    },
    uKey: {
@@ -55,5 +55,10 @@
        label: '短信验证码',
        des: '登录是否启用短信验证码',
        value: false,
    }
    },
    autoExit: {
        label: "自动退出",
        des: "长时间不操作自动退出",
        value: false
    },
};
src/assets/js/const/const_ld_nine.js
@@ -94,4 +94,62 @@
      msg: '取值范围0~99.9(保留一位小数)'
    },
  },
  update: {
    types: [
      {
        key: 0,
        label: "升级LD9",
        fileName: "E51_DFU.SM5",
        value: 0
      },
      {
        key: 1,
        label: "升级显示屏",
        fileName: "BatterTester.SM5",
        value: 1
      }
    ],
    stopReason: [
      {
        label: "无",
        value: 0
      },
      {
        label: "参数错误",
        value: 1
      },
      {
        label: "CRC错误",
        value: 2
      },
      {
        label: "操作失败",
        value: 3
      },
      {
        label: "正在工作",
        value: 4
      },
      {
        label: "正在均衡测试",
        value: 5
      },
      {
        label: "文件长度错误",
        value: 6
      },
      {
        label: "升级文件不存在",
        value: 7
      },
      {
        label: "升级文件不符合要求",
        value: 8
      },
      {
        label: "远程停止",
        value: 9
      },
    ],
  },
};
src/assets/js/tools/getPageMenu.js
@@ -576,6 +576,17 @@
                    level: 2,
                },
                {
                    label: "9度设备升级",
                    name: "nineDevUpdate",
                    src: "#/jobManage/nineDevUpdate",
                    closable: true,
                    id: 6003,
                    menuId: 6,
                    enableduse: true,
                    ord: 3,
                    level: 2,
                },
                {
                    label: "放电计划管理",
                    name: "planManage",
                    src: "#/jobManage/planManage",
@@ -586,7 +597,7 @@
                    ord: 2,
                    level: 2,
                },
                // 最大ord=2
                // 最大ord=3
            ],
        },
        {
src/assets/js/tools/updateTable.js
New file
@@ -0,0 +1,29 @@
/**
 * 更新表格数据
 * @param tblData 表格数据
 * @param data 最新数据
 * @param key 校验的属性
 */
function updateTable(tblData, data, key) {
  tblData.map(item=>{
    let obj = getItemByValue(data, item[key], key);
    if(obj) {
      Object.keys(obj).forEach(key2=>{
        item[key2] = obj[key2];
      });
    }
  });
}
function getItemByValue(data, value, key) {
  let result = null;
  for(let i=0; i<data.length; i++) {
    let item = data[i];
    if(item[key] == value) {
      result = item;
    }
  }
  return result;
}
export default updateTable;
src/pages/home.vue
@@ -62,6 +62,7 @@
import getPageMenu from "@/assets/js/tools/getPageMenu";
import { checkUserLogin, getAllRealAlarm } from "@/assets/js/api";
import {Timeout} from "@/assets/js/tools";
import config from "@/assets/js/config";
let timer;
export default {
@@ -92,6 +93,7 @@
      }
    }
    return {
      config: config,
      newItems: [],
      acTabs: acTabs,
      tabs: tabs,
@@ -281,16 +283,22 @@
      this.getAllRealAlarm();
    }, 1000);
    // 开启长时间不操作自动退出
    if(this.config.autoExit.value) {
    // 开启监控鼠标移动
    window.addEventListener("mousemove", this.changeLastTime);
    // 启动监控
    this.listenLastTime();
    }
  },
  destroyed() {
    // 开启长时间不操作自动退出
    if(this.config.autoExit.value) {
    // 移除监控鼠标移动
    window.removeEventListener("mousemove", this.changeLastTime);
    this.timer2.stop();
    }
  },
};
</script>
src/pages/jobManage/api/index.js
New file
@@ -0,0 +1,31 @@
import axios from "axios";
export default {
  /**
   * 查询可升级的LD9设备
   * @param data   查询条件
   * json:{"StationName1":"xx","StationName2":"xx","StationName5":"xx",StartNum":1,"Size":2}
   * @returns {AxiosPromise}
   */
  searchLd9(data) {
    // 查询接口
    return axios({
      method: 'post',
      url: 'BattInfAction!getPageLD9',
      data: 'json='+JSON.stringify(data)
    });
  },
  /**
   * 更新LD9设备
   * @param data
   * json:{"deviceId":"401900001","updateEn":"1","updateType":"1","updateFile":"test.SM5"}
   * @returns {AxiosPromise}
   */
  startUpdate(data) {
    return axios({
      method: 'post',
      url: 'LD9UpdateStateAction!updateUpdateFile',
      data: 'json='+JSON.stringify(data)
    });
  },
}
src/pages/jobManage/dialog/updateDev.vue
New file
@@ -0,0 +1,143 @@
<template>
  <div class="params-container">
    <el-form
        ref="ruleForm"
        size="mini"
        label-position="top"
        :model="params"
        class="params-dialog bg-white">
      <el-form-item label="机房名称">
        <el-input :value="info.StationName" readonly></el-input>
      </el-form-item>
      <el-row :gutter="layout.gutter">
        <el-col :span="layout.span">
          <el-form-item label="升级类型">
            <el-select v-model="params.updateType" @change="changeType">
              <el-option
                  v-for="(item, key) in types"
                  :key="'key' + key"
                  :label="item.label"
                  :value="item.value"
              ></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="layout.span">
          <el-form-item label="升级类型">
            <el-input v-model="params.updateFile" type="input" readonly></el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <div class="form-footer">
        <el-button type="primary" size="small" @click="confirmUpdate">启动升级</el-button>
        <el-button type="danger" size="small" @click="close">取消</el-button>
      </div>
    </el-form>
  </div>
</template>
<script>
import {const_ld_nine} from "@/assets/js/const";
import getItemByKey from "@/assets/js/tools/getItemByKey";
import api from "@/pages/jobManage/api";
export default {
  name: "updateDev",
  props: {
    visible: {
      type: Boolean,
      default: false,
    },
    info: {
      type: Object,
      default(){
        return {};
      }
    }
  },
  data() {
    let info = const_ld_nine.update;
    return {
      layout: {
        gutter: 16,
        span: 12
      },
      params: {
        deviceId: 0,
        updateEn: 1,
        updateType: 0,
        updateFile: "E51_DFU.SM5",
      },
      types: info.types
    }
  },
  methods: {
    changeType(type) {
      let item = getItemByKey(type, this.types);
      this.params.updateFile = item.fileName;
    },
    // 确认框
    confirmUpdate() {
      this.$layer.prompt({title: '输入启动升级口令,并确认', formType: 2, area: ['300px', '180px']}, (pass, index) => {
        // 请求后台校验密码
        this.$apis.login.checkUserPwd(pass).then(res=>{
          let rs = JSON.parse(res.data.result);
          if(rs.code == 1) {
            // 关闭弹出框
            this.$layer.close(index);
            this.$layer.msg("密码检测通过,启动升级");
            // 启动测试
            this.startUpdate();
          }else {
            this.$layer.msg("启动升级口令错误!");
          }
        }).catch(error=>{
          console.log(error);
          this.$layer.msg("网络请求异常");
        });
      });
    },
    startUpdate() {
      let params = this.params;
      api.startUpdate(params).then(res=>{
        let rs = JSON.parse(res.data.result);
        if(rs.code == 1) {
          this.$layer.msg("启动升级成功!");
          // 关闭弹出框
          this.close();
        }else {
          this.$layer.msg("启动升级失败!");
        }
      }).catch(error=>{
        console.log(error);
        this.$layer.msg("启动升级失败,请检测网络!");
      });
    },
    close() {
      this.$emit("update:visible", false);
    },
  },
  mounted() {
    let info = this.info;
    this.params.deviceId = info.deviceId;
    this.params.updateType = info.updateType;
    this.changeType(info.updateType);
  }
}
</script>
<style scoped>
.params-container {
  width: 400px;
  background-color: #ececec;
}
.form-footer {
  padding-bottom: 8px;
  margin-bottom: 0;
}
.form-footer .three-btn {
  margin-left: 12px;
}
.red-color {
  color: #FF0000;
}
</style>
src/pages/jobManage/nineDevUpdate.vue
New file
@@ -0,0 +1,400 @@
<template>
  <flex-layout :loading="loading">
    <div slot="header">
      <div class="table-layout filter-box-table">
        <div class="table-row">
          <div class="table-cell text-right">省:</div>
          <div class="table-cell">
            <el-select
                v-model="filters.values.province"
                @change="searchCity"
                size="small" placeholder="请选择省">
              <el-option
                  v-for="item in filters.data.province"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value">
              </el-option>
            </el-select>
          </div>
          <div class="table-cell text-right">市:</div>
          <div class="table-cell">
            <el-select
                v-model="filters.values.city"
                @change="searchCounty"
                size="small" placeholder="请选择市">
              <el-option
                  v-for="item in filters.data.city"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value">
              </el-option>
            </el-select>
          </div>
          <div class="table-cell text-right">区/县:</div>
          <div class="table-cell">
            <el-select
                v-model="filters.values.county"
                size="small" placeholder="请选择区/县">
              <el-option
                  v-for="item in filters.data.county"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value">
              </el-option>
            </el-select>
          </div>
        </div>
      </div>
    </div>
    <div class="flex-page-content">
      <el-table stripe size="small" :data="table.data" height="100%">
        <el-table-column label="编号" align="center" :min-width="50">
          <template slot-scope="scope">
            <span>{{ scope.$index + 1 }}</span>
          </template>
        </el-table-column>
        <el-table-column
            prop="StationName" label="机房名称"
            align="center" :min-width="360"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            prop="deviceVersion" label="版本号"
            align="center" :min-width="160"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            prop="updateFile" label="升级文件名称"
            align="center" :min-width="160"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            prop="updateTypeText" label="升级类型"
            align="center" :min-width="120"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            prop="stopReasonText" label="停止原因"
            align="center" :min-width="120"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            prop="updateEnText" label="升级状态"
            align="center" :min-width="120"
            :show-overflow-tooltip="true">
        </el-table-column>
        <el-table-column
            label="升级进度"
            align="center" :min-width="200"
            :show-overflow-tooltip="true">
          <template slot-scope="scope">
            <el-progress class="black-font-color" :text-inside="true" :stroke-width="22" :percentage="scope.row.percent"></el-progress>
          </template>
        </el-table-column>
        <el-table-column
            prop="currentPackageNum" label="当前数据包编号"
            align="center" :min-width="120"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            prop="countPackage" label="总数据包"
            align="center" :min-width="120"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            prop="startTime" label="开始升级时间"
            align="center" :min-width="180"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            prop="updateTime" label="更新日期"
            align="center" :min-width="180"
            :show-overflow-tooltip="true"></el-table-column>
        <el-table-column
            fixed="right"
            label="操作"
            width="180"
            align="center">
          <template slot-scope="scope">
            <el-button type="primary" size="mini" :disabled="scope.row.disabledUpdate" @click="showUpdateDialog(scope.row)">升级</el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <!-- 底部 -->
    <div class="flex-page-footer" slot="footer">
      <!-- 底部分页 -->
      <div class="el-pagination-btns">
        <el-button type="primary" round size="mini" @click="searchData(true)" icon="el-icon-search">查询</el-button>
      </div>
      <el-pagination
          class="pagess"
          :current-page="pageCurr"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :page-sizes="[10, 20, 30, 50, 100]"
          :page-size="pageSize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="total"></el-pagination>
    </div>
    <el-dialog
        title="设计参数设置"
        width="auto"
        :visible.sync="updateDialog"
        :close-on-click-modal="false"
        top="0"
        class="dialog-center"
        :modal-append-to-body="false">
      <update-dev :visible.sync="updateDialog" :info="updateDev" v-if="updateDialog"></update-dev>
    </el-dialog>
  </flex-layout>
</template>
<script>
import api from "@/pages/jobManage/api";
import {const_ld_nine} from "@/assets/js/const";
import {getLabelByValue, Timeout} from "@/assets/js/tools";
import updateTable from "@/assets/js/tools/updateTable";
import UpdateDev from "@/pages/jobManage/dialog/updateDev";
export default {
  name: "nineDevUpdate",
  components: {UpdateDev},
  data() {
    return {
      loading: false,
      updateDialog: false,
      updateDev: {},
      pageCurr: 1,
      pageSize: 10,
      total: 0,
      filters: {
        values: {
          province: '',
          city: '',
          county: '',
        },
        data: {
          province: [],
          city: [],
          county: [],
        }
      },
      table: {
        data: []
      },
      updateInfo: const_ld_nine.update,
      timer: new Timeout("nineDevUpdate"),
    }
  },
  methods: {
    searchProvince() {      // 查询省
      // 开启loading
      this.loading = true;
      this.$axios({
        method:"post",
        url:"User_battgroup_baojigroup_battgroupAction!serchStationName1InGroup",
        data:null
      }).then((res)=>{
        let rs = JSON.parse(res.data.result);
        let data = [];
        if(rs.code == 1) {
          let rsData = rs.data;
          // 遍历结果集
          for(let i=0; i<rsData.length; i++) {
            let _rsData = rsData[i];
            let tmp = {
              label: _rsData,
              value: _rsData
            };
            data.push(tmp);
          }
        }
        // 设置第一笔数据
        data.unshift({
          label: "全部(共"+data.length+"种)",
          value: ''
        });
        // 设置省
        this.filters.data.province = data;
        // 查询市
        this.searchCity();
      });
    },
    searchCity() {
      // 重置值
      this.filters.values.city="";
      this.filters.values.county="";
      // 构造查询条件
      let searchParams = {
        StationName1: this.filters.values.province
      };
      // 请求后台
      this.$axios({
        method:"post",
        url:"BattInfAction!serchAllStationName2",
        data:"json="+JSON.stringify(searchParams)
      }).then((res)=>{
        let rs = JSON.parse(res.data.result);
        let data = [];
        if(rs.code == 1) {
          let rsData = rs.data;
          // 遍历结果集
          for(let i=0; i<rsData.length; i++) {
            let _rsData = rsData[i];
            let tmp = {
              label: _rsData,
              value: _rsData
            };
            data.push(tmp);
          }
        }
        // 设置第一笔数据
        data.unshift({
          label: "全部(共"+data.length+"种)",
          value: ''
        });
        // 设置市
        this.filters.data.city = data;
        // 查询区县
        this.searchCounty();
      });
    },
    searchCounty(){
      // 重置值
      this.filters.values.county="";
      // 构造查询条件
      let searchParams = {
        StationName1: this.filters.values.province,
        StationName2: this.filters.values.city
      };
      // 请求后台
      this.$axios({
        method:"post",
        url:"BattInfAction!serchAllStationName5",
        data:"json="+JSON.stringify(searchParams)
      }).then((res)=>{
        var rs = JSON.parse(res.data.result);
        var data = [];
        if(rs.code == 1) {
          var rsData = rs.data;
          // 遍历结果集
          for(var i=0; i<rsData.length; i++) {
            var _rsData = rsData[i];
            var tmp = {
              label: _rsData,
              value: _rsData
            };
            data.push(tmp);
          }
        }
        // 设置第一笔数据
        data.unshift({
          label: "全部(共"+data.length+"种)",
          value: ''
        });
        // 设置区县
        this.filters.data.county = data;
        // 查询数据
        this.searchData(true);
      });
    },
    searchData(search) {
      if(!this.loading && search) {
        this.loading = true;
      }
      let searchParam = this.getSearchParam();
      // 请求后台
      api.searchLd9(searchParam).then(res=>{
        // 关闭loading
        this.loading = false;
        // 格式化数据
        let rs = JSON.parse(res.data.result);
        let data = [];
        if(rs.data) {
          data = rs.data.map(item=>{
            let tmp = item.ld9UpdateStatus;
            tmp.StationName = item.StationName;
            tmp.disabledUpdate = tmp.deviceVersion?false:true;
            tmp.updateTypeText = getLabelByValue(tmp.updateType, this.updateInfo.types, "未知");
            tmp.stopReasonText = getLabelByValue(tmp.stopReason, this.updateInfo.stopReason, "未知");
            tmp.updateEnText = tmp.updateEn?"正在升级中":"待升级";
            tmp.percent = tmp.countPackage?Math.floor((tmp.currentPackageNum/tmp.countPackage)*100):0;
            if(!tmp.disabledUpdate) {
              tmp.disabledUpdate = tmp.updateEn?true:false;
            }
            return tmp;
          });
          this.total = rs.sum;
        }else {
          this.total = 0;
        }
        // 单纯的查询
        if(search) {
          // 设置表格数据
          this.table.data = data;
          // 停止计时器
          this.timer.stop();
          this.startUpdate();
        }else {
          // 更新表格数据
          updateTable(this.table.data, data, "deviceId");
          this.timer.open();
        }
      }).catch(error => {
        console.log(error);
        // 关闭loading
        this.loading = false;
      });
    },
    startUpdate() {
      this.timer.start(()=>{
        this.searchData();
      }, 4000);
    },
    // 展示数据数量
    handleSizeChange(val) {
      this.pageSize = val;
      this.searchData(true);
    },
    // 翻页
    handleCurrentChange(val) {
      this.pageCurr = val;
      this.searchData(true);
    },
    // 获取查询参数
    getSearchParam() {
      let filters = this.filters.values;
      let StartNum = this.pageCurr;
      let Size = this.pageSize;
      return {
        StationName1: filters.province,
        StationName2: filters.city,
        StationName5: filters.county,
        StartNum: StartNum,
        Size: Size
      }
    },
    showUpdateDialog(data) {
      this.updateDev = data;
      this.updateDialog = true;
    }
  },
  mounted() {
    this.searchProvince();//查询省
  },
  destroyed() {
    // 停止计时器
    this.timer.stop();
  }
}
</script>
<style scoped>
.flex-page-footer {
  padding: 6px 0;
  box-sizing: border-box;
  text-align: center;
}
.el-pagination-btns {
  margin-left: 8px;
  margin-right: 8px;
  display: inline-block;
}
</style>
src/router/routes.js
@@ -424,6 +424,14 @@
    },
    component: (resolve) => require(['../pages/jobManage/btsUpgrade.vue'], resolve)
},
    {
        path: '/jobManage/nineDevUpdate',
        name: 'nineDevUpdate',
        meta: {
            title: '9度设备升级'
        },
        component: (resolve) => require(['../pages/jobManage/nineDevUpdate.vue'], resolve)
    },
{
    path: '/jobManage/addplan1',
    meta: {