Browse Source

固件升级页面改造,设备维护页面优化

e 1 year ago
parent
commit
f9bd1917e5

+ 7 - 0
web/三相/src/api/pdu/pduServer.js

@@ -83,6 +83,13 @@ export function equipmentMintenance(data) {
     method: 'post',
     data: data
   })
+}// 控制板升级
+export function controlBoardUpgrade(data) {
+  return request({
+    url: '/pdu/controlBoardUpgrade',
+    method: 'post',
+    data: data
+  })
 }
 
 // 获取系统配置

+ 4 - 0
web/三相/src/layout/components/Navbar.vue

@@ -300,6 +300,10 @@ export default {
         if (result.type === 'switchEquipmentMintenance') {
           that.$bus.$emit('SWITH_STATUS_MONITORING', result)
           return false
+        }  //控制板升级
+        if (result.type === 'controlBoardUpgrade') {
+          that.$bus.$emit('CONTROL_BOARD_UPGRADE', result)
+          return false
         }
 
 

+ 18 - 1
web/三相/src/utils/i18n/i18n-en-US.json

@@ -428,7 +428,24 @@
   "rzmm":"Authentication password",
   "jmxy":"Encryption protocol",
   "jmmm":"Encrypt password",
-  "nmsip":"TRAP NMS Server IP"
+  "nmsip":"TRAP NMS Server IP",
+  "snmpbcxz1":"The username length limit is 8-32 bits",
+  "snmpbcxz2":"The length limit for authentication passwords is 8-32 bits",
+  "snmpbcxz3":"The length limit for encrypted passwords is 8-32 bits",
+  "gjbbh":"Firmware version",
+  "gjrq":"Firmware date",
+  "bbls":"Version history",
+  "sjrq":"Upgrade date",
+  "tdsl":"Channel number",
+  "kzbh":"Control version number",
+  "dqzt":"current state",
+  "sjz":"Upgrading",
+  "gjxz":"Firmware selection",
+  "plsj":"Batch upgrade",
+  "kzbgj":"Control board firmware",
+  "qxzgj":"Please select firmware",
+  "qxzkzb":"Please select the control board that needs to be upgraded",
+  "qrsjts":"Are you sure you want to upgrade?"
 
 
 }

+ 18 - 1
web/三相/src/utils/i18n/i18n-ru-RU.json

@@ -429,6 +429,23 @@
   "rzmm":"Пароль аутентификации",
   "jmxy":"Протокол шифрования",
   "jmmm":"Шифрование",
-  "nmsip":"TRAP NMS Сервер IP"
+  "nmsip":"TRAP NMS Сервер IP",
+  "snmpbcxz1":"Длина имени пользователя ограничена 8 - 32 битами",
+  "snmpbcxz2":"Длина пароля аутентификации ограничена 8 - 32 битами",
+  "snmpbcxz3":"Длина зашифрованного пароля ограничена 8 - 32 битами",
+  "gjbbh":"Версия прошивки",
+  "gjrq":"Дата прошивки",
+  "bbls":"История версий",
+  "sjrq":"Дата обновления",
+  "tdsl":"Количество каналов",
+  "kzbh":"Контрольный номер",
+  "dqzt":"Текущее состояние",
+  "sjz":"В процессе повышения",
+  "gjxz":"Выбор прошивки",
+  "plsj":"Массовое обновление",
+  "kzbgj":"прошивка панели управления",
+  "qxzgj":"Выберите прошивку",
+  "qxzkzb":"Выберите контрольную панель для обновления",
+  "qrsjts":"Вы уверены, что хотите повышения?"
 
 }

+ 18 - 2
web/三相/src/utils/i18n/i18n-zh-CN.json

@@ -428,8 +428,24 @@
   "rzmm":"认证密码",
   "jmxy":"加密协议",
   "jmmm":"加密密码",
-  "nmsip":"TRAP NMS服务器IP"
-
+  "nmsip":"TRAP NMS服务器IP",
+  "snmpbcxz1":"用户名长度限制是8-32位",
+  "snmpbcxz2":"认证密码长度限制是8-32位",
+  "snmpbcxz3":"加密密码长度限制是8-32位",
+  "gjbbh":"固件版本",
+  "gjrq":"固件日期",
+  "bbls":"版本历史",
+  "sjrq":"升级日期",
+  "tdsl":"通道数量",
+  "kzbh":"控制版号",
+  "dqzt":"当前状态",
+  "sjz":"升级中",
+  "gjxz":"固件选择",
+  "plsj":"批量升级",
+  "kzbgj":"控制板固件",
+  "qxzgj":"请选择固件",
+  "qxzkzb":"请选择需要升级的控制板",
+  "qrsjts":"确认要升级吗?"
 
 
 

