dedsudiyu 1 éve
szülő
commit
832b764575
25 módosított fájl, 4434 hozzáadás és 306 törlés
  1. 192 0
      src/api/gasBottleManage/index.js
  2. 54 0
      src/api/lanyadingwei/index.js
  3. BIN
      src/assets/ZDimages/bigData3_2/gasBottleAlarm_a.png
  4. BIN
      src/assets/ZDimages/bigData3_2/gasBottleAlarm_b.png
  5. BIN
      src/assets/ZDimages/bigData3_2/icon_ai_alarm.png
  6. 94 0
      src/assets/styles/ZDlayout.scss
  7. 42 38
      src/layout/components/AppMain.vue
  8. 4 0
      src/utils/ruoyi.js
  9. 58 12
      src/views/comprehensive/message/warningNotice/index.vue
  10. 126 17
      src/views/comprehensive/message/warningNotice/infoPage.vue
  11. 8 8
      src/views/comprehensive/message/warningNotice/sourceOfDangerForewarning.vue
  12. 291 0
      src/views/emergencyManagement/smartLoT/bluetoothGateway/index.vue
  13. 705 0
      src/views/hazardManagement/gasBottleManage/InformationRecord/index.vue
  14. 310 0
      src/views/hazardManagement/gasBottleManage/beaconList/index.vue
  15. 330 0
      src/views/hazardManagement/gasBottleManage/cylinderSetting/index.vue
  16. 221 0
      src/views/hazardManagement/gasBottleManage/inventoryInformation/index.vue
  17. 228 0
      src/views/hazardManagement/gasBottleManage/outboundRecord/index.vue
  18. 233 0
      src/views/hazardManagement/gasBottleManage/outboundRecord/infoPage.vue
  19. 197 0
      src/views/hazardManagement/gasBottleManage/usageRecord/index.vue
  20. 256 0
      src/views/hazardManagement/gasBottleManage/usageRecord/infoPage.vue
  21. 228 0
      src/views/hazardManagement/gasBottleManage/warehousingRecord/index.vue
  22. 243 0
      src/views/hazardManagement/gasBottleManage/warehousingRecord/infoPage.vue
  23. 490 172
      src/views/newEvacuationBigData.vue
  24. 123 59
      src/views/newEvacuationBigDataHome.vue
  25. 1 0
      src/views/oneKeyOutfire/planExecuteRecord/planExecuteRecord.vue

+ 192 - 0
src/api/gasBottleManage/index.js

