likang 2 年之前
父节点
当前提交
b5ced382ce

+ 1 - 1
.env.development

@@ -4,4 +4,4 @@ ENV = 'development'
 # base api
 #VUE_APP_BASE_API = 'http://wxt.rltest.cn:8102'
 #VUE_APP_BASE_API = '127.0.0.1'
-#VUE_APP_BASE_API = 'http://192.168.1.63:8000'
+VUE_APP_BASE_API = 'http://192.168.1.56:80'

+ 4 - 1
src/config/componentsMap.js

@@ -19,7 +19,10 @@ export default {
     develop: () => import ('@/views/system/develop'),
     generate: () =>  import ('@/views/system/generate'),
     //邮箱管理
-    email: () =>  import ('@/views/system/email'),
+    email: () => import('@/views/system/email'),
+    //下发版本  用于下发日志使用
+    IssuedVersion: () => import('@/views/system/Issued_version'),
+    
     database: () => import ('@/views/system/database'),
     attachment: () =>  import ('@/views/system/attachments'),
     loginLog: () => import ('@/views/system/log/login'),

+ 1 - 0
src/views/device/hanger_equipment/index.vue

@@ -108,6 +108,7 @@
       <el-button type="warning" icon="el-icon-download" :loading="downloadLoading" style="margin-top: 15px"
         @click="exportExcel">导出</el-button>
       <el-button type="success" icon="el-icon-upload" :loading="downloadLoading" style="margin-top: 15px"
+      
         @click="importExcel">导入</el-button>
       <el-pagination background class="pagination-container" @size-change="handleSizeChange"
         @current-change="handleCurrentChange" :current-page="paginate.current" :page-sizes="paginate.sizes"

+ 85 - 28
src/views/device/hyd_equipment/formModel.vue

@@ -19,32 +19,82 @@ import { array } from 'jszip/lib/support';
 export default {
   props: ["formModelVisible", "title"],
   data() {
-    // var validateMaxPressure = (rule, value, callback) => {
-    //     if ( (value !== '') && (this.formFieldsData.min_pressure !=='')) {
-    //         var min_pressure = this.formFieldsData.min_pressure - 0;
-    //         var max_pressure = value - 0;
-    //         if (min_pressure > max_pressure) {
-    //             callback(new Error('不能小于最小压力'))
-    //         } else {
-    //             callback()
-    //         }
-    //     } else {
-    //        callback()
-    //     }
-    // };
-    // var validateMinPressure = (rule, value, callback) => {
-    //     if ( (value !== '') && (this.formFieldsData.max_pressure !=='')) {
-    //         var max_pressure = this.formFieldsData.max_pressure - 0;
-    //         var min_pressure = value - 0;
-    //         if (min_pressure > max_pressure) {
-    //             callback(new Error('不能大于最大压力'))
-    //         } else {
-    //             callback()
-    //         }
-    //     } else {
-    //        callback()
-    //     }
-    // };
+    var validateMaxPressure = (rule, value, callback) => {
+        if ( (value !== '') && (this.formFieldsData.min_pressure !=='')) {
+            var min_pressure = this.formFieldsData.min_pressure - 0;
+            var max_pressure = value - 0;
+            if (min_pressure > max_pressure) {
+                callback(new Error('不能小于最小压力'))
+            } else {
+                callback()
+            }
+        } else {
+           callback()
+        }
+    };
+    var validateMinPressure = (rule, value, callback) => {
+        if ( (value !== '') && (this.formFieldsData.max_pressure !=='')) {
+            var max_pressure = this.formFieldsData.max_pressure - 0;
+            var min_pressure = value - 0;
+            if (min_pressure > max_pressure) {
+                callback(new Error('不能大于最大压力'))
+            } else {
+                callback()
+            }
+        } else {
+           callback()
+        }
+    };
+    var validateMaxTorque = (rule, value, callback) => {
+      if ((value !== '') && (this.formFieldsData.min_torque !== '')) {
+        var min_torque = this.formFieldsData.min_torque - 0;
+        var max_torque = value - 0;
+        if (min_torque > max_torque) {
+          callback(new Error('不能小于最小扭矩'))
+        } else {
+          callback()
+        }
+      } else {
+        callback()
+      }
+    };
+    var validateMinTorque = (rule, value, callback) => {
+      if ((value !== '') && (this.formFieldsData.max_torque !== '')) {
+        var max_torque = this.formFieldsData.max_torque - 0;
+        var min_torque = value - 0;
+        if (min_torque > max_torque) {
+          callback(new Error('不能大于最大扭矩'))
+        } else {
+          callback()
+        }
+      } else {
+        callback()
+      }
+    };
+    //校验不能输入汉字
+    var validQC = (rule, value, callback) => {
+      
+      if (value) {
+        if (/[\u4E00-\u9FA5]/g.test(value)) {
+          callback(new Error("不能输入汉字"));
+        } else {
+          // 验证通过
+          callback();
+        }
+        callback();
+      }
+    };
+    //校验数字
+      var isnumber = (rule, value, callback) => {
+      var regPos = /^\d+(\.\d+)?$/; //非负浮点数
+      var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
+      if (regPos.test(value) || regNeg.test(value)) {
+        callback();
+      } else {
+        callback(new Error('请输入数字'));
+      }
+
+    };
     return {
       formData: {},
       fresh:true,
@@ -181,7 +231,8 @@ export default {
             layout: 12,
             type: "input",
             label: "编号",
-            required:true,
+            required: true,
+            rules: { validator: validQC, trigger: 'blur' },
             vif(data)
             {
               if(data.equipment_type&&data.equipment_type<5)
@@ -223,6 +274,7 @@ export default {
             type: "input",
             label: "角度分辨率",
             required: true,
+            rules: { validator: isnumber, trigger: 'blur' },
             vif(data) {
               if (data.equipment_type == 3 || data.equipment_type == 4) {
                 return true;
@@ -234,7 +286,8 @@ export default {
             layout: 12,
             type: "input",
             label: "最小扭矩",
-            required:true,
+            required: true,
+            rules: [{ validator: validateMinTorque, trigger: 'blur' }, { validator: isnumber, trigger: 'blur' }],
             vif(data)
             {
               if(data.equipment_type==3||data.equipment_type==4)
@@ -249,6 +302,7 @@ export default {
             type: "input",
             label: "最大扭矩",
             required: true,
+            rules: [{ validator: validateMaxTorque, trigger: 'blur' }, { validator: isnumber, trigger: 'blur' }],
             vif(data)
             {
               if(data.equipment_type==3||data.equipment_type==4)
@@ -263,6 +317,7 @@ export default {
             type: "input",
             required: true,
             label: "最大压力",
+            rules: [{ validator: validateMaxPressure, trigger: 'blur' }, { validator: isnumber, trigger: 'blur' }],
             vif(data)
             {
               if (data.equipment_type && data.equipment_type < 5)
@@ -279,6 +334,7 @@ export default {
             type: "input",
             required: true,
             label: "最小压力",
+            rules: [{ validator: validateMinPressure, trigger: 'blur' }, { validator: isnumber, trigger: 'blur' }],
             vif(data)
             {
               if (data.equipment_type && data.equipment_type < 5)
@@ -293,6 +349,7 @@ export default {
             type: "input",
             required: true,
             label: "有效周期",
+            rules: { validator: isnumber, trigger: 'blur' },
             vif(data)
             {
               if(data.equipment_type&&data.equipment_type==2)

+ 193 - 380
src/views/device/hyd_equipment/index.vue

@@ -3,385 +3,174 @@
     <alarm @eq_type="eqSelect"></alarm>
 
     <div class="app-container">
-    <div class="filter-container" style="padding-bottom: 0px">
-      <div class="search-box-area" id="searchBox">
-        <div class="search-item">
-          <el-select
-            class="filter-item form-search-input fl"
-            v-model="queryParam.equipment_type"
-            placeholder="请选择设备类别"
-            clearable
-            @change="handleChange"
-          >
-           <el-option
-              v-for="item in equ_types"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value">
-            </el-option>
-          
-          </el-select>
-        </div>
-        <div class="search-item">
-          <el-input
-            v-model="queryParam.material_number"
-            placeholder="请输入物料号"
-            clearable
-            class="filter-item form-search-input fl"
-            @keyup.enter.native="handleSearch"
-          />
+      <div class="filter-container" style="padding-bottom: 0px">
+        <div class="search-box-area" id="searchBox">
+          <div class="search-item">
+            <el-select class="filter-item form-search-input fl" v-model="queryParam.equipment_type"
+              placeholder="请选择设备类别" clearable @change="handleChange">
+              <el-option v-for="item in equ_types" :key="item.value" :label="item.label" :value="item.value">
+              </el-option>
+
+            </el-select>
+          </div>
+          <div class="search-item">
+            <el-input v-model="queryParam.material_number" placeholder="请输入物料号" clearable
+              class="filter-item form-search-input fl" @keyup.enter.native="handleSearch" />
+          </div>
+          <div class="search-item">
+            <el-input v-model="queryParam.name" placeholder="请输入设备名称" clearable class="filter-item form-search-input fl"
+              @keyup.enter.native="handleSearch" />
+          </div>
+          <div class="search-item">
+            <el-input v-model="queryParam.number" placeholder="请输入固定资产/类固资产/序列" clearable
+              class="filter-item form-search-input fl" @keyup.enter.native="handleSearch" />
+          </div>
+          <div class="search-item">
+            <el-input v-model="queryParam.imei" placeholder="泵的Imei号" clearable class="filter-item form-search-input fl"
+              @keyup.enter.native="handleSearch" />
+          </div>
+
         </div>
-        <div class="search-item">
-          <el-input
-            v-model="queryParam.name"
-            placeholder="请输入设备名称"
-            clearable
-            class="filter-item form-search-input fl"
-            @keyup.enter.native="handleSearch"
-          />
+        <div class="search-operate-area">
+          <!-- <el-input v-model="queryParam.code" placeholder="唯一编码" clearable class="filter-item form-search-input fl" /> -->
+          <el-button class="filter-item search fl" icon="el-icon-search" @click="handleSearch">搜索</el-button>
+          <el-button class="filter-item fl" icon="el-icon-refresh" @click="handleRefresh">重置</el-button>
+          -->
         </div>
-          <div class="search-item">
-          <el-input
-            v-model="queryParam.number"
-            placeholder="请输入固定资产/类固资产/序列"
-            clearable
-            class="filter-item form-search-input fl"
-            @keyup.enter.native="handleSearch"
-          />
+        <div class="search-operate-area1">
+          <!-- <el-button size="mini" class="filter-item search fl" icon="el-icon-plus" @click="handleCreate">添加</el-button> -->
+          <el-button class="filter-item search f2" icon="el-icon-setting" @click="showColumnOption">列设置</el-button>
+          <el-button class="filter-item search f2" icon="el-icon-refresh-right" @click="refresh">刷新</el-button>
         </div>
-
-      </div>
-      <div class="search-operate-area">
-        <!-- <el-input v-model="queryParam.code" placeholder="唯一编码" clearable class="filter-item form-search-input fl" /> -->
-        <el-button
-          class="filter-item search fl"
-          icon="el-icon-search"
-          @click="handleSearch"
-          >搜索</el-button
-        >
-        <el-button
-          class="filter-item fl"
-          icon="el-icon-refresh"
-          @click="handleRefresh"
-          >重置</el-button
-        >
-        -->
-      </div>
-      <div class="search-operate-area1">
-        <!-- <el-button size="mini" class="filter-item search fl" icon="el-icon-plus" @click="handleCreate">添加</el-button> -->
-        <el-button
-          class="filter-item search f2"
-          icon="el-icon-setting"
-          @click="showColumnOption"
-          >列设置</el-button
-        >
-        <el-button
-          class="filter-item search f2"
-          icon="el-icon-refresh-right"
-          @click="refresh"
-          >刷新</el-button
-        >
       </div>
-    </div>
-    <el-table
-      :data="data"
-      v-loading="loading"
-      ref="multipleTable"
-      @selection-change="hydraulicSelectMulti"
-      @sort-change="sortChange"
-      :dynamicColumnSetting="true"
-      tooltip-effect="dark"
-      style="width: 100%"
-      border
-      fit
-    >
-      <el-table-column
-        type="selection"
-        fixed="left"
-        width="55"
-      ></el-table-column>
-      <el-table-column
-        prop="material_number"
-        label="物料号"
-        align="center"
-        v-if="showColumn.material_number"
+      <el-table :data="data" v-loading="loading" ref="multipleTable" @selection-change="hydraulicSelectMulti"
+        @sort-change="sortChange" :dynamicColumnSetting="true" tooltip-effect="dark" style="width: 100%" border fit>
+        <el-table-column type="selection" fixed="left" width="55"></el-table-column>
+        <el-table-column prop="material_number" label="物料号" align="center" v-if="showColumn.material_number"
+          width="120" />
+        <el-table-column prop="classification" label="设备分类" align="center" v-if="showColumn.classification" />
+        <el-table-column prop="equ_type_name" label="设备类别" align="center" v-if="showColumn.equ_type_name" width="120" />
+        <el-table-column prop="name" label="设备名称" align="center" v-if="showColumn.name" width="120" />
+        <el-table-column prop="equipment_model" label="设备型号" align="center" v-if="showColumn.equipment_model" />
+        <el-table-column prop="issue_unit" label="发放单位" align="center" v-if="showColumn.issue_unit" />
+        <el-table-column prop="fixed_asset_number" label="固定资产编号" align="center" v-if="showColumn.fixed_asset_number" />
+        <el-table-column prop="fixed_asset_number2" label="类固资产编号" align="center"
+          v-if="showColumn.fixed_asset_number" />
 
-        width="120"
-      />
-      <el-table-column
-        prop="classification"
-        label="设备分类"
-        align="center"
-        v-if="showColumn.classification"
-       
-      />
-      <el-table-column
-        prop="equ_type_name"
-        label="设备类别"
-        align="center"
-        v-if="showColumn.equ_type_name"
-       
-        width="120"
-      />
-       <el-table-column
-        prop="name"
-        label="设备名称"
-        align="center"
-        v-if="showColumn.name"
-       
-        width="120"
-      />
-      <el-table-column
-        prop="equipment_model"
-        label="设备型号"
-        align="center"
-        v-if="showColumn.equipment_model"
-      />
-      <el-table-column
-        prop="issue_unit"
-        label="发放单位"
-        align="center"
-        v-if="showColumn.issue_unit"
-       
-      />
-      <el-table-column
-        prop="fixed_asset_number"
-        label="固定资产编号"
-        align="center"
-        v-if="showColumn.fixed_asset_number"
-      />
-       <el-table-column
-        prop="fixed_asset_number2"
-        label="类固资产编号"
-        align="center"
-        v-if="showColumn.fixed_asset_number"
-      />
+        <el-table-column prop="serial_number" label="序列号" align="center" v-if="showColumn.serial_number" />
+        <el-table-column prop="factory_number" label="出厂编号" align="center" v-if="showColumn.factory_number" />
+        <el-table-column prop="check_last_time" label="上次校验时间" align="center" v-if="showColumn.check_last_time"
+          width="100" />
+        <el-table-column prop="check_next_time" label="下次校验时间" align="center" width="100"
+          v-if="showColumn.check_next_time" />
+        <el-table-column prop="check_status1" label="校验状态" align="center" v-if="showColumn.check_status1" />
+        <el-table-column prop="status1" label="状态" align="center" v-if="showColumn.status1" />
+        <el-table-column label="操作" width="250" align="center" fixed="right">
+          <template slot-scope="record">
+            <el-tooltip content="修改" placement="top" :enterable="false">
+              <el-button type="primary" size="mini" icon="el-icon-edit" @click="handleUpdate(record.row)"></el-button>
+            </el-tooltip>
+            <el-tooltip content="查看" placement="top" :enterable="false">
+              <el-button type="primary" size="mini" icon="el-icon-view" @click="handleDetail(record.row)"></el-button>
+            </el-tooltip>
 
-      <el-table-column
-        prop="serial_number"
-        label="序列号"
-        align="center"
-        v-if="showColumn.serial_number"
-  
-      />
-      <el-table-column
-        prop="factory_number"
-        label="出厂编号"
-        align="center"
-       
-        v-if="showColumn.factory_number"
-      />
-      <el-table-column
-        prop="check_last_time"
-        label="上次校验时间"
-        align="center"
-        v-if="showColumn.check_last_time"
-       
-        width="100"
-      />
-      <el-table-column
-        prop="check_next_time"
-        label="下次校验时间"
-        align="center"
-       
-        width="100"
-        v-if="showColumn.check_next_time"
-      />
-      <el-table-column
-        prop="check_status1"
-        label="校验状态"
-        align="center"
-        v-if="showColumn.check_status1"
-      />
-       <el-table-column
-        prop="status1"
-        label="状态"
-        align="center"
-        v-if="showColumn.status1"
-       
-      />
-      <el-table-column
-        label="操作"
-        width="180"
-        align="center"
-        fixed="right"
-      >
-        <template slot-scope="record">
-          <el-tooltip
-            content="修改"
-            placement="top"
-            :enterable="false"
-          >
-            <el-button
-              type="primary"
-              size="mini"
-              icon="el-icon-edit"
-              @click="handleUpdate(record.row)"
-            ></el-button>
-          </el-tooltip>
-          <el-tooltip
-            content="查看"
-            placement="top"
-            :enterable="false"
-          >
-            <el-button
-              type="primary"
-              size="mini"
-              icon="el-icon-view"
-              @click="handleDetail(record.row)"
-            ></el-button>
-          </el-tooltip>
-          <el-button type="danger" size="mini" icon="el-icon-delete" @click="handleDelete(record.row.id)" />
-        </template>
-      </el-table-column>
-    </el-table>
-    <transition name="fade">
-      <div class="columnOption" v-show="isShowColumn">
-        <div class="content">
-          <div class="head">选择显示字段</div>
-          <div class="body">
-            <el-checkbox v-model="checkList.depart_name" disabled>所属部门</el-checkbox>
-            <!-- <el-checkbox v-model="checkList.alarm_state_text" disabled>告警状态</el-checkbox> -->
-            <el-checkbox v-model="checkList.material_number">物料号</el-checkbox>
-            <el-checkbox v-model="checkList.classification">设备分类</el-checkbox>
-            <el-checkbox v-model="checkList.equ_type_name">设备类别</el-checkbox>
-            <el-checkbox v-model="checkList.name">名称</el-checkbox>
-            <el-checkbox v-model="checkList.equipment_model">设备型号</el-checkbox>
-            <el-checkbox v-model="checkList.fixed_asset_number">固定资产编号</el-checkbox>
-            <el-checkbox v-model="checkList.fixed_asset_number2">类固定资产编号</el-checkbox>
-            <el-checkbox v-model="checkList.serial_number">序列号</el-checkbox>
-            <el-checkbox v-model="checkList.factory_number">出厂编号</el-checkbox>
-            <el-checkbox v-model="checkList.check_last_time">上次校验时间</el-checkbox>
-            <el-checkbox v-model="checkList.check_next_time">下次校验时间</el-checkbox>
-            <el-checkbox v-model="checkList.check_status1">校验状态</el-checkbox>
-            <el-checkbox v-model="checkList.status1">状态</el-checkbox>
-          </div>
-          <div class="footer">
-            <el-button size="small" type="primary" plain @click="saveColumn"
-              >保存列配置</el-button
-            >
+            <el-tooltip v-if="record.row.equipment_type==2" content="日志" placement="top" :enterable="false"
+              v-action="'HydEquipment@SelectLogByImei'">
+              <el-button type="warning" size="mini" icon="el-icon-s-tools" @click="handleLogDetail(record.row)">
+              </el-button>
+            </el-tooltip>
+            <el-button type="danger" size="mini" icon="el-icon-delete" @click="handleDelete(record.row.id)" />
+          </template>
+        </el-table-column>
+      </el-table>
+      <transition name="fade">
+        <div class="columnOption" v-show="isShowColumn">
+          <div class="content">
+            <div class="head">选择显示字段</div>
+            <div class="body">
+              <el-checkbox v-model="checkList.depart_name" disabled>所属部门</el-checkbox>
+              <!-- <el-checkbox v-model="checkList.alarm_state_text" disabled>告警状态</el-checkbox> -->
+              <el-checkbox v-model="checkList.material_number">物料号</el-checkbox>
+              <el-checkbox v-model="checkList.classification">设备分类</el-checkbox>
+              <el-checkbox v-model="checkList.equ_type_name">设备类别</el-checkbox>
+              <el-checkbox v-model="checkList.name">名称</el-checkbox>
+              <el-checkbox v-model="checkList.equipment_model">设备型号</el-checkbox>
+              <el-checkbox v-model="checkList.fixed_asset_number">固定资产编号</el-checkbox>
+              <el-checkbox v-model="checkList.fixed_asset_number2">类固定资产编号</el-checkbox>
+              <el-checkbox v-model="checkList.serial_number">序列号</el-checkbox>
+              <el-checkbox v-model="checkList.factory_number">出厂编号</el-checkbox>
+              <el-checkbox v-model="checkList.check_last_time">上次校验时间</el-checkbox>
+              <el-checkbox v-model="checkList.check_next_time">下次校验时间</el-checkbox>
+              <el-checkbox v-model="checkList.check_status1">校验状态</el-checkbox>
+              <el-checkbox v-model="checkList.status1">状态</el-checkbox>
+            </div>
+            <div class="footer">
+              <el-button size="small" type="primary" plain @click="saveColumn">保存列配置</el-button>
+            </div>
           </div>
         </div>
-      </div>
-    </transition>
-    <el-button
-      type="primary"
-      icon="el-icon-plus"
-      :loading="downloadLoading"
-      style="margin-top: 15px"
-      @click="handleCreate"
-      >添加</el-button
-    >
-    <el-button
-      type="danger"
-      icon="el-icon-delete"
-      v-if="selectedIds.length > 0"
-      style="margin-top: 15px"
-      @click="handleMultiDelete()"
-      >删除</el-button
-    >
-    <el-button
-      type="warning"
-      icon="el-icon-download"
-      :loading="downloadLoading"
-      style="margin-top: 15px"
-      @click="exportExcel"
-      >导出</el-button
-    >
-    <el-button
-      type="success"
-      icon="el-icon-upload"
-      :loading="downloadLoading"
-      style="margin-top: 15px"
-      @click="importExcel"
-      >导入</el-button
-    >
-    <el-pagination
-      background
-      class="pagination-container"
-      @size-change="handleSizeChange"
-      @current-change="handleCurrentChange"
-      :current-page="paginate.current"
-      :page-sizes="paginate.sizes"
-      :page-size="paginate.limit"
-      :layout="paginate.layout"
-      :total="paginate.total"
-    />
-     <form-model
-      @sendVal="closeDialog"
-      :formModelVisible="formVisible"
-      :title="title"
-      :ref="formName"
-    />
-    <detail
-      :detailVisible="detailVisible"
-       @sendVal="closeDrawer"
-       :record="detail"
-    />
-   
-     <hydraulicDetail
-      :detailVisible="hydraulicDetailVisible"
-       @sendVal="closeDrawer"
-       :record="hydraulicDetail"
-    />
-     <wrenchDetail
-      :detailVisible="wrenchDetailVisible"
-       @sendVal="closeDrawer"
-       :record="wrenchDetail"
-    />
+      </transition>
+      <el-button type="primary" icon="el-icon-plus" :loading="downloadLoading" style="margin-top: 15px"
+        @click="handleCreate">添加</el-button>
+      <el-button type="danger" icon="el-icon-delete" v-if="selectedIds.length > 0" style="margin-top: 15px"
+        @click="handleMultiDelete()">删除</el-button>
+      <el-button type="warning" icon="el-icon-download" :loading="downloadLoading" style="margin-top: 15px"
+        @click="importHydExcels">导出</el-button>
 
-    <!-- 导入弹框 -->
-    <el-dialog
-      title="导入液压设备"
-      append-to-body
-      width="400px"
-      :visible.sync="uploadDialogVisible"
-      custom-class="upload-dialog"
-    >
-      <!-- <el-cascader
-        v-model="selectedDepartId"
-        class="filter-item form-search-input fl"
-        :options="departments"
-        :props="{ checkStrictly: true, label: 'department_name', value: 'id' }"
-        style="margin-bottom: 10px"
-        @change="changeCards"
-      ></el-cascader> -->
-      <el-upload
-        class="upload-demo"
-        drag
-        :action="actionUrl"
-        :headers="headers"
-        :before-upload="beforeUpload"
-        :show-file-list="true"
-        :on-change="onchange"
-        :on-remove="onremove"
-        :on-exceed="onexeced"
-        :limit="1"
-        ref="upload"
-      >
-        <i class="el-icon-upload"></i>
-        <div class="el-upload__text">
-          将文件拖到此处,或
-          <em>点击上传</em>
-        </div>
-        <div class="el-upload__tip upload-tips" slot="tip">
-          只能上传xls/xlsx文件
-        </div>
-      </el-upload>
-      <el-link
-        type="primary"
-        href="https://rlfd.oss-cn-hangzhou.aliyuncs.com/smart_tool/import_pump.xls"
-        style="margin-top: 10px"
-        >下载模板</el-link
-      >
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="uploadDialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="importCards" :loading="loadings">{{
+
+      <el-button type="success" icon="el-icon-upload" :loading="downloadLoading" style="margin-top: 15px"
+        @click="importExcel">导入</el-button>
+      <el-pagination background class="pagination-container" @size-change="handleSizeChange"
+        @current-change="handleCurrentChange" :current-page="paginate.current" :page-sizes="paginate.sizes"
+        :page-size="paginate.limit" :layout="paginate.layout" :total="paginate.total" />
+      <form-model @sendVal="closeDialog" :formModelVisible="formVisible" :title="title" :ref="formName" />
+
+      <detail :detailVisible="detailVisible" @sendVal="closeDrawer" :record="detail" />
+
+      <hydraulicDetail :detailVisible="hydraulicDetailVisible" @sendVal="closeDrawer" :record="hydraulicDetail" />
+
+      <wrenchDetail :detailVisible="wrenchDetailVisible" @sendVal="closeDrawer" :record="wrenchDetail" />
+
+      <logDetail :detailVisible="logDetailVisible" @sendVal="closeDrawer" :record="logDetail">
+      </logDetail>
+      <!-- 导入弹框 -->
+      <el-dialog title="导入液压设备" append-to-body width="400px" :visible.sync="uploadDialogVisible"
+        custom-class="upload-dialog">
+        <!-- <el-cascader
+            v-model="selectedDepartId"
+            class="filter-item form-search-input fl"
+            :options="departments"
+            :props="{ checkStrictly: true, label: ' department_name', value: 'id' }" style="margin-bottom: 10px"
+              @change="changeCards">
+              </el-cascader> -->
+        <el-upload class="upload-demo" drag :action="actionUrl" :headers="headers" :before-upload="beforeUpload"
+          :show-file-list="true" :on-change="onchange" :on-remove="onremove" :on-exceed="onexeced" :limit="1"
+          ref="upload">
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">
+            将文件拖到此处,或
+            <em>点击上传</em>
+          </div>
+          <div class="el-upload__tip upload-tips" slot="tip">
+            只能上传xls/xlsx文件
+          </div>
+        </el-upload>
+        <el-link type="primary" href="https://rlfd.oss-cn-hangzhou.aliyuncs.com/smart_tool/import_pump.xls"
+          style="margin-top: 10px">下载模板</el-link>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="uploadDialogVisible = false">取 消</el-button>
+          <el-button type="primary" @click="importCards" :loading="loadings">{{
           submitText
-        }}</el-button>
-      </span>
-    </el-dialog>
-  </div>
+          }}</el-button>
+        </span>
+      </el-dialog>
+
+
+
+
+      <!-- 导出弹框 -->
+
+    </div>
   </div>
 </template>
 
@@ -389,9 +178,10 @@
 import rlListOperate from "@/layout/rl-list-operate/rlListOperate";
 import { action } from "@/directive/permission/index.js";
 import { getToken } from "../../../utils/auth";
-import detail from "./detail.vue"
+import detail from "./detail.vue";
 import wrenchDetail from "./wrench_detail.vue"
 import hydraulicDetail from "./hydraulic_detail.vue"
+import logDetail from "./log/index.vue"
 import formModel from './formModel.vue'
 import alarm from './alarm.vue'
 export default {
@@ -403,11 +193,13 @@ export default {
     detail,
     wrenchDetail,
     hydraulicDetail,
-    alarm
+    alarm,
+    logDetail,
   },
   data() {
     return {
       url: "hydEquipment",
+      exportUrl:'',
       defaultQueryParam:['pid']       
       ,
       queryParam: {
@@ -415,9 +207,12 @@ export default {
         material_number: "",
         name: "",
         number: "",
-        equipment_type:'',
-       
+        equipment_type: '',
+        imei:''       
       },
+      //带入参数
+      excelParam: [],
+      
       deviceTypes:[],
       current_type: {
         0: "success",
@@ -437,7 +232,10 @@ export default {
       hydraulicDetail:{},
       //扳手详情
       wrenchDetailVisible:false,
-      wrenchDetail:{},
+      wrenchDetail: {},
+      //设备日志详情
+      logDetailVisible: false,
+      logDetail: {},
 
       isShowColumn: false,
       // 列的配置化对象,存储配置信息
@@ -541,10 +339,18 @@ export default {
          this.detail = row
       }
     },
+    //日志详情
+    handleLogDetail(row) {
+      this.logDetailVisible = true;
+      this.logDetail = row;
+     },
+
     closeDrawer(){
       this.detailVisible = false;
       this.hydraulicDetailVisible=false;
-      this.wrenchDetailVisible=false;
+      this.wrenchDetailVisible = false;
+      this.logDetailVisible = false;
+      
     },
     changeUsedEvent(row,value){
 
@@ -589,14 +395,21 @@ export default {
         // console.log(file);
       }
     },
+    /**
+     * @Descripttion: 导出excel
+     * @name: likang
+     * @return {*}
+     */    
+    importHydExcels()
+    { 
+      this.queryParam.excelParam = this.excelParam;
+      this.exportExcel();
+      delete this.queryParam.excelParam;
+    },
     importCards() {
       // console.log(this.excel_url);
       var url = this.excel_url,
         depart_id = this.selectedDepartId;
-      if (depart_id == "") {
-        this.$message.error("请选择部门");
-        return;
-      }
       if (url == "") {
         this.$message.error("请上传文件");
         return;
@@ -604,7 +417,7 @@ export default {
       this.loadings = true;
       this.submitText = "导入中";
       this.$http
-        .post("cardDevice/import", { url: url, depart_id: depart_id })
+        .post("importHydExcel", { url: url})
         .then((response) => {
           if (response.data.error) {
             this.$message.error(response.data.msg);

+ 86 - 0
src/views/device/hyd_equipment/log/detail.vue

@@ -0,0 +1,86 @@
+
+<template>
+    <el-dialog :modal="false" title="日志" :visible.sync="drowDetailVisible">
+
+
+        <div class="item" v-if="this.record.rowtype == 1">
+            <pre>{{ gridData}}</pre>
+        </div>
+        <div class="item" v-else>
+            <pre v-html="gridData"></pre>
+        </div>
+
+    </el-dialog>
+</template>
+<script>
+import { elementInside } from 'dropzone';
+
+export default {
+    props: ["checkDetailVisible", "record"],
+    data() {
+        return {
+            gridData: '',
+         
+        };
+    },
+    computed: {
+        drowDetailVisible: {
+            set(val) {
+                this.$emit("sendVal", val); // 表示将子组件改变的值传递给父组件
+            },
+            get() {
+                this.$http.get("getLogDetail?id=" + this.record.id + '&type=' + this.record.rowtype).then((response) => {
+                    if (this.record.rowtype == 1)
+                    {
+                        this.gridData = JSON.stringify(response.data, null, 4);
+                    }
+                    else
+                    {
+                        this.gridData = response.data.replace(/\\n/g, '<br>')
+                    }
+                   
+                });
+                return this.checkDetailVisible; // 表示获取父组件的值
+            }
+        }
+
+    },
+
+
+};
+</script>
+<style scoped>
+
+.back-color {
+    background: black;
+    
+}
+
+.detail-item {
+    width: 100%;
+    padding: 15px 0px;
+    list-style-type: none;
+
+}
+
+.item {
+    font-size: 14px;
+    color: #FFF;
+    margin-top: 5px;
+    word-break: break-all;
+    word-wrap: break-word
+}
+
+.el-table .warning-row {
+    background: oldlace !important;
+}
+
+.el-table .success-row {
+    background: #f0f9eb !important;
+}
+
+.pagination-container {
+    padding-left: 25px;
+    padding-right: 25px;
+}
+</style>

+ 129 - 0
src/views/device/hyd_equipment/log/index.vue

@@ -0,0 +1,129 @@
+<template>
+    <el-drawer title="设备信息" :visible.sync="drawerVisible" :direction="direction" size="60%">
+        <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
+            <el-tab-pane label="日志记录" name="first">
+                <el-table :data="data" style="width: 100%; margin-left: 20px">
+                    <el-table-column prop="PublishVersion" label="版本号" align="center"></el-table-column>
+                    <el-table-column prop="AddTime" label="下发时间" align="center"></el-table-column>
+                    <el-table-column prop="AckTime" label="回复时间" align="center"></el-table-column>
+                    <el-table-column prop="Imei" label="设备号" align="center" min-width="160"></el-table-column>
+                    <el-table-column label="下发结果" align="center">
+                        <template slot-scope="scope">
+                            <p v-if="scope.row.Succ ==1">下发成功</p>
+                            <p v-else style="color:red">下发失败</p>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作" width="180" align="center" fixed="right">
+                        <template slot-scope="record">
+                            <el-tooltip content="下发日志" placement="top" :enterable="false">
+                                <el-button type="primary" size="mini" icon="el-icon-download"
+                                    @click="handleDetail(record.row,1)"></el-button>
+                            </el-tooltip>
+                            <el-tooltip content="上传日志" placement="top" :enterable="false">
+                                <el-button type="warning" size="mini" icon="el-icon-upload2"
+                                    @click="handleDetail(record.row,2)"></el-button>
+                            </el-tooltip>
+
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <el-pagination background class="pagination-container" @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange" :current-page="paginate.current" :page-sizes="paginate.sizes"
+                    :page-size="paginate.limit" :layout="paginate.layout" :total="paginate.total" />
+            </el-tab-pane>
+
+        </el-tabs>
+        <checkdetail :checkDetailVisible="checkDetailVisible" :record="detail" @sendVal="closeDrawer"></checkdetail>
+    </el-drawer>
+
+</template>
+<script>
+import rlListOperate from "@/layout/rl-list-operate/rlListOperate";
+import checkdetail from './detail.vue';
+export default {
+    components: { checkdetail },
+    props: ["detailVisible", "record"],
+    mixins: [rlListOperate],
+    data() {
+        return {
+            url: 'selectLogByImei',
+            drawer: false,
+            data: [],
+            direction: "rtl",
+            activeName: "first",
+            detail: '',
+            checkDetailVisible: false,
+            title: ''
+        };
+    },
+    methods: {
+
+        handleClick(tab, event) {
+            // console.log(tab, event);
+        },
+        closeDrawer() {
+            this.checkDetailVisible = false
+        },
+        handleDetail(row, rowtype) {
+            
+            row.rowtype = rowtype;
+            this.detail = row;
+            this.checkDetailVisible = true;
+        },
+        tableRowClassName({ row, rowIndex }) {
+            if (rowIndex === 1) {
+                return "warning-row";
+            } else if (rowIndex === 3) {
+                return "success-row";
+            }
+            return "";
+        },
+    },
+    computed: {
+        drawerVisible: {
+            set(val) {
+                this.$emit("sendVal", val); // 表示将子组件改变的值传递给父组件
+            },
+            get() {
+                if (this.detailVisible) {
+                    //获取维护记录
+                    this.queryParam.imei = this.record.list.imei;
+                    this.getList()
+                }
+                return this.detailVisible; // 表示获取父组件的值
+            },
+        },
+    },
+};
+</script>
+<style scoped>
+.back-color {
+    background: black;
+}
+
+.detail-item {
+    width: 100%;
+    padding: 15px 0px;
+    list-style-type: none;
+
+}
+
+.item {
+    font-size: 14px;
+    color: #FFF;
+    margin-top: 5px;
+}
+
+.el-table .warning-row {
+    background: oldlace !important;
+}
+
+.el-table .success-row {
+    background: #f0f9eb !important;
+}
+
+.pagination-container {
+    padding-left: 25px;
+    padding-right: 25px;
+}
+</style>

+ 15 - 1
src/views/permission/users/index.vue

@@ -203,6 +203,17 @@ export default {
    components: { Regionals },
    directives: { action },
   data() {
+    var validQC = (rule, value, callback) => {
+      if (value) {
+        if (/[\u4E00-\u9FA5]/g.test(value)) {
+          callback(new Error("不能输入汉字"));
+        } else {
+          // 验证通过
+          callback();
+        }
+        callback();
+      }
+    }
     return {
       cityOptions: regionData,
     
@@ -268,11 +279,14 @@ export default {
           label: 'role_name'
         }
       },
+    
       // 表单验证
       rules: {
         username: [
           { required: true, message: '请输入用户', trigger: 'blur' },
-          { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }
+          { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' },
+          { validator: validQC, trigger: "blur" }
+
         ],
         email: [
           // { required: true, message: '请输入邮箱地址', trigger: 'blur' },

+ 178 - 0
src/views/system/Issued_version/index.vue

@@ -0,0 +1,178 @@
+<template>
+  <div class="app-container">
+    <div class="filter-container">
+
+      <!-- <el-button class="filter-item" type="primary" icon="el-icon-plus" @click="handleCreate()">
+        新增
+      </el-button>
+      <el-button v-if="this.selectedIds.length" size="small" class="filter-item mb-5" type="danger" icon="el-icon-delete" @click="handleMultiDelete">
+        批量删除
+      </el-button> -->
+    </div>
+    <el-table ref="multipleTable" :data="data" tooltip-effect="dark" style="width: 100%" border fit
+      @selection-change="handleSelectMulti">
+      <el-table-column type="selection" width="55" align="center" />
+
+      <el-table-column label="指令类型" prop="directive" align="center" />
+      <el-table-column label="内容" prop="file_name" align="center" />
+
+      <el-table-column label="下发对象" align="center">
+        <template slot-scope="scope">
+          <p v-if="scope.row.type == 1">
+            <el-tag type="success">部分</el-tag>
+          </p>
+          <p v-else>
+            <el-tag type="success">全部</el-tag>
+          </p>
+        </template>
+      </el-table-column>
+      <el-table-column label="下发设备" prop="equ_ids" align="center" />
+
+      <el-table-column label="详情" prop="info" align="center" />
+      <el-table-column prop="created_at" label="下发时间" align="center" />
+      <el-table-column prop="creator" label="下发人" align="center" />
+      <el-table-column label="操作" width="200px" align="center">
+        <template slot-scope="word">
+          <!-- <el-button type="primary" icon="el-icon-edit" @click="handleUpdate(word.row)" /> -->
+          <el-button type="danger" icon="el-icon-delete" @click="handleDelete(word.row.id)" />
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-button type="primary" icon="el-icon-plus" :loading="downloadLoading" style="margin-top: 15px"
+      @click="handleCreate">添加</el-button>
+    <el-button type="danger" icon="el-icon-delete" v-if="selectedIds.length > 0" style="margin-top: 15px"
+      @click="handleMultiDelete()">删除</el-button>
+    <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+      :current-page="paginate.current" class="pagination-container" :page-sizes="paginate.sizes"
+      :page-size="paginate.limit" :layout="paginate.layout" :total="paginate.total" />
+    <!----------------------------------- 部门 ---------------------------------------------->
+    <el-dialog :title="title" :visible.sync="formVisible" @close="handleCancel" width="500px">
+
+
+      <el-form :ref="formName" :model="formFieldsData" :rules="rules">
+
+        <el-form-item label="选择指令类型" :label-width="formLabelWidth" prop="directive" required>
+          <el-select v-model="formFieldsData.directive" placeholder="请选择">
+            <el-option v-for="item in diroptions" :key="item.value" :label="item.text" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="下发对象" :label-width="formLabelWidth" prop="type" placeholder="请下发对象" required>
+          <el-select v-model="formFieldsData.type" placeholder="请选择" @change="Listen">
+            <el-option label="全部" value=1></el-option>
+            <el-option label="部分" value=2></el-option>
+          </el-select>
+        </el-form-item>
+
+        <!-- 选择设备 -->
+        <el-form-item label="选择设备" :label-width="formLabelWidth" prop="equ_ids" v-if="isHidden" required>
+          <el-select v-model="formFieldsData.equ_ids" placeholder="请选择" multiple>
+            <el-option v-for="item in options" :key="item.value" :label="item.text" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="指令" :label-width="formLabelWidth" prop="file_name" required>
+          <el-input type="textarea" v-model="formFieldsData.file_name" placeholder="请输入下发指令" style="width: 250px"
+            autocomplete="off" clearable />
+        </el-form-item>
+
+        <el-form-item label="详情" :label-width="formLabelWidth" prop="info">
+          <el-input type="textarea" v-model="formFieldsData.info" placeholder="请输入详情" style="width: 250px"
+            autocomplete="off" clearable />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleCancel">取 消</el-button>
+        <el-button type="primary" @click="handleSubmit">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import formOperate from '@/layout/mixin/formOperate'
+
+export default {
+  name: "lssue",
+  mixins: [formOperate],
+  data() {
+    return {
+    
+      isHidden: false,
+      formName: 'lssue',
+      formLabelWidth: '120px',
+      // 用户搜索
+      queryParam: {
+        status: '',
+        email: ''
+      },
+      options: [],
+      diroptions:[],
+      formVisible: false,
+      formFieldsData: {
+        file_name: '',
+        type: '',
+        equ_ids: '',
+        directive:'',
+        info:'',
+      },
+      url: 'lssue',
+      // 表单验证
+      rules: {
+        directive: [
+          { required: true, message: '请选择指令类型', trigger: 'blur' }
+        ],
+         type: [
+          { required: true, message: '请选择下发对象', trigger: 'blur' }
+        ],
+        equ_ids: [
+          { required: true, message: '请选择对象', trigger: 'blur' }
+        ],
+        file_name: [
+          { required: true, message: '请选择输入指令', trigger: 'blur' }
+        ]
+
+      }
+    }
+  },
+  created() {
+    this.$http.get("getAllHydEqu?type=2").then(resp => {
+      this.options = resp.data
+    });
+   
+    this.$http.post("sysDictData/getOptions", { type:'directive'}).then(resp => {
+      this.diroptions = resp.data
+    });
+
+
+   
+
+  },
+  methods: {
+
+    Listen(value)
+    {
+      if (value == 1)
+      {
+        this.isHidden = false;
+        this.formFieldsData.equ_ids = '';
+      }
+      else
+      {
+        this.isHidden = true;
+      }
+    }
+
+
+
+  },
+
+
+
+}
+</script>
+<style lang="scss" scoped>
+.filter-item {
+  margin-bottom: 10px;
+}
+</style>

+ 17 - 2
src/views/wind/wind/form/AddEditWind.vue

@@ -101,6 +101,18 @@ export default {
     },
   },
   data: function () {
+    var validQC = (rule, value, callback) => {
+
+      if (value) {
+        if (/[\u4E00-\u9FA5]/g.test(value)) {
+          callback(new Error("不能输入汉字"));
+        } else {
+          // 验证通过
+          callback();
+        }
+        callback();
+      }
+    };
     return {
       departmentData: [],
       departProps: {
@@ -127,8 +139,11 @@ export default {
           { required: true, message: "请选择所属部门", trigger: "blur" },
           { required: true, message: "请选择所属部门", trigger: "change" },
         ],
-
-
+        //风场编号
+        number: [
+          { validator: validQC, trigger: 'blur' }
+          
+        ],
         address: [
           { required: true, message: "请输入风场地址", trigger: "blur" },
           { required: true, message: "请输入风场地址", trigger: "change" },