+ 23 - 13
web/三相/src/views/fwgl/ntpsz/index.vue

@@ -28,20 +28,20 @@
                 </el-form-item>
 
                 <el-form-item      :label="this.$t('sq')" prop="sq">
-                  <el-select  :disabled="isReadOnly" style="width: 100%" v-model="form.sq"    allow-create   clearable :filterable="false">
+                  <el-select  :disabled="isReadOnly3" style="width: 100%" v-model="form.sq"    allow-create   clearable :filterable="false">
                     <el-option v-for="item in sqs" :key="item.id" :label="item.name" :value="item.id">
                     </el-option>
                   </el-select>
               </el-form-item>
-                <el-form-item    :label="this.$t('xinq')" prop="sq">
-                  <el-select  :disabled="isReadOnly" style="width: 100%" v-model="form.week"   allow-create   clearable :filterable="false">
-                    <el-option v-for="item in weeks" :key="item.id" :label="$t('xinq')+$t(item.name)" :value="item.id">
-                    </el-option>
-                  </el-select>
-                </el-form-item>
+                <!--<el-form-item    :label="this.$t('xinq')" prop="sq">-->
+                  <!--<el-select  :disabled="isReadOnly" style="width: 100%" v-model="form.week"   allow-create   clearable :filterable="false">-->
+                    <!--<el-option v-for="item in weeks" :key="item.id" :label="$t('xinq')+$t(item.name)" :value="item.id">-->
+                    <!--</el-option>-->
+                  <!--</el-select>-->
+                <!--</el-form-item>-->
                 <el-form-item     :label="this.$t('rqsj')" prop="time">
                   <el-date-picker clearable
-                                  :disabled="isReadOnly"
+                                  :disabled="isReadOnly2"
                                   v-model="form.time"
                                   type="datetime"
                                   value-format="yyyy-MM-dd HH:mm:ss"
@@ -99,7 +99,9 @@
         sensorStatusTabs:[],
         sensorStatusOpen: false, // 配置传感器
         sensorStatusList:[],
-        isReadOnly:true
+        isReadOnly:true,
+        isReadOnly2:true,
+        isReadOnly3:true,
       };
     },
     created() {
@@ -121,9 +123,13 @@
       handleSelectChange(type){
         this.form.mode=type
         if(type=='0'){
-          this.isReadOnly=false;
-        }else{
           this.isReadOnly=true;
+          this.isReadOnly2=false
+          this.isReadOnly3=false
+        }else{
+          this.isReadOnly=false;
+          this.isReadOnly2=true
+          this.isReadOnly3=false
         }
       },
       //
@@ -135,9 +141,13 @@
           if(response.data!=null){
           this.form=response.data;
             if(response.data.mode=='0'){
-              this.isReadOnly=false;
-            }else{
               this.isReadOnly=true;
+              this.isReadOnly2=false
+              this.isReadOnly3=false
+            }else{
+              this.isReadOnly=false;
+              this.isReadOnly2=true
+              this.isReadOnly3=false
             }
 
           }

+ 14 - 1
web/三相/src/views/fwgl/snmpsz/index.vue

@@ -26,7 +26,7 @@
                   </el-select>
                 </el-form-item>
                 <el-form-item   v-if="form.mode=='1'  && form.snmpVersion=='SNMP V3'" :label="this.$t('yhm2')" prop="yhm2">
-                  <el-input v-model="form.yhm"    />
+                  <el-input v-model="form.yhm"  />
                 </el-form-item>
                 <el-form-item  v-if="form.mode=='1' && form.snmpVersion=='SNMP V3' " :label="this.$t('rzxy')" prop="rzxy">
                   <el-select style="width: 100%" v-model="form.rzxy"    @change="handleSelectChange1"    allow-create    :filterable="false">
@@ -200,6 +200,19 @@
               params.trapMode="";
             }
 