@@ -0,0 +1,192 @@
+import request from '@/utils/request'
+
+/**************** 信息记录 ******************/
+// 气体下拉框
+export function airbottleStockGroupBottleName (query) {
+  return request({
+    url: '/airbottle/stock/groupBottleName',
+    method: 'get',
+    params: query
+  })
+}
+
+// 出入库统计
+export function airbottleStatisticsList (query) {
+  return request({
+    url: '/airbottle/statistics/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 用气数统计
+export function airbottleStatisticsOutList (query) {
+  return request({
+    url: '/airbottle/statistics/outList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 用气量统计
+export function airbottleStatisticsApplyList (query) {
+  return request({
+    url: '/airbottle/statistics/applyList',
+    method: 'get',
+    params: query
+  })
+}
+
+/**************** 信标列表 ******************/
+// 信标列表
+export function airbottleBeaconList (data) {
+  return request({
+    url: '/airbottle/beacon/list',
+    method: 'post',
+    data: data
+  })
+}
+// 信标列表-新增
+export function airbottleBeaconAdd (data) {
+  return request({
+    url: '/airbottle/beacon/add',
+    method: 'post',
+    data: data
+  })
+}
+// 信标列表-详情
+export function airbottleBeaconFindById (query) {
+  return request({
+    url: '/airbottle/beacon/findById',
+    method: 'get',
+    params: query
+  })
+}
+// 信标列表-删除
+export function airbottleBeaconDelete (data) {
+  return request({
+    url: '/airbottle/beacon/delete',
+    method: 'post',
+    data: data
+  })
+}
+
+/**************** 使用记录 ******************/
+// 信标列表
+export function airbottleUsageRecordList (data) {
+  return request({
+    url: '/airbottle/usageRecord/list',
+    method: 'post',
+    data: data
+  })
+}
+// 信标列表-详情
+export function airbottleUsageRecordFindById (query) {
+  return request({
+    url: '/airbottle/usageRecord/findById',
+    method: 'get',
+    params: query
+  })
+}
+/**************** 入库/出库记录 ******************/
+// 入库/出库列表  type:1-入库,2-出库
+export function airbottleInOutRecordList (data) {
+  return request({
+    url: '/airbottle/inOutRecord/list',
+    method: 'post',
+    data: data
+  })
+}
+// 入库/出库-详情
+export function airbottleInOutRecordFindById (query) {
+  return request({
+    url: '/airbottle/inOutRecord/findById',
+    method: 'get',
+    params: query
+  })
+}
+
+/**************** 气瓶类型 ******************/
+// 气瓶类型-列表
+export function airbottleBottleTypeList (data) {
+  return request({
+    url: '/airbottle/bottleType/list',
+    method: 'post',
+    data: data
+  })
+}
+// 气瓶类型-新增
+export function airbottleBottleTypeAdd (data) {
+  return request({
+    url: '/airbottle/bottleType/add',
+    method: 'post',
+    data: data
+  })
+}
+// 气瓶类型-编辑
+export function airbottleBottleTypeUpdate (data) {
+  return request({
+    url: '/airbottle/bottleType/update',
+    method: 'post',
+    data: data
+  })
+}
+// 气瓶类型-详情
+export function airbottleBottleTypeFindById (query) {
+  return request({
+    url: '/airbottle/bottleType/findById',
+    method: 'get',
+    params: query
+  })
+}
+// 气瓶类型-删除
+export function airbottleBottleTypeDelete (data) {
+  return request({
+    url: '/airbottle/bottleType/delete',
+    method: 'post',
+    data: data
+  })
+}
+
+/**************** 库存信息 ******************/
+// 气瓶类型-列表
+export function airbottleStockList (data) {
+  return request({
+    url: '/airbottle/stock/list',
+    method: 'post',
+    data: data
+  })
+}
+/**************** 实验室气瓶查询 ******************/
+export function airbottleStockFindClassifyBySubId (query) {
+  return request({
+    url: '/airbottle/stock/findClassifyBySubId',
+    method: 'get',
+    params: query
+  })
+}
+
+/**************** 处理预警 ******************/
+// 处理预警
+export function laboratoryWarningNoticeLogUpdate (data) {
+  return request({
+    url: '/laboratory/warningNoticeLog/updateDeal',
+    method: 'post',
+    data: data
+  })
+}
+
+/*根据楼层实验室ID查询危险源列表*/
+export function airbottleStock (query) {
+  return request({
+    url: '/airbottle/stock/'+query,
+    method: 'get',
+  })
+}
+/*获取气瓶报警数据*/
+export function airbottleBluetoothGetBeaconNotice (query) {
+  return request({
+    url: '/airbottle/bluetooth/getBeaconNotice',
+    method: 'get',
+  })
+}

+ 54 - 0
src/api/lanyadingwei/index.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 蓝牙网关-列表
+export function airbottleBluetoothList(query) {
+  return request({
+    url: '/airbottle/bluetooth/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 蓝牙网关-详情
+export function airbottleBluetoothInfo(id) {
+  return request({
+    url: '/airbottle/bluetooth/'+id,
+    method: 'get',
+  })
+}
+
+// 蓝牙网关-新增
+export function airbottleBluetoothAdd(data) {
+  return request({
+    url: '/airbottle/bluetooth',
+    method: 'post',
+    data: data
+  })
+}
+
+// 蓝牙网关-修改
+export function laboratoryBuildingPut(data) {
+  return request({
+    url: '/airbottle/bluetooth',
+    method: 'put',
+    data: data
+  })
+}
+
+// 蓝牙网关-删除
+export function laboratoryBuildingDel(id) {
+  return request({
+    url: '/airbottle/bluetooth/' + id,
+    method: 'delete'
+  })
+}
+
+
+
+
+
+
+
+
+
+

BIN
src/assets/ZDimages/bigData3_2/gasBottleAlarm_a.png


BIN
src/assets/ZDimages/bigData3_2/gasBottleAlarm_b.png


BIN
src/assets/ZDimages/bigData3_2/icon_ai_alarm.png


+ 94 - 0
src/assets/styles/ZDlayout.scss

@@ -301,6 +301,100 @@
   padding:0;
   margin:5px 20px 20px 10px;
   box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.1);
+  .page-container{
+    flex:1;
+    display:flex;
+    flex-direction: column;
+    overflow: hidden;
+  }
+}
+
+//===========================页面查询按钮===========================
+.page-inquire-common-style-button{
+  font-weight:500;
+  cursor:pointer;
+  display: inline-block;
+  text-align: center;
+  width: 70px;
+  height: 40px;
+  line-height:40px;
+  font-size:14px;
+  border-radius: 6px;
+  border: 1px solid #0045AF;
+  color:#FFFFFF;
+  background-color:#0045AF;
+  margin:0 10px 0 0;
+  overflow: hidden;
+  i{
+    margin:0 5px 0 0;
+  }
+}
+.page-inquire-common-style-button:hover{
+  color:#FFFFFF;
+  background-color:#0183FA;
+  border: 1px solid #0183FA;
+}
+//===========================页面新增按钮===========================
+.page-add-common-style-button{
+  font-weight:500;
+  padding:0 20px;
+  height: 40px;
+  line-height:40px;
+  font-size:14px;
+  border-radius: 6px;
+  color: #FFFFFF;
+  border: 1px solid #0045AF;
+  background-color: #0045AF;
+  cursor:pointer;
+  margin:0;
+  text-align:center;
+  overflow: hidden;
+  i{
+    margin:0 5px 0 0;
+  }
+}
+.page-add-common-style-button:hover{
+  border:1px solid #0045AF;
+  background-color: #FFFFFF;
+  color:#0045AF;
+}
+//===========================页面重置按钮===========================
+.page-reset-common-style-button{
+  font-weight:500;
+  cursor:pointer;
+  display: inline-block;
+  text-align: center;
+  width: 70px;
+  height: 40px;
+  line-height:40px;
+  font-size:14px;
+  border-radius: 6px;
+  border: 1px solid #999999;
+  color:#999999;
+  background-color:#FFFFFF;
+  margin:0;
+  overflow: hidden;
+  i{
+    margin:0 5px 0 0;
+  }
+}
+.page-reset-common-style-button:hover{
+  color:#0183FA;
+  background-color:#E5F2FF;
+  border: 1px solid #0183FA;
+}
+//===========================右侧内容窗口页面公共样式===========================
+.page-form-title-box{
+  height:80px;
+  border-bottom:1px solid #dedede;
+  padding:20px 20px 0 20px;
+}
+.page-content-box{
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  padding:20px;
+  overflow: hidden;
 }
 //#app .app-container::-webkit-scrollbar {
 //  display: none;

+ 42 - 38
src/layout/components/AppMain.vue

@@ -18,6 +18,7 @@
 </template>
 
 <script>
+  import { airbottleBluetoothGetBeaconNotice } from "@/api/gasBottleManage/index";
   import { selectTriggerInfo } from '@/api/evacuationBigData/index.js'
   import store from '@/store'
   import mqtt from 'mqtt'
@@ -170,46 +171,49 @@ export default {
     //查询当前用户下的预案触发数据
     selectTriggerInfo(){
       let self = this;
-      selectTriggerInfo().then(response => {
-        //预案发生时候,存储值用于实验室配置传感器状态
-        let arr=[];
-        if(response.data){
-          arr=JSON.stringify(response.data)
-        }
-        localStorage.setItem('selectTriggerList',arr)
-        if(response.data[0]){
-          this.$set(this,'text',response.data.length>1?'有多个实验室发生预案':'有实验室发生预案');
-          this.$set(this,'buildId',response.data[0].buildId);
-          this.$set(this,'floorId',response.data[0].floorId);
-          this.$set(this,'subId',response.data[0].subId);
-          this.$set(this,'groupId',response.data[0].groupId);
-          if(response.data[0].riskAttribute == 1){
-            this.$set(this,'closePlan',true);
-          }
-          this.$set(this,'textType',true);
-          //没有火焰预案并且没有查看过
-          for(let i=0;i<response.data.length;i++){
-            if(response.data[i].riskAttribute != '1'&&response.data[i].ifCheck != '1'){
-              console.log('跳转2',self.$route.path);
-              //如果就在应急预案页面责终止跳转
-              if(self.$route.path == '/emergencyManagement/newPerformEvacuation' || self.$route.path == '/newEvacuationBigData'){
-                return
-              }
-              this.$router.push({
-                path: "/emergencyManagement/newPerformEvacuation",
-                query: {
-                  buildId: response.data[i].buildId,
-                  floorId:response.data[i].floorId,
-                  subId:response.data[i].subId,
-                  groupId:response.data[i].groupId,
-                }
-              })
-              return
+      let newList = [];
+      selectTriggerInfo().then(responseOne => {
+        newList = newList.concat(responseOne.data);
+        airbottleBluetoothGetBeaconNotice().then(responseTow => {
+          newList = newList.concat(responseTow.data);
+          let arr = JSON.stringify(newList);
+          //预案发生时候,存储值用于实验室配置传感器状态
+          localStorage.setItem('selectTriggerList',arr)
+          if(newList[0]){
+            this.$set(this,'text',newList.length>1?'有多个实验室发生预案':'有实验室发生预案');
+            this.$set(this,'buildId',newList[0].buildId);
+            this.$set(this,'floorId',newList[0].floorId);
+            this.$set(this,'subId',newList[0].subId);
+            this.$set(this,'groupId',newList[0].groupId);
+            if(newList[0].riskAttribute == 1){
+              this.$set(this,'closePlan',true);
             }
+            this.$set(this,'textType',true);
+            //没有火焰预案并且没有查看过
+            console.log('newList=================>',newList);
+            // for(let i=0;i<newList.length;i++){
+            //   if(newList[i].riskAttribute != '1'&&newList[i].ifCheck != '1'){
+            //     console.log('跳转2',self.$route.path);
+            //     //如果就在应急预案页面责终止跳转
+            //     if(self.$route.path == '/emergencyManagement/newPerformEvacuation' || self.$route.path == '/newEvacuationBigData'){
+            //       return
+            //     }
+            //     this.$router.push({
+            //       path: "/emergencyManagement/newPerformEvacuation",
+            //       query: {
+            //         buildId: newList[i].buildId,
+            //         floorId:newList[i].floorId,
+            //         subId:newList[i].subId,
+            //         groupId:newList[i].groupId,
+            //       }
+            //     })
+            //     return
+            //   }
+            // }
+          }else{
+            this.$set(this,'textType',false);
           }
-        }else{
-          this.$set(this,'textType',false);
-        }
+        })
       })
     },
   }

+ 4 - 0
src/utils/ruoyi.js

@@ -66,6 +66,10 @@ export function parseTime(time, pattern) {
 	if (arguments.length === 0 || !time) {
 		return null
 	}
+  if(time.indexOf('T')!== -1){
+    let newTime = time.split('T')
+    time = newTime[0] + ' ' + newTime[1]
+  }
 	const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
 	let date
 	if (typeof time === 'object') {

+ 58 - 12
src/views/comprehensive/message/warningNotice/index.vue

@@ -40,28 +40,36 @@
             <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
             <p class="reset-button-one" @click="resetQuery">重置</p>
           </el-form-item>
-          <el-form-item style="float: right;">
+          <el-form-item style="float: right;" v-if="outButtonData.type">
             <el-col :span="1.5">
-              <p class="inquire-button-one"
+              <p class="reset-button-one"
                  style="width:100px;"
-                 @click="goPage(3)"
-              >危险源预警</p>
+                 @click="outButton"
+              >返回</p>
             </el-col>
           </el-form-item>
           <el-form-item style="float: right;">
             <el-col :span="1.5">
               <p class="inquire-button-one"
                  style="width:100px;"
-                 @click="goPage(2)"
-              >算法预警</p>
+                 @click="goPage(3)"
+              >危险源预警</p>
             </el-col>
           </el-form-item>
+          <!--<el-form-item style="float: right;">-->
+            <!--<el-col :span="1.5">-->
+              <!--<p class="inquire-button-one"-->
+                 <!--style="width:100px;"-->
+                 <!--@click="goPage(2)"-->
+              <!--&gt;算法预警</p>-->
+            <!--</el-col>-->
+          <!--</el-form-item>-->
         </el-form>
       </div>
       <div class="content-box">
         <el-table  border :data="tableList" ref="multipleTable">
           <el-table-column label="预警时间" align="center" prop="warningTime" show-overflow-tooltip/>
-          <el-table-column label="预警类型" align="center" prop="warningType" show-overflow-tooltip width="300">
+          <el-table-column label="预警类型" align="center" prop="warningType" show-overflow-tooltip width="200">
             <template slot-scope="scope">
               <div class="table-button-box">
                 <span v-if="scope.row.warningType==1">算法识别</span>
@@ -70,14 +78,22 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="预警内容" align="center" prop="warningContent" show-overflow-tooltip width="300"/>
-          <el-table-column label="预警方式" align="center" prop="warningWay" show-overflow-tooltip width="300"/>
-          <el-table-column label="实验室" sortable="custom" align="center" prop="subName" show-overflow-tooltip width="300"/>
+          <el-table-column label="预警内容" align="center" prop="warningContent" show-overflow-tooltip width="249"/>
+          <el-table-column label="预警方式" align="center" prop="warningWay" show-overflow-tooltip width="200"/>
+          <el-table-column label="学院"  align="center" prop="deptName" show-overflow-tooltip width="200"/>
+          <el-table-column label="实验室"  align="center" prop="subName" show-overflow-tooltip width="230"/>
+          <el-table-column label="处理状态" align="center" prop="start" show-overflow-tooltip width="134">
+            <template slot-scope="scope">
+              <span v-if="scope.row.warningType==3">{{scope.row.start?'已处理':'待处理'}}</span>
+              <span v-else>-</span>
+            </template>
+          </el-table-column>
           <el-table-column label="操作" align="center" prop="deptName" width="150">
             <template slot-scope="scope">
               <div class="table-button-box">
                 <p class="table-button-null"></p>
-                <p class="table-button-p" @click="clickPage(4,scope.row)">详情</p>
+                <p class="table-button-p" v-if="scope.row.warningType == 3 && scope.row.dispose == 0" @click="clickPage(4,scope.row)">处理</p>
+                <p class="table-button-p" v-else @click="clickPage(4,scope.row)">详情</p>
                 <p class="table-button-null"></p>
               </div>
             </template>
@@ -127,15 +143,39 @@
         tableList:[],
         total:0,
         pageData:{},
+        //返回按钮
+        outButtonData:{
+          type:false,
+          buildId:"",
+          floorId:"",
+          subId:"",
+        },
       }
     },
     created(){
-
+      if (this.$route.query.type == 'out') {
+        this.$set(this,'outButtonData',{
+          type:true,
+          buildId:this.$route.query.buildId,
+          floorId:this.$route.query.floorId,
+          subId:this.$route.query.subId,
+        })
+      }
     },
     mounted(){
         this.getList()
     },
     methods:{
+      outButton(){
+        this.$router.push({
+          path: "/emergencyManagement/newPerformEvacuation",
+          query: {
+            buildId: this.outButtonData.buildId,
+            floorId:this.outButtonData.floorId,
+            subId:this.outButtonData.subId,
+          }
+        })
+      },
       goPage(type){
         if(type != this.pageType){
           this.$set(this,'pageType',type);
@@ -147,6 +187,12 @@
       //详情
       clickPage(type,row){
         this.pageData.id=row.id
+        if(row.warningType == 3){
+          this.pageData.type = true
+          if(row.dispose == 0){
+            this.pageData.handle = true
+          }
+        }
         this.$set(this,'pageType',type);
 
       },

+ 126 - 17
src/views/comprehensive/message/warningNotice/infoPage.vue

@@ -34,10 +34,10 @@
               <p><span>{{infoData.warningWay}}</span></p>
             </div>
           </div>
-          <div class='info-box'>
+          <div class='info-box' style="width:700px;">
             <div>
               <p>位置:</p>
-              <p>{{infoData.subName}}-{{infoData.buildName}}{{infoData.floorName}}{{infoData.roomNum}}</p>
+              <p>{{infoData.buildName}}{{infoData.floorName}}{{infoData.subName}}{{infoData.roomNum?'('+infoData.roomNum+')':''}}</p>
             </div>
           </div>
         </div>
@@ -112,16 +112,18 @@
               <p>{{infoData.specification}}</p>
             </div>
           </div>
-          <div class='info-box' v-if="infoData.warningSubType==2">
+        </div>
+        <div class='info-big-box'>
+          <div class='info-box'>
             <div>
-              <p>申领人:</p>
-              <p>{{infoData.applyUser}}</p>
+              <p>定位状态:</p>
+              <p>{{infoData.locationState == 0 ?'离位':'在位'}}</p>
             </div>
           </div>
-          <div class='info-box' v-if="infoData.warningSubType==2">
+          <div class='info-box'>
             <div>
-              <p>申领时间:</p>
-              <p>{{infoData.applyTime}}</p>
+              <p>处理状态:</p>
+              <p>{{infoData.dispose == 0 ?'未处理':'已处理'}}</p>
             </div>
           </div>
         </div>
@@ -132,18 +134,64 @@
           <p v-for="(item,index) in infoData.messageVOList" :key="index">{{item.name}} - {{item.messageTime}}</p>
         </div>
       </div>
-      <div class="info-max-for-img-box" v-if="infoData.warningSubType!=2 && infoData.warningSubType!=3 && infoData.warningSubType!=4">
-        <p class="title-p">报警抓拍</p>
-        <div class='info-big-box'>
-          <div v-if="infoData.warningType!=1" class="for-video-box"  @click="lookVideo(videoUrl+infoData.recordVideo,'')">
-            <video :src="videoUrl+infoData.recordVideo" controls="controls"></video>
-            <p class="el-icon-video-play positionP"></p>
+      <div class="info-max-box" v-if="infoData.warningType==3">
+        <p class="title-p">预警处理</p>
+        <div class='info-big-box' v-if="infoData.dispose == 1">
+          <div class='info-box'>
+            <div>
+              <p>处理人:</p>
+              <p>{{infoData.updateName}}</p>
+            </div>
+          </div>
+          <div class='info-box'>
+            <div>
+              <p>处理时间:</p>
+              <p>{{parseTime(infoData.updateTime,'{y}-{m}-{d} {h}:{i}')}}</p>
+            </div>
           </div>
-          <div v-if="infoData.warningType==1" class="for-img-box" v-for="(item,index) in infoData.warningDetailList" :key="index" @click="lookImg(infoData.warningDetailList,index)">
-            <img :src="item.photoUrl">
+        </div>
+        <div class='info-big-box' v-if="infoData.dispose == 1">
+          <div class='info-box'>
+            <div>
+              <p>处理备注:</p>
+              <p>{{infoData.remark}}</p>
+            </div>
+          </div>
+        </div>
+        <div class="dispose-box" v-if="infoData.dispose == 0">
+          <el-form ref="disposeForm" :model="disposeForm" :rules="rules" label-width="100px">
+            <el-form-item style="margin-top:20px;" label="处理备注:" prop="remark">
+              <el-input
+                type="textarea"
+                style="width:1200px;"
+                maxlength="100"
+                resize="none"
+                show-word-limit
+                :autosize="{ minRows: 2, maxRows: 4}"
+                placeholder="请输入处理备注"
+                v-model="disposeForm.remark">
+              </el-input>
+            </el-form-item>
+          </el-form>
+          <div class="dispose-button-box">
+            <p></p>
+            <p @click="upDispose">确定处理</p>
+            <p></p>
           </div>
         </div>
       </div>
+      <!--<div class="info-max-for-img-box" v-if="infoData.warningSubType!=2 && infoData.warningSubType!=3 && infoData.warningSubType!=4">-->
+        <!--<p class="title-p">报警抓拍</p>-->
+        <!--<div class='info-big-box'>-->
+          <!--<div v-if="infoData.warningType!=1" class="for-video-box"  @click="lookVideo(videoUrl+infoData.recordVideo,'')">-->
+            <!--<video :src="videoUrl+infoData.recordVideo" controls="controls"></video>-->
+            <!--<p class="el-icon-video-play positionP"></p>-->
+          <!--</div>-->
+          <!--<div v-if="infoData.warningType==1" class="for-img-box" v-for="(item,index) in infoData.warningDetailList" :key="index" @click="lookImg(infoData.warningDetailList,index)">-->
+            <!--<img :src="item.photoUrl">-->
+          <!--</div>-->
+        <!--</div>-->
+      <!--</div>-->
     </div>
     <lookImgDialog ref="lookImgDialog"></lookImgDialog>
     <lookVideoDialog ref="lookVideoDialog"></lookVideoDialog>
@@ -152,6 +200,7 @@
 
 <script>
   import { warningNoticeLogDetail} from '@/api/laboratory/warningNotice'
+  import { laboratoryWarningNoticeLogUpdate} from '@/api/gasBottleManage/index'
   import lookImgDialog from '@/components/lookImgDialog/lookImgDialog.vue'
   import lookVideoDialog from '@/components/lookVideoDialog/lookVideoDialog.vue'
   export default {
@@ -173,7 +222,15 @@
           {fileName:"",fileUrl:"http://192.168.1.43/statics/2023/06/06/baba141f-05b4-4d3a-b4e6-81d67096cfd1.jpg"},
           {fileName:"",fileUrl:"http://192.168.1.43/statics/2023/06/06/0e76d4b5-536e-449b-b8ce-7fa9ff48ced6.jpg"},
         ],
-
+        disposeForm:{
+          remark:"",
+        },
+        rules:{
+          remark: [
+            { required: true, message: "请输入处理备注", trigger: "change" },
+            { required: true, message: "请输入处理备注", validator: this.spaceJudgment, trigger: "change" },
+          ],
+        }
       }
     },
     created(){
@@ -182,6 +239,29 @@
       this.getInfo();
     },
     methods:{
+      upDispose(){
+        let self = this;
+        this.$refs["disposeForm"].validate(valid => {
+          if (valid) {
+            this.$confirm('是否确认处理?', "警告", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(function() {
+            }).then(() => {
+              let obj = {
+                id:self.infoData.id,
+                remark:self.disposeForm.remark,
+                dispose:1,
+              }
+              laboratoryWarningNoticeLogUpdate(obj).then( response => {
+                self.msgSuccess(response.msg)
+                self.getInfo();
+              });
+            }).catch(() => {});
+          }
+        })
+      },
       //查看视屏
       lookVideo(item){
         this.$refs.lookVideoDialog.lookVideoDialogOpen(1,item,'报警抓拍');
@@ -288,6 +368,35 @@
           background-color: #D8D8D8;
           margin:0 24px;
         }
+        .dispose-box{
+          .dispose-button-box{
+            display: flex;
+            margin-top:40px;
+            p:nth-child(1){
+              flex:1;
+            }
+            p:nth-child(2){
+              width:90px;
+              height:40px;
+              line-height:38px;
+              color:#fff;
+              font-size:14px;
+              text-align: center;
+              background-color: #0045AF;
+              border:1px solid #0045AF;
+              border-radius:6px;
+              cursor: pointer;
+            }
+            p:nth-child(2):hover{
+              color:#0183fa;
+              background-color: #fff;
+              border:1px solid #0183fa;
+            }
+            p:nth-child(3){
+              flex:1;
+            }
+          }
+        }
       }
       .info-max-for-message-box{
         margin:0 57px;

+ 8 - 8
src/views/comprehensive/message/warningNotice/sourceOfDangerForewarning.vue

@@ -47,12 +47,12 @@
                          v-for="item in checkListB" :value="item.key" :label="item.key" :key="item.key">{{item.value}}</el-checkbox>
           </el-checkbox-group>
         </el-form-item>
-        <el-form-item class="form-item-check-box" label="超时未归还">
-          <el-checkbox-group v-model="addForm2.timeout">
-            <el-checkbox style="width:100px;margin-top:2px;"
-                         v-for="item in checkListB" :value="item.key" :label="item.key" :key="item.key">{{item.value}}</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
+        <!--<el-form-item class="form-item-check-box" label="超时未归还">-->
+          <!--<el-checkbox-group v-model="addForm2.timeout">-->
+            <!--<el-checkbox style="width:100px;margin-top:2px;"-->
+                         <!--v-for="item in checkListB" :value="item.key" :label="item.key" :key="item.key">{{item.value}}</el-checkbox>-->
+          <!--</el-checkbox-group>-->
+        <!--</el-form-item>-->
       </el-form>
     </div>
     <div class="bottom-button-max-box">
@@ -71,7 +71,7 @@ import { warningConfigAdd, warningConfigList } from '@/api/laboratory/warningNot
     name: 'sourceOfDangerForewarning',
     data(){
       return{
-        checkListA:[{key:"1",value:"系统通知"},{key:"2",value:"短信通知"},{key:"3",value:"声光报警"},{key:"5",value:"电话通知"},],
+        checkListA:[{key:"1",value:"系统通知"},{key:"2",value:"短信通知"},{key:"3",value:"声光报警"},],
         checkListB:[{key:"1",value:"系统通知"},{key:"2",value:"短信通知"},{key:"3",value:"声光报警"},],
         checkListC:[{key:"1",value:"系统通知"},{key:"2",value:"短信通知"}],
         addForm:{//化学品
@@ -143,7 +143,7 @@ import { warningConfigAdd, warningConfigList } from '@/api/laboratory/warningNot
             obj.push(this.addForm)
             obj.push(this.addForm2)
             for(let i=0;i<obj.length;i++){
-              obj[i].illegalRemoval=obj[i].illegalRemoval.join(',');
+              obj[i].illegalRemoval=obj[i].illegalRemoval+'';
               obj[i].timeout=obj[i].timeout.join(',');
               obj[i].expired=obj[i].expired.join(',');
               obj[i].unexpired=obj[i].unexpired.join(',');

+ 291 - 0
src/views/emergencyManagement/smartLoT/bluetoothGateway/index.vue

@@ -0,0 +1,291 @@
+<!--蓝牙网关-->
+<template>
+  <div class="app-container bluetoothGateway">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" class="form-box">
+      <el-form-item label="关键字" prop="searchValue">
+        <el-input
+          maxlength="10"
+          v-model="queryParams.searchValue"
+          placeholder="预案名称/创建人"
+          clearable
+        />
+      </el-form-item>
+      <el-form-item label="学院" prop="deptId">
+        <el-select v-model="queryParams.deptId" clearable placeholder="请选择学院">
+          <el-option
+            v-for="dict in deptOptions"
+            :key="dict.deptId"
+            :label="dict.deptName"
+            :value="dict.deptId"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="状态" prop="gatewayOnline">
+        <el-select v-model="queryParams.gatewayOnline" clearable placeholder="请选择状态">
+          <el-option label="离线" value="0" />
+          <el-option label="在线" value="1" />
+        </el-select>
+      </el-form-item>
+      <el-form-item style="float: right;">
+        <el-col :span="1.5">
+          <p class="page-add-common-style-button"
+             @click="tableButton(1)"
+             v-hasPermi="['demo:demo:demo']"
+          >+  新增蓝牙网关</p>
+        </el-col>
+      </el-form-item>
+      <el-form-item>
+        <p class="inquire-button-one" @click="handleQuery">查询</p>
+        <p class="reset-button-one" @click="resetQuery">重置</p>
+      </el-form-item>
+    </el-form>
+    <el-table v-loading="loading" border :data="dataList">
+      <el-table-column label="名称" align="left" prop="gatewayName"/>
+      <el-table-column label="网关" align="left" prop="gatewayMac" width="249" show-overflow-tooltip/>
+      <el-table-column label="状态" align="left" prop="gatewayOnline" width="200" show-overflow-tooltip>
+        <template slot-scope="scope">{{scope.row.gatewayOnline==0?'离线':'在线'}}</template>
+      </el-table-column>
+      <el-table-column label="学院" align="left" prop="deptName" width="300" show-overflow-tooltip/>
+      <el-table-column label="实验室名称" align="left" prop="subName" width="350" show-overflow-tooltip/>
+      <el-table-column label="操作" align="left" class-name="small-padding fixed-width" width="160" v-if="tableButtonType">
+        <template slot-scope="scope">
+          <div class="table-button-box">
+            <p class="table-button-null"></p>
+            <p class="table-button-p" @click="tableButton(2,scope.row)" v-hasPermiAnd="['demo:demo:demo','demo:demo:demo']">编辑</p>
+            <p class="table-button-p" @click="tableButton(3,scope.row)" v-hasPermi="['demo:demo:demo']">删除</p>
+            <p class="table-button-null"></p>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination :page-sizes="[20, 30, 40, 50]"
+                v-show="total>0"
+                :total="total"
+                layout="total, prev, pager, next, sizes, jumper"
+                :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize"
+                @pagination="getList"
+    />
+
+    <el-dialog :title="dialogTitle" :visible.sync="dialogType" v-if="dialogType"
+               :close-on-click-modal="false" width="600px" append-to-body>
+      <el-form ref="dialogForm" :model="dialogForm" :rules="rules" label-width="80px">
+        <el-form-item label="名称" prop="gatewayName">
+          <el-input v-model="dialogForm.gatewayName" placeholder="请输入名称" maxLength="20" style="width:450px;"/>
+        </el-form-item>
+        <el-form-item label="网关" prop="gatewayMac">
+          <el-input v-model="dialogForm.gatewayMac" placeholder="请输入网关" maxLength="20" style="width:450px;"/>
+        </el-form-item>
+        <el-form-item label="实验室" prop="subId">
+          <el-select
+            style="width:450px;"
+            v-model="dialogForm.subId"
+            filterable
+            remote
+            clearable
+            reserve-keyword
+            @focus="selectFocus"
+            @change="selectChange"
+            placeholder="请选择实验室"
+            :remote-method="getSub"
+            :loading="loading">
+            <el-option
+              v-for="item in laboratoryOptions"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <p class="dialog-footer-null-p"></p>
+        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submit">确 定</el-button>
+        <p class="dialog-footer-null-p"></p>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+  import { airbottleBluetoothList, airbottleBluetoothInfo,
+    airbottleBluetoothAdd, laboratoryBuildingPut,
+    laboratoryBuildingDel } from '@/api/lanyadingwei/index'
+  import {listDepartments} from "@/api/system/dept";
+  import { subjectList } from '@/api/gasManage3_0/gasManage'
+  export default {
+    name: 'index',
+    data(){
+      return{
+        tableButtonType:this.hasPermiDom(['demo:demo:demo','demo:demo:demo']),
+        loading:false,
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          deptId:"",
+          gatewayOnline:"",
+        },
+        deptOptions:{},
+        dataList:[],
+        total:0,
+        dialogTitle:"",
+        dialogType:false,
+        dialogLookType:false,
+        dialogForm:{
+          gatewayName:"",
+          gatewayMac:"",
+          subName:"",
+          subId:"",
+          deptId:"",
+          deptName:"",
+        },
+        laboratoryOptions:[],
+        // 表单校验
+        rules: {
+          gatewayName: [
+            { required: true, message: "请输入名称", trigger: "change" },
+            { required: true, message: "请输入名称", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          gatewayMac: [
+            { required: true, message: "请输入网关", trigger: "change" },
+            { required: true, message: "请输入网关", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          subId: [
+            { required: true, message: "请选择实验室", trigger: "change" },
+          ],
+        },
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.listDepartments();
+      this.getList();
+    },
+    methods:{
+      cancel(){
+        this.$set(this,'dialogType',false);
+      },
+      submit(){
+        this.$refs["dialogForm"].validate((valid) => {
+          if (valid) {
+            if(!this.dialogForm.id){
+              //新增
+              airbottleBluetoothAdd(this.dialogForm).then(response => {
+                this.msgSuccess(response.msg)
+                this.getList();
+                this.$set(this,'dialogType',false);
+              });
+            }else{
+              //修改
+              laboratoryBuildingPut(this.dialogForm).then(response => {
+                this.msgSuccess(response.msg)
+                this.getList();
+                this.$set(this,'dialogType',false);
+              });
+            }
+          }
+        })
+      },
+      selectChange(val){
+        let self = this;
+        for(let i=0;i<self.laboratoryOptions.length;i++){
+          if(val == self.laboratoryOptions[i].id){
+            this.$set(this.dialogForm,'subName',self.laboratoryOptions[i].name);
+            this.$set(this.dialogForm,'deptId',self.laboratoryOptions[i].deptId);
+            this.$set(this.dialogForm,'deptName',self.laboratoryOptions[i].deptName);
+          }
+        }
+      },
+      selectFocus(){
+        if(!this.laboratoryOptions[0]){
+          this.getSub("");
+        }
+      },
+      //懒加载实验室
+      getSub(e){
+        subjectList({name:e}).then(response => {
+          this.$set(this,'laboratoryOptions',response.data);
+        });
+      },
+      //学院
+      listDepartments(){
+        listDepartments({}).then(response => {
+          this.$set(this, 'deptOptions', response.data)
+        });
+      },
+      // 列表
+      getList(){
+        airbottleBluetoothList(this.queryParams).then(response => {
+          this.$set(this, 'dataList', response.rows)
+          this.$set(this, 'total', response.total)
+        });
+      },
+      //表格按钮
+      tableButton(type,row){
+        let self = this;
+        if (type == 1){
+          this.$set(this,'dialogForm',{
+            gatewayName:"",
+            gatewayMac:"",
+            subName:"",
+            subId:"",
+            deptId:"",
+            deptName:"",
+          });
+          this.$set(this,'dialogType',true);
+        } else if(type == 2){
+          this.$set(this,'dialogForm',{
+            id:row.id,
+            gatewayName:row.gatewayName,
+            gatewayMac:row.gatewayMac,
+            subName:row.subName,
+            subId:row.subId,
+            deptId:row.deptId,
+            deptName:row.deptName,
+          });
+          this.getSub(row.subName);
+          this.$set(this,'dialogType',true);
+        } else if(type == 3){
+          this.$confirm('是否确认删除?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            laboratoryBuildingDel(row.id).then(response => {
+              self.msgSuccess(response.msg)
+              self.getList();
+            });
+          }).then(() => {
+          }).catch(() => {});
+        }
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.queryParams.pageSize = 20;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'queryParams',{
+          searchValue:"",
+          deptId:"",
+          gatewayOnline:"",
+        });
+        this.handleQuery();
+      },
+    }
+  }
+</script>
+<style scoped lang="scss">
+  .bluetoothGateway{
+    display: flex!important;
+    flex-direction: column;
+    box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+    padding:20px!important;
+
+  }
+</style>

+ 705 - 0
src/views/hazardManagement/gasBottleManage/InformationRecord/index.vue

@@ -0,0 +1,705 @@
+<!-- 信息记录 -->
+<template>
+  <div class="app-container InformationRecord">
+    <div class="max-top-box">
+      <p class="title-p">出库信息统计</p>
+      <el-select class="top-select" @change="topSelectChange"
+                 v-model="topValue" placeholder="请选择">
+        <el-option
+          v-for="item in options"
+          :key="item.id"
+          :label="item.gasName"
+          :value="item.id">
+        </el-option>
+      </el-select>
+      <div id="top-eCharts-box"></div>
+    </div>
+    <div class="max-bottom-box">
+      <div class="big-left-box">
+        <p class="title-p">用气数统计</p>
+        <el-select class="left-select" @change="leftSelectChange"
+                   v-model="leftValue" placeholder="请选择">
+          <el-option
+            v-for="item in options"
+            :key="item.id"
+            :label="item.gasName"
+            :value="item.id">
+          </el-option>
+        </el-select>
+        <div id="left-eCharts-box"></div>
+      </div>
+      <div class="big-right-box">
+        <p class="title-p">用气量统计</p>
+        <el-select class="right-select" @change="rightSelectChange"
+                   v-model="rightValue" placeholder="请选择">
+          <el-option
+            v-for="item in options"
+            :key="item.id"
+            :label="item.gasName"
+            :value="item.id">
+          </el-option>
+        </el-select>
+        <div id="right-eCharts-box"></div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+  import echarts from 'echarts'
+  import { airbottleStockGroupBottleName,airbottleStatisticsList,
+    airbottleStatisticsOutList,airbottleStatisticsApplyList, } from "@/api/gasBottleManage/index";
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  //import addPage from "./addPage.vue";
+  export default {
+    name: 'index',
+    //components: {
+    //  addPage
+    //},
+    data () {
+      return {
+        options:[],
+        topValue:'',
+        topData:{},
+        leftValue:'',
+        leftData:{},
+        rightValue:'',
+        rightData:{},
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      this.getOptions();
+      this.topSelectChange();
+      this.leftSelectChange();
+      this.rightSelectChange();
+    },
+    methods: {
+      //获取气体类型列表
+      getOptions(){
+        airbottleStockGroupBottleName().then(response => {
+          let list = [{gasName:'全部气体',id:''}]
+          list = list.concat(response.data)
+          this.$set(this,'options',list);
+        });
+      },
+      //出入库信息统计
+      topSelectChange(val){
+        airbottleStatisticsList({gasName:this.forNameList(val)}).then(response => {
+          let timeData = [];
+          let leftData = [];
+          let rightData = [];
+          let numList = [];
+          let num = 4;
+          for(let i=0;i<response.data.inList.length;i++){
+            timeData.push(response.data.inList[i].recordMonth);
+            leftData.push(response.data.inList[i].totalNum);
+            rightData.push(response.data.outList[i].totalNum);
+            let numMax = response.data.inList[i].totalNum>=response.data.outList[i].totalNum?response.data.inList[i].totalNum:response.data.outList[i].totalNum;
+            num = numMax>num?numMax:num;
+          }
+          for(let i=0;i<response.data.inList.length;i++){
+            numList.push(num);
+          }
+          this.topECharts(timeData,leftData,rightData,numList);
+        });
+      },
+      //用气数统计
+      leftSelectChange(val){
+        airbottleStatisticsOutList({gasName:this.forNameList(val)}).then(response => {
+          let listData = [];
+          let numList = [];
+          let num = 4;
+          for(let i=0;i<response.data.length;i++){
+            listData.push({
+              name:response.data[i].recordMonth,
+              value:response.data[i].totalNum,
+            });
+            num = response.data[i].totalNum>num?response.data[i].totalNum:num;
+          }
+          for(let i=0;i<response.data.length;i++){
+            numList.push(num);
+          }
+          console.log('listData',listData)
+          console.log('numList',numList)
+          this.leftECharts(listData,numList);
+        });
+      },
+      //用气量统计
+      rightSelectChange(val){
+        airbottleStatisticsApplyList({gasName:this.forNameList(val)}).then(response => {
+          let nameList = [];
+          let dataList = [];
+          let num = 4;
+
+          for(let i=0;i<response.data.length;i++){
+            nameList.push(response.data[i].recordMonth);
+            dataList.push(response.data[i].totalNum);
+            num = response.data[i].totalNum>num?response.data[i].totalNum:num;
+          }
+          this.rightECharts(nameList,dataList,num);
+        });
+      },
+      topECharts(timeData,leftData,rightData,numList){
+        let self = this;
+        let myChart = this.$echarts.init(document.getElementById('top-eCharts-box'));
+        let option = {
+          backgroundColor: "#fff",
+          tooltip: {
+            trigger: "axis",
+            axisPointer: {
+              // 坐标轴指示器,坐标轴触发有效
+              type: false, // 默认为直线,可选为:'line' | 'shadow'
+            },
+          },
+          grid: {
+            left: "2%",
+            right: "2%",
+            bottom: "5%",
+            top: "20%",
+            containLabel: true,
+          },
+          legend: {
+            data: ["入库", "出库"],
+            left: 60,
+            top: 60,
+            textStyle: {
+              color: "#333",
+            },
+            itemWidth: 12,
+            itemHeight: 10,
+            // itemGap: 35
+          },
+          xAxis: {
+            type: "category",
+            data: timeData,
+            axisLine: {
+              lineStyle: {
+                color: "#666666",
+              },
+            },
+            axisTick: {
+              show: false,
+            },
+            axisLabel: {
+              textStyle: {
+                color: "#666666",
+                // fontSize: 12,
+              },
+            },
+          },
+          yAxis: {
+            type: "value",
+            // max: "1200",
+            axisLine: {
+              lineStyle: {
+                color: "#666666",
+              },
+            },
+            axisTick: {
+              show: false,
+            },
+            min: 0,
+            max: numList[0] <= 4 ? 4 : numList[0],
+            splitLine: {
+              show: true,
+              lineStyle: {
+                color: "rgba(255,255,255,0)",
+              },
+            },
+            axisLabel: {
+              formatter: "{value}个",
+              textStyle: {
+                color: "#666666",
+                // fontSize: 12,
+              },
+            },
+          },
+          dataZoom: [
+            {
+              show: false,
+              height: 12,
+              xAxisIndex: [0],
+              bottom: "8%",
+              start: 10,
+              end: 120,
+              handleIcon:
+                "path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
+              handleSize: "110%",
+              handleStyle: {
+                color: "#d3dee5",
+              },
+              textStyle: {
+                color: "#fff",
+              },
+              borderColor: "#90979c",
+            },
+            // 缩放
+            // {
+            //   type: "inside",
+            //   show: true,
+            //   height: 15,
+            //   start: 1,
+            //   end: 35,
+            // },
+          ],
+          series: [
+            {
+              name: "入库",
+              type: "bar",
+              barWidth: "15%",
+              itemStyle: {
+                normal: {
+                  color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                    {
+                      offset: 0,
+                      color: "#88C8FF",
+                    },
+                    {
+                      offset: 1,
+                      color: "#0183FA",
+                    },
+                  ]),
+                  barBorderRadius: 12,
+                },
+              },
+              data: leftData,
+            },
+            {
+              name: "出库",
+              type: "bar",
+              barWidth: "15%",
+              itemStyle: {
+                normal: {
+                  color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                    {
+                      offset: 0,
+                      color: "#F28E26",
+                    },
+                    {
+                      offset: 1,
+                      color: "#FFDEBC",
+                    },
+                  ]),
+                  barBorderRadius: 11,
+                },
+              },
+              data: rightData,
+            },
+          ],
+        };
+
+        // let app = {
+        //   currentIndex: -1,
+        // };
+        // setInterval(function () {
+        //   let dataLen = option.series[0].data.length;
+        //   // 取消之前高亮的图形
+        //   myChart.dispatchAction({
+        //     type: "downplay",
+        //     seriesIndex: 0,
+        //     dataIndex: app.currentIndex,
+        //   });
+        //   app.currentIndex = (app.currentIndex + 1) % dataLen;
+        //   //console.log(app.currentIndex);
+        //   // 高亮当前图形
+        //   myChart.dispatchAction({
+        //     type: "highlight",
+        //     seriesIndex: 0,
+        //     dataIndex: app.currentIndex,
+        //   });
+        //   // 显示 tooltip
+        //   myChart.dispatchAction({
+        //     type: "showTip",
+        //     seriesIndex: 0,
+        //     dataIndex: app.currentIndex,
+        //   });
+        // }, 1000);
+        myChart.setOption(option);
+      },
+      leftECharts(listData,numList){
+        let self = this;
+        let myChart = this.$echarts.init(document.getElementById('left-eCharts-box'));
+        let data = listData;
+        let xData = [];
+        let yData = [];
+        data.map(function (a, b) {
+          xData.push(a.name);
+          yData.push(a.value);
+        });
+        let option = {
+          backgroundColor: "#fff",
+          color: ["#3398DB"],
+          // tooltip: {
+          //   trigger: "axis",
+          //   axisPointer: {
+          //     // 坐标轴指示器,坐标轴触发有效
+          //     type: false, // 默认为直线,可选为:'line' | 'shadow'
+          //   },
+          // },
+          tooltip: {
+            trigger: "axis",
+            axisPointer: {
+              type: false, // 默认为直线,可选为:'line' | 'shadow'
+              lineStyle: {
+                opacity: 0,
+              },
+            },
+            formatter: function (prams) {
+              return prams[0].name + ':' + prams[0].data + '个';
+            },
+          },
+          legend: {
+            data: ["直接访问", "背景"],
+            show: false,
+          },
+          grid: {
+            left: "4%",
+            right: "2%",
+            bottom: "5%",
+            top: "20%",
+            containLabel: true,
+            z: 22,
+          },
+          xAxis: [
+            {
+              type: "category",
+              gridIndex: 0,
+              data: xData,
+              axisTick: {
+                alignWithLabel: true,
+                show: false,
+              },
+              axisLine: {
+                lineStyle: {
+                  color: "#666666",
+                },
+              },
+              axisLabel: {
+                show: true,
+                color: "#666666",
+                // fontSize: 12,
+              },
+            },
+          ],
+          yAxis: [
+            {
+              type: "value",
+              gridIndex: 0,
+              splitLine: {
+                show: false,
+              },
+              axisTick: {
+                show: false,
+              },
+              min: 0,
+              max: numList[0] <= 4 ? 4 : numList[0],
+              axisLine: {
+                lineStyle: {
+                  color: "#666666",
+                },
+              },
+              axisLabel: {
+                color: "#666666",
+                formatter: "{value}个",
+              },
+            },
+            {
+              type: "value",
+              gridIndex: 0,
+              splitNumber: 12,
+              splitLine: {
+                show: false,
+              },
+              axisLine: {
+                show: false,
+              },
+              axisTick: {
+                show: false,
+              },
+              axisLabel: {
+                show: false,
+              },
+              splitArea: {
+                show: false,
+                areaStyle: {
+                  color: ["rgba(250,250,250,0.0)", "rgba(250,250,250,0.05)"],
+                },
+              },
+            },
+          ],
+          series: [
+            {
+              name: "用气数",
+              type: "bar",
+              barWidth: "30%",
+              xAxisIndex: 0,
+              yAxisIndex: 0,
+              itemStyle: {
+                normal: {
+                  barBorderRadius: 30,
+                  color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                    {
+                      offset: 0,
+                      color: "#00feff",
+                    },
+                    {
+                      offset: 0.5,
+                      color: "#027eff",
+                    },
+                    {
+                      offset: 1,
+                      color: "#0286ff",
+                    },
+                  ]),
+                },
+              },
+              data: yData,
+              zlevel: 11,
+            },
+            {
+              name: "背景",
+              type: "bar",
+              barWidth: "50%",
+              xAxisIndex: 0,
+              yAxisIndex: 1,
+              barGap: "-135%",
+              data: numList,
+              itemStyle: {
+                normal: {
+                  color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                    {
+                      offset: 1,
+                      color: "rgba(242,249,255,1)",
+                    },
+                  ]),
+                },
+              },
+              zlevel: 9,
+            },
+          ],
+        };
+        myChart.setOption(option);
+      },
+      rightECharts(nameList,dataList,numMax){
+        let self = this;
+        let myChart = this.$echarts.init(document.getElementById('right-eCharts-box'));
+        let option = {
+          backgroundColor: "transparent",
+          grid: {
+            left: "3%",
+            right: "3%",
+            bottom: "5%",
+            top: "20%",
+            containLabel: true,
+          },
+          tooltip: {
+            trigger: "axis",
+            axisPointer: {
+              // 坐标轴指示器,坐标轴触发有效
+              type: false, // 默认为直线,可选为:'line' | 'shadow'
+            },
+            formatter: function (prams) {
+              return prams[0].name + ':' + prams[0].data + 'mPa';
+            },
+            // axisPointer: {
+            //     type: 'shadow',
+            //     lineStyle: {
+            //         color: '#57617B'
+            //     }
+            // }
+          },
+          xAxis: [
+            {
+              type: "category",
+
+              boundaryGap: false,
+              axisLabel: {
+                textStyle: {
+                  color: "#666666",
+                  // fontSize: 12,
+                },
+              },
+              axisTick: {
+                show: false,
+              },
+              axisLine: {
+                show: true,
+                lineStyle: {
+                  // x轴线颜色
+                  color: "#666666",
+                  width: 1,
+                },
+              },
+              data: nameList,
+            },
+          ],
+          yAxis: [
+            {
+              type: "value",
+              axisLabel: {
+                color: "#666666",
+                formatter: "{value}mPa",
+              },
+              axisTick: {
+                show: false,
+              },
+              axisLine: {
+                lineStyle: {
+                  color: "#666666",
+                },
+              },
+              min: 0,
+              max: numMax <= 4 ? 4 : numMax,
+              splitLine: {
+                show: false,
+              },
+            },
+          ],
+          series: [
+            {
+              name: "",
+              type: "line",
+              stack: "用气量",
+              symbol: "circle",
+              showSymbol: false,
+              symbolSize: 8,
+              itemStyle: {
+                normal: {
+                  color: "#0092f6",
+                  lineStyle: {
+                    color: "#0092f6",
+                    width: 1,
+                  },
+                  areaStyle: {
+                    //color: '#94C9EC'
+                    color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+                      {
+                        offset: 0.4,
+                        color: "rgba(60, 70, 255, 0.5)",
+                      },
+                      {
+                        offset: 1,
+                        color: "rgba(25, 125, 240, 1)",
+                      },
+                    ]),
+                  },
+                },
+              },
+              markPoint: {
+                itemStyle: {
+                  normal: {
+                    color: "red",
+                  },
+                },
+              },
+              data: dataList,
+            },
+          ],
+        };
+        myChart.setOption(option);
+      },
+      forNameList(val){
+        let self = this;
+        if(val){
+          for(let i=0;i<self.options.length;i++){
+            if(val == self.options[i].id){
+              console.log('self.options[i].gasName',self.options[i].gasName)
+              return self.options[i].gasName
+            }
+          }
+        }else{
+          return ''
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .InformationRecord{
+    display: flex;
+    flex-direction: column;
+    .max-top-box{
+      width:1570px;
+      height:460px;
+      position: relative;
+      .title-p{
+        z-index:10;
+        position: absolute;
+        top:20px;
+        left:20px;
+        font-size:16px;
+        font-weight:700;
+        color:#333;
+      }
+      .top-select{
+        z-index:10;
+        position: absolute;
+        top:20px;
+        right:20px;
+        width:120px;
+      }
+      #top-eCharts-box{
+        width:1570px;
+        height:460px;
+      }
+    }
+    .max-bottom-box{
+      flex:1;
+      display: flex;
+      .big-left-box{
+        width:770px;
+        height:440px;
+        position: relative;
+        .title-p{
+          z-index:10;
+          position: absolute;
+          top:20px;
+          left:20px;
+          font-size:16px;
+          font-weight:700;
+          color:#333;
+        }
+        .left-select{
+          z-index:10;
+          position: absolute;
+          top:20px;
+          right:20px;
+          width:120px;
+        }
+        #left-eCharts-box{
+          width:770px;
+          height:440px;
+        }
+      }
+      .big-right-box{
+        width:800px;
+        height:440px;
+        position: relative;
+        .title-p{
+          z-index:10;
+          position: absolute;
+          top:20px;
+          left:20px;
+          font-size:16px;
+          font-weight:700;
+          color:#333;
+        }
+        .right-select{
+          z-index:10;
+          position: absolute;
+          top:20px;
+          right:20px;
+          width:120px;
+        }
+        #right-eCharts-box{
+          width:800px;
+          height:440px;
+        }
+      }
+    }
+  }
+</style>

+ 310 - 0
src/views/hazardManagement/gasBottleManage/beaconList/index.vue

@@ -0,0 +1,310 @@
+<!-- 信标列表 -->
+<template>
+  <div class="app-container beaconList">
+    <div class="page-container beaconListPage">
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="searchValue" label-width="60px">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.searchValue"
+              placeholder="编号"
+              clearable
+              style="width: 200px"
+            />
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+          <p class="page-add-common-style-button"
+             style="float: right;"
+             @click="tableButton(3)"
+          >+  新增信标</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table-column label="序号"  width="50" align="center"  type="index"/>
+          <el-table-column label="信标编号" prop="beaconTag"  show-overflow-tooltip/>
+          <el-table-column label="最后使用时间" prop="bindingTime" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.bindingTime,'{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="200" show-overflow-tooltip v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="tableButton(1,scope.row)"
+                >打印二维码</p>
+                <p class="table-button-p"
+                   @click="tableButton(2,scope.row)"
+                >删除</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <el-dialog class="beaconList-dialog-box"
+      :title="dialogTitle" :visible.sync="dialogType" v-if="dialogType"
+      :close-on-click-modal="false" width="500px" append-to-body>
+      <div v-if="!dialogAddType">
+        <div v-if="dialogForm.state">
+          <div class="text-box">
+            <p>学院:</p>
+            <p>{{dialogForm.collegeName}}</p>
+          </div>
+          <div class="text-box">
+            <p>实验室:</p>
+            <p>{{dialogForm.subjectName}}{{dialogForm.roomNum}}</p>
+          </div>
+          <!--<div class="text-box">-->
+            <!--<p>气瓶编号:</p>-->
+            <!--<p>{{dialogForm.roomNum}}</p>-->
+          <!--</div>-->
+          <div class="text-box">
+            <p>气瓶:</p>
+            <p>{{dialogForm.gasName}}</p>
+          </div>
+        </div>
+        <div class="text-box" v-if="dialogForm.state">
+          <p>最后一次绑定时间:</p>
+          <p>{{ parseTime(dialogForm.bindingTime,'{y}-{m}-{d} {h}:{i}') }}</p>
+        </div>
+        <vue-qr style="display: block;height:100px;width:100px;margin:auto;" text="dialogForm.qrCodeUrl" :size="300"></vue-qr>
+        <p class="text-p">{{dialogForm.beaconTag}}</p>
+        <p class="text-p">信标</p>
+      </div>
+      <div v-if="dialogAddType">
+        <el-form ref="dialogForm" :model="dialogForm" :rules="rules" label-width="120px">
+          <el-form-item label="信标编号:" prop="beaconTag" style="margin-top:20px;">
+            <el-input
+              maxLength="20"
+              v-model="dialogForm.beaconTag"
+              placeholder="请输入名称"
+              style="width: 280px"
+            />
+          </el-form-item>
+        </el-form>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <p class="dialog-footer-null-p"></p>
+        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submit" :style="dialogAddType?'width:150px;':''">{{dialogAddType?'确认并打印二维码':'打 印'}}</el-button>
+        <p class="dialog-footer-null-p"></p>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+  import vueQr from 'vue-qr'
+  import { getLodop } from "@/utils/LodopFuncs";
+  import { airbottleBeaconList,airbottleBeaconAdd,airbottleBeaconFindById,airbottleBeaconDelete } from "@/api/gasBottleManage/index";
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  export default {
+    name: 'index',
+    components: {
+      vueQr
+    },
+    data () {
+      return {
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        //页面遮罩
+        loading:false,
+        //下拉列表数据
+        optionList:[{value:true,label:'启用'},{value:false,label:'停用'}],
+        //查询条件
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+        },
+        //列表数据
+        dataList:[],
+        //数据数量
+        total:0,
+        //弹窗开关
+        dialogType:false,
+        dialogTitle:"",
+        dialogForm:null,
+        //打印/新增状态
+        dialogAddType:false,
+        //校验
+        rules:{
+          beaconTag:[
+            { required: true, message: '请输入信标编号', trigger: 'blur' },
+            { required: true, message: "请输入信标编号", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+        },
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      this.getList();
+    },
+    methods: {
+      //弹窗相关
+      cancel(){
+        this.$set(this,'dialogType',false);
+      },
+      //打印二维码
+      submit(){
+        let _this=this;
+        if(!this.dialogAddType){
+          if(this.needCLodop()){
+            //打印
+            this.CreateOneFormPage(this.dialogForm.beaconTag)
+            this.$set(this,'dialogType',false);
+          }else{
+            //提示驱动缺失
+            this.$set(this,'dialogType',false);
+            this.$confirm('未检测到打印服务,请联系管理员.', "警告", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(function() {
+            }).then(() => {
+            }).catch(() => {});
+          }
+        }else{
+          this.$refs["dialogForm"].validate(valid => {
+            if (valid) {
+              let obj = JSON.parse(JSON.stringify(this.dialogForm))
+              airbottleBeaconAdd(obj).then(response => {
+                this.$set(this,'dialogType',false);
+                this.msgSuccess(response.msg)
+                this.getList();
+                if(this.needCLodop()){
+                  //打印
+                  this.CreateOneFormPage(obj.beaconTag)
+                  this.$set(this,'dialogType',false);
+                }else{
+                  //提示驱动缺失
+                  this.$set(this,'dialogType',false);
+                  this.$confirm('未检测到打印服务,请联系管理员.', "警告", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning"
+                  }).then(function() {
+                  }).then(() => {
+                  }).catch(() => {});
+                }
+              });
+            }
+          })
+        }
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        airbottleBeaconList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'dataList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      //操作按钮
+      tableButton(type,row){
+        let self = this;
+        if(type == 1){
+          //打印二维码
+          airbottleBeaconFindById({id:row.id}).then(response => {
+            this.$set(this,'dialogTitle','标签信息');
+            this.$set(this,'dialogForm',response.data);
+            this.$set(this,'dialogAddType',false);
+            this.$set(this,'dialogType',true);
+          });
+        }else if(type == 2){
+          //删除
+          this.$confirm('是否确认删除?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+          }).then(() => {
+            airbottleBeaconDelete({id:row.id}).then(response => {
+              self.msgSuccess(response.msg)
+              self.getList();
+            });
+          }).catch(() => {});
+        }else if(type == 3){
+          //新增
+          this.$set(this,'dialogTitle','新增');
+          this.$set(this,'dialogForm',{beaconTag:""});
+          this.$set(this,'dialogAddType',true);
+          this.$set(this,'dialogType',true);
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .beaconList{
+    display: flex;
+    flex-direction: column;
+    .beaconListPage{
+
+    }
+  }
+</style>
+<style lang="scss">
+  .beaconList-dialog-box{
+    .el-dialog__body{
+      padding:10px 20px;
+      .text-box{
+        display: flex;
+        p{
+          font-size:16px;
+          line-height:40px;
+        }
+        p:nth-child(1){
+          margin-left:60px;
+        }
+        p:nth-child(2){
+
+        }
+      }
+      .text-p{
+        line-height:30px;
+        font-size:16px;
+        text-align: center;
+      }
+    }
+    .dialog-footer{
+      display: flex;
+      .dialog-footer-null-p{
+        flex:1;
+      }
+    }
+  }
+</style>

+ 330 - 0
src/views/hazardManagement/gasBottleManage/cylinderSetting/index.vue

@@ -0,0 +1,330 @@
+<!-- 气瓶类型 -->
+<template>
+  <div class="app-container cylinderSetting">
+    <div class="page-container cylinderSettingPage">
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="searchValue" label-width="60px">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.searchValue"
+              placeholder="气体名称"
+              clearable
+              style="width: 240px"
+            />
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+          <p class="page-add-common-style-button"
+             style="float: right;"
+             @click="tableButton(1)"
+          >新增</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table-column label="气体名称" prop="gasName"  show-overflow-tooltip/>
+          <el-table-column label="级别" prop="level" width="300" show-overflow-tooltip>
+            <template slot-scope="scope">
+              {{forData(1,scope.row.level)}}
+            </template>
+          </el-table-column>
+          <el-table-column label="规格" prop="size" width="150" show-overflow-tooltip>
+            <template slot-scope="scope">
+              {{forData(2,scope.row.size)}}
+            </template>
+          </el-table-column>
+          <el-table-column label="成分" prop="gasComposition" width="300" show-overflow-tooltip/>
+          <el-table-column label="编辑时间" prop="updateTime" width="249" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.updateTime,'{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="180" show-overflow-tooltip v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="tableButton(2,scope.row)"
+                >编辑</p>
+                <p class="table-button-p"
+                   @click="tableButton(3,scope.row)"
+                >删除</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <el-dialog class="cylinderSetting-dialog-box"
+               :title="dialogTitle" :visible.sync="dialogType" v-if="dialogType"
+               :close-on-click-modal="false" width="500px" append-to-body>
+      <el-form ref="dialogForm" :model="dialogForm" :rules="rules" label-width="120px">
+        <el-form-item label="名称:" prop="gasName">
+          <el-input
+            maxLength="10"
+            v-model="dialogForm.gasName"
+            placeholder="请输入名称"
+            style="width: 280px"
+          />
+        </el-form-item>
+        <el-form-item label="级别:" prop="level">
+          <el-select v-model="dialogForm.level"
+                     placeholder="请选择" style="width: 280px">
+            <el-option
+              v-for="dict in gasBottleLevel"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="规格:" prop="size">
+          <el-select v-model="dialogForm.size"
+                     placeholder="请选择" style="width: 280px">
+            <el-option
+              v-for="dict in gasBottleSpecification"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="气体成分:" prop="gasComposition">
+          <el-input
+            maxLength="20"
+            v-model="dialogForm.gasComposition"
+            placeholder="请输入名称"
+            style="width: 280px"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <p class="dialog-footer-null-p"></p>
+        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submit">确 定</el-button>
+        <p class="dialog-footer-null-p"></p>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+  import vueQr from 'vue-qr'
+  import { getLodop } from "@/utils/LodopFuncs";
+  import { airbottleBottleTypeList,airbottleBottleTypeAdd,
+    airbottleBottleTypeUpdate,airbottleBottleTypeFindById,
+    airbottleBottleTypeDelete} from "@/api/gasBottleManage/index";
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  //import addPage from "./addPage.vue";
+  export default {
+    name: 'index',
+    components: {
+      vueQr
+    },
+    data () {
+      return {
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        //页面遮罩
+        loading:false,
+        //气瓶级别
+        gasBottleLevel:[],
+        gasBottleSpecification:[],
+        //查询条件
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        },
+        //时间数据
+        dateRange:[],
+        //列表数据
+        dataList:[],
+        //数据数量
+        total:0,
+        //弹窗开关
+        dialogType:false,
+        dialogTitle:"",
+        dialogForm:{},
+        //校验
+        rules:{
+          gasName:[
+            { required: true, message: '请输入名称', trigger: 'blur' },
+            { required: true, message: "请输入名称", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          level:[
+            { required: true, message: '请选择级别', trigger: 'blur' },
+          ],
+          size:[
+            { required: true, message: '请选择规格', trigger: 'blur' },
+          ],
+          // gasComposition:[
+          //   { required: true, message: '请输入气体成分', trigger: 'blur' },
+          //   { required: true, message: "请输入气体成分", validator: this.spaceJudgment, trigger: "blur" }
+          // ],
+        },
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      this.getList();
+      this.getDicts("gasBottleLevel").then((response) => {
+        this.$set(this,'gasBottleLevel',response.data);
+      });
+      this.getDicts("gasBottleSpecification").then((response) => {
+        this.$set(this,'gasBottleSpecification',response.data);
+      });
+    },
+    methods: {
+      //弹窗相关
+      cancel(){
+        this.$set(this,'dialogType',false);
+      },
+      submit(){
+        this.$refs["dialogForm"].validate(valid => {
+          if (valid) {
+            if(this.dialogForm.id){
+              //编辑
+              airbottleBottleTypeUpdate(this.dialogForm).then(response => {
+                this.$set(this,'dialogType',false);
+                this.msgSuccess(response.msg)
+                this.getList();
+              });
+            } else {
+              //新增
+              airbottleBottleTypeAdd(this.dialogForm).then(response => {
+                this.$set(this,'dialogType',false);
+                this.msgSuccess(response.msg)
+                this.getList();
+              });
+            }
+          }
+        })
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        airbottleBottleTypeList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'dataList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      //操作按钮
+      tableButton(type,row){
+        let self = this;
+        if(type == 1){
+          //新增
+          this.$set(this,'dialogTitle','新增');
+          this.$set(this,'dialogForm',{
+            gasName:"",
+            level:"",
+            size:"",
+            gasComposition:"",
+          });
+          this.$set(this,'dialogType',true);
+        }else if(type == 2){
+          //编辑
+          this.$set(this,'dialogTitle','编辑');
+          this.$set(this,'dialogForm',{
+            id:row.id,
+            gasName:row.gasName,
+            level:row.level+'',
+            size:row.size+'',
+            gasComposition:row.gasComposition,
+          });
+          this.$set(this,'dialogType',true);
+        }else if(type == 3){
+          //删除
+          this.$confirm('是否确认删除?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+          }).then(() => {
+            airbottleBottleTypeDelete({id:row.id}).then(response => {
+              self.msgSuccess(response.msg)
+              self.getList();
+            });
+          }).catch(() => {});
+        }
+      },
+      forData(type,id){
+        let self = this;
+        let num = 0;
+        if(type == 1){
+          for(let i=0;i<self.gasBottleLevel.length;i++){
+            if(id == self.gasBottleLevel[i].dictValue){
+              num++
+              return self.gasBottleLevel[i].dictLabel
+            }
+          }
+        }else if (type){
+          for(let i=0;i<self.gasBottleSpecification.length;i++){
+            if(id == self.gasBottleSpecification[i].dictValue){
+              num++
+              return self.gasBottleSpecification[i].dictLabel
+            }
+          }
+        }
+        if(num == 0){
+          return '其他'
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .cylinderSetting{
+    display: flex;
+    flex-direction: column;
+    .cylinderSettingPage{
+
+    }
+  }
+</style>
+<style lang="scss">
+  .cylinderSetting-dialog-box{
+    .text-p{
+      line-height:40px;
+      font-size:16px;
+      text-align: center;
+    }
+    .dialog-footer{
+      display: flex;
+      .dialog-footer-null-p{
+        flex:1;
+      }
+    }
+  }
+</style>

+ 221 - 0
src/views/hazardManagement/gasBottleManage/inventoryInformation/index.vue

@@ -0,0 +1,221 @@
+<!-- 库存信息 -->
+<template>
+  <div class="app-container inventoryInformation">
+    <div class="page-container inventoryInformationPage" v-if="pageType === 1">
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="searchValue" label-width="60px">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.searchValue"
+              placeholder="编号/气体名称/实验地点"
+              clearable
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-form-item label="学院" prop="collegeId">
+            <el-select v-model="queryParams.collegeId"
+                       clearable placeholder="请选择学院" style="width: 200px">
+              <el-option
+                v-for="dict in optionList"
+                :key="dict.deptId"
+                :label="dict.deptName"
+                :value="dict.deptId"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="入库时间" prop="state">
+            <el-date-picker
+              :clearable="false"
+              v-model="dateRange"
+              size="small"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <!--<el-table-column label="气瓶编号" prop="gasName"  show-overflow-tooltip/>-->
+          <el-table-column label="气体名称" prop="gasName" show-overflow-tooltip/>
+          <el-table-column label="气体级别/规格" prop="content" width="150" show-overflow-tooltip>
+            <template slot-scope="scope">
+              {{forData(1,scope.row.level)}}/ {{forData(2,scope.row.size)}}
+            </template>
+          </el-table-column>
+          <el-table-column label="气体余量" prop="gasPressure" width="150" show-overflow-tooltip/>
+          <el-table-column label="学院" prop="collegeName" width="249" show-overflow-tooltip/>
+          <el-table-column label="实验地点" prop="subjectName" width="346" show-overflow-tooltip>
+            <template slot-scope="scope">
+              {{scope.row.subjectName}}{{scope.row.roomNum?'('+scope.row.roomNum+')':''}}
+            </template>
+          </el-table-column>
+          <el-table-column label="有效期" prop="validPeriod" width="249" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.validPeriod,'{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+  import { airbottleStockList } from "@/api/gasBottleManage/index";
+  import { listDepartments } from "@/api/system/dept";
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  //import addPage from "./addPage.vue";
+  export default {
+    name: 'index',
+    data () {
+      return {
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        //页面状态
+        pageType:1,
+        //页面遮罩
+        loading:false,
+        //下拉列表数据
+        optionList:[],
+        //气瓶级别
+        gasBottleLevel:[],
+        gasBottleSpecification:[],
+        //查询条件
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        },
+        //时间数据
+        dateRange:[],
+        //列表数据
+        dataList:[],
+        //数据数量
+        total:0,
+        //弹窗开关
+        dialogType:false,
+        dialogTitle:"",
+        dialogForm:null,
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      this.listDepartments();
+      this.getList();
+      this.getDicts("gasBottleLevel").then((response) => {
+        this.$set(this,'gasBottleLevel',response.data);
+      });
+      this.getDicts("gasBottleSpecification").then((response) => {
+        this.$set(this,'gasBottleSpecification',response.data);
+      });
+    },
+    methods: {
+      listDepartments(){
+        listDepartments().then(response => {
+          this.$set(this,'optionList',response.data);
+        });
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        airbottleStockList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'dataList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      forData(type,id){
+        let self = this;
+        let num = 0;
+        if(type == 1){
+          for(let i=0;i<self.gasBottleLevel.length;i++){
+            if(id == self.gasBottleLevel[i].dictValue){
+              num++
+              return self.gasBottleLevel[i].dictLabel
+            }
+          }
+        }else if (type){
+          for(let i=0;i<self.gasBottleSpecification.length;i++){
+            if(id == self.gasBottleSpecification[i].dictValue){
+              num++
+              return self.gasBottleSpecification[i].dictLabel
+            }
+          }
+        }
+        if(num == 0){
+          return '其他'
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .inventoryInformation{
+    display: flex;
+    flex-direction: column;
+    .inventoryInformationPage{
+
+    }
+  }
+</style>
+<style lang="scss">
+  .inventoryInformation-dialog-box{
+    .el-dialog__body{
+      padding:10px 20px;
+      .text-p{
+        line-height:30px;
+        font-size:16px;
+        text-align: center;
+      }
+    }
+    .dialog-footer{
+      display: flex;
+      .dialog-footer-null-p{
+        flex:1;
+      }
+    }
+  }
+</style>

+ 228 - 0
src/views/hazardManagement/gasBottleManage/outboundRecord/index.vue

@@ -0,0 +1,228 @@
+<!-- 出库记录 -->
+<template>
+  <div class="app-container outboundRecord">
+    <div class="page-container outboundRecordPage" v-if="pageType === 1">
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="searchValue" label-width="60px">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.searchValue"
+              placeholder="气体名称/操作人/联系电话"
+              clearable
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-form-item label="学院" prop="collegeId">
+            <el-select v-model="queryParams.collegeId" clearable placeholder="请选择" style="width: 200px">
+              <el-option
+                v-for="dict in optionList"
+                :key="dict.deptId"
+                :label="dict.deptName"
+                :value="dict.deptId"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="出库时间" prop="state">
+            <el-date-picker
+              :clearable="false"
+              v-model="dateRange"
+              size="small"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table-column label="气体名称" prop="gasName"  show-overflow-tooltip/>
+          <el-table-column label="气体级别/规格" prop="content" width="150" show-overflow-tooltip>
+            <template slot-scope="scope">
+              {{forData(1,scope.row.level)}}/ {{forData(2,scope.row.size)}}
+            </template>
+          </el-table-column>
+          <el-table-column label="学院" prop="collegeName" width="200" show-overflow-tooltip/>
+          <el-table-column label="实验地点" prop="content" width="370" show-overflow-tooltip>
+            <template slot-scope="scope">
+              {{scope.row.subjectName}}{{scope.row.roomNum?'('+scope.row.roomNum+')':''}}
+            </template>
+          </el-table-column>
+          <el-table-column label="操作人" prop="operator" width="150" show-overflow-tooltip/>
+          <el-table-column label="联系方式" prop="phone" width="150" show-overflow-tooltip/>
+          <el-table-column label="出库时间" prop="createTime" width="249" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime,'{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="120" show-overflow-tooltip v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="tableButton(1,scope.row)"
+                >详情</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <info-page :propsData="propsData" v-if="pageType === 2"></info-page>
+  </div>
+</template>
+<script>
+  import { airbottleInOutRecordList,airbottleInOutRecordFindById } from "@/api/gasBottleManage/index";
+  import { listDepartments } from "@/api/system/dept";
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import infoPage from "./infoPage.vue";
+  export default {
+    name: 'index',
+    components: {
+      infoPage
+    },
+    data () {
+      return {
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        //页面状态
+        pageType:1,
+        //页面遮罩
+        loading:false,
+        //下拉列表数据
+        optionList:[],
+        //气瓶级别
+        gasBottleLevel:[],
+        gasBottleSpecification:[],
+        //查询条件
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        },
+        //时间数据
+        dateRange:[],
+        //列表数据
+        dataList:[{}],
+        //数据数量
+        total:0,
+        //组件传参
+        propsData:{},
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      this.listDepartments();
+      this.getList();
+      this.getDicts("gasBottleLevel").then((response) => {
+        this.$set(this,'gasBottleLevel',response.data);
+      });
+      this.getDicts("gasBottleSpecification").then((response) => {
+        this.$set(this,'gasBottleSpecification',response.data);
+      });
+    },
+    methods: {
+      listDepartments(){
+        listDepartments().then(response => {
+          this.$set(this,'optionList',response.data);
+        });
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        obj.type = 2;
+        airbottleInOutRecordList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'dataList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      //操作按钮
+      tableButton(type,row){
+        if(type == 1){
+          airbottleInOutRecordFindById({id:row.id}).then(response => {
+            this.$set(this,'pageType',2);
+            this.$set(this,'propsData',response.data);
+          });
+        }else if(type == 2){
+          this.$set(this,'pageType',1);
+          this.getList();
+        }
+      },
+      forData(type,id){
+        let self = this;
+        let num = 0;
+        if(type == 1){
+          for(let i=0;i<self.gasBottleLevel.length;i++){
+            if(id == self.gasBottleLevel[i].dictValue){
+              num++
+              return self.gasBottleLevel[i].dictLabel
+            }
+          }
+        }else if (type){
+          for(let i=0;i<self.gasBottleSpecification.length;i++){
+            if(id == self.gasBottleSpecification[i].dictValue){
+              num++
+              return self.gasBottleSpecification[i].dictLabel
+            }
+          }
+        }
+        if(num == 0){
+          return '其他'
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .outboundRecord{
+    display: flex;
+    flex-direction: column;
+    .outboundRecordPage{
+
+    }
+  }
+</style>

+ 233 - 0
src/views/hazardManagement/gasBottleManage/outboundRecord/infoPage.vue

@@ -0,0 +1,233 @@
+<template>
+  <div class="infoPage">
+    <div class="title-box">
+      <p>出库记录详情</p>
+      <p @click="backPage">返回</p>
+    </div>
+    <div class="text-max-max-box scrollbar-box">
+      <div class="text-max-big-box">
+        <p class="text-title-p">气瓶信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <!--<div>-->
+              <!--<p>气瓶编号:</p>-->
+              <!--<p>{{propsData.data1}}</p>-->
+            <!--</div>-->
+            <div>
+              <p>气体名称:</p>
+              <p>{{propsData.gasName}}</p>
+            </div>
+            <div>
+              <p>气体级别:</p>
+              <p>{{forData(1,propsData.level)}}</p>
+            </div>
+            <div>
+              <p>气体规格:</p>
+              <p>{{forData(2,propsData.size)}}</p>
+            </div>
+          </div>
+          <div class="text-box-two">
+            <div>
+              <p>电子标签:</p>
+              <p>{{propsData.beaconTag}}</p>
+            </div>
+            <div>
+              <p>气体组分:</p>
+              <p>{{propsData.gasComposition}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="text-max-big-box">
+        <p class="text-title-p">出库人信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <div>
+              <p>操作人:</p>
+              <p>{{propsData.operator}}</p>
+            </div>
+            <div>
+              <p>联系方式:</p>
+              <p>{{propsData.phone}}</p>
+            </div>
+            <div>
+              <p>学院:</p>
+              <p>{{propsData.collegeName}}</p>
+            </div>
+            <div>
+              <p>实验室地点:</p>
+              <p style="width:420px;">{{propsData.subjectName}}{{propsData.roomNum?'('+propsData.roomNum+')':''}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="text-max-big-box">
+        <p class="text-title-p">出库信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <div>
+              <p>出库时间:</p>
+              <p>{{ parseTime(propsData.createTime,'{y}-{m}-{d} {h}:{i}') }}</p>
+            </div>
+            <div>
+              <p>出库气压值:</p>
+              <p>{{propsData.gasPressure}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+  export default {
+    name: 'infoPage',
+    props:{
+      propsData:{},
+    },
+    data () {
+      return {
+        //气瓶级别
+        gasBottleLevel:[],
+        gasBottleSpecification:[],
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.getDicts("gasBottleLevel").then((response) => {
+        this.$set(this,'gasBottleLevel',response.data);
+      });
+      this.getDicts("gasBottleSpecification").then((response) => {
+        this.$set(this,'gasBottleSpecification',response.data);
+      });
+    },
+    methods:{
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(2);
+      },
+      forData(type,id){
+        let self = this;
+        let num = 0;
+        if(type == 1){
+          for(let i=0;i<self.gasBottleLevel.length;i++){
+            if(id == self.gasBottleLevel[i].dictValue){
+              num++
+              return self.gasBottleLevel[i].dictLabel
+            }
+          }
+        }else if (type){
+          for(let i=0;i<self.gasBottleSpecification.length;i++){
+            if(id == self.gasBottleSpecification[i].dictValue){
+              num++
+              return self.gasBottleSpecification[i].dictLabel
+            }
+          }
+        }
+        if(num == 0){
+          return '其他'
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .infoPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    font-weight: 500;
+    overflow: hidden;
+    .title-box{
+      display: flex;
+      border-bottom:1px solid #dedede;
+      p:nth-child(1){
+        flex:1;
+        color:#0045AF;
+        font-size:18px;
+        padding-left:20px;
+        line-height: 80px;
+      }
+      p:nth-child(2){
+        width:80px;
+        height:30px;
+        line-height:28px;
+        border:1px solid #0045AF;
+        color:#0045AF;
+        border-radius:6px;
+        font-size:16px;
+        margin:25px 20px;
+        text-align: center;
+        cursor: pointer;
+      }
+    }
+    .text-max-max-box{
+      padding-bottom:20px;
+      .text-max-big-box{
+        margin:0 20px;
+        .text-title-p{
+          line-height:80px;
+          font-size:16px;
+        }
+        .text-big-box{
+          border:1px solid #dedede;
+          height:130px;
+          padding:15px;
+          .text-box-one{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:200px;
+              }
+            }
+          }
+          .text-box-two{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:520px;
+              }
+            }
+          }
+          .text-box-three{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:1300px;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+</style>

+ 197 - 0
src/views/hazardManagement/gasBottleManage/usageRecord/index.vue

@@ -0,0 +1,197 @@
+<!-- 使用记录 -->
+<template>
+  <div class="app-container usageRecord">
+    <div class="page-container usageRecordPage" v-if="pageType === 1">
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="searchValue" label-width="60px">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.searchValue"
+              placeholder="气体名称/使用人"
+              clearable
+              style="width: 210px"
+            />
+          </el-form-item>
+          <el-form-item label="学院" prop="collegeId">
+            <el-select v-model="queryParams.collegeId" clearable placeholder="请选择" style="width: 200px">
+              <el-option
+                v-for="dict in optionList"
+                :key="dict.deptId"
+                :label="dict.deptName"
+                :value="dict.deptId"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="使用时间" prop="state">
+            <el-date-picker
+              :clearable="false"
+              v-model="dateRange"
+              size="small"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table-column label="气体名称" prop="gasName"  show-overflow-tooltip/>
+          <el-table-column label="使用量" prop="usageAmount" width="150" show-overflow-tooltip/>
+          <el-table-column label="学院" prop="collegeName" width="200" show-overflow-tooltip/>
+          <el-table-column label="实验地点" prop="subjectName" width="249" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{scope.row.subjectName}}{{scope.row.roomNum?'('+scope.row.roomNum+')':''}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="使用人" prop="operator" width="120" show-overflow-tooltip/>
+          <el-table-column label="联系方式" prop="phone" width="150" show-overflow-tooltip/>
+          <el-table-column label="使用时间" prop="startTime" width="200" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.startTime,'{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="归还时间" prop="endTime" width="200" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.endTime,'{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="120" show-overflow-tooltip v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="tableButton(1,scope.row)"
+                >详情</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <info-page :propsData="propsData" v-if="pageType === 2"></info-page>
+  </div>
+</template>
+<script>
+  import { airbottleUsageRecordList,airbottleUsageRecordFindById } from "@/api/gasBottleManage/index";
+  import { listDepartments } from "@/api/system/dept";
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import infoPage from "./infoPage.vue";
+  export default {
+    name: 'index',
+    components: {
+      infoPage
+    },
+    data () {
+      return {
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        //页面状态
+        pageType:1,
+        //页面遮罩
+        loading:false,
+        //下拉列表数据
+        optionList:[],
+        //查询条件
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        },
+        //时间数据
+        dateRange:[],
+        //列表数据
+        dataList:[],
+        //数据数量
+        total:0,
+        //组件传参
+        propsData:{},
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      this.listDepartments();
+      this.getList();
+    },
+    methods: {
+      listDepartments(){
+        listDepartments().then(response => {
+          this.$set(this,'optionList',response.data);
+        });
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        airbottleUsageRecordList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'dataList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      //操作按钮
+      tableButton(type,row){
+        if(type == 1){
+          airbottleUsageRecordFindById({id:row.id}).then(response => {
+            this.$set(this,'pageType',2);
+            this.$set(this,'propsData',response.data);
+          });
+        }else if(type == 2){
+          this.$set(this,'pageType',1);
+          this.getList();
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .usageRecord{
+    display: flex;
+    flex-direction: column;
+    .usageRecordPage{
+
+    }
+  }
+</style>

+ 256 - 0
src/views/hazardManagement/gasBottleManage/usageRecord/infoPage.vue

@@ -0,0 +1,256 @@
+<template>
+  <div class="infoPage">
+    <div class="title-box">
+      <p>使用详情</p>
+      <p @click="backPage">返回</p>
+    </div>
+    <div class="text-max-max-box scrollbar-box">
+      <div class="text-max-big-box">
+        <p class="text-title-p">气瓶信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <!--<div>-->
+              <!--<p>气瓶编号:</p>-->
+              <!--<p>{{propsData.data1}}</p>-->
+            <!--</div>-->
+            <div>
+              <p>气体名称:</p>
+              <p>{{propsData.gasName}}</p>
+            </div>
+            <div>
+              <p>气体级别:</p>
+              <p>{{forData(1,propsData.level)}}</p>
+            </div>
+            <div>
+              <p>气体规格:</p>
+              <p>{{forData(2,propsData.size)}}</p>
+            </div>
+          </div>
+          <div class="text-box-two">
+            <div>
+              <p>信标标签:</p>
+              <p>{{propsData.beaconTag}}</p>
+            </div>
+            <div>
+              <p>气体组分:</p>
+              <p>{{propsData.gasComposition}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="text-max-big-box">
+        <p class="text-title-p">使用人信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <div>
+              <p>使用人:</p>
+              <p>{{propsData.operator}}</p>
+            </div>
+            <div>
+              <p>联系方式:</p>
+              <p>{{propsData.phone}}</p>
+            </div>
+            <div>
+              <p>学院:</p>
+              <p>{{propsData.collegeName}}</p>
+            </div>
+            <div>
+              <p>实验室地点:</p>
+              <p style="width:420px;">{{propsData.subjectName}}{{propsData.roomNum?'('+propsData.roomNum+')':''}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="text-max-big-box">
+        <p class="text-title-p">使用信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <div>
+              <p>使用量:</p>
+              <p>{{propsData.usageAmount}}</p>
+            </div>
+            <div>
+              <p>使用时间:</p>
+              <p>{{parseTime(propsData.startTime,'{y}-{m}-{d} {h}:{i}')}}</p>
+            </div>
+            <div>
+              <p>气表照片:</p>
+              <p class="lookImg" @click="lookImg">查看图片</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <lookImgDialog ref="lookImgDialog"></lookImgDialog>
+  </div>
+</template>
+<script>
+  import lookImgDialog from '@/components/lookImgDialog/lookImgDialog.vue'
+  export default {
+    name: 'infoPage',
+    components: {
+      lookImgDialog
+    },
+    props:{
+      propsData:{},
+    },
+    data () {
+      return {
+        //气瓶级别
+        gasBottleLevel:[],
+        gasBottleSpecification:[],
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.getDicts("gasBottleLevel").then((response) => {
+        this.$set(this,'gasBottleLevel',response.data);
+      });
+      this.getDicts("gasBottleSpecification").then((response) => {
+        this.$set(this,'gasBottleSpecification',response.data);
+      });
+    },
+    methods:{
+      lookImg(){
+        let list = [];
+        let newList = this.propsData.usageImg.split(',');
+        for(let i=0;i<newList.length;i++){
+          list.push({
+            url:newList[i]
+          })
+        }
+        this.$refs.lookImgDialog.lookImgDialogOpen(1,list,0,'气表照片');
+      },
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(2);
+      },
+      forData(type,id){
+        let self = this;
+        let num = 0;
+        if(type == 1){
+          for(let i=0;i<self.gasBottleLevel.length;i++){
+            if(id == self.gasBottleLevel[i].dictValue){
+              num++
+              return self.gasBottleLevel[i].dictLabel
+            }
+          }
+        }else if (type){
+          for(let i=0;i<self.gasBottleSpecification.length;i++){
+            if(id == self.gasBottleSpecification[i].dictValue){
+              num++
+              return self.gasBottleSpecification[i].dictLabel
+            }
+          }
+        }
+        if(num == 0){
+          return '其他'
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .infoPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    font-weight: 500;
+    overflow: hidden;
+    .title-box{
+      display: flex;
+      border-bottom:1px solid #dedede;
+      p:nth-child(1){
+        flex:1;
+        color:#0045AF;
+        font-size:18px;
+        padding-left:20px;
+        line-height: 80px;
+      }
+      p:nth-child(2){
+        width:80px;
+        height:30px;
+        line-height:28px;
+        border:1px solid #0045AF;
+        color:#0045AF;
+        border-radius:6px;
+        font-size:16px;
+        margin:25px 20px;
+        text-align: center;
+        cursor: pointer;
+      }
+    }
+    .text-max-max-box{
+      padding-bottom:20px;
+      .text-max-big-box{
+        margin:0 20px;
+        .text-title-p{
+          line-height:80px;
+          font-size:16px;
+        }
+        .text-big-box{
+          border:1px solid #dedede;
+          height:130px;
+          padding:15px;
+          .text-box-one{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:200px;
+              }
+              .lookImg{
+                color: #0183fa;
+                cursor: pointer;
+              }
+            }
+          }
+          .text-box-two{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:520px;
+              }
+            }
+          }
+          .text-box-three{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:1300px;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+</style>

+ 228 - 0
src/views/hazardManagement/gasBottleManage/warehousingRecord/index.vue

@@ -0,0 +1,228 @@
+<!-- 入库记录 -->
+<template>
+  <div class="app-container warehousingRecord">
+    <div class="page-container warehousingRecordPage" v-if="pageType === 1">
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="searchValue" label-width="60px">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.searchValue"
+              placeholder="气体名称/操作人/联系电话"
+              clearable
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-form-item label="学院" prop="collegeId">
+            <el-select v-model="queryParams.collegeId" clearable placeholder="请选择" style="width: 200px">
+              <el-option
+                v-for="dict in optionList"
+                :key="dict.deptId"
+                :label="dict.deptName"
+                :value="dict.deptId"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="时间" prop="state">
+            <el-date-picker
+              :clearable="false"
+              v-model="dateRange"
+              size="small"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table-column label="气体名称" prop="gasName"  show-overflow-tooltip/>
+          <el-table-column label="气体级别/规格" prop="content" width="150" show-overflow-tooltip>
+            <template slot-scope="scope">
+              {{forData(1,scope.row.level)}}/ {{forData(2,scope.row.size)}}
+            </template>
+          </el-table-column>
+          <el-table-column label="学院" prop="collegeName" width="200" show-overflow-tooltip/>
+          <el-table-column label="实验地点" prop="subjectName" width="249" show-overflow-tooltip>
+            <template slot-scope="scope">
+              {{scope.row.subjectName}}{{scope.row.roomNum?'('+scope.row.roomNum+')':''}}
+            </template>
+          </el-table-column>
+          <el-table-column label="入库人" prop="operator" width="120" show-overflow-tooltip/>
+          <el-table-column label="联系方式" prop="phone" width="220" show-overflow-tooltip/>
+          <el-table-column label="入库时间" prop="createTime" width="200" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime,'{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="100" show-overflow-tooltip v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="tableButton(1,scope.row)"
+                >详情</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <info-page :propsData="propsData" v-if="pageType === 2"></info-page>
+  </div>
+</template>
+<script>
+  import { airbottleInOutRecordList,airbottleInOutRecordFindById } from "@/api/gasBottleManage/index";
+  import { listDepartments } from "@/api/system/dept";
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import infoPage from "./infoPage.vue";
+  export default {
+    name: 'index',
+    components: {
+     infoPage
+    },
+    data () {
+      return {
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        //页面状态
+        pageType:1,
+        //页面遮罩
+        loading:false,
+        //下拉列表数据
+        optionList:[],
+        //气瓶级别
+        gasBottleLevel:[],
+        gasBottleSpecification:[],
+        //查询条件
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        },
+        //时间数据
+        dateRange:[],
+        //列表数据
+        dataList:[],
+        //数据数量
+        total:0,
+        //组件传参
+        propsData:{},
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      this.listDepartments();
+      this.getList();
+      this.getDicts("gasBottleLevel").then((response) => {
+        this.$set(this,'gasBottleLevel',response.data);
+      });
+      this.getDicts("gasBottleSpecification").then((response) => {
+        this.$set(this,'gasBottleSpecification',response.data);
+      });
+    },
+    methods: {
+      listDepartments(){
+        listDepartments().then(response => {
+          this.$set(this,'optionList',response.data);
+        });
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          collegeId :null,
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        obj.type = 1;
+        airbottleInOutRecordList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'dataList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      //操作按钮
+      tableButton(type,row){
+        if(type == 1){
+          airbottleInOutRecordFindById({id:row.id}).then(response => {
+            this.$set(this,'pageType',2);
+            this.$set(this,'propsData',response.data);
+          });
+        }else if(type == 2){
+          this.$set(this,'pageType',1);
+          this.getList();
+        }
+      },
+      forData(type,id){
+        let self = this;
+        let num = 0;
+        if(type == 1){
+          for(let i=0;i<self.gasBottleLevel.length;i++){
+            if(id == self.gasBottleLevel[i].dictValue){
+              num++
+              return self.gasBottleLevel[i].dictLabel
+            }
+          }
+        }else if (type){
+          for(let i=0;i<self.gasBottleSpecification.length;i++){
+            if(id == self.gasBottleSpecification[i].dictValue){
+              num++
+              return self.gasBottleSpecification[i].dictLabel
+            }
+          }
+        }
+        if(num == 0){
+          return '其他'
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .warehousingRecord{
+    display: flex;
+    flex-direction: column;
+    .warehousingRecordPage{
+
+    }
+  }
+</style>

+ 243 - 0
src/views/hazardManagement/gasBottleManage/warehousingRecord/infoPage.vue

@@ -0,0 +1,243 @@
+<template>
+  <div class="infoPage">
+    <div class="title-box">
+      <p>入库记录详情</p>
+      <p @click="backPage">返回</p>
+    </div>
+    <div class="text-max-max-box scrollbar-box">
+      <div class="text-max-big-box">
+        <p class="text-title-p">气瓶信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <!--<div>-->
+              <!--<p>气瓶编号:</p>-->
+              <!--<p>{{propsData.data1}}</p>-->
+            <!--</div>-->
+            <div>
+              <p>气体名称:</p>
+              <p>{{propsData.gasName}}</p>
+            </div>
+            <div>
+              <p>气体级别:</p>
+              <p>{{forData(1,propsData.level)}}</p>
+            </div>
+            <div>
+              <p>气体规格:</p>
+              <p>{{forData(2,propsData.size)}}</p>
+            </div>
+          </div>
+          <div class="text-box-two">
+            <div>
+              <p>电子标签:</p>
+              <p>{{propsData.beaconTag}}</p>
+            </div>
+            <div>
+              <p>气体组分:</p>
+              <p>{{propsData.gasComposition}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="text-max-big-box">
+        <p class="text-title-p">入库人信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <div>
+              <p>入库人:</p>
+              <p>{{propsData.operator}}</p>
+            </div>
+            <div>
+              <p>联系方式:</p>
+              <p>{{propsData.phone}}</p>
+            </div>
+            <div>
+              <p>学院:</p>
+              <p>{{propsData.collegeName}}</p>
+            </div>
+            <div>
+              <p>实验室地点:</p>
+              <p style="width:420px;">{{propsData.subjectName}}{{propsData.roomNum?'('+propsData.roomNum+')':''}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="text-max-big-box">
+        <p class="text-title-p">入库信息</p>
+        <div class="text-big-box">
+          <div class="text-box-one">
+            <div>
+              <p>入库时间:</p>
+              <p>{{ parseTime(propsData.createTime,'{y}-{m}-{d} {h}:{i}') }}</p>
+            </div>
+            <div>
+              <p>检验有效期:</p>
+              <p>{{propsData.validPeriod}}</p>
+            </div>
+            <div>
+              <p>入库气压值:</p>
+              <p>{{propsData.gasPressure}}</p>
+            </div>
+          </div>
+          <div class="text-box-three">
+            <div>
+              <p>备注:</p>
+              <p>{{propsData.remark}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+  export default {
+    name: 'infoPage',
+    props:{
+      propsData:{},
+    },
+    data () {
+      return {
+        //气瓶级别
+        gasBottleLevel:[],
+        gasBottleSpecification:[],
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.getDicts("gasBottleLevel").then((response) => {
+        this.$set(this,'gasBottleLevel',response.data);
+      });
+      this.getDicts("gasBottleSpecification").then((response) => {
+        this.$set(this,'gasBottleSpecification',response.data);
+      });
+    },
+    methods:{
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(2);
+      },
+      forData(type,id){
+        let self = this;
+        let num = 0;
+        if(type == 1){
+          for(let i=0;i<self.gasBottleLevel.length;i++){
+            if(id == self.gasBottleLevel[i].dictValue){
+              num++
+              return self.gasBottleLevel[i].dictLabel
+            }
+          }
+        }else if (type){
+          for(let i=0;i<self.gasBottleSpecification.length;i++){
+            if(id == self.gasBottleSpecification[i].dictValue){
+              num++
+              return self.gasBottleSpecification[i].dictLabel
+            }
+          }
+        }
+        if(num == 0){
+          return '其他'
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .infoPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    font-weight: 500;
+    overflow: hidden;
+    .title-box{
+      display: flex;
+      border-bottom:1px solid #dedede;
+      p:nth-child(1){
+        flex:1;
+        color:#0045AF;
+        font-size:18px;
+        padding-left:20px;
+        line-height: 80px;
+      }
+      p:nth-child(2){
+        width:80px;
+        height:30px;
+        line-height:28px;
+        border:1px solid #0045AF;
+        color:#0045AF;
+        border-radius:6px;
+        font-size:16px;
+        margin:25px 20px;
+        text-align: center;
+        cursor: pointer;
+      }
+    }
+    .text-max-max-box{
+      padding-bottom:20px;
+      .text-max-big-box{
+        margin:0 20px;
+        .text-title-p{
+          line-height:80px;
+          font-size:16px;
+        }
+        .text-big-box{
+          border:1px solid #dedede;
+          height:130px;
+          padding:15px;
+          .text-box-one{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:200px;
+              }
+            }
+          }
+          .text-box-two{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:520px;
+              }
+            }
+          }
+          .text-box-three{
+            display: flex;
+            div{
+              display: flex;
+              p{
+                line-height:50px;
+              }
+              p:nth-child(1){
+                width:120px;
+                text-align: right;
+                color:#999999;
+              }
+              p:nth-child(2){
+                width:1300px;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+</style>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 490 - 172
src/views/newEvacuationBigData.vue


+ 123 - 59
src/views/newEvacuationBigDataHome.vue

@@ -65,11 +65,11 @@
         <div id="container" ref="container" @mousedown="getMouseXY($event)">
 
         </div>
-        <div class="position-floor-user-box">
-          <img src="@/assets/ZDimages/bigData3_2/icon_zhpt_rs.png">
-          <p>实时人数:</p>
-          <p>{{userNum}}人</p>
-        </div>
+        <!--<div class="position-floor-user-box">-->
+          <!--<img src="@/assets/ZDimages/bigData3_2/icon_zhpt_rs.png">-->
+          <!--<p>实时人数:</p>-->
+          <!--<p>{{userNum}}人</p>-->
+        <!--</div>-->
         <div class="position-floor-button-box" v-if="mapList[0]">
           <p class="position-floor-for-button-p" :class="item.checkType?'check-button-box':''"
              @click="dataDispose(item.index)"
@@ -108,6 +108,7 @@
   import { SceneUtils } from 'three/examples/jsm/utils/SceneUtils.js'
   import newEvacuationBigDataSubPageKYDXNH from './differenceComponent/newEvacuationBigDataSubPageKYDXNH.vue'
   import newEvacuationBigDataSubPagePublic from './differenceComponent/newEvacuationBigDataSubPagePublic.vue'
+  import { airbottleBluetoothGetBeaconNotice } from "@/api/gasBottleManage/index";
   export default {
     name: 'newEvacuationBigDataHome',
     components: {
@@ -122,7 +123,7 @@
     watch:{
       Obj(newVal,oldVal){
         //可以对数据执行相应的操作
-        console.log(newVal,oldVal)
+        // console.log(newVal,oldVal)
         this.selectTriggerInfo();
       }
     },
@@ -192,6 +193,9 @@
         //楼栋MQTT相关
         buildingClient:{},
         userTopic:"lab/horn",//消息
+        //气瓶MQTT相关
+        gasBottleClient:{},
+        gasBottleTopic:"air/blueTooth/gateway",//预案
         //摄像头数据
         monitorNumList:[],
         monitorType:null,
@@ -685,6 +689,8 @@
             this.getLotStatis();
             //楼栋MQTT
             this.offBuildingMQTT('on');
+            //气瓶MQTT
+            this.offGasBottleMQTT('on');
           }
         })
       },
@@ -701,6 +707,8 @@
         this.getLotStatis();
         //楼栋MQTT
         this.offBuildingMQTT('on');
+        //气瓶MQTT
+        this.offGasBottleMQTT('on');
       },
       //获取楼栋人数
       getBuildOrFloorInfo(){
@@ -1039,59 +1047,65 @@
       //查询预案发生
       selectTriggerInfo(){
         let self = this;
-        selectTriggerInfo().then(response => {
-          if(response.data[0]){
-            for(let i=0;i<response.data.length;i++){
-              for(let o=0;o<self.mapList.length;o++){
-                for(let x=0;x<self.mapList[o].relationalData.length;x++){
-                  if (self.mapList[o].relationalData[x].type == '1' && self.mapList[o].relationalData[x].roomType!='-99'){
-                    if(response.data[i].subId == self.mapList[o].relationalData[x].subId){
-                      self.mapList[o].relationalData[x].planType = true;
-                      //判断预案是否进入过
-                      for(let s=0;s<response.data.length;s++){
-                        if(response.data[s].riskAttribute != '1'&&response.data[s].ifCheck != '1'){
-                          setTimeout(function (){
-                            if(self.$route.query.buildId){
-                              delete self.$route.query.buildId;
-                            }
-                            if(self.$route.query.subId){
-                              delete self.$route.query.subId;
-                            }
-                            if(self.$route.query.floorId){
-                              delete self.$route.query.floorId;
-                            }
-                            if(self.$route.query.groupId){
-                              delete self.$route.query.groupId;
-                            }
-                            let obj = {
-                              buildId:response.data[s].buildId,
-                              floorId:response.data[s].floorId,
-                              subId:response.data[s].subId,
-                              groupId:response.data[s].groupId,
-                              planType:true
-                            }
-                            self.$parent.goPage(2,obj);
-                          },5000)
-                          break
-                        }
+        let newList = [];
+        selectTriggerInfo().then(responseOne => {
+          newList = newList.concat(responseOne.data);
+          airbottleBluetoothGetBeaconNotice().then(responseTow => {
+            newList = newList.concat(responseTow.data);
+            //********************处理数据********************
+            if(newList[0]){
+              for(let i=0;i<newList.length;i++){
+                for(let o=0;o<self.mapList.length;o++){
+                  for(let x=0;x<self.mapList[o].relationalData.length;x++){
+                    if (self.mapList[o].relationalData[x].type == '1' && self.mapList[o].relationalData[x].roomType!='-99'){
+                      if(newList[i].subId == self.mapList[o].relationalData[x].subId){
+                        self.mapList[o].relationalData[x].planType = true;
+                        //判断预案是否进入过
+                        // for(let s=0;s<newList.length;s++){
+                        //   if(newList[s].riskAttribute != '1'&&newList[s].ifCheck != '1'){
+                        //     setTimeout(function (){
+                        //       if(self.$route.query.buildId){
+                        //         delete self.$route.query.buildId;
+                        //       }
+                        //       if(self.$route.query.subId){
+                        //         delete self.$route.query.subId;
+                        //       }
+                        //       if(self.$route.query.floorId){
+                        //         delete self.$route.query.floorId;
+                        //       }
+                        //       if(self.$route.query.groupId){
+                        //         delete self.$route.query.groupId;
+                        //       }
+                        //       let obj = {
+                        //         buildId:newList[s].buildId,
+                        //         floorId:newList[s].floorId,
+                        //         subId:newList[s].subId,
+                        //         groupId:newList[s].groupId,
+                        //         planType:true
+                        //       }
+                        //       self.$parent.goPage(2,obj);
+                        //     },5000)
+                        //     break
+                        //   }
+                        // }
+                      }else{
+                        self.mapList[o].relationalData[x].planType = false;
                       }
-                    }else{
-                      self.mapList[o].relationalData[x].planType = false;
                     }
                   }
                 }
               }
-            }
-          }else{
-            for(let o=0;o<self.mapList.length;o++){
-              for(let x=0;x<self.mapList[o].relationalData.length;x++){
-                if (self.mapList[o].relationalData[x].type == '1' && self.mapList[o].relationalData[x].roomType!='-99'){
-                  self.mapList[o].relationalData[x].planType = false;
+            }else{
+              for(let o=0;o<self.mapList.length;o++){
+                for(let x=0;x<self.mapList[o].relationalData.length;x++){
+                  if (self.mapList[o].relationalData[x].type == '1' && self.mapList[o].relationalData[x].roomType!='-99'){
+                    self.mapList[o].relationalData[x].planType = false;
+                  }
                 }
               }
             }
-          }
-          this.initAdd();
+            this.initAdd();
+          })
         })
       },
       //全局-MQTT订阅
@@ -1102,10 +1116,10 @@
           password: localStorage.getItem('mqttPassword')
         });
         this.allClient.on("connect", e =>{
-          console.log("连接成功");
+          // console.log("连接成功");
           this.allClient.subscribe(self.planTopic, (err) => {
             if (!err) {
-              console.log("预案-订阅成功:" + self.planTopic);
+              // console.log("预案-订阅成功:" + self.planTopic);
             }
           });
         });
@@ -1113,10 +1127,10 @@
           if (message){
             let data = JSON.parse(message)
             if(data){
-              console.log('data',data);
+              // console.log('data',data);
               if(topic == self.planTopic){
                 //传感器状态
-                console.log('预案-状态');
+                // console.log('预案-状态');
                 self.selectTriggerInfo();
               }
             }
@@ -1132,16 +1146,16 @@
         });
         this.buildingClient.subscribe(self.userTopic+self.buildingId, (err) => {
           if (!err) {
-            console.log("实验室人数-订阅成功:" + self.userTopic+self.buildingId);
+            // console.log("实验室人数-订阅成功:" + self.userTopic+self.buildingId);
           }
         });
         this.buildingClient.on("message", (topic, message) => {
           if (message){
             let data = JSON.parse(message)
             if(data){
-              console.log('data',data);
+              // console.log('data',data);
               if(topic == (self.userTopic+self.buildingId)){
-                console.log('实验室人数-状态');
+                // console.log('实验室人数-状态');
                 //实验室人数
                 self.getBuildOrFloorInfo();
               }
@@ -1149,9 +1163,39 @@
           }
         });
       },
+      //气瓶-MQTT订阅
+      onGasBottleMQTT(){
+        let self = this;
+        this.gasBottleClient = mqtt.connect(localStorage.getItem('mqttUrl'), {
+          username: localStorage.getItem('mqttUser'),
+          password: localStorage.getItem('mqttPassword')
+        });
+        this.gasBottleClient.on("connect", e =>{
+          // console.log("气瓶-连接成功");
+          this.gasBottleClient.subscribe(self.gasBottleTopic, (err) => {
+            if (!err) {
+              // console.log("气瓶-订阅成功:" + self.gasBottleTopic);
+            }
+          });
+        });
+        this.gasBottleClient.on("message", (topic, message) => {
+          if (message){
+            let data = JSON.parse(message)
+            if(data){
+              // console.log('data',data);
+              if(topic == (self.gasBottleTopic)){
+                //气瓶-预案触发
+                // console.log('气瓶-预案触发');
+                // this.$set(this,'sensorList',this.sensorIconMatching(data.data.functionStatuses));
+                this.selectTriggerInfo();
+              }
+            }
+          }
+        });
+      },
       //取消订阅-全局-关闭MQTT连接
       offAllMQTT(type){
-        console.log('type',type)
+        // console.log('type',type)
         let self = this;
         //判断是否已有连接如果有责断开
         if(this.allClient.unsubscribe){
@@ -1186,6 +1230,25 @@
           this.onBuildingMQTT();
         }
       },
+      //取消订阅气瓶-MQTT连接
+      offGasBottleMQTT(type){
+        let self = this;
+        //判断是否已有连接如果有责断开
+        if(this.gasBottleClient.unsubscribe){
+          this.gasBottleClient.unsubscribe(self.gasBottleTopic, error => {
+            if (error) {
+              console.log('气瓶-MQTT断开报错=>', error)
+            }
+          })
+          this.gasBottleClient.end();
+          this.$set(this,'gasBottleClient',{});
+        }
+        //判断传入参数如果存在 发起一次新的连接
+        if(type){
+          // console.log('===========>')
+          this.onGasBottleMQTT();
+        }
+      },
       //跳转
       goRoute(){
         if(this.routeType){
@@ -1211,6 +1274,7 @@
       self.videoOff();
       // self.offAllMQTT();
       self.offBuildingMQTT();
+      self.offGasBottleMQTT();
       cancelAnimationFrame(self.animateData);
       self.scene.traverse((child) => {
         if (child.material) {

+ 1 - 0
src/views/oneKeyOutfire/planExecuteRecord/planExecuteRecord.vue

@@ -26,6 +26,7 @@
       </el-form>
       <el-table border v-loading="loading" :data="tableData">
         <el-table-column label="预案名称" align="left" prop="groupName"/>
+        <el-table-column label="学院" align="left" prop="deptName"></el-table-column>
         <el-table-column label="实验室名称" align="left" prop="subjectName"></el-table-column>
         <el-table-column label="预案属性" align="left" prop="riskAttribute">
           <template slot-scope="scope">