dedsudiyu 2 years ago
parent
commit
5c758b0c51

+ 37 - 0
src/api/laboratory/electronicInformationBoard.js

@@ -0,0 +1,37 @@
+import request from '@/utils/request'
+
+
+//获取信息牌列表
+export function XxpCardInfoList(query) {
+  return request({
+    url: '/laboratory/XxpCardInfo/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//新增信息牌
+export function XxpCardInfo(data) {
+  return request({
+    url: '/laboratory/XxpCardInfo',
+    method: 'post',
+    data: data
+  })
+}
+
+//修改信息牌
+export function XxpCardInfoPut(data) {
+  return request({
+    url: '/laboratory/XxpCardInfo',
+    method: 'put',
+    data:data
+  })
+}
+
+//删除信息牌
+export function XxpCardInfoDelete(id) {
+  return request({
+    url: '/laboratory/XxpCardInfo/'+id,
+    method: 'delete',
+  })
+}

+ 53 - 0
src/api/laboratory/onDutyConfiguration.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+//查询值班列表
+export function getListYmd(query) {
+  return request({
+    url: '/laboratory/XxpDuty/listYmd',
+    method: 'get',
+    params: query
+  })
+}
+
+//添加值班人员
+export function addXxpDuty(data) {
+  return request({
+    url: '/laboratory/XxpDuty',
+    method: 'post',
+    data: data
+  })
+}
+
+//值班人员详情接口
+export function getInfoByDate(query) {
+  return request({
+    url: '/laboratory/XxpDuty/getInfoByDate',
+    method: 'get',
+    params: query
+  })
+}
+//删除值班人员
+export function delXxpDuty(id) {
+  return request({
+    url: '/laboratory/XxpDuty/'+id,
+    method: 'delete',
+  })
+}
+//获取树状实验室列表接口
+export function treeDeptSubSel(query) {
+  return request({
+    url: '/system/dept/treeDeptSubSel',
+    method: 'get',
+    params: query
+  })
+}
+//获取实验室可选值班人员列表
+export function getUserDutyList(query) {
+  return request({
+    url: '/system/user/getUserDutyList',
+    method: 'get',
+    params: query
+  })
+}
+
+

+ 69 - 0
src/api/laboratory/patrolRecord.js

@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+
+//获取值班记录列表
+export function getListYmd(query) {
+  return request({
+    url: '/laboratory/XxpInspection/listYmd',
+    method: 'get',
+    params: query
+  })
+}
+//获取正常记录
+export function listStandard(query) {
+  return request({
+    url: 'laboratory/XxpInspection/listStandard',
+    method: 'get',
+    params: query
+  })
+}
+//获取异常记录
+export function listAbnormal(query) {
+  return request({
+    url: '/laboratory/XxpInspection/listAbnormal',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+
+
+
+
+
+
+//获取条件列表
+export function materialdataList(query) {
+  return request({
+    url: '/laboratory/materialdata/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//添加条件
+export function materialdata(data) {
+  return request({
+    url: '/laboratory/materialdata/add',
+    method: 'post',
+    data: data
+  })
+}
+
+//删除条件
+export function materialdataDel(id) {
+  return request({
+    url: '/laboratory/materialdata/'+id,
+    method: 'delete',
+  })
+}
+
+//编辑条件
+export function materialdataPut(data) {
+  return request({
+    url: '/laboratory/materialdata',
+    method: 'put',
+    data:data
+  })
+}

+ 43 - 37
src/assets/styles/ZDcolorClass.scss

@@ -270,44 +270,50 @@
   border: 1px solid #0183FA;
 }
 //===========================表格内按钮===========================
-.table-min-button{
-  height:23px;
-  color:$list_button_color;
-  line-height:23px;
-  font-size:14px;
-  cursor:pointer;
-  padding:0 10px !important;
-  margin:0 0 0 10px !important;
-  text-align:center;
-}
-.table-button-one-90{
-  width:90px;
-  height:30px;
-  line-height:30px;
-  border:1px solid $list_button_back;
-  color:$list_button_color;
-  font-size:14px;
-  border-radius: 4px;
-  cursor:pointer;
-  margin:0;
-  text-align:center;
-  i{
-    margin:0 5px 0 0;
+.cell{
+  //.button-box{
+  //  display: flex;
+  //  margin:0 auto;
+  //}
+  .table-min-button{
+    //flex:1;
+    height:23px;
+    color:$list_button_color;
+    line-height:23px;
+    font-size:14px;
+    cursor:pointer;
+    margin:0 10px !important;
+    text-align:center;
   }
-}
-.table-button-lab-120{
-  width:120px;
-  height:30px;
-  line-height:30px;
-  border:1px solid $list_button_back;
-  color:$list_button_color;
-  font-size:14px;
-  border-radius: 4px;
-  cursor:pointer;
-  margin:0;
-  text-align:center;
-  i{
-    margin:0 5px 0 0;
+  .table-button-one-90{
+    width:90px;
+    height:30px;
+    line-height:30px;
+    border:1px solid $list_button_back;
+    color:$list_button_color;
+    font-size:14px;
+    border-radius: 4px;
+    cursor:pointer;
+    margin:0;
+    text-align:center;
+    i{
+      margin:0 5px 0 0;
+    }
+  }
+  .table-button-lab-120{
+    width:120px;
+    height:30px;
+    line-height:30px;
+    border:1px solid $list_button_back;
+    color:$list_button_color;
+    font-size:14px;
+    border-radius: 4px;
+    cursor:pointer;
+    margin:0;
+    text-align:center;
+    i{
+      margin:0 5px 0 0;
+    }
   }
 }
 //悬浮样式

+ 5 - 0
src/assets/styles/ZDelement.scss

@@ -476,3 +476,8 @@
     text-align: left;
   }
 }
+/************按钮***********/
+.el-button--medium{
+  height:30px;
+  padding:0;
+}

File diff suppressed because it is too large
+ 1308 - 0
src/views/comprehensive/personnel/onDutyConfiguration/index.vue


+ 155 - 0
src/views/comprehensive/personnel/onDutyConfiguration/infoPage.vue

@@ -0,0 +1,155 @@
+<template>
+  <div class="onDutyConfigurationInfo">
+    <div class="onDutyConfigurationInfo-title-box">
+      <p>{{propsData.time}}值班安排</p>
+      <p class="add-button-one-90" @click="outButton">返回</p>
+    </div>
+    <div class="list-max-big-box scrollbar-box">
+      <div class="for-list-max-big-box" v-for="(item,index) in listData" :key="index">
+        <p class="for-title-p">{{item.subjectName}}</p>
+        <el-table v-loading="loading" border :data="item.dutyList">
+          <el-table-column label="值班人员" align="left" prop="userName" show-overflow-tooltip/>
+          <el-table-column label="类别" align="left" prop="data2" show-overflow-tooltip width="230">
+            <template slot-scope="scope">
+              <span>{{scope.row.userType == 11?'教职工':'学生'}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="电话" align="left" prop="userPhone" show-overflow-tooltip width="200"/>
+          <el-table-column label="部门" align="left" prop="deptName" show-overflow-tooltip width="300"/>
+          <el-table-column label="指派日期" align="left" prop="createTime" show-overflow-tooltip width="300"/>
+          <el-table-column label="操作" align="left" width="210" v-if="tableButtonType && !propsData.type">
+            <template slot-scope="scope">
+              <div class="button-box">
+                <p class="table-min-button" style="color:#0183FA;margin-left:0!important;" @click="delUserButton(scope.row)">移除</p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <div style="padding:0 20px 10px 20px;">
+      <pagination :page-sizes="[5, 10, 15, 20]"
+                  :total="total"
+                  layout="total, prev, pager, next, sizes, jumper"
+                  :page.sync="param.pageNum"
+                  :limit.sync="param.pageSize"
+                  @pagination="getListPlan"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+  import { getInfoByDate,delXxpDuty } from '@/api/laboratory/onDutyConfiguration'
+  export default {
+    name: 'infoPage',
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        tableButtonType:this.hasPermiDom(['laboratory:plan:query','laboratory:planjoin:edit','laboratory:distribution:list','laboratory:plan:query','laboratory:plan:edit','laboratory:plan:remove']),
+        listData:[],
+        loading:false,
+        param:{
+          pageNum:1,
+          pageSize:5,
+        },
+        total:0,
+      }
+    },
+    created(){
+      this.getListPlan();
+    },
+    mounted(){
+
+    },
+    methods:{
+      outButton(){
+        this.$parent.goPage('get')
+      },
+      getListPlan(){
+        this.loading = true;
+        let obj = {
+          pageNum:this.param.pageNum,
+          pageSize:this.param.pageSize,
+          deptId:this.propsData.checkTreeId,
+          dutyTime:this.propsData.time,
+        }
+        console.log(obj);
+        getInfoByDate(obj).then(response => {
+          this.loading = false;
+          if(response.rows[0]){
+            this.$set(this,'listData',response.rows);
+          }else{
+            this.outButton();
+          }
+        })
+      },
+      delUserButton(row){
+        let self = this;
+        this.$confirm('是否确认删除该流程?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          delXxpDuty(row.id).then(response => {
+            self.msgSuccess(response.msg);
+            self.getListPlan()
+          })
+        }).then(() => {
+        }).catch(() => {});
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .onDutyConfigurationInfo{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    *{
+      margin:0;
+      padding:0;
+    }
+    .onDutyConfigurationInfo-title-box{
+      display: flex;
+      height: 80px;
+      border-bottom:1px solid #E0E0E0;
+      p:nth-child(1){
+        flex:1;
+        line-height:80px;
+        margin-left:20px;
+        color:#0045AF;
+        font-size:16px;
+        font-weight:900;
+      }
+      p:nth-child(2){
+        margin:20px;
+      }
+    }
+    .list-max-big-box{
+      flex:1;
+      padding:0 20px 20px;
+      .for-list-max-big-box{
+        .for-title-p{
+          height:80px;
+          line-height:80px;
+          font-size:16px;
+          color:#0045AF;
+        }
+      }
+    }
+  }
+</style>
+<style lang="scss">
+  .onDutyConfigurationInfo{
+    .el-table__empty-text{
+      font-size: 12px;
+      background: none;
+      color:#909399;
+    }
+  }
+</style>

+ 71 - 0
src/views/comprehensive/personnel/patrolRecord/anomalyPage.vue

@@ -0,0 +1,71 @@
+<!--异常-->
+<template>
+  <div class="anomalyPage">
+    <el-table v-loading="loading" border :data="listData">
+      <el-table-column  label="姓名" align="left" prop="userName" show-overflow-tooltip width="200"/>
+      <el-table-column label="联系电话" align="left" prop="userPhone" show-overflow-tooltip width="340"/>
+      <el-table-column label="计划巡查实验室" align="left" prop="subjectName" show-overflow-tooltip/>
+      <el-table-column label="异常原因" align="left" prop="remark" show-overflow-tooltip width="500"/>
+    </el-table>
+    <pagination :page-sizes="[5, 10, 15, 20]"
+                :total="total"
+                style="margin-top:10px;"
+                layout="total, prev, pager, next, sizes, jumper"
+                :page.sync="param.pageNum"
+                :limit.sync="param.pageSize"
+                @pagination="getListPlan"
+    />
+  </div>
+</template>
+
+<script>
+  import { listAbnormal } from '@/api/laboratory/patrolRecord'
+  export default {
+    name: 'anomalyPage',
+    props:{
+      propsPageData:{},
+    },
+    data(){
+      return{
+        listData:[],
+        loading:false,
+        param:{
+          pageNum:1,
+          pageSize:10,
+        },
+        total:0,
+
+      }
+    },
+    created(){
+      this.getListPlan();
+    },
+    mounted(){
+
+    },
+    methods:{
+      //获取数据
+      getListPlan(){
+        this.loading = true;
+        let obj = {
+          pageNum:this.param.pageNum,
+          pageSize:this.param.pageSize,
+          dutyTime:this.propsPageData.time,
+          deptId:this.propsPageData.checkTreeId,
+        }
+        listAbnormal(obj).then(response => {
+          this.$set(this,'listData',response.rows);
+          this.loading = false;
+        })
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .anomalyPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+  }
+</style>

+ 789 - 0
src/views/comprehensive/personnel/patrolRecord/index.vue

@@ -0,0 +1,789 @@
+<template>
+  <div class="app-container patrolRecord">
+    <div class="patrolRecordPage" v-show="pageType === 1">
+      <div class="left-page-max-big-box">
+        <el-tree
+          style="margin-right:10px;"
+          :data="deptOptions"
+          :props="defaultProps"
+          icon-class=""
+          node-key="id"
+          :highlight-current="true"
+          default-expand-all
+          :expand-on-click-node="false"
+          :filter-node-method="filterNode"
+          ref="tree"
+          @node-click="handleNodeClick"
+        />
+      </div>
+      <p class="center-border-p"></p>
+      <div class="right-page-max-big-box">
+        <div class="top-button-max-box">
+          <div class="yearMonthButtonBox">
+            <p @click="yearMonthSwitchButton(1)" :class="yearMonthType===1?'left-button-one':'left-button-tow'">月度</p>
+            <p @click="yearMonthSwitchButton(2)" :class="yearMonthType===2?'right-button-one':'right-button-tow'">年度</p>
+          </div>
+          <div class="year-month-data-button-box">
+            <p class="year-month-subtract-button" @click="subtractDate"><</p>
+            <p class="year-month-text-p" v-show="yearMonthType===1">{{yearMonthData.year}}-{{yearMonthData.month}}</p>
+            <p class="year-month-text-p" v-show="yearMonthType===2">{{yearMonthData.year}}</p>
+            <p class="year-month-add-button" @click="addDate">></p>
+          </div>
+          <p class="return-year-month-button inquire-button-one" v-show="yearMonthType===1" @click="returnPresent">回到本月</p>
+        </div>
+        <div class="month-max-big-box scrollbar-box" v-if="yearMonthType === 1">
+          <div class="month-week-box">
+            <p class="for-week-box" v-for="item of weekList" :key="item.key">{{ item.value }}</p>
+          </div>
+          <div class="month-big-box">
+            <div v-for="(year,index) in yearDate" v-if="year.year == yearMonthData.year && year.month == yearMonthData.month">
+              <div class="for-month-max-big-box" v-for="(item,index) in year.list" :key="item.key">
+                <p class="for-month-top-big-box" :class="item.disable?'for-month-top-big-box-color':''">{{item.date}}</p>
+                <div class="for-month-bottom-big-box" :class="item.noSignedInCount>0?'red-backgroud-color':''"
+                     v-if="!item.disable&&item.signInCount>0" @click.stop="goPage('info',item)">
+                  <div class="for-month-bottom-left-min-box">
+                    <p>已签到人员:{{item.signInCount}}</p>
+                    <p>未签到人员:{{item.noSignedInCount}}</p>
+                  </div>
+                  <div class="for-month-bottom-right-min-box el-icon-arrow-right"></div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="year-max-big-box scrollbar-box" v-if="yearMonthType === 2">
+          <div class="for-year-max-big-box" v-for="(year,index) in yearDate" :key="year.key" v-if="year.year == yearMonthData.year">
+            <p class="year-name-p">{{year.month==1?'一月':(year.month===2?'二月':(year.month===3?'三月':(year.month===4?'四月':(
+              year.month===5?'五月':(year.month===6?'六月':(year.month===7?'七月':(year.month===8?'八月':(year.month===9?'九月':(
+              year.month===10?'十月':(year.month===11?'十一月':(year.month===12?'十二月':'')))))))))))}}</p>
+            <div class="year-week-box">
+              <p class="for-week-box" v-for="item of weekList" :key="item.key">{{ item.value }}</p>
+            </div>
+            <div class="year-big-box">
+              <div class="for-year-big-box" v-for="(item,index) in year.list" :key="item.key">
+                <p class="for-year-top-big-box" :class="item.disable?'for-year-top-big-box-color':''">{{item.date}}</p>
+                <div class="for-year-bottom-big-box" :class="!item.disable&&item.noSignedInCount>0?'red-backgroud-color':''" v-if="item.signInCount>0" @click.stop="goPage('info',item)">{{item.noSignedInCount>0?item.noSignedInCount:item.signInCount}}人</div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <info-page v-if="pageType === 2" :propsData="propsData"></info-page>
+  </div>
+</template>
+
+<script>
+  import { getListYmd } from '@/api/laboratory/patrolRecord'
+  import { getTreeList} from '@/api/evacuation3_2/index'
+  import { treeselect } from "@/api/system/user_teacher";
+  import infoPage from "./infoPage.vue";
+  export default {
+    name: 'index',
+    components: {
+      infoPage
+    },
+    data() {
+      return {
+        //页面状态切换
+        pageType:1,
+        //树状结构
+        treeList:[],
+        deptOptions:[],
+        defaultProps: {
+          children: "children",
+          label: "label"
+        },
+        checkTreeId:null,
+        //年月状态切换 1.月度  2.年度
+        yearMonthType:1,
+        //全选按钮状态
+        allButtonType:false,
+        //年月数据切换
+        yearMonthData:{
+          presentYear:null,
+          presentMonth:null,
+          presentDate:null,
+          year:null,
+          month:null,
+        },
+        //计算用日期
+        shareDate: new Date(),
+        newKey:0,
+        weekList: [
+          {
+            key:"1",
+            value:"周一",
+          },
+          {
+            key:"2",
+            value:"周二",
+          },
+          {
+            key:"3",
+            value:"周三",
+          },
+          {
+            key:"4",
+            value:"周四",
+          },
+          {
+            key:"5",
+            value:"周五",
+          },
+          {
+            key:"6",
+            value:"周六",
+          },
+          {
+            key:"7",
+            value:"周日",
+          },
+        ],
+        //年日历
+        yearDate:[],
+        //月日历
+        monthDate:[],
+        //已勾选数据
+        checkList:[],
+        //子页面传参数据
+        propsData:{},
+      }
+    },
+    created() {
+      this.getTreeselect();
+    },
+    mounted() {
+    },
+    methods: {
+      /**************************************************/
+      //查询值班记录列表
+      getListYmd(){
+        let self = this;
+        let obj = {
+          deptId:this.checkTreeId,
+          // beginTime:this.yearDate[0].list[0].value,
+          beginTime:"",
+          // endTime:this.yearDate[this.yearDate.length-1].list[this.yearDate[this.yearDate.length-1].list.length-1].value,
+          endTime:"",
+        };
+        if(this.yearMonthType == 1){
+          for(let i=0;i<self.yearDate.length;i++){
+            if(self.yearDate[i].year == self.yearMonthData.year &&
+              self.yearDate[i].month == self.yearMonthData.month){
+              obj.beginTime = self.yearDate[i].list[0].value;
+              obj.endTime = self.yearDate[i].list[self.yearDate[i].list.length-1].value;
+            }
+          }
+        }else if(this.yearMonthType == 2){
+          let list = [];
+          for(let i=0;i<self.yearDate.length;i++){
+            if(self.yearDate[i].year == self.yearMonthData.year){
+              list.push(self.yearDate[i]);
+            }
+          }
+          obj.beginTime = list[0].list[0].value;
+          obj.endTime = list[list.length-1].list[list[list.length-1].list.length-1].value;
+        }
+        getListYmd(obj).then(response => {
+          for(let o=0;o<self.yearDate.length;o++){
+            for(let x=0;x<self.yearDate[o].list.length;x++){
+              let signInCount = 0;
+              let noSignedInCount = 0;
+              for(let i=0;i<response.data.length;i++){
+                if(self.yearDate[o].list[x].value == response.data[i].dutyTime){
+                  signInCount = response.data[i].signInCount
+                  noSignedInCount = response.data[i].noSignedInCount
+                }
+              }
+              self.yearDate[o].list[x].signInCount = signInCount
+              self.yearDate[o].list[x].noSignedInCount = noSignedInCount
+            }
+          }
+
+
+          // for(let i=0;i<response.data.length;i++){
+          //   let year = parseInt(response.data[i].dutyTime.split('-')[0]);
+          //   let month = parseInt(response.data[i].dutyTime.split('-')[1]);
+          //   for(let o=0;o<self.yearDate.length;o++){
+          //     if(self.yearDate[o].year == year && self.yearDate[o].month == month){
+          //       for(let x=0;x<self.yearDate[o].list.length;x++){
+          //         if(self.yearDate[o].list[x].value == response.data[i].dutyTime){
+          //           self.yearDate[o].list[x].signInCount = response.data[i].signInCount
+          //           self.yearDate[o].list[x].noSignedInCount = response.data[i].noSignedInCount
+          //         }
+          //       }
+          //     }
+          //   }
+          // }
+        });
+      },
+      //时间初始化
+      initializationDate(){
+        let myDate = new Date();
+        let obj = {
+          presentYear:myDate.getFullYear(),
+          presentMonth:myDate.getMonth()+1,
+          presentDate:parseInt(this.stringify(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()).replace(/-/g,"")),
+          year:myDate.getFullYear(),
+          month:myDate.getMonth()+1,
+        };
+        this.$set(this,'yearMonthData',obj);
+        this.$set(this,'yearDate',[]);
+        this.$set(this,'checkList',[]);
+        if(this.generateDate()){
+          //后端数据回填
+          this.getListYmd();
+        }
+      },
+      /** 查询部门下拉树结构 */
+      getTreeselect() {
+        let self = this;
+        treeselect({}).then(response => {
+          this.deptOptions = response.data;
+          this.$nextTick(function(){
+            if(response.data[0]){
+              self.$refs.tree.setCurrentKey(response.data[0].id);
+              self.$set(self,'checkTreeId',response.data[0].id);
+              self.initializationDate();
+            }
+          })
+        });
+      },
+      // 筛选节点
+      filterNode(value, data) {
+        if (!value) return true;
+        return data.label.indexOf(value) !== -1;
+      },
+      // 节点单击事件
+      handleNodeClick(data) {
+        if(data.id != this.checkTreeId){
+          console.log('123')
+          this.$set(this,'checkTreeId',data.id);
+          this.initializationDate();
+        }
+      },
+      //页面切换
+      goPage(type,item){
+        if(type == 'index'){
+          this.$set(this,'pageType',1)
+        }else if(type=='info'){
+          let obj = {
+            checkTreeId:this.checkTreeId,
+            time:item.value,
+          }
+          this.$set(this,'propsData',obj)
+          this.$set(this,'pageType',2)
+        }
+      },
+      //返回当前时间
+      returnPresent(){
+        this.$set(this.yearMonthData,'year',this.yearMonthData.presentYear);
+        this.$set(this.yearMonthData,'month',this.yearMonthData.presentMonth);
+        this.getListYmd();
+      },
+      //年或月增加
+      addDate(){
+        if(this.yearMonthType == 1){
+          if(this.yearMonthData.month<12){
+            this.yearMonthData.month++
+          }else{
+            if(this.yearMonthData.year>=this.yearMonthData.presentYear+1){
+              return
+            }
+            this.yearMonthData.year++
+            this.$set(this.yearMonthData,'month',1);
+          }
+        }else if(this.yearMonthType == 2){
+          if(this.yearMonthData.year>=this.yearMonthData.presentYear+1){
+            return
+          }
+          this.yearMonthData.year++
+        }
+        this.getListYmd();
+      },
+      //年或月减少
+      subtractDate(){
+        if(this.yearMonthType == 1){
+          if(this.yearMonthData.month>1){
+            this.yearMonthData.month--
+          }else{
+            if(this.yearMonthData.year==this.yearMonthData.presentYear){
+              return
+            }
+            this.yearMonthData.year--
+            this.$set(this.yearMonthData,'month',12);
+          }
+        }else if(this.yearMonthType == 2){
+          if(this.yearMonthData.year==this.yearMonthData.presentYear){
+            return
+          }
+          this.yearMonthData.year--
+        }
+        this.getListYmd();
+      },
+      //年月展示切换按钮
+      yearMonthSwitchButton(type){
+        if(this.yearMonthType != type){
+          this.$set(this,'yearMonthType',type);
+        }
+        this.getListYmd();
+      },
+      // 生成日历
+      generateDate() {
+        let self = this;
+        let myDate = new Date();
+        let year = myDate.getFullYear();
+        let newTimeList = [];
+        self.newKey = 0;
+        for(let o=0;o<2;o++){
+          for(let i=0;i<12;i++){
+            self.newKey++
+            newTimeList.push(self.setCurrentYearMonth(year,i))
+          }
+          year++
+        }
+        this.$set(this,'yearDate',newTimeList);
+        return true;
+      },
+      // 设置日历显示的日期(年-月)
+      setCurrentYearMonth(year,month) {
+        let showYearMonth = {
+          year,
+          month,
+        };
+        return this.createCalendar(showYearMonth);
+      },
+      // 创建当前月对应日历的日期数据
+      createCalendar(showYearMonth) {
+        const oneDayMS = 24 * 60 * 60 * 1000;
+        let { year, month } = showYearMonth;
+        let obj = {
+          key:this.newKey,
+          time:year+'-'+(month+1),
+          year:year,
+          month:month+1,
+          list:[],
+        }
+        let firstDay = this.getFirstDayByMonths(year, month);
+        let prefixDaysLen = firstDay === 0 ? 6 : firstDay - 1;
+        let begin = new Date(year, month, 1).getTime() - oneDayMS * prefixDaysLen;
+        let lastDay = this.getLastDayByMonth(year, month);
+        let suffixDaysLen = lastDay === 0 ? 0 : 7 - lastDay;
+        let end = new Date(year, month + 1, 0).getTime() + oneDayMS * suffixDaysLen;
+        while (begin <= end) {
+          this.shareDate.setTime(begin);
+          let year = this.shareDate.getFullYear();
+          let curMonth = this.shareDate.getMonth();
+          let date = this.shareDate.getDate();
+          let time = this.stringify(year, curMonth, date).replace(/-/g,"");
+          obj.list.push({
+            year: year,
+            month: curMonth + 1,
+            date: date,
+            weeks:this.calculationWeeks(year, curMonth, date),
+            value: this.stringify(year, curMonth, date),
+            key:this.newKey+''+time,
+            time:time,
+            disable: curMonth !== month,
+            checkType:false,
+            signInCount:0,
+            noSignedInCount:0,
+          });
+          begin += oneDayMS;
+        }
+        return obj;
+      },
+      //计算当前是周几
+      calculationWeeks(year, curMonth, date){
+        let now = new Date(this.stringify(year, curMonth, date));
+        let day = now.getDay();
+        let weeks = new Array(
+          "7",
+          "1",
+          "2",
+          "3",
+          "4",
+          "5",
+          "6"
+        );
+        return weeks[day];
+      },
+      // 格式化时间
+      stringify(year, month, date) {
+        return [year, this.pad(month + 1), this.pad(date)].join("-");
+      },
+      // 对小于 10 的数字,前面补 0
+      pad(str) {
+        return str < 10 ? `0${str}` : str;
+      },
+      // 当前月的第一天是星期几
+      getFirstDayByMonths(year, month) {
+        return new Date(year, month, 1).getDay();
+      },
+      // 当前月的最后一天是星期几
+      getLastDayByMonth(year, month) {
+        return new Date(year, month + 1, 0).getDay();
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+.patrolRecord{
+  display: flex;
+  flex-direction: column;
+  font-weight:500;
+  *{
+    margin:0;
+    padding:0;
+  }
+  .patrolRecordPage{
+    flex:1;
+    display: flex;
+    overflow: hidden;
+    .left-page-max-big-box{
+      width:250px;
+      overflow: hidden;
+      display: flex;
+      flex-direction: column;
+      padding:36px 0 36px 10px;
+      .tree-box {
+        flex: 1;
+        .terr-max-box:nth-child(1){
+          margin:0;
+        }
+        .terr-max-box {
+          margin-top: 20px;
+          .max-name-box {
+            display: flex;
+            margin-right: 20px;
+            margin-bottom: 10px;
+            color: #D8D8D8;
+            font-size: 20px;
+            .max-name {
+              flex: 1;
+              margin-right: 19px;
+              color: #333;
+              font-size: 16px;
+              line-height: 16px;
+              margin-top: 3px;
+              cursor: pointer;
+              overflow: hidden;
+            }
+          }
+          .terr-big-box {
+            margin-left: 30px;
+            .big-name-box {
+              cursor: pointer;
+              height: 40px;
+              line-height: 40px;
+              display: flex;
+              font-size: 16px;
+              color: #333;
+              img {
+                width: 16px;
+                height: 16px;
+                margin-top: 12px;
+                margin-right: 4px;
+              }
+              .name-p {
+                flex: 1;
+                overflow: hidden;
+              }
+            }
+            .terr-min-box {
+              margin-left: 30px;
+              .min-name {
+                cursor: pointer;
+                height: 40px;
+                line-height: 40px;
+                display: flex;
+                font-size: 16px;
+                color: #333;
+                overflow: hidden;
+              }
+            }
+          }
+          .check-color {
+            color: #0183FA !important;
+          }
+        }
+      }
+      .tree-null-p {
+        text-align: center;
+        line-height: 100px;
+        flex: 1;
+        color: #999;
+      }
+    }
+    .center-border-p{
+      border-right:1px dashed #A2A2A2;
+      margin:36px 35px 36px 0;
+    }
+    .right-page-max-big-box{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+      -webkit-user-select: none;
+      -moz-user-select: none;
+      -ms-user-select: none;
+      user-select: none;
+      .top-button-max-box{
+        height:87px;
+        padding:21px 0 26px 0;
+        display: flex;
+        border-bottom:1px solid #E0E0E0;
+        font-size:14px;
+        .yearMonthButtonBox{
+          width:200px;
+          height:40px;
+          display: flex;
+          p{
+            text-align: center;
+            line-height:38px;
+            width:100px;
+            cursor: pointer;
+          }
+          p:nth-child(1){
+            border-top-left-radius: 4px;
+            border-bottom-left-radius: 4px;
+          }
+          p:nth-child(2){
+            border-top-right-radius: 4px;
+            border-bottom-right-radius: 4px;
+          }
+          .left-button-one{
+            background: #0183FA;
+            border:1px solid #0183FA;
+            color:#fff;
+          }
+          .left-button-tow{
+            color:#333333;
+            border:1px solid #E0E0E0;
+            border-right:none;
+          }
+          .right-button-one{
+            background: #0183FA;
+            border:1px solid #0183FA;
+            color:#fff;
+          }
+          .right-button-tow{
+            color:#333333;
+            border:1px solid #E0E0E0;
+            border-left:none;
+          }
+        }
+        .year-month-data-button-box{
+          display: flex;
+          margin:0 33px 0 39px;
+          p{
+            line-height:38px;
+            text-align: center;
+          }
+          .year-month-subtract-button{
+            border:1px solid #E0E0E0;
+            border-top-left-radius: 4px;
+            border-bottom-left-radius: 4px;
+            width:38px;
+            cursor: pointer;
+          }
+          .year-month-text-p{
+            border-top:1px solid #E0E0E0;
+            border-bottom:1px solid #E0E0E0;
+            width:150px;
+          }
+          .year-month-add-button{
+            border:1px solid #E0E0E0;
+            border-top-right-radius: 4px;
+            border-bottom-right-radius: 4px;
+            width:38px;
+            cursor: pointer;
+          }
+        }
+        .return-year-month-button{
+          width:100px;
+          height:40px;
+          line-height:38px;
+        }
+        .flex-p{
+          flex:1;
+        }
+        .all-button{
+          width:80px;
+          height:40px;
+          margin-right:8px;
+          line-height:38px;
+        }
+        .add-button{
+          width:80px;
+          height:40px;
+          margin-right:23px;
+          line-height:38px;
+        }
+      }
+      .month-max-big-box{
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+        user-select: none;
+        flex:1;
+        padding:10px 0 30px;
+        .month-week-box{
+          display: flex;
+          overflow: hidden;
+          font-size:0;
+          .for-week-box{
+            font-size:14px;
+            width:180px;
+            text-align: center;
+            line-height:60px;
+            border-bottom:1px solid #E0E0E0;
+          }
+        }
+        .month-big-box{
+          border-left:1px solid #E0E0E0;
+          font-size:0;
+          .for-month-max-big-box{
+            overflow: hidden;
+            font-size:16px;
+            width:180px;
+            height:110px;
+            display: inline-block;
+            border-right:1px solid #E0E0E0;
+            border-bottom:1px solid #E0E0E0;
+            position: relative;
+            .for-month-top-big-box{
+              width:180px;
+              height:50px;
+              line-height:50px;
+              text-align: center;
+              font-size:16px;
+              color:#333;
+            }
+            .for-month-top-big-box-color{
+              color:#E0E0E0;
+            }
+            .for-month-bottom-big-box{
+              height:60px;
+              background: rgba(1,131,250,0.2);
+              color:#0183FA;
+              display: flex;
+              cursor: pointer;
+              .for-month-bottom-left-min-box{
+                flex: 1;
+                font-size:14px;
+                padding:10px 0 0 10px;
+                p{
+                  line-height:20px;
+                }
+              }
+              .for-month-bottom-right-min-box{
+                width:24px;
+                text-align: center;
+                line-height:60px;
+                font-size:12px;
+                font-weight:900;
+              }
+            }
+          }
+        }
+      }
+      .year-max-big-box{
+        flex:1;
+        padding:30px 0;
+        .for-year-max-big-box{
+          vertical-align:top;
+          width:596px;
+          display: inline-block;
+          margin:0 42px 40px 0;
+          overflow: hidden;
+          .year-name-p{
+            text-align: center;
+            font-size:16px;
+            background: #CCE6FE;
+            color:#0183FA;
+            line-height:40px;
+            border-top-left-radius:4px;
+            border-top-right-radius:4px;
+          }
+          .year-week-box{
+            overflow: hidden;
+            font-size:0;
+            background: rgba(224,224,224,0.2);
+            .for-week-box{
+              width:85px;
+              line-height:40px;
+              text-align: center;
+              display: inline-block;
+              font-size:12px;
+            }
+          }
+          .year-big-box{
+            border-top:1px solid #E0E0E0;
+            border-left:1px solid #E0E0E0;
+            overflow: hidden;
+            font-size:0;
+            .for-year-big-box{
+              display: inline-block;
+              overflow: hidden;
+              width:85px;
+              height:60px;
+              border-right:1px solid #E0E0E0;
+              border-bottom:1px solid #E0E0E0;
+              position: relative;
+              .for-year-top-big-box{
+                flex:1;
+                font-size:12px;
+                color:#333;
+                line-height:30px;
+                text-align: center;
+              }
+              .for-year-top-big-box-color{
+                color:#E0E0E0;
+              }
+              .for-year-bottom-big-box{
+                line-height:30px;
+                font-size:14px;
+                text-align: center;
+                background: #CCE6FE;
+                color:#0183FA;
+                cursor: pointer;
+              }
+            }
+          }
+        }
+      }
+      .red-backgroud-color{
+        background: rgba(255,0,0,0.2)!important;
+        color:#FF0000!important;
+      }
+    }
+  }
+}
+</style>
+<style lang="scss">
+  .patrolRecord{
+    .el-tree-node__label{
+      font-size:16px;
+    }
+    .el-tree-node__content{
+      height:30px;
+      line-height: 30px;
+    }
+    .el-tree-node__expand-icon{
+      color:#333;
+      font-size:16px;
+      padding:0;
+      margin-right:3px;
+    }
+    .el-tree-node__expand-icon.is-leaf{
+      color: transparent;
+    }
+    .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content{
+      background-color:#ffffff;
+      color:#0183FA;
+    }
+  }
+</style>

+ 132 - 0
src/views/comprehensive/personnel/patrolRecord/infoPage.vue

@@ -0,0 +1,132 @@
+<template>
+  <div class="onDutyConfigurationInfo">
+    <div class="onDutyConfigurationInfo-title-box">
+      <p>{{propsData.time}}巡查记录</p>
+      <p class="add-button-one-90" @click="outButton">返回</p>
+    </div>
+    <div class="list-max-big-box scrollbar-box">
+      <div class="list-max-big-title-box">
+        <div>
+          <p :class="buttonType == 1?'text-p':''" @click="buttonClick(1)">正常记录</p>
+          <p :class="buttonType == 1?'color-p':''"></p>
+        </div>
+        <div>
+          <p :class="buttonType == 2?'text-p':''" @click="buttonClick(2)">异常记录</p>
+          <p :class="buttonType == 2?'color-p':''"></p>
+        </div>
+      </div>
+      <normal-page v-if="buttonType==1" :propsPageData="propsData"></normal-page>
+      <anomaly-page v-if="buttonType==2" :propsPageData="propsData"></anomaly-page>
+    </div>
+  </div>
+</template>
+
+<script>
+  import normalPage from "./normalPage.vue";
+  import anomalyPage from "./anomalyPage.vue";
+  export default {
+    name: 'infoPage',
+    components: {
+      normalPage,
+      anomalyPage
+    },
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        buttonType:1,
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+
+    },
+    methods:{
+      //页面切换按钮
+      buttonClick(type){
+        if(this.buttonType != type){
+          this.$set(this,'buttonType',type)
+        }
+      },
+      //返回按钮
+      outButton(){
+        this.$parent.goPage('index')
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .onDutyConfigurationInfo{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    *{
+      margin:0;
+      padding:0;
+    }
+    .onDutyConfigurationInfo-title-box{
+      display: flex;
+      height: 80px;
+      border-bottom:1px solid #E0E0E0;
+      p:nth-child(1){
+        flex:1;
+        line-height:80px;
+        margin-left:20px;
+        color:#0045AF;
+        font-size:16px;
+        font-weight:900;
+      }
+      p:nth-child(2){
+        margin:20px;
+      }
+    }
+    .list-max-big-box{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      padding:0 20px 10px;
+      .list-max-big-title-box{
+        display: flex;
+        div{
+          overflow: hidden;
+          margin-right:48px;
+          padding:15px 0 19px;
+          p:nth-child(1){
+            cursor: pointer;
+            width: 78px;
+            height: 42px;
+            font-size: 16px;
+            line-height: 42px;
+            text-align: center;
+          }
+          p:nth-child(2){
+            margin:0 auto;
+            width: 55px;
+            height: 4px;
+          }
+          .text-p{
+            color: #0045AF;
+          }
+          .color-p{
+            background: #0045AF;
+            border-radius: 20px 20px 20px 20px;
+          }
+        }
+      }
+    }
+  }
+</style>
+<style lang="scss">
+  .onDutyConfigurationInfo{
+    .el-table__empty-text{
+      font-size: 12px;
+      background: none;
+      color:#909399;
+    }
+  }
+</style>

+ 71 - 0
src/views/comprehensive/personnel/patrolRecord/normalPage.vue

@@ -0,0 +1,71 @@
+<!--正常-->
+<template>
+  <div class="normalPage">
+    <el-table v-loading="loading" border :data="listData">
+      <el-table-column  label="姓名" align="left" prop="userName" show-overflow-tooltip width="200"/>
+      <el-table-column label="实验室" align="left" prop="subjectName" show-overflow-tooltip/>
+      <el-table-column label="签到时间" align="left" prop="signIn" show-overflow-tooltip width="320"/>
+      <el-table-column label="签退时间" align="left" prop="signOut" show-overflow-tooltip width="320"/>
+      <el-table-column label="停留时间" align="left" prop="residenceTime" show-overflow-tooltip width="320"/>
+    </el-table>
+    <pagination :page-sizes="[5, 10, 15, 20]"
+                :total="total"
+                style="margin-top:10px;"
+                layout="total, prev, pager, next, sizes, jumper"
+                :page.sync="param.pageNum"
+                :limit.sync="param.pageSize"
+                @pagination="getListPlan"
+    />
+  </div>
+</template>
+
+<script>
+  import { listStandard } from '@/api/laboratory/patrolRecord'
+  export default {
+    name: 'normalPage',
+    props:{
+      propsPageData:{},
+    },
+    data(){
+      return{
+        listData:[],
+        loading:false,
+        param:{
+          pageNum:1,
+          pageSize:10,
+        },
+        total:0,
+      }
+    },
+    created(){
+      this.getListPlan();
+    },
+    mounted(){
+
+    },
+    methods:{
+      //获取数据
+      getListPlan(){
+        this.loading = true;
+        let obj = {
+          pageNum:this.param.pageNum,
+          pageSize:this.param.pageSize,
+          signIn:this.propsPageData.time,
+          deptId:this.propsPageData.checkTreeId,
+        }
+        listStandard(obj).then(response => {
+          this.$set(this,'listData',response.rows);
+          this.loading = false;
+        })
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .normalPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+  }
+</style>

+ 97 - 36
src/views/comprehensive/system/publicConfig/integrationConfig.vue

@@ -1,8 +1,16 @@
 <!--一体机配置-->
 <template>
-  <div class="public-config-page">
+  <div class="public-config-page integrationConfig">
     <el-form class="public-form-box scrollbar-box"  :model="form" ref="form" :inline="true" :rules="rules" label-width="160px">
       <div class="form-max-box">
+        <el-form-item label="信息牌模块:" prop="isStart">
+          <el-radio-group v-model="form.isStart" style="margin-top:4px;">
+            <el-radio :label="1" style="margin-right:30px;">启用</el-radio>
+            <el-radio :label="0">停用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
         <el-form-item label="物联控制权限:" prop="lotControl">
           <el-checkbox-group v-model="form.lotControl">
             <el-checkbox v-for="item in citiesList" :label="item.id" :key="item.id" style="margin-right:20px;margin-top:2px;">{{item.name}}</el-checkbox>
@@ -10,24 +18,36 @@
         </el-form-item>
       </div>
       <div class="form-max-box">
-        <el-form-item label="签到/离开示意图:" prop="signMap">
-          <el-upload
-            class="certificate-avatar-uploader"
-            :action="uploadImgUrl"
-            :show-file-list="false"
-            accept="image/jpeg,image/gif,image/png"
-            :on-success="(res)=>handleAvatarSuccess(res,'signMap')"
-            :headers="headers"
-            :before-upload="beforeAvatarUpload">
-            <img v-if="form.signMap" :src="form.signMap" class="avatar">
-            <i v-if="!form.signMap" class="el-icon-plus avatar-uploader-icon" >上传</i>
-          </el-upload>
-          <i v-if="form.signMap" class="el-icon-view" @click="lookImg(form.signMap)"
-             style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;
-            height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
+        <el-form-item class="time-input-box" label="自动返回时间:" prop="returnTime">
+          <el-input-number :controls="false" :min="30" :max="600" placeholder="请输入内容" v-model="form.returnTime" style="width:500px;"/>
+          <span>秒</span>
         </el-form-item>
       </div>
       <div class="form-max-box">
+        <el-form-item class="time-input-box" label="自动注销时间:" prop="logoutTime">
+          <el-input-number :controls="false" :min="30" :max="600" placeholder="请输入内容" v-model="form.logoutTime" style="width:500px;"/>
+          <span>秒</span>
+        </el-form-item>
+      </div>
+      <!--<div class="form-max-box">-->
+        <!--<el-form-item label="签到/离开示意图:" prop="signMap">-->
+          <!--<el-upload-->
+            <!--class="certificate-avatar-uploader"-->
+            <!--:action="uploadImgUrl"-->
+            <!--:show-file-list="false"-->
+            <!--accept="image/jpeg,image/gif,image/png"-->
+            <!--:on-success="(res)=>handleAvatarSuccess(res,'signMap')"-->
+            <!--:headers="headers"-->
+            <!--:before-upload="beforeAvatarUpload">-->
+            <!--<img v-if="form.signMap" :src="form.signMap" class="avatar">-->
+            <!--<i v-if="!form.signMap" class="el-icon-plus avatar-uploader-icon" >上传</i>-->
+          <!--</el-upload>-->
+          <!--<i v-if="form.signMap" class="el-icon-view" @click="lookImg(form.signMap)"-->
+             <!--style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;-->
+            <!--height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>-->
+        <!--</el-form-item>-->
+      <!--</div>-->
+      <div class="form-max-box">
         <el-form-item label="视频封面:" prop="videoCover">
           <el-upload
             class="certificate-avatar-uploader"
@@ -45,24 +65,24 @@
             height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
         </el-form-item>
       </div>
-      <div class="form-max-box">
-        <el-form-item label="操作指南:" prop="operationGuide">
-          <el-upload
-            class="certificate-avatar-uploader"
-            :action="uploadImgUrl"
-            :show-file-list="false"
-            accept="image/jpeg,image/gif,image/png"
-            :on-success="(res)=>handleAvatarSuccess(res,'operationGuide')"
-            :headers="headers"
-            :before-upload="beforeAvatarUpload">
-            <img v-if="form.operationGuide" :src="form.operationGuide" class="avatar">
-            <i v-if="!form.operationGuide" class="el-icon-plus avatar-uploader-icon">上传</i>
-          </el-upload>
-          <i v-if="form.operationGuide" class="el-icon-view" @click="lookImg(form.operationGuide)"
-             style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;
-            height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
-        </el-form-item>
-      </div>
+      <!--<div class="form-max-box">-->
+        <!--<el-form-item label="操作指南:" prop="operationGuide">-->
+          <!--<el-upload-->
+            <!--class="certificate-avatar-uploader"-->
+            <!--:action="uploadImgUrl"-->
+            <!--:show-file-list="false"-->
+            <!--accept="image/jpeg,image/gif,image/png"-->
+            <!--:on-success="(res)=>handleAvatarSuccess(res,'operationGuide')"-->
+            <!--:headers="headers"-->
+            <!--:before-upload="beforeAvatarUpload">-->
+            <!--<img v-if="form.operationGuide" :src="form.operationGuide" class="avatar">-->
+            <!--<i v-if="!form.operationGuide" class="el-icon-plus avatar-uploader-icon">上传</i>-->
+          <!--</el-upload>-->
+          <!--<i v-if="form.operationGuide" class="el-icon-view" @click="lookImg(form.operationGuide)"-->
+             <!--style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;-->
+            <!--height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>-->
+        <!--</el-form-item>-->
+      <!--</div>-->
     </el-form>
     <div class="sub_btn">
       <p class="null-p"></p>
@@ -93,7 +113,10 @@ export default {
       form:{
         lotControl:[],
         userType:[],
-        expandType:[]
+        expandType:[],
+        isStart:1,
+        returnTime:60,
+        logoutTime:120,
       },
       rules: {
         lotControl:[
@@ -150,10 +173,17 @@ export default {
       let self = this;
       this.$refs["form"].validate(valid => {
         if (valid) {
+          if(this.form.returnTime == this.form.logoutTime){
+            this.msgError('自动返回时间与自动注销时间不能重复');
+            return
+          }
           let obj = {
             signMap:this.form.signMap,
             videoCover:this.form.videoCover,
             operationGuide:this.form.operationGuide,
+            isStart:this.form.isStart,
+            returnTime:this.form.returnTime,
+            logoutTime:this.form.logoutTime,
           }
           let num = 0;
           for(let i=0;i<self.form.lotControl.length;i++){
@@ -161,7 +191,6 @@ export default {
               num++
             }
           }
-          console.log('num',num);
           if(num == 0){
             obj.lotControl = self.form.lotControl+'';
           }else{
@@ -184,6 +213,15 @@ export default {
       getLogoInfo().then(response => {
         localStorage.setItem('videoCover',response.data.videoCover)
         this.$set(this,'form',response.data)
+        if(!response.data.isStart){
+          response.data.isStart = 1;
+        }
+        if(!response.data.returnTime){
+          response.data.returnTime = 60;
+        }
+        if(!response.data.logoutTime){
+          response.data.logoutTime = 120;
+        }
         if(response.data.lotControl){
           let list = response.data.lotControl.split(",");
           this.$set(this.form,'lotControl',list);
@@ -279,4 +317,27 @@ export default {
   }
 }
 </style>
+<style lang="scss">
+  .integrationConfig{
+    .time-input-box{
+      input{
+        text-align: left;
+        border-top-right-radius:0;
+        border-bottom-right-radius:0;
+      }
+      span{
+        font-size:14px;
+        font-weight:500;
+        display: inline-block;
+        width:40px;
+        height:40px;
+        background: #E0E0E0;
+        text-align: center;
+        line-height: 40px;
+        border-top-right-radius:4px;
+        border-bottom-right-radius:4px;
+      }
+    }
+  }
+</style>
 

+ 326 - 0
src/views/emergencyManagement/electronicInformationBoard/index.vue

@@ -0,0 +1,326 @@
+<template>
+  <div class="app-container electronicInformationBoard">
+    <el-form class="form-box" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+      <el-form-item label="关键字" prop="searchValue" label-width="54px">
+        <el-input
+          maxLength="20"
+          v-model="queryParams.searchValue"
+          placeholder="设备名称/设备编号/实验室"
+          clearable
+          size="small"
+          style="width: 240px"
+        />
+      </el-form-item>
+      <el-form-item label="部门" prop="type" label-width="56px">
+        <el-select v-model="queryParams.deptId" 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="lightStatus">-->
+      <!--<el-select v-model="queryParams.lightStatus" placeholder="请选择状态" clearable size="small" label-width="60px">-->
+      <!--<el-option label="请选择字典生成" value="" />-->
+      <!--</el-select>-->
+      <!--</el-form-item>-->
+      <el-form-item>
+        <p class="inquire-button-one" @click="handleQuery" style="margin:0 20px;">查询</p>
+        <p class="reset-button-one" @click="resetQuery">重置</p>
+      </el-form-item>
+      <el-form-item
+        style="float: right;">
+        <p class="inquire-button-one"
+           @click="addButton(1)"
+        >+ 新增</p>
+      </el-form-item>
+    </el-form>
+    <el-table v-loading="loading" border :data="dataList" style="margin-bottom:10px;">
+      <el-table-column label="设备名称" align="center" prop="cardName" show-overflow-tooltip/>
+      <el-table-column label="设备编号" align="center" prop="cardNum" show-overflow-tooltip width="210"/>
+      <el-table-column label="部门" align="center" prop="deptName" show-overflow-tooltip width="200"/>
+      <el-table-column label="位置" align="center" prop="location" show-overflow-tooltip width="200"/>
+      <el-table-column label="设备状态" align="center" prop="operate" show-overflow-tooltip width="150">
+        <template slot-scope="scope">
+          <span>{{scope.row.operate==2?'在线':'离线'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="createBy" show-overflow-tooltip width="150"/>
+      <el-table-column label="创建时间" align="center" prop="createTime" show-overflow-tooltip width="230"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150" v-if="tableButtonType">
+        <template slot-scope="scope">
+          <div class="button-box" style="display: flex">
+            <p class="table-min-button" style="margin-left:0;" @click="addButton(2,scope.row)"
+            >编辑</p>
+            <p class="table-min-button" @click="delButton(scope.row)"
+            >删除</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"
+    />
+    <el-dialog :title="dialogTitle" :visible.sync="addDialogType" v-if="addDialogType"
+               width="520px" append-to-body id="onDutyConfiguration-dialog-box">
+      <el-form ref="form" :model="addForm" :rules="rules" label-width="100px">
+        <el-form-item label="设备编号:" prop="cardNum">
+          <el-input v-model="addForm.cardNum" placeholder="请输入设备编号" maxlength="20" style="width:360px;"/>
+        </el-form-item>
+        <el-form-item label="实验室:" prop="subjectId">
+          <el-select
+            style="width:360px;"
+            v-model="addForm.subjectId"
+            filterable
+            remote
+            clearable
+            @focus="selectFocus"
+            reserve-keyword
+            @clear="clearClick"
+            placeholder="输入关键字检索选择"
+            :remote-method="getSelectList"
+            @change="selectChange"
+            :loading="loading">
+            <el-option
+              v-for="item in selectList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="安装位置:" prop="location">
+          <el-input v-model="addForm.location" placeholder="请输入安装位置" maxlength="10" style="width:360px;"/>
+        </el-form-item>
+        <el-form-item label="关联门禁:" prop="isStart">
+          <el-radio-group v-model="addForm.isStart" style="margin-top:4px;">
+            <el-radio :label="1" style="margin-right:30px;">是</el-radio>
+            <el-radio :label="2">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" style="text-align: center;">
+        <el-button @click="cancel" style="height:30px;line-height:30px;">取 消</el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { XxpCardInfoList,XxpCardInfo,XxpCardInfoPut,XxpCardInfoDelete } from "@/api/laboratory/electronicInformationBoard";
+  import { filterDept,getSubList } from "@/api/medicUniversity-3_1/index";
+  import {listDepartments} from "@/api/system/dept";
+  export default {
+    name: 'index',
+    data(){
+      return{
+        tableButtonType:this.hasPermiDom(['laboratory:plan:query','laboratory:planjoin:edit']),
+        showSearch: true,
+        loading: false,
+        deptOptions:[],
+        queryParams: {
+          pageNum: 1,
+          pageSize:20,
+        },
+        dataList: [],
+        total: 0,
+        addDialogType:false,
+        dialogTitle:"",
+        addForm:{},
+        rules:{
+          cardNum: [
+            { required: true, message: "请输入设备编号", trigger: "change" },
+            { required: true, message: "请输入预案名称", validator: this.spaceJudgment, trigger: "change" },
+          ],
+          subjectId: [
+            { required: true, message: "请选择实验室", trigger: "change" },
+            { required: true, message: "请选择实验室", validator: this.spaceJudgment, trigger: "change" },
+          ],
+          location: [
+            { required: true, message: "请输入安装位置", trigger: "change" },
+            { required: true, message: "请输入安装位置", validator: this.spaceJudgment, trigger: "change" },
+          ],
+          isStart: [
+            { required: true, message: "请选择是否关联门禁", trigger: "change" },
+            { required: true, message: "请选择是否关联门禁", validator: this.spaceJudgment, trigger: "change" },
+          ],
+        },
+        selectList:[],
+        selectListData:[],
+      }
+    },
+    created(){
+      this.getDeptListTow();
+      this.filterDept();
+      this.getList();
+    },
+    mounted(){
+
+    },
+    methods:{
+      delButton(row){
+        let self = this;
+        this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          XxpCardInfoDelete(row.id).then(response => {
+            self.msgSuccess(response.msg);
+            self.getList();
+          });
+        }).then(() => {
+        }).catch(() => {});
+      },
+      //新增编辑按钮
+      addButton(type,row){
+        if(type == 1){
+          this.$set(this,'dialogTitle','新增电子信息牌');
+          this.$set(this,'addForm',{
+            cardNum:"",
+            subjectId:"",
+            location:"",
+            isStart:1,
+          });
+        }else if(type == 2){
+          this.$set(this,'dialogTitle','编辑电子信息牌');
+          this.$set(this,'addForm',{
+            id:row.id,
+            cardNum:row.cardNum,
+            subjectId:row.subjectId,
+            subjectName:row.subjectName,
+            location:row.location,
+            isStart:row.isStart,
+          });
+        }
+        this.$set(this,'addDialogType',true);
+      },
+      //查询当前院系
+      filterDept(){
+        filterDept().then(response => {
+          let idText = "";
+          for(let i=0;i<response.data.length;i++){
+            if(i==0){
+              idText = idText + response.data[i].deptId;
+            }else{
+              idText = idText +','+ response.data[i].deptId;
+            }
+          }
+          //查询院系下实验室
+          getSubList(idText).then(response => {
+            //当前列表
+            this.selectList = JSON.parse(JSON.stringify(response.data));
+            //原始列表数据
+            this.selectListData = JSON.parse(JSON.stringify(response.data));
+          });
+        });
+      },
+      //实验室选中
+      selectChange(id){
+        let self = this;
+        for(let i=0;i<self.selectList.length;i++){
+          if(id == self.selectList[i].id){
+            this.$set(this.addForm,'subjectName',self.selectList[i].name);
+          }
+        }
+      },
+      /** 实验室-本地懒加载 */
+      getSelectList(val) {
+        let self = this;
+        let list = [];
+        for(let i=0;i<self.selectListData.length;i++){
+          if(self.selectListData[i].name.indexOf(val) != -1){
+            list.push(self.selectListData[i]);
+          }
+        }
+        this.selectList = JSON.parse(JSON.stringify(list))
+      },
+      //实验室选中清除
+      clearClick(){
+        this.selectList = JSON.parse(JSON.stringify(this.selectListData))
+      },
+      selectFocus(){
+        if(!this.selectList[0]){
+          this.filterDept();
+        }
+      },
+      submitForm(){
+        this.$refs["form"].validate((valid) => {
+          if (valid) {
+            if(this.addForm.id){
+              //编辑
+              XxpCardInfoPut(this.addForm).then(response => {
+                //当前列表
+                this.msgSuccess(response.msg);
+                this.getList();
+                this.addDialogType = false;
+              });
+            }else{
+              //新增
+              XxpCardInfo(this.addForm).then(response => {
+                //当前列表
+                this.msgSuccess(response.msg);
+                this.getList();
+                this.addDialogType = false;
+              });
+            }
+          }
+        })
+      },
+      cancel(){
+        this.addDialogType = false;
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'queryParams',{
+          searchValue:"",
+          deptId:''
+        })
+        this.handleQuery();
+      },
+      getList() {
+        this.loading = true;
+        XxpCardInfoList(this.queryParams).then( response => {
+          this.dataList =  response.rows;
+          this.total =  response.total;
+          this.loading = false;
+        });
+      },
+      /** 查询学院列表 */
+      getDeptListTow() {
+        listDepartments().then(response => {
+          // this.deptOptionsTwo = response.data;
+          this.$set(this, 'deptOptions', response.data)
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .electronicInformationBoard{
+    display: flex;
+    flex-direction: column;
+    font-weight:500;
+    padding:20px 20px 10px!important;
+    *{
+      margin:0;
+      padding:0;
+    }
+    .form-box{
+      height:60px;
+    }
+  }
+</style>