+            if(this.form.yhm!=undefined && (this.form.yhm.length>32 || this.form.yhm.length<8) ){
+              alert(this.$t("snmpbcxz1"));
+              return;
+            }
+            if(this.form.rzmm!=undefined && (this.form.rzmm.length>32 || this.form.rzmm.length<8) ){
+              alert(this.$t("snmpbcxz2"));
+                  return;
+            }
+            if(this.form.jmmm!=undefined && (this.form.jmmm.length>32 || this.form.jmmm.length<8) ){
+              alert(this.$t("snmpbcxz3"));
+                  return;
+            }
+
             this.$modal.confirm(this.$t('qdybcm')).then(function() {
               serviceManagement(params).then(() => {
                 aa.$modal.msgSuccess(aa.$t('zxcg'));

+ 55 - 9
web/三相/src/views/sbwh/gjsj/index.vue

@@ -19,23 +19,28 @@
     <el-card style="min-height: 700px ;border-radius: 15px">
     <el-table max-height="700"  :data="channelList"  :header-cell-style="{ background:'#FFFFFF',color:'#000000'}">
       <!--<el-table-column type="selection" width="55" align="center" />-->
-      <el-table-column :label="this.$t('sbmc')" prop="productName"  />
-      <el-table-column label="产品ID" v-if="false" prop="productId"  />
-      <el-table-column :label="this.$t('sbbh')" prop="productNumber"  />
-      <el-table-column :label="this.$t('sblx')" prop="productType" :show-overflow-tooltip="true"   >
+      <el-table-column align="center" :label="this.$t('sbmc')" prop="productName"  />
+      <el-table-column align="center" label="产品ID" v-if="false" prop="productId"  />
+      <el-table-column align="center" :label="this.$t('sbbh')" prop="productNumber"  />
+      <el-table-column align="center" :label="this.$t('sblx')" prop="productType" :show-overflow-tooltip="true"   >
         <template slot-scope="scope">
           <span >{{getDity(scope.row,'productType')}}</span>
         </template>
       </el-table-column>
-      <el-table-column :label="this.$t('bbh')" prop="productVersion" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('gjbbh')" prop="productVersion" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('gjrq')" prop="firmwareDate" :show-overflow-tooltip="true"   />
       <el-table-column :label="this.$t('cz')" align="center"  class-name="small-padding fixed-width">
         <template slot-scope="scope" >
           <el-button
             size="mini"
             type="text"
-            icon="el-icon-setting"
             @click="handleImport(scope.row)"
           >{{$t('gjsj')}}</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleHis(scope.row)"
+          >{{$t('bbls')}}</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -76,7 +81,18 @@
         <el-button @click="cancel">{{$t('qx')}}</el-button>
       </div>
     </el-dialog>
+    <el-dialog :title="title" class="dialogClass" style="overflow-y: auto;" :visible.sync="open"  width="500px" :close-on-click-modal="false" :close-on-press-escape="false" append-to-body>
+        <el-col style="height: 500px;overflow-y: auto;"  >
+          <el-card  >
+            <el-collapse accordion v-model="activeNames">
+              <el-collapse-item  v-for="(item, index) in hisData" :name="index"  :title="item.productVersion+' -  '+item.versionDate">
+                  <li>{{item.updateContent}}</li>
+              </el-collapse-item>
+            </el-collapse>
+          </el-card>
+        </el-col>
 
+    </el-dialog>
   </div>
 </template>
 
@@ -130,6 +146,8 @@
           url:  window.location.origin+"/pdu/equipmentMintenanceUpload" // todo
         },
         productChTypes:[{"id":"1","name":"sblx1"},{"id":"2","name":"sblx2"},{"id":"3","name":"sblx3"},{"id":"4","name":"sblx4"},{"id":"5","name":"sblx5"}],
+        hisData:[],
+        activeNames:[]
       };
     },
     created() {
@@ -264,11 +282,25 @@ if(file==null){
         this.resetForm("queryForm");
         this.handleQuery();
       },
-      /** 修改按钮操作 */
-      handleUpdate(row) {
+      /** 版本历史 */
+      handleHis(row) {
         this.form =row;
+        const params={};
+        params.token=this.usertoken;
+        params.type="listRtHisQuery";
+        params.productId=row.productId;
+        this.loading = true;
+        // console.log(this.queryParams)
+        equipmentMintenance(params).then(response => {
+          if(response.data!=null){
+              this.hisData=response.data;
+          }
+         // this.channelList = response.data;
+      }).catch(() => {});
+        this.loading = false;
         this.open = true;
-        this.title = this.$t('gjsj');
+        this.title = this.$t('bbls');
+        this.activeNames=[0];
       },
 
       /** 提交按钮 */
@@ -326,5 +358,19 @@ if(file==null){
   .left-align-form .el-form-item {
     margin-bottom: 0; /* 根据需要可以去掉或调整间距 */
   }
+  .update-log {
+  ol {
+    display: block;
+    list-style-type: decimal;
+    margin-block-start: 1em;
+    margin-block-end: 1em;
+    margin-inline-start: 0;
+    margin-inline-end: 0;
+    padding-inline-start: 40px;
+  }
+  }
+  .dialogClass .el-dialog{
+    height: 600px;
+  }
 </style>
 

+ 12 - 12
web/三相/src/views/sbwh/gysb/index.vue

@@ -18,18 +18,18 @@
     <el-card style="min-height: 700px ;border-radius: 15px">
     <el-table max-height="700"  :data="channelList" :header-cell-style="{ background:'#FFFFFF',color:'#000000'}">
       <!--<el-table-column type="selection" width="55" align="center" />-->
-      <el-table-column :label="this.$t('sbmc')" prop="productName"  />
-      <el-table-column label="产品ID" v-if="false" prop="productId"  />
-      <el-table-column :label="this.$t('sbbh')" prop="productNumber"  />
-      <el-table-column :label="this.$t('sbyzm')" prop="productCode" width="180" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('sbxh')" prop="productModel" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('gjbb')" prop="productVersion" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('xtsj')" prop="systemTime" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('yxsj')" prop="runTime" :show-overflow-tooltip="true"   />
-      <el-table-column :label="'IP'+this.$t('dz')" prop="IPadress" :show-overflow-tooltip="true"   />
-      <el-table-column :label="'MAC'+this.$t('dz')" prop="MACadress" :show-overflow-tooltip="true"   />
-      <el-table-column :label="'RS485'+this.$t('dz')" prop="RSadress" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('cz')" align="center"  class-name="small-padding fixed-width">
+      <el-table-column align="center" :label="this.$t('sbmc')" prop="productName"  />
+      <el-table-column align="center" label="产品ID" v-if="false" prop="productId"  />
+      <el-table-column align="center" :label="this.$t('sbbh')" prop="productNumber"  />
+      <el-table-column align="center" :label="this.$t('sbyzm')" prop="productCode" width="180" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('sbxh')" prop="productModel" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('gjbb')" prop="productVersion" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('xtsj')" prop="systemTime" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('yxsj')" prop="runTime" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="'IP'+this.$t('dz')" prop="IPadress" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="'MAC'+this.$t('dz')" prop="MACadress" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="'RS485'+this.$t('dz')" prop="RSadress" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('cz')"   class-name="small-padding fixed-width">
         <template slot-scope="scope" >
           <el-button
             size="mini"

+ 5 - 5
web/三相/src/views/sbwh/hhccsz/index.vue

@@ -32,15 +32,15 @@
     <el-card style="min-height: 700px ;border-radius: 15px">
     <el-table max-height="700"  :data="channelList" :header-cell-style="{ background:'#FFFFFF',color:'#000000'}">
       <!--<el-table-column type="selection" width="55" align="center" />-->
-      <el-table-column :label="this.$t('sbmc')" prop="productName"  />
-      <el-table-column label="产品ID" v-if="false" prop="productId"  />
-      <el-table-column :label="this.$t('sbbh')" prop="productNumber"  />
-      <el-table-column :label="this.$t('sblx')" prop="productType" :show-overflow-tooltip="true"   >
+      <el-table-column align="center" :label="this.$t('sbmc')" prop="productName"  />
+      <el-table-column align="center" label="产品ID" v-if="false" prop="productId"  />
+      <el-table-column align="center" :label="this.$t('sbbh')" prop="productNumber"  />
+      <el-table-column align="center" :label="this.$t('sblx')" prop="productType" :show-overflow-tooltip="true"   >
         <template slot-scope="scope">
           <span >{{getDity(scope.row,'productType')}}</span>
         </template>
       </el-table-column>
-      <el-table-column :label="this.$t('sbzt')" prop="productStatus" :show-overflow-tooltip="true"   />
+      <el-table-column align="center"  :label="this.$t('sbzt')" prop="productStatus" :show-overflow-tooltip="true"   />
       <el-table-column :label="this.$t('cz')" align="center"  class-name="small-padding fixed-width">
         <template slot-scope="scope" >
           <el-button

+ 426 - 0
web/三相/src/views/sbwh/kzbsj/index.vue

@@ -0,0 +1,426 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="auto">
+
+
+      <el-form-item :label="this.$t('kzbgj')" prop="fileName" style="width: 400px">
+        <el-input :readonly="true" :disabled="true" style="width: 300px"    v-model="fileName" />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary"   :min-width="getStringWidth($t('gjxz'))"  style="border-radius: 10px;background-color: #0E35FF;margin-left: 10px;"     @click="handleImport">{{$t('gjxz')}}</el-button>
+        <el-button type="primary"   :min-width="getStringWidth($t('plsj'))"  style="border-radius: 10px;background-color: #0E35FF;margin-left: 10px;"  @click="handleUpdateAll">{{$t('plsj')}}</el-button>
+        <!--<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{$t('czhi')}}</el-button>-->
+      </el-form-item>
+
+    </el-form>
+    <el-card style="min-height: 700px ;border-radius: 15px">
+    <el-table max-height="700"  :data="channelList"  @selection-change="handleSelectionChange"  :header-cell-style="{ background:'#FFFFFF',color:'#000000'}">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column align="center" :label="this.$t('sbmc')" prop="productName"  />
+      <el-table-column align="center" label="产品ID" v-if="false" prop="productId"  />
+      <el-table-column align="center" :label="this.$t('kzbh')" prop="productNumber"  />
+      <el-table-column align="center" :label="this.$t('tdsl')" prop="productChNumber" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('gjbbh')" prop="productVersion" :show-overflow-tooltip="true"   />
+
+      <el-table-column align="center" :label="this.$t('sjrq')" prop="upgradeDate" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('dqzt')" prop="status" :show-overflow-tooltip="true"   >
+        <template slot-scope="scope">
+          <span v-if="scope.row.status=='0'" style="color: red">{{getDity(scope.row,'status')}}</span>
+          <span v-else-if="scope.row.status=='1'" style="color: green">{{getDity(scope.row,'status')}}</span>
+          <span v-else style="color: #FFD966">{{getDity(scope.row,'status')}}</span>
+
+        </template>
+      </el-table-column>
+      <el-table-column :label="this.$t('cz')" align="center"  class-name="smfirmwareDateall-padding fixed-width">
+        <template slot-scope="scope" >
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleUpdate(scope.row)"
+          >{{$t('sej')}}</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    </el-card>
+    <!-- 编辑通道-->
+    <!-- 用户导入对话框 -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" :close-on-click-modal="false" :close-on-press-escape="false" append-to-body>
+      <el-form ref="form" :model="form"  label-width="auto" class="left-align-form">
+        <el-form-item style="display: none" label="设备id:" prop="productId">
+          <el-input :readonly="true" :disabled="true"  v-model="form.productId" />
+        </el-form-item>
+        <!--<el-form-item   :label="this.$t('bbh')" prop="productVersion">-->
+          <!--<el-input  v-model="form.productVersion" />-->
+        <!--</el-form-item>-->
+
+      </el-form>
+      <el-upload
+           ref="upload"
+        :limit="1"
+        :action="upload.url + '?productId=' + this.productId+'&type=importData&token='+this.usertoken"
+           accept=".bin, .hex"
+        :disabled="upload.isUploading"
+           :on-change="beforeUpload"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">{{$t('drts')}}<em>{{$t('djsc')}}</em></div>
+        <div class="el-upload__tip text-center" slot="tip">
+          <span>{{$t('jyxdr')}}bin、hex{{$t('gswj')}}。</span>
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">{{$t('qd')}}</el-button>
+        <el-button @click="cancel">{{$t('qx')}}</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="title" class="dialogClass" style="overflow-y: auto;" :visible.sync="open"  width="500px" :close-on-click-modal="false" :close-on-press-escape="false" append-to-body>
+        <el-col style="height: 500px;overflow-y: auto;"  >
+          <el-card  >
+            <el-collapse accordion v-model="activeNames">
+              <el-collapse-item  v-for="(item, index) in hisData" :name="index"  :title="item.productVersion+' -  '+item.versionDate">
+                  <li>{{item.updateContent}}</li>
+              </el-collapse-item>
+            </el-collapse>
+          </el-card>
+        </el-col>
+
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { list, forceLogout } from "@/api/monitor/online";
+  import {controlBoardUpgrade ,serviceManagement} from "@/api/pdu/pduServer";
+
+  export default {
+    name: "Online",
+    data() {
+      return {
+        // 遮罩层
+        loading: true,
+        // 总条数
+        total: 0,
+        // 表格数据
+        channelList: [],
+        // 弹出层标题
+        title: "",
+        // 是否显示弹出层
+        open: false,
+        sortnoOpen: false,
+        // 通道配置表单参数
+        form: {},
+        sortnoForm: {},
+        modes:["开启","关闭"],
+        // 查询参数
+        queryParams: {
+          productName: "",
+          productNumber: "",
+          token: "",
+          type: "",
+        },
+        usertoken:"",
+        tableData: [],
+        tableProps: [
+          { prop: 'sortno', isShow: true, label: '序号', width: '55', minWidth: '100', align: 'center', type: 'index' },
+          { prop: 'productChId', isShow: true, label: '通道号', width: '150', minWidth: '100', align: 'center', type: 'index' },
+          { prop: 'productChName', isShow: true, label: '通道名称', width: '', minWidth: '100', align: 'center' },
+          { prop: 'status', isShow: true, label: '状态', width: '', minWidth: '100', align: 'center' },
+        ],
+        productList:[],
+        upload: {
+          // 是否显示弹出层(用户导入)
+          open: false,
+          // 弹出层标题(用户导入)
+          title: "",
+          // 是否禁用上传
+          isUploading: false,
+          // 上传的地址
+          url:  window.location.origin+":8084/pdu/controlBoardUpgradeUpload" // todo
+        },
+        productChTypes:[{"id":"1","name":"sblx1"},{"id":"2","name":"sblx2"},{"id":"3","name":"sblx3"},{"id":"4","name":"sblx4"},{"id":"5","name":"sblx5"}],
+        statuss:[{"id":"0","name":"lix"},{"id":"1","name":"zx"},{"id":"2","name":"sjz"}],
+        hisData:[],
+        activeNames:[],
+        productId:"",
+        file:null,
+        fileName:"",
+        validate:""
+      };
+    },
+    mounted() {
+      //监听websocket消息
+
+      this.$bus.$on('CONTROL_BOARD_UPGRADE', this.onSocketMessageToUpgrade);
+    },
+    created() {
+      console.log(window.location.origin)
+      this.usertoken= this.$store.state.user.usertoken;
+    //  this.queryProductList();
+      this.handleQuery();
+    },
+    methods: {
+      //推送通道状态
+      onSocketMessageToUpgrade(recvMessage) {
+        if (recvMessage.success) {
+          let resultData =recvMessage.data.data
+          if(recvMessage.data!=null && resultData!='' && resultData!=null){
+            this.channelList = resultData;
+          }
+
+          // this.handleQuery();
+        }
+      },
+      // 多选框选中数据
+      handleSelectionChange(selection) {
+        var ids = selection.map(item => item.productId);
+        this.productId=ids.join(",");
+      },
+      getStringWidth(text) {
+
+        //console.log('text', text)
+        const font = '14px Arial'
+        const canvas = document.createElement('canvas')
+        const context = canvas.getContext('2d')
+        context.font = font
+        const metrics = context.measureText(text)
+        // console.log('metrics.width', metrics.width)
+        return metrics.width + 40
+      },
+      //格式化培训形式
+      getDity(row,type) {
+        var name="";
+        var id="";
+        var formTrain=[];
+        if(type=='status'){
+          formTrain=this.statuss
+          id=row.status
+        }
+        for (var i = 0; i < formTrain.length; i++) {
+          let item = formTrain[i]
+          if (id== item.id) {
+            name=item.name;
+            return this.$t(item.name)
+          }
+        }
+        return name;
+      },
+      // 设备列表
+      queryProductList(){
+        const params={};
+        params.token= this.usertoken;
+        params.type= "listCbQuery";
+        controlBoardUpgrade(params).then(response => {
+          this.productList = response.data;
+        }).catch(() => {});
+      },
+      /** 导入按钮操作 */
+      handleImport(row) {
+        this.upload.title = this.$t('gjxz'); // todo
+        this.upload.open = true;
+        if(this.fileName!=""){
+          this.$refs.upload.clearFiles();
+        }
+        this.fileName ="";
+        this.validate="";
+      },
+// 升级
+      handleUpdate(row) {
+        if( this.fileName==""){
+          alert(this.$t("qxzgj"))
+          return
+        }
+        this.validate="1";
+        this.$refs.upload.submit();
+
+      },
+      //批量升级
+      handleUpdateAll(){
+        if( this.fileName==""){
+          alert(this.$t("qxzgj"))
+          return
+        }
+        if(this.productId==""){
+          alert(this.$t("qxzkzb"))
+          return
+        }
+        this.validate="1";
+        this.$refs.upload.submit();
+
+  },
+      beforeUpload(file){
+        if(this.validate==""){
+          var name= file.name.split('.')[1].toLowerCase() ;
+          if ( name!='bin' && name!='hex' ) {
+            this.$modal.msgError(this.$t('jyxdr')+"bin、hex"+this.$t('gswj'));
+            this.$refs.upload.clearFiles();
+            return false;
+          }
+          this.fileName=file.name;
+        }
+      },
+// 文件上传中处理
+      handleFileUploadProgress(event, file, fileList) {
+        this.upload.isUploading = true;
+      },
+// 文件上传成功处理
+      handleFileSuccess(response, file, fileList) {
+        this.upload.open = false;
+        this.upload.isUploading = false;
+        this.$refs.upload.clearFiles();
+        this.$modal.alert( response.msg);
+        this.cancel();
+        this.handleQuery();
+      },
+// 提交上传文件
+      submitFileForm() {
+        this.upload.open = false;
+        // this.$refs.upload.submit();
+      },
+
+
+      handleAdd(){
+        this.sortnoOpen=true;
+      },
+      // 更多操作触发
+      handleCommand(command, row) {
+        const params={};
+        params.token=this.usertoken;
+        params.productId=row.productId;
+        params.productNumber=row.productNumber;
+        switch (command) {
+          case "channelopen":
+            params.type="sBRestart";
+            this.$modal.confirm(this.$t('qdycqm')).then(function() {
+              controlBoardUpgrade(params);
+            }).then(() => {
+              //this.$modal.msgSuccess(this.$t('zxcg'));
+            }).catch(() => {});
+
+            break;
+          default:
+            break;
+        }
+      },
+
+
+      // 通道列表
+      queryChannelStatus(){
+
+        this.queryParams.token=this.usertoken;
+        this.queryParams.type="listCbQuery";
+        this.loading = true;
+       // console.log(this.queryParams)
+          controlBoardUpgrade(this.queryParams).then(response => {
+            this.channelList = response.data;
+        }).catch(() => {});
+        this.loading = false;
+      },
+
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryChannelStatus();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      /** 版本历史 */
+      handleHis(row) {
+        this.form =row;
+        const params={};
+        params.token=this.usertoken;
+        params.type="listRtHisQuery";
+        params.productId=row.productId;
+        this.loading = true;
+        // console.log(this.queryParams)
+        controlBoardUpgrade(params).then(response => {
+          if(response.data!=null){
+              this.hisData=response.data;
+          }
+         // this.channelList = response.data;
+      }).catch(() => {});
+        this.loading = false;
+        this.open = true;
+        this.title = this.$t('bbls');
+        this.activeNames=[0];
+      },
+
+      /** 提交按钮 */
+      submitForm: function() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            const params={};
+            params.token=this.usertoken;
+            params.type="sXTimeSave";
+            params.productChName=this.form.productChName;
+            params.productChId=this.form.productChId;
+            params.firingInterval=this.form.firingInterval;
+            params.closeInterval=this.form.closeInterval;
+            params.productId=this.form.productId;
+            this.loading = true;
+            this.$modal.confirm(this.$t('qdybcm')).then(function() {
+              serviceManagement(params).then(response => {
+                this.open = false;
+              this.queryChannelStatus();
+            });
+
+            }).then(() => {
+              this.open = false;
+          }).catch(() => {});
+
+          }
+        });
+
+      },
+
+      // 取消按钮
+      cancel() {
+        if(this.fileName!=""){
+          this.$refs.upload.clearFiles();
+        }
+        this.fileName ="";
+        this.upload.open = false;
+        //  this.reset();
+      },
+      /** 强退按钮操作 */
+      handleForceLogout(row) {
+        this.$modal.confirm(this.$t('sfqztc') + row.userName + this.$t('yhm')).then(function() {
+          return forceLogout(row.tokenId);
+        }).then(() => {
+          this.getList();
+        this.$modal.msgSuccess(this.$t('qtcg'));
+      }).catch(() => {});
+      }
+    }
+  };
+</script>
+<style>
+  .left-align-form .el-form-item__label {
+    text-align: left;
+  }
+
+  .left-align-form .el-form-item {
+    margin-bottom: 0; /* 根据需要可以去掉或调整间距 */
+  }
+  .update-log {
+  ol {
+    display: block;
+    list-style-type: decimal;
+    margin-block-start: 1em;
+    margin-block-end: 1em;
+    margin-inline-start: 0;
+    margin-inline-end: 0;
+    padding-inline-start: 40px;
+  }
+  }
+  .dialogClass .el-dialog{
+    height: 600px;
+  }
+</style>
+

