dedsudiyu лет назад: 2
Родитель
Сommit
f240be998d

+ 90 - 0
src/api/laboratory/exhaustTime.js

@@ -0,0 +1,90 @@
+import request from '@/utils/request'
+
+// 定时排风列表接口
+export function exhaustList(query) {
+  return request({
+    url: '/laboratory/timed/exhaust/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 定时排风任务开关
+export function operateExhaust(data) {
+  return request({
+    url: '/laboratory/timed/exhaust/operateExhaust',
+    method: 'put',
+    data: data
+  })
+}
+
+// 新增排风任务
+export function exhaust(data) {
+  return request({
+    url: '/laboratory/timed/exhaust',
+    method: 'post',
+    data: data
+  })
+}
+
+// 编辑排风任务
+export function putExhaust(data) {
+  return request({
+    url: '/laboratory/timed/exhaust',
+    method: 'put',
+    data: data
+  })
+}
+
+//获取任务详情
+export function getExhaustInfo(id) {
+  return request({
+    url: 'laboratory/timed/exhaust/'+id,
+    method: 'get',
+  })
+}
+
+//删除排风任务
+export function delExhaust(id) {
+  return request({
+    url: '/laboratory/timed/exhaust/' + id,
+    method: 'delete'
+  })
+}
+
+//获取节假日数据接口
+export function getHoliday(query) {
+  return request({
+    url: 'laboratory/timed/exhaust/getHoliday',
+    method: 'get',
+    params: query
+  })
+}
+
+//左侧关联实验室相关实验室查询
+export function getLabExhaustNoJoinSub(query) {
+  return request({
+    url: 'laboratory/timed/exhaust/getLabExhaustNoJoinSub',
+    method: 'get',
+    params: query
+  })
+}
+
+//右侧关联实验室相关实验室查询
+export function getLabExhaustJoinSub(query) {
+  return request({
+    url: 'laboratory/timed/exhaust/getLabExhaustJoinSub',
+    method: 'get',
+    params: query
+  })
+}
+
+//关联实验室提交
+
+export function joinsub(data) {
+  return request({
+    url: '/laboratory/timed/joinsub',
+    method: 'post',
+    data: data
+  })
+}

BIN
src/assets/ZDimages/icon_wxz_yuo.png


BIN
src/assets/ZDimages/icon_wxz_zuo.png


BIN
src/assets/ZDimages/icon_yxz_yuo.png


BIN
src/assets/ZDimages/icon_yxz_zuo.png


+ 29 - 0
src/assets/styles/ZDpageCss.scss

@@ -198,6 +198,35 @@ p{
     margin: 0;
   }
 }
+//定时排风
+.timingExhaustAir{
+  .switch .el-switch__label {
+    position: absolute;
+    display: none;
+  }
+  .switch .el-switch__label--right {
+    z-index: 1;
+    color: #fff !important;
+  }
+  .switch .el-switch__label--right span{
+    margin-left: 10px;
+  }
+  .switch .el-switch__label--left {
+    z-index: 1;
+    color: #A2A2A2 !important;
+  }
+  .switch .el-switch__label--left span{
+    margin-left: 24px;
+  }
+  .switch .el-switch__label.is-active {
+    display: block;
+  }
+  .switch.el-switch .el-switch__core,
+  .el-switch .el-switch__label {
+    width: 60px !important;
+    margin: 0;
+  }
+}
 //供应商管理
 .supplier{
   .switch .el-switch__label {

+ 1 - 0
src/layout/components/Navbar.vue

@@ -152,6 +152,7 @@ export default {
     p{
       font-size:24px;
       color:#fff;
+      line-height:80px;
     }
   }
   .hamburger-container {

+ 0 - 17
src/views/comprehensive/laboratoryManagement/exhaustAirRecord/index.vue

@@ -1,17 +0,0 @@
-<template>
-    <div class="exhaustAirRecord">
-
-    </div>
-</template>
-
-<script>
-  export default {
-    name: 'index'
-  }
-</script>
-
-<style scoped>
-  .exhaustAirRecord{
-
-  }
-</style>

+ 811 - 0
src/views/comprehensive/laboratoryManagement/timingExhaustAir/addPage.vue

@@ -0,0 +1,811 @@
+<template>
+    <div class="timingExhaustAirAddPage">
+      <div class="top-title-box">
+        <p>{{propsData.id?'编辑':'新增'}}定时排风任务 </p>
+        <p class="add-button-one-90" @click="backPage">返回</p>
+      </div>
+      <div class="content-max-big-box scrollbar-box">
+        <el-form :model="formData" ref="upForm" :rules="rules">
+          <el-form-item label="任务名称" prop="taskName" class="form-item" label-width="80px">
+            <el-input
+              style="width:500px;"
+              maxlength="20"
+              show-word-limit
+              v-model="formData.taskName"
+              placeholder="输入定时排风任务名称"
+              clearable
+              size="small"
+            />
+          </el-form-item>
+          <div class="form-time-box" v-for="(item,index) in formData.exhaustPeriodVoList" :key="index">
+            <el-form-item :label="index == 0 ?'排风时段':''" class="form-item" label-width="80px"
+                          :rules="rules.beginTime" :prop="'exhaustPeriodVoList.'+ index +'.beginTime'">
+              <el-time-select
+                style="width:200px;"
+                placeholder="请选择"
+                v-model="item.beginTime"
+                :picker-options="{
+                start: '00:00',
+                step: '00:30',
+                end: '24:00'
+              }">
+              </el-time-select>
+            </el-form-item>
+            <p style="width:48px;text-align: center">至</p>
+            <el-form-item label="" class="form-item" label-width="0px"
+                          :rules="rules.endTime" :prop="'exhaustPeriodVoList.'+ index +'.endTime'">
+              <el-time-select
+                style="width:200px;"
+                placeholder="请选择"
+                v-model="item.endTime"
+                :picker-options="{
+                start: '00:00',
+                step: '00:30',
+                end: '24:00'
+              }">
+              </el-time-select>
+            </el-form-item>
+            <el-form-item label="" class="form-item" label-width="0px" style="margin:0 40px;">
+              <el-radio-group v-model="item.timedType">
+                <el-radio :label="1">工作日(周一至周五)</el-radio>
+                <el-radio :label="2">周(周一至周日)</el-radio>
+                <el-radio :label="3">自定义</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="" class="form-item" label-width="0px" v-if="item.timedType==3" style="margin-right:20px;"
+                          :rules="rules.customTime" :prop="'exhaustPeriodVoList.'+ index +'.customTime'">
+              <el-select v-model="item.customTime" multiple placeholder="请选择"
+                         style="width: 350px;">
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <i class="el-icon-delete del-button-i" v-if="formData.exhaustPeriodVoList[1]" @click="timeListDelObj(index)"></i>
+          </div>
+          <p class="add-button-on" @click="timeListAddObj">+  新增排风时段</p>
+          <div class="form-time-box">
+            <div class="form-title-box">
+              <span v-show="formData.executionDateVoList[1]">*</span>
+              <span v-show="!formData.executionDateVoList[1]"></span>
+              <p class="form-title-p">执行日期</p>
+              <div class="festival-box" @click="festivalButton" v-if="festival[0]">
+                <img src="@/assets/ZDimages/personnelManagement/icon_xzqx_zc.png" v-if="!formData.executionDateType==1">
+                <img src="@/assets/ZDimages/personnelManagement/icon_xzqx_xz.png" v-if="formData.executionDateType==1">
+                <p>节假日不执行排风</p>
+              </div>
+              <p class="form-title-text" v-if="festival[0]">不指定排风日期表示所有日期均执行排风</p>
+              <p class="form-title-text" v-if="!festival[0]">无法通过网络获取节假日,请手动填写排风日期并排除节假日。</p>
+            </div>
+          </div>
+          <div class="form-period-max-box">
+            <div class="form-period-box" v-for="(item,index) in formData.executionDateVoList">
+              <div class="form-period-min-box">
+                <el-form-item label="" class="form-item" label-width="0px" style="margin-right:8px;"
+                              :rules="rules.dateRange" :prop="'executionDateVoList.'+ index +'.dateRange'">
+                  <el-date-picker
+                    @change="festivalButtonPicker"
+                    :clearable="false"
+                    v-model="item.dateRange"
+                    style="width: 448px;height:40px;"
+                    value-format="yyyy-MM-dd"
+                    type="daterange"
+                    range-separator="-"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                  ></el-date-picker>
+                </el-form-item>
+                <i class="el-icon-circle-plus-outline i-add-button"
+                   v-if="index == formData.executionDateVoList.length-1"
+                   @click="periodListAddObj"></i>
+                <i class="el-icon-delete i-del-button"
+                   v-if="formData.executionDateVoList[1]"
+                   @click="periodListDelObj(index)"></i>
+              </div>
+            </div>
+            <div class="form-period-box" v-if="!formData.executionDateVoList[0]">
+              <div class="form-period-min-box" style="height:79px;">
+                <i class="el-icon-circle-plus-outline i-add-button" style="margin-top:17px;"
+                   @click="periodListAddObj"></i>
+              </div>
+            </div>
+          </div>
+          <el-form-item label="状态" prop="exhaustType" class="form-item" label-width="80px">
+            <el-switch
+              @click.native="changeIsNeedCaptcha"
+              class="switch"
+              v-model="formData.exhaustType"
+              :active-value="1"
+              :inactive-value="0"
+              active-color="#0183FA"
+              inactive-color="#E0E0E0"
+              active-text="启用"
+              inactive-text="停用"
+              disabled
+            ></el-switch>
+          </el-form-item>
+        </el-form>
+        <div class="button-max-box">
+          <p></p>
+          <p @click="backPage">取消</p>
+          <p @click="subButton">确认</p>
+          <p></p>
+        </div>
+      </div>
+    </div>
+</template>
+
+<script>
+  import { exhaust,getHoliday,putExhaust } from "@/api/laboratory/exhaustTime";
+  export default {
+    name: 'addPage',
+    props:{
+      propsData:{},
+    },
+    data() {
+      //验证时间段时候重复
+      const timeVerification  = (rule, value, callback) => {
+        let self = this;
+        let index = rule.field.split('.')[1];
+        let type = rule.field.split('.')[2]=='beginTime'?'1':(rule.field.split('.')[2]=='endTime'?'2':'');
+        let oneList = [];
+        let towList = [];
+        for(let i=0;i<self.PeriodVerificationProcessing.length;i++){
+          if(i == index){
+            oneList = oneList.concat(self.PeriodVerificationProcessing[i])
+          }else{
+            towList = towList.concat(self.PeriodVerificationProcessing[i]);
+          }
+        }
+        //验证时间顺序
+        let age = 0;
+        for(let i=0;i<oneList.length;i++){
+          if(oneList[i].beginTime >= oneList[i].endTime){
+            age++
+          }
+        }
+        if(age != 0){
+          callback(new Error("开始时间不能大于等于结束时间"));
+        }
+        //验证时间重复
+        if(self.PeriodVerificationProcessing[1]){
+          let num = 0;
+          for(let i=0;i<oneList.length;i++){
+            for(let o=0;o<towList.length;o++){
+              if (type == 1){
+                if(oneList[i].beginTime >= towList[o].beginTime &&
+                  oneList[i].beginTime <= towList[o].endTime ){
+                  num++
+                }
+              }else if(type == 2){
+                if(oneList[i].endTime >= towList[o].beginTime &&
+                  oneList[i].endTime <= towList[o].endTime ){
+                  num++
+                }
+              }
+            }
+          }
+          if(num != 0){
+            callback(new Error("时间段不能重复"));
+          }else{
+            callback()
+          }
+        }else{
+          callback()
+        }
+      };
+      const dateVerification = (rule, value, callback) =>{
+        let self = this;
+        if(self.formData.executionDateVoList[1]){
+          if(value[1]){
+            callback()
+          }else{
+            callback(new Error("请选择执行日期"));
+          }
+        }
+        let index = rule.field.split('.')[1];
+        if(!self.DateVerificationProcessing[0]){
+          callback()
+        }
+        let oneList = [];
+        let towList = [];
+        for(let i=0;i<self.DateVerificationProcessing.length;i++){
+          if(i == index){
+            oneList.push(self.DateVerificationProcessing[i])
+          }else{
+            towList.push(self.DateVerificationProcessing[i]);
+          }
+        }
+        //验证时间重复
+        if(self.DateVerificationProcessing[1]){
+          let num = 0;
+          for(let i=0;i<oneList.length;i++){
+            for(let o=0;o<towList.length;o++){
+              if(oneList[i].beginTime >= towList[o].beginTime &&
+                oneList[i].beginTime <= towList[o].endTime ){
+                num++
+              }
+              if(oneList[i].endTime >= towList[o].beginTime &&
+                oneList[i].endTime <= towList[o].endTime ){
+                num++
+              }
+            }
+          }
+          if(num != 0){
+            callback(new Error("执行日期不能重复"));
+          }else{
+            callback()
+          }
+        }else{
+          callback()
+        }
+      };
+      return {
+        // 表单校验
+        rules: {
+          taskName: [
+            { required: true, message: "请输入任务名称", trigger: "blur" },
+            { required: true, message: "请输入任务名称", validator: this.spaceJudgment, trigger: "blur" },
+          ],
+          beginTime: [
+            { required: true, message: "请选择开始时间", trigger: "blur" },
+            { required: true, validator: timeVerification, trigger: "blur" },
+          ],
+          endTime: [
+            { required: true, message: "请选择结束时间", trigger: "blur" },
+            { required: true, validator: timeVerification, trigger: "blur" },
+          ],
+          timedType: [
+            { required: true, message: "请选择排风时段", trigger: "blur" }
+          ],
+          customTime: [
+            { required: true, message: "请选择自定义时间", trigger: "blur" },
+          ],
+          dateRange: [
+            { required: true, validator: dateVerification, trigger: "blur" },
+          ],
+        },
+        //周数据
+        options: [
+          {
+            value: '1',
+            label: '周一'
+          }, {
+            value: '2',
+            label: '周二'
+          }, {
+            value: '3',
+            label: '周三'
+          }, {
+            value: '4',
+            label: '周四'
+          }, {
+            value: '5',
+            label: '周五'
+          }, {
+            value: '6',
+            label: '周六'
+          }, {
+            value: '7',
+            label: '周日'
+          }
+        ],
+        //表单数据
+        formData:{
+          taskName:"",
+          exhaustType:1,
+          exhaustPeriodVoList:[
+            {
+              beginTime:"",
+              endTime:"",
+              timedType:1,
+              customTime:"",
+            },
+          ],
+          executionDateVoList:[
+            {
+              dateRange:[],
+            }
+          ]
+        },
+        //节日数据
+        festival:[],
+        //时间段验证数据
+        PeriodVerificationProcessing:[],
+        //不执行日期验证数据
+        DateVerificationProcessing:[],
+      }
+    },
+    created() {
+      this.getHoliday();
+      if(this.propsData.id){
+        let obj = JSON.parse(JSON.stringify(this.propsData))
+        let list = [];
+        for(let i=0;i<obj.executionDateVoList.length;i++){
+          list.push({dateRange:[obj.executionDateVoList[i].beginDate,obj.executionDateVoList[i].endDate]})
+        }
+        obj.executionDateVoList = list;
+        this.$set(this,'formData',obj);
+      }
+    },
+    mounted() {
+
+    },
+    methods: {
+      //时间验证
+      timeVerificationProcessing(){
+        let self = this;
+        let timeNum = 1440;
+        let exhaustPeriodVoList = [];
+        let executionDateVoList = [];
+        //处理时间段验证数据
+        for(let i=0;i<self.formData.exhaustPeriodVoList.length;i++){
+          let newList = [];
+          if(self.formData.exhaustPeriodVoList[i].timedType == 1){
+            //周一至周五
+            let beginHH = self.accMul(parseInt(self.formData.exhaustPeriodVoList[i].beginTime.split(':')[0]),60);
+            let beginMM = parseInt(self.formData.exhaustPeriodVoList[i].beginTime.split(':')[1]);
+            let endHH = self.accMul(parseInt(self.formData.exhaustPeriodVoList[i].endTime.split(':')[0]),60);
+            let endMM = parseInt(self.formData.exhaustPeriodVoList[i].endTime.split(':')[1]);
+            for(let o=0;o<5;o++){
+              newList.push({
+                beginTime:self.accMul(o,timeNum)+beginHH+beginMM,
+                endTime:self.accMul(o,timeNum)+endHH+endMM,
+              })
+            }
+            exhaustPeriodVoList.push(newList);
+          }else if(self.formData.exhaustPeriodVoList[i].timedType == 2){
+            //周一至周日
+            let beginHH = self.accMul(parseInt(self.formData.exhaustPeriodVoList[i].beginTime.split(':')[0]),60);
+            let beginMM = parseInt(self.formData.exhaustPeriodVoList[i].beginTime.split(':')[1]);
+            let endHH = self.accMul(parseInt(self.formData.exhaustPeriodVoList[i].endTime.split(':')[0]),60);
+            let endMM = parseInt(self.formData.exhaustPeriodVoList[i].endTime.split(':')[1]);
+            for(let o=0;o<7;o++){
+              newList.push({
+                beginTime:self.accMul(o,timeNum)+beginHH+beginMM,
+                endTime:self.accMul(o,timeNum)+endHH+endMM,
+              })
+            }
+            exhaustPeriodVoList.push(newList);
+          }else if(self.formData.exhaustPeriodVoList[i].timedType == 3){
+            //自定义时间
+            let beginHH = self.accMul(parseInt(self.formData.exhaustPeriodVoList[i].beginTime.split(':')[0]),60);
+            let beginMM = parseInt(self.formData.exhaustPeriodVoList[i].beginTime.split(':')[1]);
+            let endHH = self.accMul(parseInt(self.formData.exhaustPeriodVoList[i].endTime.split(':')[0]),60);
+            let endMM = parseInt(self.formData.exhaustPeriodVoList[i].endTime.split(':')[1]);
+            for(let o=0;o<self.formData.exhaustPeriodVoList[i].customTime.length;o++){
+              newList.push({
+                beginTime:self.accMul(parseInt(self.formData.exhaustPeriodVoList[i].customTime[o])-1,timeNum)+beginHH+beginMM,
+                endTime:self.accMul(parseInt(self.formData.exhaustPeriodVoList[i].customTime[o])-1,timeNum)+endHH+endMM,
+              })
+            }
+            exhaustPeriodVoList.push(newList);
+          }
+        }
+        this.$set(this,'PeriodVerificationProcessing',exhaustPeriodVoList);
+        //处理不执行日期验证数据
+        for(let i=0;i<self.formData.executionDateVoList.length;i++){
+          if (self.formData.executionDateVoList[i].dateRange[1]){
+            executionDateVoList.push({
+              beginTime : Date.parse(new Date(self.formData.executionDateVoList[i].dateRange[0]+' '+'00:00:00'))/1000,
+              endTime : Date.parse(new Date(self.formData.executionDateVoList[i].dateRange[1]+' '+'23:59:59'))/1000
+            })
+          }
+        }
+        this.$set(this,'DateVerificationProcessing',executionDateVoList);
+        return true;
+      },
+      //提交
+      subButton(){
+        let self = this;
+        if(self.timeVerificationProcessing()){
+          self.$refs["upForm"].validate(valid => {
+            if (valid) {
+              this.$confirm('确认提交?', "警告", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+              }).then(function() {
+                self.upDataButton();
+              }).then(() => {
+              }).catch(() => {});
+            }
+          })
+        }
+      },
+      upDataButton(){
+        let newObj = {
+          taskName:this.formData.taskName,
+          exhaustType:this.formData.exhaustType,
+          exhaustPeriodVoList:this.formData.exhaustPeriodVoList,
+          executionDateVoList:this.formData.executionDateVoList
+        }
+        if(this.formData.id){
+          newObj.id = this.formData.id;
+        }
+        let obj = JSON.parse(JSON.stringify(newObj));
+        if(newObj.executionDateVoList[0].dateRange[0]){
+          let list = [];
+          for(let i=0;i<newObj.executionDateVoList.length;i++){
+            list.push({
+              beginDate:newObj.executionDateVoList[i].dateRange[0],
+              endDate:newObj.executionDateVoList[i].dateRange[1],
+            })
+          }
+          obj.executionDateVoList = list;
+        }else{
+          obj.executionDateVoList = [];
+        }
+        for(let i=0;i<obj.exhaustPeriodVoList.length;i++){
+          obj.exhaustPeriodVoList[i].customTime = obj.exhaustPeriodVoList[i].customTime+'';
+        }
+        if(obj.id){
+          putExhaust(obj).then( response => {
+            this.msgSuccess(response.msg);
+            this.$parent.goPage(4,response.data.id);
+          });
+        }else{
+          exhaust(obj).then( response => {
+            this.msgSuccess(response.msg);
+            this.$parent.goPage(4,response.data.id);
+          });
+        }
+      },
+      //启用停用状态切换
+      changeIsNeedCaptcha(){
+        this.formData.exhaustType = this.formData.exhaustType==1?0:1
+      },
+      //节日按钮
+      festivalButton(){
+        let self = this;
+        if(this.formData.executionDateType==1){
+          this.$set(this.formData,'executionDateType',0)
+          this.$set(this.formData,'executionDateVoList',[{dateRange:[]}]);
+        }else{
+          let num = 0;
+          for(let i=0;i<self.formData.executionDateVoList.length;i++){
+            if(self.formData.executionDateVoList[i].dateRange[1]){
+              num++
+            }
+          }
+          if(num!=0){
+            this.$confirm('确认后将覆盖下方录入的排风日期', "警告", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(function() {
+              self.$set(self.formData,'executionDateType',1)
+              self.dateFormatting();
+            }).then(() => {
+            }).catch(() => {});
+          }else{
+            self.$set(this.formData,'executionDateType',1)
+            self.dateFormatting();
+          }
+        }
+      },
+      //时间变更后重置节假日
+      festivalButtonPicker(){
+        this.$set(this.formData,'executionDateType',0)
+      },
+      //添加时段
+      periodListAddObj(){
+        if(this.formData.executionDateVoList.length<10){
+          this.formData.executionDateVoList.push({
+            dateRange:[]
+          })
+          this.$set(this.formData,'executionDateType',0)
+        }else{
+          this.msgError('最多可以增加10个执行日期')
+        }
+      },
+      //删除时段
+      periodListDelObj(index){
+        this.formData.executionDateVoList.splice(index,1)
+        this.$set(this.formData,'executionDateType',0)
+        if(!this.formData.executionDateVoList[1]){
+          this.$refs['upForm'].clearValidate('executionDateVoList.'+ '0' +'.dateRange');
+        }
+      },
+      //添加时间
+      timeListAddObj(){
+        if(this.formData.exhaustPeriodVoList.length<6){
+          this.formData.exhaustPeriodVoList.push({
+            beginTime:"",
+            endTime:"",
+            timedType:1,
+            customTime:"",
+          })
+        }else{
+          this.msgError('最多可以增加6个排风时段')
+        }
+      },
+      //删除时间
+      timeListDelObj(index){
+        this.formData.exhaustPeriodVoList.splice(index,1)
+      },
+      backPage(){
+        this.$parent.goPage(1);
+      },
+      //生成排除节假日后的日期
+      dateFormatting(){
+        let self = this;
+        let myDate = new Date();
+        let year = myDate.getFullYear()
+        let yearTow = year + 1;
+        let age = true;
+        let timeList = [];
+        let beginTime = "";
+        let endTime = "";
+        for(let timeStamp = Date.parse(new Date(year+'/1/1'+' '+'00:00:00'))/1000;(new Date(self.accMul(timeStamp,1000)).getFullYear())<yearTow; timeStamp = timeStamp + 86400){
+          let num = 0;
+          for(let i=0;i<self.festival.length;i++){
+            if(timeStamp >= self.festival[i].beginTime && timeStamp <= self.festival[i].endTime){
+              num++
+            }
+          }
+          if(num == 0){
+            if(age){
+              let obj = {beginTime:timeStamp}
+              obj = JSON.parse(JSON.stringify(obj))
+              beginTime = obj.beginTime;
+              age = false;
+            }
+            endTime = timeStamp;
+          }else{
+            if(beginTime != ""){
+              timeList.push(JSON.parse(JSON.stringify({dateRange:[self.timestampToTimeD(beginTime),self.timestampToTimeD(timeStamp - 1)]})));
+              beginTime = "";
+              age = true;
+            }
+          }
+        }
+        if(beginTime != ""){
+          timeList.push(JSON.parse(JSON.stringify({dateRange:[self.timestampToTimeD(beginTime),self.timestampToTimeD(endTime)]})));
+        }
+        this.$set(this.formData,'executionDateVoList',timeList);
+      },
+      timestampToTimeD(timestamp) {
+        let date = new Date(this.accMul(timestamp,1000)); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
+        let Y = date.getFullYear() + "-";//年
+        let M = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-";//月
+        let D = (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " ";//日
+        return Y + M + D;
+      },
+      //获取节假日数据
+      getHoliday(){
+        getHoliday().then( response => {
+          let self = this;
+          let list = response.data
+          for(let i=0;i<list.length;i++){
+            list[i] = list[i]+'';
+            list[i] = list[i].replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")
+          }
+          let bigList = [];
+          let minList = [];
+          for(let i=0;i<list.length;i++){
+            if(i+1 < list.length){
+              minList.push(list[i])
+              if(!self.daysRet(list[i],list[i+1])){
+                if(minList[1]){
+                  // let newList = [minList[0],minList[minList.length-1]];
+                  let newList = {
+                    beginTime : Date.parse(new Date(minList[0]+' '+'00:00:00'))/1000,
+                    endTime : Date.parse(new Date(minList[minList.length-1]+' '+'23:59:59'))/1000
+                  };
+                  bigList.push(newList)
+                }else{
+                  // let newList = [minList[0],minList[0]];
+                  let newList = {
+                    beginTime : Date.parse(new Date(minList[0]+' '+'00:00:00'))/1000,
+                    endTime : Date.parse(new Date(minList[0]+' '+'23:59:59'))/1000
+                  };
+                  bigList.push(newList)
+                }
+                minList = [];
+                if(i+2 == list.length){
+                  // bigList.push([list[i+1],list[i+1]]);
+                  bigList.push({
+                    beginTime : Date.parse(new Date(list[i+1]+' '+'00:00:00'))/1000,
+                    endTime : Date.parse(new Date(list[i+1]+' '+'23:59:59'))/1000
+                  });
+                }
+              }else{
+                if(i+2 == list.length){
+                  minList.push(list[i+1])
+                  // let newList = [minList[0],minList[minList.length-1]];
+                  let newList = {
+                    beginTime : Date.parse(new Date(minList[0]+' '+'00:00:00'))/1000,
+                    endTime : Date.parse(new Date(minList[minList.length-1]+' '+'23:59:59'))/1000
+                  };
+                  bigList.push(newList)
+                  minList = [];
+                }
+              }
+            }
+          }
+          this.$set(this,'festival',bigList);
+        });
+      },
+      //节假日连续判断
+      daysRet(timeOne,timeTow){
+        let list = [timeOne,timeTow]
+        let days = list.sort().map((d, i) => {
+          let dt = new Date(d)
+          dt.setDate(dt.getDate() + 4 - i) // 处理为相同日期
+          // 抹去 时 分 秒 毫秒
+          dt.setHours(0)
+          dt.setMinutes(0)
+          dt.setSeconds(0)
+          dt.setMilliseconds(0)
+          return +dt
+        })
+        let ret = true
+        days.forEach(d => {
+          if (days[0] !== d) {
+            ret = false
+          }
+        })
+        return ret
+      },
+      //乘法
+      accMul(arg1,arg2){
+        var m=0,s1=arg1.toString(),s2=arg2.toString();
+        try{m+=s1.split(".")[1].length}catch(e){}
+        try{m+=s2.split(".")[1].length}catch(e){}
+        return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .timingExhaustAirAddPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    font-weight:500;
+    overflow: hidden;
+    .top-title-box{
+      display: flex;
+      padding:20px 0;
+      border-bottom:1px #E0E0E0 solid;
+      p:nth-child(1){
+        margin-left:20px;
+        flex:1;
+        font-size:18px;
+        line-height:40px;
+        color:#0045AF;
+      }
+      p:nth-child(2){
+        margin-right:20px;
+        width:80px;
+      }
+    }
+    .content-max-big-box{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      padding:40px 0 40px 80px;
+      .form-time-box{
+        display: flex;
+        line-height:40px;
+        .form-title-box{
+          display: flex;
+          font-size:14px;
+          margin-top:20px;
+          span{
+            width:10px;
+            color:#ff4949;
+            margin-left:3px
+          }
+          .form-title-p{
+            color:#333;
+            margin-right:10px;
+          }
+          .festival-box{
+            display: flex;
+            margin:0 20px 0 11px;
+            cursor: pointer;
+            img{
+              width:14px;
+              height:14px;
+              margin:13px 4px;
+            }
+            p{
+              line-height:40px;
+            }
+          }
+          .form-title-text{
+            color:#CCCCCC;
+          }
+        }
+      }
+      .form-period-max-box{
+        padding-left:80px;
+        .form-period-box{
+          width:544px;
+          display: inline-block;
+          line-height:40px;
+          .form-period-min-box{
+            display: flex;
+            .i-add-button{
+              width:40px;
+              height:40px;
+              line-height:40px;
+              text-align: center;
+              font-size:14px;
+              cursor: pointer;
+              color:#0183FA;
+            }
+            .i-del-button{
+              width:40px;
+              height:40px;
+              line-height:40px;
+              text-align: center;
+              font-size:14px;
+              cursor: pointer;
+              color:#999;
+            }
+          }
+        }
+      }
+      .add-button-on{
+        margin-left:80px;
+        width:448px;
+        line-height:40px;
+        border:1px dashed #0183FA;
+        border-radius:4px;
+        text-align: center;
+        color:#0183FA;
+        font-size:16px;
+        cursor: pointer;
+      }
+      .del-button-i{
+        width:40px;
+        height:40px;
+        line-height:40px;
+        text-align: center;
+        font-size:14px;
+        color:#999;
+        cursor: pointer;
+      }
+      .button-max-box{
+        margin:50px 0;
+        display: flex;
+        p:nth-child(1){
+          flex:1;
+        }
+        p:nth-child(2){
+          width:70px;
+          height:30px;
+          line-height:30px;
+          margin-right:13px;
+          font-size:12px;
+          color:#999999;
+          background: #E0E0E0;
+          border-radius:6px;
+          text-align: center;
+          cursor: pointer;
+        }
+        p:nth-child(3){
+          width:70px;
+          height:30px;
+          line-height:30px;
+          font-size:12px;
+          color:#ffffff;
+          background: #0045AF;
+          border-radius:6px;
+          text-align: center;
+          cursor: pointer;
+        }
+        p:nth-child(4){
+          flex:1;
+        }
+      }
+    }
+  }
+</style>

+ 785 - 0
src/views/comprehensive/laboratoryManagement/timingExhaustAir/index.vue

@@ -0,0 +1,785 @@
+<!--定时排风-->
+<template>
+    <div class="app-container timingExhaustAir">
+      <div class="timingExhaustAirPage" v-if="pageType == 1">
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+          <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" placeholder="请选择" clearable >
+              <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>
+            <p class="inquire-button-one" @click="handleQuery">查询</p>
+            <p class="reset-button-one" @click="resetQuery">重置</p>
+          </el-form-item>
+          <el-form-item style="float: right;margin-right:0;">
+            <el-col :span="1.5">
+              <p class="inquire-button-one" style="width:80px;margin:0;"
+                 @click="goPage(2)"
+              ><i class="el-icon-plus"></i> 新增</p>
+            </el-col>
+          </el-form-item>
+        </el-form>
+        <el-table v-loading="loading" border :data="dataList">
+          <el-table-column label="序号"  width="100" align="left"  type="index"/>
+          <el-table-column label="定时排风任务" align="left" prop="taskName" show-overflow-tooltip/>
+          <el-table-column label="是否启用" align="left" prop="exhaustType" width="200" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <el-switch
+                class="switch"
+                @click.native="changeIsNeedCaptcha(scope.row)"
+                v-model="scope.row.exhaustType"
+                :active-value="1"
+                :inactive-value="0"
+                active-color="#0183FA"
+                inactive-color="#E0E0E0"
+                active-text="启用"
+                inactive-text="停用"
+                disabled
+              ></el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column label="编辑时间" align="left" prop="updateTime" width="300" show-overflow-tooltip/>
+          <el-table-column label="操作人" align="left" prop="updateBy" width="200" show-overflow-tooltip/>
+          <el-table-column label="操作" align="left" prop="createTime" width="300" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <div class="button-box">
+                <p class="table-min-button" style="margin-left:20px!important;" @click="correlationButton(scope.row.id)">关联实验室</p>
+                <p class="table-min-button" style="margin-left:20px!important;" @click="goPage(3,scope.row.id)">编辑</p>
+                <p class="table-min-button" style="margin-left:20px!important;" @click="delExhaust(scope.row.id)">删除</p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </div>
+      <add-page v-if="pageType == 2" :propsData="propsData"></add-page>
+      <el-dialog title="关联实验室" :visible.sync="exhaustPageType" v-if="exhaustPageType"
+                 width="1470px" append-to-body id="exhaust-correlation-dialog-box">
+        <p class="exhaust-title-p">任务执行时间</p>
+        <div class="time-max-box">
+          <div class="for-time-box" v-for="(item,index) in correlationData.exhaustPeriodVoList" :key="index">
+            <p class="for-title-p">{{item.beginTime}}~{{item.endTime}}</p>
+            <div class="for-time-min-box" :class="item.timedType==3?'for-time-min-box-one':''">
+              <p class="for-time-text-one" v-show="item.timedType==1">周一至周五</p>
+              <p class="for-time-text-one" v-show="item.timedType==2">周一至周日</p>
+              <p class="for-time-text-tow" v-show="item.timedType==3" v-for="(minItem,minIndex) in item.customTime" :key="minIndex">{{minItem==1?'周一':(minItem==2?'周二':(minItem==3?'周三':(minItem==4?'周四':(minItem==5?'周五':(minItem==6?'周六':minItem==7?'周末':'')))))}}{{minIndex!=item.customTime.length-1?'、':''}}</p>
+            </div>
+          </div>
+        </div>
+        <div class="exhaust-sub-max-box">
+          <div class="left-sub-max-box">
+            <div class="left-sub-max-title">
+              <p>待选实验室</p>
+              <p>{{leftIds.length?leftIds.length:0}}/{{leftTotal}}</p>
+            </div>
+            <div class="left-form-max-box">
+              <el-form :model="leftQueryParams" :inline="true" v-show="leftShowSearch"
+                       ref="queryForm" style="display: flex">
+                <el-form-item label="关键字" prop="searchValue" >
+                  <el-input
+                    style="width:150px;"
+                    maxlength="10"
+                    v-model="leftQueryParams.searchValue"
+                    placeholder="实验室"
+                    clearable
+                  />
+                </el-form-item>
+                <el-form-item label="学院" prop="deptId">
+                  <el-select v-model="leftQueryParams.deptId" placeholder="请选择" clearable
+                             style="width:130px;">
+                    <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="typeId">
+                  <el-select v-model="leftQueryParams.typeId" placeholder="请选择" clearable
+                             style="width:100px;">
+                    <el-option
+                      v-for="dict in typeList"
+                      :key="dict.id"
+                      :label="dict.typeName"
+                      :value="dict.id"
+                    ></el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item label="安全分级" prop="level">
+                  <el-select v-model="leftQueryParams.level" placeholder="请选择" clearable
+                             style="width:100px;">
+                    <el-option
+                      v-for="dict in levelList"
+                      :key="dict.id"
+                      :label="dict.classifiedName"
+                      :value="dict.id"
+                    ></el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item>
+                  <p class="inquire-button-one" @click="leftHandleQuery">查询</p>
+                  <p class="reset-button-one" @click="leftResetQuery">重置</p>
+                </el-form-item>
+              </el-form>
+              <el-table ref="leftTable" v-loading="leftLoading" border :data="leftDataList" @selection-change="handleSelectionChangeLeft" :row-key="getRowKeysLeft">
+                <el-table-column type="selection" width="59" align="left" :reserve-selection="true"/>
+                <el-table-column label="实验室" align="left" prop="name" show-overflow-tooltip/>
+                <el-table-column label="安全分类" align="left" prop="createBy" width="100" show-overflow-tooltip/>
+                <el-table-column label="安全分级" align="left" prop="createTime" width="100" show-overflow-tooltip/>
+                <el-table-column label="实验室位置" align="left" prop="createTime" width="358" show-overflow-tooltip/>
+              </el-table>
+              <pagination
+                v-show="leftTotal>0"
+                :total="leftTotal"
+                :page.sync="leftQueryParams.pageNum"
+                :limit.sync="leftQueryParams.pageSize"
+                @pagination="getLabExhaustNoJoinSub"
+              />
+              <p style="height:20px;" v-show="leftTotal==0"></p>
+            </div>
+          </div>
+          <div class="button-sub-max-box">
+            <img class="top-img" v-show="!rightIds.length" src="@/assets/ZDimages/icon_wxz_zuo.png">
+            <img class="top-img" v-show="rightIds.length" @click="rightDataMoveLeft" src="@/assets/ZDimages/icon_yxz_zuo.png">
+            <img class="bottom-img" v-show="!leftIds.length" src="@/assets/ZDimages/icon_wxz_yuo.png">
+            <img class="bottom-img" v-show="leftIds.length" @click="leftDataMoveRight" src="@/assets/ZDimages/icon_yxz_yuo.png">
+          </div>
+          <div class="right-sub-max-box">
+            <div class="right-sub-max-title">
+              <p>已选择实验室</p>
+              <p>{{rightIds.length?rightIds.length:0}}/{{rightTotal}}</p>
+            </div>
+            <div class="right-form-max-box">
+              <el-form :model="rightQueryParams" :inline="true" v-show="rightShowSearch"
+                       ref="queryForm" style="display: flex">
+                <el-form-item label="" prop="searchValue" >
+                  <el-input placeholder="请输入实验室名称" style="width:288px;" v-model="rightQueryParams.searchValue" class="input-with-select">
+                    <el-button slot="append" icon="el-icon-search" @click="rightResetQuery"
+                               style="background:rgba(0,0,0,0);"></el-button>
+                  </el-input>
+                </el-form-item>
+              </el-form>
+              <el-table ref="rightTable" v-loading="rightLoading" border :data="rightDataList" @selection-change="handleSelectionChangeRight" :row-key="getRowKeysRight">
+                <el-table-column type="selection" width="80" align="left" :reserve-selection="true"/>
+                <el-table-column label="实验室" align="left" prop="name" show-overflow-tooltip/>
+              </el-table>
+            </div>
+          </div>
+        </div>
+        <div slot="footer" class="dialog-footer">
+          <div class="exhaust-button-box">
+            <p></p>
+            <p @click="cancel">取消</p>
+            <p @click="joinsubButton">确定</p>
+            <p></p>
+          </div>
+        </div>
+      </el-dialog>
+    </div>
+</template>
+
+<script>
+  import { delExhaust,exhaustList,operateExhaust,getExhaustInfo,getLabExhaustNoJoinSub,getLabExhaustJoinSub,joinsub } from "@/api/laboratory/exhaustTime";
+  import { listClassifiedAll } from "@/api/laboratory/classified";
+  import { listClasstypeAll } from "@/api/laboratory/classtype";
+  import { listDepartments } from "@/api/system/dept";
+  import addPage from "./addPage.vue";
+  export default {
+    name: 'index',
+    components: {
+      addPage
+    },
+    data() {
+      return {
+        //关联实验室也页面状态
+        exhaustPageType:false,
+        //页面状态
+        pageType:1,
+        showSearch:true,
+        loading:false,
+        total:0,
+        queryParams:{
+          pageNum: 1,
+          pageSize:20,
+          searchValue:"",
+          deptId:"",
+        },
+        //列表数据
+        dataList:[],
+        //学院数据
+        deptOptions:[],
+        //分类数据
+        typeList:[],
+        //分级数据
+        levelList:[],
+        propsData:{},
+        //关联数据
+        correlationData:{},
+        //左列表数据
+        leftShowSearch:true,
+        leftLoading:false,
+        leftTotal:0,
+        leftQueryParams:{
+          pageNum: 1,
+          pageSize:10,
+          searchValue:"",
+          deptId:"",
+          typeId:"",
+          level:"",
+        },
+        leftDataList:[],
+        leftSelectedNum:0,
+        leftIds:[],
+        leftMultiple:true,
+        //右列表数据
+        rightShowSearch:true,
+        rightLoading:false,
+        rightQueryParams:{
+          searchValue:"",
+        },
+        rightDataList:[],
+        rightTotal:0,
+        rightSelectedNum:0,
+        rightIds:[],
+        rightMultiple:true,
+        //删减减数据
+        addList:[],
+        reduceList:[],
+        //原始数据
+        primitiveList:[]
+      }
+    },
+    created() {
+      this.listDepartments();
+      this.getListClassifiedAll();
+      this.getListClasstypeAll();
+      this.getList();
+    },
+    mounted() {
+
+    },
+    methods: {
+      //关联数据提交
+      joinsubButton(){
+        let self = this;
+        let obj = {
+          delSubIds:[],
+          joinsubList:[],
+        };
+        for(let i=0;i<self.rightDataList.length;i++){
+          let minObj = {
+            timedExhaustId:self.correlationData.id,
+            subId:self.rightDataList[i].id
+          }
+          obj.joinsubList.push(minObj)
+        }
+        for(let o=0;o<self.primitiveList.length;o++){
+          let num = 0;
+          for(let i=0;i<self.rightDataList.length;i++){
+            if (self.rightDataList[i].id == self.primitiveList[o].id){
+              num ++
+            }
+          }
+          if(num == 0){
+            obj.delSubIds.push(self.primitiveList[o].id)
+          }
+        }
+        joinsub(obj).then( response => {
+          self.msgSuccess(response.msg);
+          self.$set(self,'exhaustPageType',false);
+        });
+      },
+      //左侧数据移动到右
+      leftDataMoveRight(){
+        let self = this;
+        if(this.leftIds[0]){
+          for(let i=0;i<self.leftIds.length;i++){
+            let num = 0;
+            for(let o=0;o<self.addList.length;o++){
+              if(self.leftIds[i] == self.addList[o]){
+                num++
+              }
+            }
+            if(num == 0){
+              self.addList.push(self.leftIds[i])
+            }
+            for(let o=0;o<self.reduceList.length;o++){
+              if(self.leftIds[i] == self.reduceList[o]){
+                self.reduceList.splice(o,1);
+              }
+            }
+            for(let x=0;x<self.leftDataList.length;x++){
+              if(self.leftIds[i] == self.leftDataList[x].id){
+                let age = 0;
+                for(let o=0;o<self.rightDataList.length;o++){
+                  if(self.leftIds[i] == self.rightDataList[o].id){
+                    age++
+                  }
+                }
+                if(age == 0){
+                  self.rightDataList.push(self.leftDataList[x])
+                }
+              }
+            }
+          }
+        }
+        this.$refs.leftTable.clearSelection()
+        this.getLabExhaustNoJoinSub();
+      },
+      //右侧数据移动到左
+      rightDataMoveLeft(){
+        let self = this;
+        if(this.rightIds[0]){
+          for(let i=0;i<self.rightIds.length;i++){
+            let num = 0;
+            for(let o=0;o<self.reduceList.length;o++){
+              if(self.rightIds[i] == self.reduceList[o]){
+                num++
+              }
+            }
+            if(num == 0){
+              self.reduceList.push(self.rightIds[i])
+            }
+            for(let o=0;o<self.rightDataList.length;o++){
+              if(self.rightDataList[o].id == self.rightIds[i]){
+                self.rightDataList.splice(o,1);
+              }
+            }
+            for(let o=0;o<self.addList.length;o++){
+              if(self.rightIds[i] == self.addList[o]){
+                self.addList.splice(o,1);
+              }
+            }
+          }
+          this.$refs.rightTable.clearSelection()
+          this.getLabExhaustNoJoinSub();
+        }
+      },
+      //关联实验室
+      correlationButton(id){
+        this.$set(this,'leftSelectedNum',0);
+        this.$set(this,'leftIds',[]);
+        this.$set(this,'leftMultiple',true);
+        this.$set(this,'rightSelectedNum',0);
+        this.$set(this,'rightIds',[]);
+        this.$set(this,'rightMultiple',true);
+        this.$set(this,'addList',[]);
+        this.$set(this,'reduceList',[]);
+        this.$set(this,'primitiveList',[]);
+        this.leftResetQuery();
+        this.rightResetQuery();
+        getExhaustInfo(id).then( response => {
+          for(let i=0;i<response.data.exhaustPeriodVoList.length;i++){
+            if(response.data.exhaustPeriodVoList[i].customTime){
+              response.data.exhaustPeriodVoList[i].customTime = response.data.exhaustPeriodVoList[i].customTime.split(',');
+            }
+          }
+          this.$set(this,'correlationData',response.data);
+          this.$set(this,'exhaustPageType',true);
+        });
+      },
+      //页面状态切换
+      goPage(type,id){
+        let self = this;
+        if(this.pageType != type){
+          if(type == 1){
+            this.pageType = 1;
+          }else if(type == 2){
+            this.$set(this,'propsData',{});
+            this.pageType = 2;
+          }else if(type == 3){
+            getExhaustInfo(id).then( response => {
+              for(let i=0;i<response.data.exhaustPeriodVoList.length;i++){
+                if(response.data.exhaustPeriodVoList[i].customTime){
+                  response.data.exhaustPeriodVoList[i].customTime = response.data.exhaustPeriodVoList[i].customTime.split(',');
+                }
+              }
+              this.$set(this,'propsData',response.data);
+              this.pageType = 2;
+            });
+          }else if(type == 4){
+            this.pageType = 1;
+            this.resetQuery();
+            this.$confirm('是否立即关联实验室,也可以稍后在列表中关联实验室.', "警告", {
+              confirmButtonText: "关联",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(function() {
+              self.correlationButton(id);
+            }).then(() => {
+            }).catch(() => {});
+          }
+        }
+      },
+      //删除任务
+      delExhaust(id){
+        let self = this;
+        this.$confirm('确认删除该任务?', "警告", {
+          confirmButtonText: "确认",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          delExhaust(id).then( response => {
+            self.msgSuccess(response.msg);
+            self.getList();
+          })
+        }).then(() => {
+        }).catch(() => {});
+      },
+      //启用停用方法
+      changeIsNeedCaptcha(item){
+        let self = this;
+        let obj = {
+          id:item.id,
+          exhaustType:item.exhaustType==1?0:1
+        }
+        this.$confirm('确认'+item.exhaustType==1?'停用?':'启用?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          operateExhaust(obj).then( response => {
+            self.msgSuccess(response.msg);
+            self.getList();
+          });
+        }).then(() => {
+        }).catch(() => {});
+      },
+      //获取列表数据
+      getList(){
+        this.loading = true;
+        exhaustList(this.queryParams).then( response => {
+          this.dataList =  response.rows;
+          this.total =  response.total;
+          this.loading = false;
+        });
+      },
+      //查询
+      handleQuery(){
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      //重置
+      resetQuery(){
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          deptId:"",
+        });
+        this.handleQuery();
+      },
+      //左查询
+      leftHandleQuery(){
+        this.leftQueryParams.pageNum = 1;
+        this.getLabExhaustNoJoinSub();
+      },
+      //左重置
+      leftResetQuery(){
+        this.$set(this,'leftQueryParams',{
+          pageNum: 1,
+          pageSize:10,
+          searchValue:"",
+          deptId:"",
+          typeId:"",
+          level:"",
+        });
+        this.leftHandleQuery();
+      },
+      //左获取列表数据
+      getLabExhaustNoJoinSub(){
+        this.leftLoading = true;
+        let obj = JSON.parse(JSON.stringify(this.leftQueryParams));
+        obj.noSubIds = JSON.parse(JSON.stringify(this.addList));
+        obj.subIds = JSON.parse(JSON.stringify(this.reduceList));
+        getLabExhaustNoJoinSub(obj).then( response => {
+          this.leftDataList =  response.rows;
+          this.leftTotal =  response.total;
+          this.$set(this,'rightTotal',this.rightDataList.length);
+          this.leftLoading = false;
+          this.$forceUpdate();
+        });
+      },
+      //左多选框选中数据
+      handleSelectionChangeLeft(selection) {
+        this.leftSelectedNum = selection.length;
+        this.leftIds = selection.map(item => item.id)
+        this.leftMultiple = !selection.length
+      },
+      getRowKeysLeft(row) {
+        return row.id
+      },
+      //右侧获取列表数据
+      rightResetQuery(){
+        this.rightLoading = true;
+        getLabExhaustJoinSub(this.rightQueryParams).then( response => {
+          this.rightDataList =  JSON.parse(JSON.stringify(response.data.list));
+          this.primitiveList =  JSON.parse(JSON.stringify(response.data.list));
+          this.rightTotal =  response.data.total;
+          this.rightLoading = false;
+        });
+      },
+      //右多选框选中数据
+      handleSelectionChangeRight(selection) {
+        this.rightSelectedNum = selection.length;
+        this.rightIds = selection.map(item => item.id)
+        this.rightMultiple = !selection.length
+      },
+      getRowKeysRight(row) {
+        return row.id
+      },
+      //关闭窗口
+      cancel(){
+        this.$set(this,'exhaustPageType',false);
+      },
+      //获取学院列表
+      listDepartments(){
+        listDepartments().then(response => {
+          this.deptOptions = response.data;
+        });
+      },
+      //获取分级
+      getListClassifiedAll(){
+        listClassifiedAll().then(response=>{
+          if(response.code==200){
+            this.levelList = response.data
+          }
+        })
+      },
+      //获取分类
+      getListClasstypeAll(){
+        listClasstypeAll().then(response=>{
+          if(response.code==200){
+            this.typeList = response.data;
+          }
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .timingExhaustAir{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    .timingExhaustAirPage{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      padding:20px 20px 10px 20px!important;
+      .button-box{
+        display: flex;
+      }
+    }
+  }
+</style>
+<style lang="scss">
+  #exhaust-correlation-dialog-box{
+    .el-form-item{
+      display: flex;
+      margin-right:10px;
+    }
+    .el-dialog__body{
+      padding:0 55px;
+    }
+    .el-input-group__append{
+      border:none;
+      background: #fff!important;
+    }
+    .el-input-group--append .el-input__inner{
+      border:none;
+    }
+    .el-form-item__content .el-input-group{
+      border:1px solid #DCDFE6;
+      border-radius:4px;
+    }
+    .exhaust-title-p{
+      color:#0045AF;
+      font-size:18px;
+      line-height:60px;
+    }
+    .time-max-box{
+      display: flex;
+      .for-time-box{
+        width:170px;
+        height:140px;
+        margin-right:11px;
+        .for-title-p{
+          width:170px;
+          height:40px;
+          line-height:40px;
+          color:#0183FA;
+          background: rgba(1,131,250,0.1);
+          text-align: center;
+          font-size:16px;
+        }
+        .for-time-min-box{
+          width:170px;
+          height:100px;
+          color:#333;
+          border: 1px solid #E0E0E0;
+          font-size:14px;
+          .for-time-text-one{
+            text-align: center;
+            line-height:100px;
+          }
+          .for-time-text-tow{
+            display: inline-block;
+            line-height:25px;
+          }
+        }
+        .for-time-min-box-one{
+          padding:10px 15px 10px 25px;
+        }
+      }
+    }
+    .exhaust-sub-max-box{
+      margin:41px 0 28px;
+      padding-top:41px;
+      border-top:1px dashed #D8D8D8;
+      display: flex;
+      .left-sub-max-box{
+        width:957px;
+        height:440px;
+        .el-table__empty-text{
+          font-size:0;
+          color:rgba(0,0,0,0);
+          width:100%;
+          height:100%;
+          background: url("../../../../assets/ZDimages/null-data-1.png") no-repeat 50% 50%;
+          background-size: 18%;
+        }
+        .left-sub-max-title{
+          display: flex;
+          background: rgba(1,131,250,0.1);
+          color:#0183FA;
+          line-height:40px;
+          font-size:16px;
+          p:nth-child(1){
+            margin-left:29px;
+            flex:1;
+          }
+          p:nth-child(2){
+            margin-right:22px;
+          }
+        }
+        .left-form-max-box{
+          display: flex;
+          flex-direction: column;
+          width:957px;
+          height:400px;
+          border:1px solid #E0E0E0;
+          padding:20px 20px 0 20px;
+        }
+      }
+      .button-sub-max-box{
+        width:74px;
+        .top-img{
+          cursor: pointer;
+          display: block;
+          margin-top:201px;
+          width:30px;
+          height:30px;
+          margin-left:22px;
+        }
+        .bottom-img{
+          cursor: pointer;
+          display: block;
+          margin-top:14px;
+          width:30px;
+          height:30px;
+          margin-left:22px;
+        }
+      }
+      .right-sub-max-box{
+        height:440px;
+        width:330px;
+        .el-table__empty-text{
+          font-size:0;
+          color:rgba(0,0,0,0);
+          width:100%;
+          height:100%;
+          background: url("../../../../assets/ZDimages/null-data-1.png") no-repeat 50% 50%;
+          background-size: 55%;
+        }
+        .right-sub-max-title{
+          display: flex;
+          background: rgba(1,131,250,0.1);
+          color:#0183FA;
+          line-height:40px;
+          font-size:16px;
+          p:nth-child(1){
+            margin-left:29px;
+            flex:1;
+          }
+          p:nth-child(2){
+            margin-right:22px;
+          }
+        }
+        .right-form-max-box{
+          display: flex;
+          flex-direction: column;
+          width:330px;
+          height:400px;
+          border:1px solid #E0E0E0;
+          padding:20px;
+        }
+      }
+    }
+    .exhaust-button-box{
+      display: flex;
+      p:nth-child(1){
+        flex:1;
+      }
+      p:nth-child(2){
+        width:70px;
+        height:30px;
+        line-height:30px;
+        margin-right:13px;
+        font-size:12px;
+        color:#999999;
+        background: #E0E0E0;
+        border-radius:6px;
+        text-align: center;
+        cursor: pointer;
+      }
+      p:nth-child(3){
+        width:70px;
+        height:30px;
+        line-height:30px;
+        font-size:12px;
+        color:#ffffff;
+        background: #0045AF;
+        border-radius:6px;
+        text-align: center;
+        cursor: pointer;
+      }
+      p:nth-child(4){
+        flex:1;
+      }
+
+    }
+  }
+</style>

+ 1 - 0
src/views/homeNavbar.vue

@@ -149,6 +149,7 @@ export default {
     p{
       font-size:24px;
       color:#fff;
+      line-height:80px;
     }
   }
   .hamburger-container {