dedsudiyu 11 ay önce
ebeveyn
işleme
3579c6b126

BIN
src/assets/ZDimages/integratedManagement/icon_xzqx_xz.png


BIN
src/assets/ZDimages/integratedManagement/icon_xzqx_zc.png


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1338 - 0
src/views/integratedManagement/personnelManage/onDutyConfiguration/index.vue


+ 159 - 0
src/views/integratedManagement/personnelManage/onDutyConfiguration/infoPage.vue

@@ -0,0 +1,159 @@
+<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="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p" @click="delUserButton(scope.row)"
+                   v-hasPermi="['laboratory:duty:remove']">移除</p>
+                <p class="table-button-null"></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 '@/apiDemo/laboratory/onDutyConfiguration'
+  export default {
+    name: 'infoPage',
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        tableButtonType:this.hasPermiDom(['laboratory:duty: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,'total',response.total);
+            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>

+ 72 - 0
src/views/integratedManagement/personnelManage/patrolRecord/anomalyPage.vue

@@ -0,0 +1,72 @@
+<!--异常-->
+<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 '@/apiDemo/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,'total',response.total);
+          this.$set(this,'listData',response.rows);
+          this.loading = false;
+        })
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .anomalyPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+  }
+</style>

+ 795 - 0
src/views/integratedManagement/personnelManage/patrolRecord/index.vue

@@ -0,0 +1,795 @@
+<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 page-submit-common-style-button" 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||item.noSignedInCount>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||item.noSignedInCount>0)&&!item.disable" @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 '@/apiDemo/laboratory/patrolRecord'
+  import { getTreeList} from '@/apiDemo/evacuation3_2/index'
+  import { treeselect } from "@/apiDemo/system/user_teacher";
+  import infoPage from "./infoPage.vue";
+  //                                  V3
+  import { systemDeptOrganizeStructureByDept } from "@/api/commonality/permission";
+  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'){
+          if(!this.hasPermiDom(['laboratory:xxpIns:query'])){
+            this.msgError('您没有相关权限,无法查看.')
+            return
+          }
+          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){
+              return
+            }
+            this.yearMonthData.year++
+            this.$set(this.yearMonthData,'month',1);
+          }
+        }else if(this.yearMonthType == 2){
+          if(this.yearMonthData.year>=this.yearMonthData.presentYear){
+            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-1){
+              return
+            }
+            this.yearMonthData.year--
+            this.$set(this.yearMonthData,'month',12);
+          }
+        }else if(this.yearMonthType == 2){
+          if(this.yearMonthData.year<=this.yearMonthData.presentYear-1){
+            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()-1;
+        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/integratedManagement/personnelManage/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>

+ 72 - 0
src/views/integratedManagement/personnelManage/patrolRecord/normalPage.vue

@@ -0,0 +1,72 @@
+<!--正常-->
+<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 '@/apiDemo/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,'total',response.total);
+          this.$set(this,'listData',response.rows);
+          this.loading = false;
+        })
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .normalPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+  }
+</style>

+ 11 - 16
src/views/systemManagement/roleManagement/index.vue

@@ -72,12 +72,10 @@
                    v-hasPermiRouter="['system:role:edit']"
                 >编辑</p>
                 <p class="table-button-p"
-                   v-if="!scope.row.onlyIdentify"
                    @click="copyButton(2,scope.row)"
                    v-hasPermiRouter="['system:role:perms']"
                 >PC权限配置</p>
                 <p class="table-button-p"
-                   v-if="!scope.row.onlyIdentify"
                    @click="copyButton(3,scope.row)"
                    v-hasPermiRouter="['applet:role:perms']"
                 >小程序权限配置</p>
@@ -118,7 +116,7 @@
         <el-form-item label="权限字符" prop="roleKey" v-if="dialogForm.onlyIdentify">
           <el-input v-model="dialogForm.roleKey" :disabled="!!dialogForm.roleId" placeholder="请输入权限字符" maxLength="20" style="width:320px;"/>
         </el-form-item>
-        <el-form-item label="数据范围" prop="dataScope" v-if="!dialogForm.onlyIdentify">
+        <el-form-item label="数据范围" prop="dataScope">
           <el-select v-model="dialogForm.dataScope"
                      placeholder="请选择数据范围"
                      clearable style="width:320px;">
@@ -347,21 +345,18 @@ export default {
           }
           if(!this.dialogForm.onlyIdentify){
             obj.roleKey = '';
-            obj.dataScope = this.dialogForm.dataScope;
-            if(this.dialogForm.dataScope == 5){
-              let list = this.$refs['cascader'].getCheckedNodes()
-              let valueList = [];
-              list.forEach((item)=>{
-                valueList.push(item.value)
-              })
-              obj.customDept = valueList+'';
-            }else{
-              obj.customDept = '';
-            }
-            // obj.customDept = this.dialogForm.dataScope == 5 ? this.dialogForm.customDept + '' : '';
           }else{
             obj.roleKey = this.dialogForm.roleKey;
-            obj.dataScope = 4;
+          }
+          obj.dataScope = this.dialogForm.dataScope;
+          if(this.dialogForm.dataScope == 5){
+            let list = this.$refs['cascader'].getCheckedNodes()
+            let valueList = [];
+            list.forEach((item)=>{
+              valueList.push(item.value)
+            })
+            obj.customDept = valueList+'';
+          }else{
             obj.customDept = '';
           }
           if(this.dialogForm.roleId){