+ 4 - 4
web/三相/src/views/sbwh/sbcq/index.vue

@@ -25,15 +25,15 @@
     <el-card style="min-height: 700px ;border-radius: 15px">
     <el-table max-height="700"  :data="channelList"  :header-cell-style="{ background:'#FFFFFF',color:'#000000'}">
       <!--<el-table-column type="selection" width="55" align="center" />-->
-      <el-table-column :label="this.$t('sbmc')" prop="productName"  />
+      <el-table-column align="center" :label="this.$t('sbmc')" prop="productName"  />
       <el-table-column label="产品ID" v-if="false" prop="productId"  />
-      <el-table-column :label="this.$t('sbbh')" prop="productNumber"  />
-      <el-table-column :label="this.$t('sblx')" prop="productType" :show-overflow-tooltip="true"   >
+      <el-table-column align="center" :label="this.$t('sbbh')" prop="productNumber"  />
+      <el-table-column align="center" :label="this.$t('sblx')" prop="productType" :show-overflow-tooltip="true"   >
         <template slot-scope="scope">
           <span >{{getDity(scope.row,'productType')}}</span>
         </template>
       </el-table-column>
-      <el-table-column :label="this.$t('sbzt')" prop="productStatus" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('sbzt')" prop="productStatus" :show-overflow-tooltip="true"   />
       <el-table-column :label="this.$t('cz')" align="center"  class-name="small-padding fixed-width">
         <template slot-scope="scope" >
           <el-button

+ 9 - 9
web/三相/src/views/sbwh/shfw/index.vue

@@ -31,16 +31,16 @@
     <el-card style="min-height: 700px ;border-radius: 15px">
     <el-table max-height="700"  :data="channelList"  :header-cell-style="{ background:'#FFFFFF',color:'#000000'}">
       <!--<el-table-column type="selection" width="55" align="center" />-->
-      <el-table-column :label="this.$t('sbmc')" prop="productName"  />
+      <el-table-column align="center" :label="this.$t('sbmc')" prop="productName"  />
       <el-table-column label="产品ID" v-if="false" prop="productId"  />
-      <el-table-column :label="this.$t('sbbh')" prop="productNumber"  />
-      <el-table-column :label="this.$t('sblx')" v-if="false" prop="productType" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('cslg')" prop="logo" v-if="false" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('dz')" prop="sensorAddr" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('wz')" prop="website" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('shdh')" prop="serviceTel" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('yx')" prop="mailbox" :show-overflow-tooltip="true"   />
-      <el-table-column :label="this.$t('ewm')" v-if="false" prop="qrCode" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('sbbh')" prop="productNumber"  />
+      <el-table-column align="center" :label="this.$t('sblx')" v-if="false" prop="productType" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('cslg')" prop="logo" v-if="false" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('dz')" prop="sensorAddr" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('wz')" prop="website" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('shdh')" prop="serviceTel" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('yx')" prop="mailbox" :show-overflow-tooltip="true"   />
+      <el-table-column align="center" :label="this.$t('ewm')" v-if="false" prop="qrCode" :show-overflow-tooltip="true"   />
       <el-table-column :label="this.$t('cz')" align="center"  class-name="small-padding fixed-width">
         <template slot-scope="scope" >
           <el-button