dedsudiyu hace 2 años
padre
commit
4ee520e850
Se han modificado 32 ficheros con 2726 adiciones y 0 borrados
  1. 85 0
      src/api/safetyCheck/index.js
  2. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_aqyh.png
  3. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_aqyht.png
  4. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_bg.png
  5. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_by.png
  6. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_dn.png
  7. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_dy.png
  8. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_gjyh.png
  9. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_gjyh_2.png
  10. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_kzjc.png
  11. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_sjsys.png
  12. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_sjsys_2.png
  13. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_sjtj.png
  14. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_ssp.png
  15. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_sy.png
  16. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_syszc.png
  17. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_xcgl.png
  18. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_xyxc.png
  19. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_yjcsys.png
  20. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_zcgl.png
  21. BIN
      src/assets/ZDimages/safetyCheck/icon_gzt_zgbg.png
  22. BIN
      src/assets/ZDimages/safetyCheck/search 10.png
  23. 279 0
      src/views/safetyCheck/dataStatistics/checkIndexStatistics.vue
  24. 99 0
      src/views/safetyCheck/dataStatistics/index.vue
  25. 302 0
      src/views/safetyCheck/dataStatistics/laboratoryStatistics.vue
  26. 303 0
      src/views/safetyCheck/dataStatistics/safetyHazardStatistics.vue
  27. 211 0
      src/views/safetyCheck/worktable/coverageRateEcharts.vue
  28. 274 0
      src/views/safetyCheck/worktable/hiddenDangerStatisticsEcharts.vue
  29. 484 0
      src/views/safetyCheck/worktable/index.vue
  30. 260 0
      src/views/safetyCheck/worktable/inspectionStatisticsEcharts.vue
  31. 290 0
      src/views/safetyCheck/worktable/toDoListBox.vue
  32. 139 0
      src/views/safetyCheck/worktable/worktableButtonBox.vue

+ 85 - 0
src/api/safetyCheck/index.js

@@ -1,8 +1,93 @@
 import request from '@/utils/request'
 
+//工作台-校级巡查数据
+export function schoolWorkCheck(query) {
+  return request({
+    url: '/security/schoolWork/check',
+    method: 'get',
+    params: query
+  })
+}
+
+//工作台-实验室巡查数据
+export function schoolWorkSubCheck(query) {
+  return request({
+    url: '/security/schoolWork/subCheck',
+    method: 'get',
+    params: query
+  })
+}
+
+//工作台-待办事项列表
+export function todoList(query) {
+  return request({
+    url: '/security/schoolWork/todoList',
+    method: 'get',
+    params: query
+  })
+}
 
+//工作台-待办事项列表-待复核
+export function tobeReviewed(query) {
+  return request({
+    url: '/security/schoolWork/tobeReviewed',
+    method: 'get',
+    params: query
+  })
+}
 
+//工作台-存在隐患
+export function hiddenCount(query) {
+  return request({
+    url: '/security/schoolWork/hiddenCount',
+    method: 'get',
+    params: query
+  })
+}
 
+//工作台-检查覆盖率
+export function yearRate(query) {
+  return request({
+    url: '/security/schoolWork/yearRate',
+    method: 'get',
+    params: query
+  })
+}
+
+//工作台-检查统计
+export function checkStatistics(query) {
+  return request({
+    url: '/security/schoolWork/checkStatistics',
+    method: 'get',
+    params: query
+  })
+}
+
+//工作台-已处理隐患
+export function hiddenDangerRectify(query) {
+  return request({
+    url: '/security/schoolWork/hiddenDangerRectify',
+    method: 'get',
+    params: query
+  })
+}
+
+//工作台-指标统计(校级)
+export function hiddenCountByType(query) {
+  return request({
+    url: '/security/schoolWork/hiddenCountByType',
+    method: 'get',
+    params: query
+  })
+}
+//工作台-指标统计(院级)
+export function collegCheckHiddenCountByType(query) {
+  return request({
+    url: 'security/collegCheck/hiddenCountByType',
+    method: 'get',
+    params: query
+  })
+}
 
 
 

BIN
src/assets/ZDimages/safetyCheck/icon_gzt_aqyh.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_aqyht.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_bg.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_by.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_dn.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_dy.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_gjyh.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_gjyh_2.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_kzjc.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_sjsys.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_sjsys_2.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_sjtj.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_ssp.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_sy.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_syszc.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_xcgl.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_xyxc.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_yjcsys.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_zcgl.png


BIN
src/assets/ZDimages/safetyCheck/icon_gzt_zgbg.png


BIN
src/assets/ZDimages/safetyCheck/search 10.png


+ 279 - 0
src/views/safetyCheck/dataStatistics/checkIndexStatistics.vue

@@ -0,0 +1,279 @@
+<template>
+  <div class="checkIndexStatistics">
+    <el-form :model="queryParams" class="form-box" ref="queryForm" :inline="true">
+      <el-form-item label="" prop="data1" label-width="50px">
+        <el-select v-model="queryParams.data1" clearable placeholder="全部">
+          <el-option
+            v-for="item in deptSelectList"
+            :key="item.key"
+            :label="item.label"
+            :value="item.key">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="searchValue" label-width="80px">
+        <el-input
+          maxLength="30"
+          v-model="queryParams.searchValue"
+          placeholder="计划任务"
+          clearable
+          style="width: 200px"/>
+      </el-form-item>
+      <el-form-item label="" prop="dateRange" label-width="70px">
+        <el-date-picker
+          :clearable="false"
+          v-model="dateRange"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
+        <p class="reset-button-one" @click="resetQuery">重置</p>
+      </el-form-item>
+      <el-form-item style="float: right;">
+        <el-dropdown @command="exportButton">
+          <div class="form-dropdown-box">
+            <img src="@/assets/ZDimages/personnelManagement/icon_jzgxx_sc.png">
+            <p>导出</p>
+            <img src="@/assets/ZDimages/personnelManagement/icon_jzggl_xljt.png">
+          </div>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item style="border-bottom:1px solid #E0E0E0;margin:0 10px;color:#333;" :command="{command:1}">导出全部数据</el-dropdown-item>
+            <el-dropdown-item style="margin:0 10px;color:#333;" :command="{command:2}">导出选中数据</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+      </el-form-item>
+    </el-form>
+    <div class="num-data-box">
+      共搜索到隐患总数 {{numData.subNum1}},一级指标隐患总数 {{numData.subNum1}},占比{{numData.subNum2}}%,{{numData.subNum3}} 200,{{numData.subNum4}}10.1%,三级指标隐患总数 300,占比10.1%
+    </div>
+    <el-table  border :data="tableList" ref="multipleTable"
+               :row-key="getRowKeys"
+               @select="select" @select-all="selectAll">
+      <el-table-column type="selection" width="50" align="center"/>
+      <el-table-column label="序号" align="center"  type="index" width="60" />
+      <el-table-column label="计划任务" align="center" prop="deptName" show-overflow-tooltip/>
+      <el-table-column label="学院" align="center" prop="deptName" show-overflow-tooltip width="230"/>
+      <el-table-column label="隐患总数" align="center" prop="deptName" show-overflow-tooltip width="120"/>
+      <el-table-column label="一级指标隐患数" align="center" prop="deptName" show-overflow-tooltip width="130"/>
+      <el-table-column label="一级指标占比" align="center" prop="deptName" show-overflow-tooltip width="130"/>
+      <el-table-column label="二级指标隐患数" align="center" prop="deptName" show-overflow-tooltip width="130"/>
+      <el-table-column label="二级指标占比" align="center" prop="deptName" show-overflow-tooltip width="130"/>
+      <el-table-column label="三级指标隐患数" align="center" prop="deptName" show-overflow-tooltip width="130"/>
+      <el-table-column label="三级指标占比" align="center" prop="deptName" show-overflow-tooltip width="130"/>
+    </el-table>
+    <pagination :page-sizes="[20, 30, 40, 50]"
+                v-show="total>0"
+                :total="total"
+                :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize"
+                @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'checkIndexStatistics',
+    data(){
+      return{
+        deptSelectList:[],
+        classTypeList:[],
+        classifiedList:[],
+        dateRange:[],
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          data1:""
+        },
+        setChildren:"",
+        numData:{
+          subNum1:"2000",
+          subNum2:"2000",
+          subNum3:"2000",
+          subNum4:"2000",
+          subNum5:"2000",
+          subNum6:"2000",
+          subNum7:"2000",
+          subNum8:"2000",
+        },
+        tableList:[{}],
+        total:0,
+        currentDate:'',
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+
+    },
+    methods:{
+      //获取数据列表
+      getList(){
+        // this.queryParamsData = JSON.parse(JSON.stringify(this.queryParams));
+        // this.queryParamsData.type = 'RFID_RECOGNIZER';
+        // listHardware(this.queryParamsData).then(response => {
+        //   this.total = response.total;
+        //   this.tableList = response.rows;
+        // });
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'dateRange',[]);
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          data1:""
+        });
+        this.handleQuery();
+      },
+      /** 当前时间 */
+      getCurrentTime () {
+        const yy = new Date().getFullYear()
+        const mm = new Date().getMonth() + 1
+        const dd = new Date().getDate()
+        const hh = new Date().getHours()
+        const mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() : new Date().getMinutes()
+        const ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() : new Date().getSeconds()
+        return yy + '-' + mm + '-' + dd
+      },
+      /** 导出按钮操作 */
+      exportButton(item) {
+        let self = this;
+        this.currentDate=this.getCurrentTime()
+
+        if(item.command == 1){
+          self.$confirm(`确认导出全部数据?`, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(async () => {
+            self.download('/system/user/teacher/export/', {...self.queryParams}, '教职工信息-'+this.currentDate+'.xlsx')
+          }).catch(() => {})
+        }else if(item.command == 2){
+          if(self.ids.length>0) {
+            self.$confirm(`确认导出选中数据?`, "提示", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(async () => {
+              let ids = self.ids.join(',');
+              let obj = {
+                ids :ids
+              }
+              self.download(`/system/user/teacher/export/`,obj, '教职工信息-'+this.currentDate+'.xlsx')
+            }).catch(() => {})
+          }else {
+            Message({
+              message: "请选择要导出的数据",
+              type: 'error'
+            });
+          }
+        }
+      },
+      /*===记录勾选数据===
+        需要再el-table 添加  :row-key="getRowKeys"
+        需要在selection 添加 :reserve-selection="true"
+      */
+      getRowKeys(row) {
+        return row.id
+      },
+      // 单选
+      select (selection, row) {
+        if (selection.some(el => { return row.id === el.id })) {
+          if (row.children) {
+            this.setChildren(row.children, true)
+          }
+        } else {
+          if (row.children) {
+            this.setChildren(row.children, false)
+          }
+        }
+      },
+      // 全选
+      selectAll (selection) {
+        const isSelect = selection.some(el => {
+          const tableDataIds = this.tableData.map(j => j.id)
+          return tableDataIds.includes(el.id)
+        })
+        const isCancel = !this.tableData.every(el => {
+          const selectIds = selection.map(j => j.id)
+          return selectIds.includes(el.id)
+        })
+        if (isSelect) {
+          selection.map(el => {
+            if (el.children) {
+              this.setChildren(el.children, true)
+            }
+          })
+        }
+        if (isCancel) {
+          this.tableData.map(el => {
+            if (el.children) {
+              this.setChildren(el.children, false)
+            }
+          })
+        }
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .checkIndexStatistics{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    padding:20px;
+    .form-box{
+      .form-dropdown-box{
+        display: flex;
+        margin:0;
+        padding:0 10px;
+        cursor: pointer;
+        height:40px;
+        img:nth-child(1){
+          width:16px;
+          height:16px;
+          margin-top:12px;
+        }
+        p{
+          width:47px;
+          text-align: center;
+          font-size:14px;
+          margin:0;
+          line-height:40px;
+        }
+        img:nth-child(3){
+          width:10px;
+          height:6px;
+          margin-top:17px;
+        }
+      }
+    }
+    .num-data-box{
+      background: rgba(1,131,250,0.2);
+      color:#0183FA;
+      font-size:14px;
+      line-height:40px;
+      padding:0 20px;
+      border-radius:4px;
+      margin-bottom:20px;
+    }
+  }
+</style>

+ 99 - 0
src/views/safetyCheck/dataStatistics/index.vue

@@ -0,0 +1,99 @@
+<template>
+  <div class="app-container dataStatistics">
+    <div class="title-box">
+      <div :class="pageType == 1?'checkTitle':''" @click="checkTitleButton(1)">
+        <p>按实验室</p>
+        <p></p>
+      </div>
+      <div :class="pageType == 2?'checkTitle':''" @click="checkTitleButton(2)">
+        <p>按安全隐患</p>
+        <p></p>
+      </div>
+      <div :class="pageType == 3?'checkTitle':''" @click="checkTitleButton(3)">
+        <p>按检查指标</p>
+        <p></p>
+      </div>
+    </div>
+    <laboratoryStatistics v-if="pageType == 1"></laboratoryStatistics>
+    <safetyHazardStatistics v-if="pageType == 2"></safetyHazardStatistics>
+    <checkIndexStatistics v-if="pageType == 3"></checkIndexStatistics>
+  </div>
+</template>
+
+<script>
+  import laboratoryStatistics from './laboratoryStatistics.vue'
+  import safetyHazardStatistics from './safetyHazardStatistics.vue'
+  import checkIndexStatistics from './checkIndexStatistics.vue'
+  export default {
+    name: 'index',
+    components: {
+      laboratoryStatistics,
+      safetyHazardStatistics,
+      checkIndexStatistics
+    },
+    data(){
+      return{
+        pageType:1,
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+
+    },
+    methods:{
+      checkTitleButton(type){
+        if(this.pageType != type){
+          this.$set(this,'pageType',type);
+        }
+      }
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .dataStatistics{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    *{
+      font-weight: 500;
+    }
+    .title-box{
+      display: flex;
+      height:80px;
+      border-bottom:1px solid #d8d8d8;
+      padding:0 40px;
+      div{
+        height:80px;
+        margin-right:80px;
+        cursor: pointer;
+        p:nth-child(1){
+          width:80px;
+          font-size:16px;
+          text-align: center;
+          color:#333;
+          line-height:40px;
+          height:40px;
+          margin-top:20px;
+        }
+        p:nth-child(2){
+          width:60px;
+          height: 4px;
+          border-radius:4px;
+          margin:0 10px;
+        }
+      }
+      .checkTitle{
+        p:nth-child(1){
+          color:#0045AF;
+        }
+        p:nth-child(2){
+          background-color: #0045AF;
+        }
+      }
+    }
+  }
+</style>

+ 302 - 0
src/views/safetyCheck/dataStatistics/laboratoryStatistics.vue

@@ -0,0 +1,302 @@
+<template>
+  <div class="laboratoryStatistics">
+    <el-form :model="queryParams" class="form-box" ref="queryForm" :inline="true">
+      <el-form-item label="" prop="data1" label-width="50px">
+        <el-select v-model="queryParams.data1" clearable placeholder="全部">
+          <el-option
+            v-for="item in deptSelectList"
+            :key="item.key"
+            :label="item.label"
+            :value="item.key">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="classType">
+        <el-select v-model="queryParams.classType" clearable placeholder="安全分类" style="width: 120px">
+          <el-option
+            v-for="item in classTypeList"
+            :key="item.key"
+            :label="item.label"
+            :value="item.key">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="classified">
+        <el-select v-model="queryParams.classified" clearable placeholder="安全分级" style="width: 120px">
+          <el-option
+            v-for="item in classifiedList"
+            :key="item.key"
+            :label="item.label"
+            :value="item.key">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="searchValue" label-width="80px">
+        <el-input
+          maxLength="30"
+          v-model="queryParams.searchValue"
+          placeholder="实验室/房间号"
+          clearable
+          style="width: 200px"/>
+      </el-form-item>
+      <el-form-item label="" prop="dateRange" label-width="70px">
+        <el-date-picker
+          :clearable="false"
+          v-model="dateRange"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
+        <p class="reset-button-one" @click="resetQuery">重置</p>
+      </el-form-item>
+      <el-form-item style="float: right;">
+        <el-dropdown @command="exportButton">
+          <div class="form-dropdown-box">
+            <img src="@/assets/ZDimages/personnelManagement/icon_jzgxx_sc.png">
+            <p>导出</p>
+            <img src="@/assets/ZDimages/personnelManagement/icon_jzggl_xljt.png">
+          </div>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item style="border-bottom:1px solid #E0E0E0;margin:0 10px;color:#333;" :command="{command:1}">导出全部数据</el-dropdown-item>
+            <el-dropdown-item style="margin:0 10px;color:#333;" :command="{command:2}">导出选中数据</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+      </el-form-item>
+    </el-form>
+    <div class="num-data-box">
+      搜索到实验室总数 {{numData.subNum1}},存在危险源的实验室数 {{numData.subNum2}},危险源总数 {{numData.subNum3}},特种设备安全类 {{numData.subNum4}} ,一级 {{numData.subNum5}},二级 {{numData.subNum6}},三级 {{numData.subNum7}},四级 {{numData.subNum8}}
+    </div>
+    <el-table  border :data="tableList" ref="multipleTable"
+               :row-key="getRowKeys"
+               @select="select" @select-all="selectAll">
+      <el-table-column type="selection" width="50" align="center"/>
+      <el-table-column label="序号" align="center"  type="index" width="60" />
+      <el-table-column label="学院" align="center" prop="deptName" show-overflow-tooltip width="200"/>
+      <el-table-column label="实验室" align="center" prop="deptName" show-overflow-tooltip width="180"/>
+      <el-table-column label="房间号" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+      <el-table-column label="楼栋" align="center" prop="deptName" show-overflow-tooltip width="180"/>
+      <el-table-column label="安全分类" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+      <el-table-column label="安全分级" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+      <el-table-column label="危险源" align="center" prop="deptName" show-overflow-tooltip width="260"/>
+      <el-table-column label="实验室安全责任人" align="center" prop="deptName" show-overflow-tooltip width="185"/>
+      <el-table-column label="实验室负责人" align="center" prop="deptName" show-overflow-tooltip width="180"/>
+      <el-table-column label="隐患总数" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+      <el-table-column label="整改率" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+      <el-table-column label="复核通过率" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+    </el-table>
+    <pagination :page-sizes="[20, 30, 40, 50]"
+                v-show="total>0"
+                :total="total"
+                :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize"
+                @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'laboratoryStatistics',
+    data(){
+      return{
+        deptSelectList:[],
+        classTypeList:[],
+        classifiedList:[],
+        dateRange:[],
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          data1:""
+        },
+        setChildren:"",
+        numData:{
+          subNum1:"2000",
+          subNum2:"2000",
+          subNum3:"2000",
+          subNum4:"2000",
+          subNum5:"2000",
+          subNum6:"2000",
+          subNum7:"2000",
+          subNum8:"2000",
+        },
+        tableList:[{}],
+        total:0,
+        currentDate:'',
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+
+    },
+    methods:{
+      //获取数据列表
+      getList(){
+        // this.queryParamsData = JSON.parse(JSON.stringify(this.queryParams));
+        // this.queryParamsData.type = 'RFID_RECOGNIZER';
+        // listHardware(this.queryParamsData).then(response => {
+        //   this.total = response.total;
+        //   this.tableList = response.rows;
+        // });
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'dateRange',[]);
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          data1:""
+        });
+        this.handleQuery();
+      },
+      /** 当前时间 */
+      getCurrentTime () {
+        const yy = new Date().getFullYear()
+        const mm = new Date().getMonth() + 1
+        const dd = new Date().getDate()
+        const hh = new Date().getHours()
+        const mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() : new Date().getMinutes()
+        const ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() : new Date().getSeconds()
+        return yy + '-' + mm + '-' + dd
+      },
+      /** 导出按钮操作 */
+      exportButton(item) {
+        let self = this;
+        this.currentDate=this.getCurrentTime()
+
+        if(item.command == 1){
+          self.$confirm(`确认导出全部数据?`, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(async () => {
+            self.download('/system/user/teacher/export/', {...self.queryParams}, '教职工信息-'+this.currentDate+'.xlsx')
+          }).catch(() => {})
+        }else if(item.command == 2){
+          if(self.ids.length>0) {
+            self.$confirm(`确认导出选中数据?`, "提示", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(async () => {
+              let ids = self.ids.join(',');
+              let obj = {
+                ids :ids
+              }
+              self.download(`/system/user/teacher/export/`,obj, '教职工信息-'+this.currentDate+'.xlsx')
+            }).catch(() => {})
+          }else {
+            Message({
+              message: "请选择要导出的数据",
+              type: 'error'
+            });
+          }
+        }
+      },
+      /*===记录勾选数据===
+        需要再el-table 添加  :row-key="getRowKeys"
+        需要在selection 添加 :reserve-selection="true"
+      */
+      getRowKeys(row) {
+        return row.id
+      },
+      // 单选
+      select (selection, row) {
+        if (selection.some(el => { return row.id === el.id })) {
+          if (row.children) {
+            this.setChildren(row.children, true)
+          }
+        } else {
+          if (row.children) {
+            this.setChildren(row.children, false)
+          }
+        }
+      },
+      // 全选
+      selectAll (selection) {
+        const isSelect = selection.some(el => {
+          const tableDataIds = this.tableData.map(j => j.id)
+          return tableDataIds.includes(el.id)
+        })
+        const isCancel = !this.tableData.every(el => {
+          const selectIds = selection.map(j => j.id)
+          return selectIds.includes(el.id)
+        })
+        if (isSelect) {
+          selection.map(el => {
+            if (el.children) {
+              this.setChildren(el.children, true)
+            }
+          })
+        }
+        if (isCancel) {
+          this.tableData.map(el => {
+            if (el.children) {
+              this.setChildren(el.children, false)
+            }
+          })
+        }
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .laboratoryStatistics{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    padding:20px;
+    .form-box{
+      .form-dropdown-box{
+        display: flex;
+        margin:0;
+        padding:0 10px;
+        cursor: pointer;
+        height:40px;
+        img:nth-child(1){
+          width:16px;
+          height:16px;
+          margin-top:12px;
+        }
+        p{
+          width:47px;
+          text-align: center;
+          font-size:14px;
+          margin:0;
+          line-height:40px;
+        }
+        img:nth-child(3){
+          width:10px;
+          height:6px;
+          margin-top:17px;
+        }
+      }
+    }
+    .num-data-box{
+      background: rgba(1,131,250,0.2);
+      color:#0183FA;
+      font-size:14px;
+      line-height:40px;
+      padding:0 20px;
+      border-radius:4px;
+      margin-bottom:20px;
+    }
+  }
+</style>

+ 303 - 0
src/views/safetyCheck/dataStatistics/safetyHazardStatistics.vue

@@ -0,0 +1,303 @@
+<template>
+  <div class="safetyHazardStatistics">
+    <el-form :model="queryParams" class="form-box" ref="queryForm" :inline="true">
+      <el-form-item label="" prop="data1" label-width="50px">
+        <el-select v-model="queryParams.data1" clearable placeholder="全部">
+          <el-option
+            v-for="item in deptSelectList"
+            :key="item.key"
+            :label="item.label"
+            :value="item.key">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="classType">
+        <el-select v-model="queryParams.classType" clearable placeholder="全部状态" style="width: 120px">
+          <el-option
+            v-for="item in classTypeList"
+            :key="item.key"
+            :label="item.label"
+            :value="item.key">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="classified">
+        <el-select v-model="queryParams.classified" clearable placeholder="全部隐患等级" style="width: 140px">
+          <el-option
+            v-for="item in classifiedList"
+            :key="item.key"
+            :label="item.label"
+            :value="item.key">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="" prop="searchValue" label-width="80px">
+        <el-input
+          maxLength="30"
+          v-model="queryParams.searchValue"
+          placeholder="计划任务/实验室/房间号"
+          clearable
+          style="width: 200px"/>
+      </el-form-item>
+      <el-form-item label="" prop="dateRange" label-width="70px">
+        <el-date-picker
+          :clearable="false"
+          v-model="dateRange"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
+        <p class="reset-button-one" @click="resetQuery">重置</p>
+      </el-form-item>
+      <el-form-item style="float: right;">
+        <el-dropdown @command="exportButton">
+          <div class="form-dropdown-box">
+            <img src="@/assets/ZDimages/personnelManagement/icon_jzgxx_sc.png">
+            <p>导出</p>
+            <img src="@/assets/ZDimages/personnelManagement/icon_jzggl_xljt.png">
+          </div>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item style="border-bottom:1px solid #E0E0E0;margin:0 10px;color:#333;" :command="{command:1}">导出全部数据</el-dropdown-item>
+            <el-dropdown-item style="margin:0 10px;color:#333;" :command="{command:2}">导出选中数据</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+      </el-form-item>
+    </el-form>
+    <div class="num-data-box">
+      共搜索到隐患总数 {{numData.subNum1}},重大隐患数 {{numData.subNum2}},一般隐患数 {{numData.subNum3}},管理问题数 {{numData.subNum4}} ,待整改总数 {{numData.subNum5}},复核总数 {{numData.subNum6}},复核通过率 {{numData.subNum6}}
+    </div>
+    <el-table  border :data="tableList" ref="multipleTable"
+               :row-key="getRowKeys"
+               @select="select" @select-all="selectAll">
+      <el-table-column type="selection" width="50" align="center"/>
+      <el-table-column label="序号" align="center"  type="index" width="60" />
+      <el-table-column label="计划任务" align="center" prop="deptName" show-overflow-tooltip width="200"/>
+      <el-table-column label="学院" align="center" prop="deptName" show-overflow-tooltip width="200"/>
+      <el-table-column label="实验室" align="center" prop="deptName" show-overflow-tooltip width="180"/>
+      <el-table-column label="房间号" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+      <el-table-column label="楼栋" align="center" prop="deptName" show-overflow-tooltip width="180"/>
+      <el-table-column label="隐患等级" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+      <el-table-column label="不符合项" align="center" prop="deptName" show-overflow-tooltip width="260"/>
+      <el-table-column label="历史出现次数" align="center" prop="deptName" show-overflow-tooltip width="120"/>
+      <el-table-column label="隐患描述" align="center" prop="deptName" show-overflow-tooltip width="180"/>
+      <el-table-column label="检查者" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+      <el-table-column label="检查时间" align="center" prop="deptName" show-overflow-tooltip width="180"/>
+      <el-table-column label="状态" align="center" prop="deptName" show-overflow-tooltip width="100"/>
+    </el-table>
+    <pagination :page-sizes="[20, 30, 40, 50]"
+                v-show="total>0"
+                :total="total"
+                :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize"
+                @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'safetyHazardStatistics',
+    data(){
+      return{
+        deptSelectList:[],
+        classTypeList:[],
+        classifiedList:[],
+        dateRange:[],
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          data1:""
+        },
+        setChildren:"",
+        numData:{
+          subNum1:"2000",
+          subNum2:"2000",
+          subNum3:"2000",
+          subNum4:"2000",
+          subNum5:"2000",
+          subNum6:"2000",
+          subNum7:"2000",
+          subNum8:"2000",
+        },
+        tableList:[{}],
+        total:0,
+        currentDate:'',
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+
+    },
+    methods:{
+      //获取数据列表
+      getList(){
+        // this.queryParamsData = JSON.parse(JSON.stringify(this.queryParams));
+        // this.queryParamsData.type = 'RFID_RECOGNIZER';
+        // listHardware(this.queryParamsData).then(response => {
+        //   this.total = response.total;
+        //   this.tableList = response.rows;
+        // });
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.$set(this.queryParams,'pageNum',1);
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'dateRange',[]);
+        this.$set(this,'queryParams',{
+          pageNum:1,
+          pageSize:20,
+          searchValue:"",
+          data1:""
+        });
+        this.handleQuery();
+      },
+      /** 当前时间 */
+      getCurrentTime () {
+        const yy = new Date().getFullYear()
+        const mm = new Date().getMonth() + 1
+        const dd = new Date().getDate()
+        const hh = new Date().getHours()
+        const mf = new Date().getMinutes() < 10 ? '0' + new Date().getMinutes() : new Date().getMinutes()
+        const ss = new Date().getSeconds() < 10 ? '0' + new Date().getSeconds() : new Date().getSeconds()
+        return yy + '-' + mm + '-' + dd
+      },
+      /** 导出按钮操作 */
+      exportButton(item) {
+        let self = this;
+        this.currentDate=this.getCurrentTime()
+
+        if(item.command == 1){
+          self.$confirm(`确认导出全部数据?`, "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(async () => {
+            self.download('/system/user/teacher/export/', {...self.queryParams}, '教职工信息-'+this.currentDate+'.xlsx')
+          }).catch(() => {})
+        }else if(item.command == 2){
+          if(self.ids.length>0) {
+            self.$confirm(`确认导出选中数据?`, "提示", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(async () => {
+              let ids = self.ids.join(',');
+              let obj = {
+                ids :ids
+              }
+              self.download(`/system/user/teacher/export/`,obj, '教职工信息-'+this.currentDate+'.xlsx')
+            }).catch(() => {})
+          }else {
+            Message({
+              message: "请选择要导出的数据",
+              type: 'error'
+            });
+          }
+        }
+      },
+      /*===记录勾选数据===
+        需要再el-table 添加  :row-key="getRowKeys"
+        需要在selection 添加 :reserve-selection="true"
+      */
+      getRowKeys(row) {
+        return row.id
+      },
+      // 单选
+      select (selection, row) {
+        if (selection.some(el => { return row.id === el.id })) {
+          if (row.children) {
+            this.setChildren(row.children, true)
+          }
+        } else {
+          if (row.children) {
+            this.setChildren(row.children, false)
+          }
+        }
+      },
+      // 全选
+      selectAll (selection) {
+        const isSelect = selection.some(el => {
+          const tableDataIds = this.tableData.map(j => j.id)
+          return tableDataIds.includes(el.id)
+        })
+        const isCancel = !this.tableData.every(el => {
+          const selectIds = selection.map(j => j.id)
+          return selectIds.includes(el.id)
+        })
+        if (isSelect) {
+          selection.map(el => {
+            if (el.children) {
+              this.setChildren(el.children, true)
+            }
+          })
+        }
+        if (isCancel) {
+          this.tableData.map(el => {
+            if (el.children) {
+              this.setChildren(el.children, false)
+            }
+          })
+        }
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .safetyHazardStatistics{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    padding:20px;
+    .form-box{
+      .form-dropdown-box{
+        display: flex;
+        margin:0;
+        padding:0 10px;
+        cursor: pointer;
+        height:40px;
+        img:nth-child(1){
+          width:16px;
+          height:16px;
+          margin-top:12px;
+        }
+        p{
+          width:47px;
+          text-align: center;
+          font-size:14px;
+          margin:0;
+          line-height:40px;
+        }
+        img:nth-child(3){
+          width:10px;
+          height:6px;
+          margin-top:17px;
+        }
+      }
+    }
+    .num-data-box{
+      background: rgba(1,131,250,0.2);
+      color:#0183FA;
+      font-size:14px;
+      line-height:40px;
+      padding:0 20px;
+      border-radius:4px;
+      margin-bottom:20px;
+    }
+
+  }
+</style>

+ 211 - 0
src/views/safetyCheck/worktable/coverageRateEcharts.vue

@@ -0,0 +1,211 @@
+<template>
+  <div class="coverageRateEcharts" id="coverageRateEcharts-box">
+  </div>
+</template>
+
+<script>
+  import echarts from 'echarts'
+  import { yearRate } from '@/api/safetyCheck/index.js'
+  export default {
+    name: 'coverageRateEcharts',
+    data(){
+      return{
+
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.eCharts();
+    },
+    methods:{
+      //eCharts方法
+      eCharts(){
+        yearRate().then(response => {
+          let myChart = this.$echarts.init(document.getElementById('coverageRateEcharts-box'));
+          let getname = ['未检查', '已检查', '检查中']; // 课程名
+          let getbl = [0, 0, 0]; // 比例
+          let getNum = [0, 0, 0]; // 数量
+          for(let i=0;i<response.data.length;i++){
+            if(response.data[i].type == 0){
+              if(response.data[i].rate.indexOf('%') != -1){
+                response.data[i].rate = response.data[i].rate.split('%')[0]
+                getbl[0] = response.data[i].rate
+              }else{
+                getbl[0] = response.data[i].rate
+              }
+              getNum[0] = response.data[i].number
+            }else if(response.data[i].type == 2){
+              if(response.data[i].rate.indexOf('%') != -1){
+                response.data[i].rate = response.data[i].rate.split('%')[0]
+                getbl[1] = response.data[i].rate
+              }else{
+                getbl[1] = response.data[i].rate
+              }
+              getNum[1] = response.data[i].number
+            }else if(response.data[i].type == 1){
+              if(response.data[i].rate.indexOf('%') != -1){
+                response.data[i].rate = response.data[i].rate.split('%')[0]
+                getbl[2] = response.data[i].rate
+              }else{
+                getbl[2] = response.data[i].rate
+              }
+              getNum[2] = response.data[i].number
+            }
+          }
+          let data = [];
+          for (let i = 0; i < getname.length; i++) {
+            data.push({ name: getname[i], value: getbl[i], num: getNum[i] })
+          }
+          let option = {
+            legend: {
+              type: "scroll",
+              orient: 'vertical',
+              height: '80%',
+              right: '0%',
+              top: 'center',
+              //icon: "circle", //设置为圆,删除则为矩形
+              itemWidth: 14,
+              itemHeight: 6,
+              itemGap: 25,
+              data: getname,
+              formatter: function (name) {
+                for (let i = 0; i < getname.length; i++) {
+                  if (name == data[i].name) {
+                    return '{name|' + name + '}'
+                  }
+                }
+              },
+              textStyle: {
+                rich: {
+                  name: {
+                    fontSize: 14,
+                    fontWeight: 400,
+                    width: 100,
+                    height: 20,
+                    padding: [0, 0, 0, 5],
+                    color: 'rgba(0, 0, 0, 0.85)',
+                    fontFamily: 'Source Han Sans CN-Regular',
+                  },
+                  num: {
+                    fontSize: 14,
+                    fontWeight: 500,
+                    height: 20,
+                    width: 50,
+                    color: 'rgba(0, 0, 0, 0.65)',
+                    fontFamily: 'Source Han Sans CN-Regular',
+                  },
+                  value: {
+                    fontSize: 14,
+                    fontWeight: 500,
+                    height: 20,
+                    width: 50,
+                    color: 'rgba(0, 0, 0, 0.65)',
+                    fontFamily: 'Source Han Sans CN-Regular',
+                  }
+                }
+              }
+
+            },
+            series: [{
+              type: 'pie',
+              top:20,
+              bottom:20,
+              left:10,
+              right:10,
+              radius: ['55%', '70%'],
+              center: ["38%", "50%"],
+              // label: {
+              //   formatter: params => {
+              //     let name = params.name;
+              //     if (name == getname[0]) {
+              //       return `{name0|${name}:${params.data.num}\n${params.value}%}`
+              //     } else if (name == getname[1]) {
+              //       return `{name1|${name}:${params.data.num}\n${params.value}%}`
+              //     } else if (name == getname[2]) {
+              //       return `{name2|${name}:${params.data.num}\n${params.value}%}`
+              //     }
+              //   },
+              //   rich: {
+              //     name0: {
+              //       fontSize: 14,
+              //       fontFamily: 'Source Han Sans CN-Regular',
+              //       color: fontColor[0],
+              //       padding: [2, 6, 4, 6],
+              //       borderRadius: 100
+              //     },
+              //     name1: {
+              //       fontSize: 14,
+              //       fontFamily: 'Source Han Sans CN-Regular',
+              //       color: fontColor[1],
+              //       padding: [2, 6, 4, 6],
+              //       borderRadius: 100
+              //     },
+              //     name2: {
+              //       fontSize: 14,
+              //       fontFamily: 'Source Han Sans CN-Regular',
+              //       color: fontColor[2],
+              //       padding: [2, 6, 4, 6],
+              //       borderRadius: 100
+              //     },
+              //   }
+              // },
+              // labelLine: {
+              //   show: false,
+              //   normal: {
+              //     length: 5,
+              //     length2: 50
+              //   }
+              // },
+              label: {
+                normal: {
+                    formatter: params => {
+                      let name = params.name;
+                      if (name == getname[0]) {
+                        return `${name}:${params.data.num}\n${params.value}%`
+                      } else if (name == getname[1]) {
+                        return `${name}:${params.data.num}\n${params.value}%`
+                      } else if (name == getname[2]) {
+                        return `${name}:${params.data.num}\n${params.value}%`
+                      }
+                    },
+                  textStyle: {
+                    fontSize: 12
+                  },
+                  padding: [0, -60, 26, -60],
+                }
+              },
+              labelLine: {
+                normal: {
+                  length: 10,
+                  length2: 60,
+                }
+              },
+              data: data,
+              itemStyle: {
+                shadowBlur: 8,
+                shadowColor: "rgba(255, 255, 255, 0)",
+                borderColor: '#FFF',
+                borderWidth: 2,
+                color: function (colors) {
+                  var colorList = ['#FFA200', '#0183FA', '#FF5D3D'];
+                  return colorList[colors.dataIndex];
+                }
+              },
+            }
+            ]
+          };
+
+          myChart.setOption(option);
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .coverageRateEcharts{
+    height:183px;
+  }
+</style>

+ 274 - 0
src/views/safetyCheck/worktable/hiddenDangerStatisticsEcharts.vue

@@ -0,0 +1,274 @@
+<template>
+  <div class="hiddenDangerStatisticsEcharts">
+    <div class="title-button-box">
+      <p :class="hdLevel==1?'check-p':''" @click="titleButtonClick(1)">一级指标</p>
+      <p :class="hdLevel==2?'check-p':''" @click="titleButtonClick(2)">二级指标</p>
+      <p :class="hdLevel==3?'check-p':''" @click="titleButtonClick(3)">三级指标</p>
+    </div>
+    <div class="hiddenDangerStatisticsEcharts-box" id="hiddenDangerStatisticsEcharts-box">
+
+    </div>
+  </div>
+</template>
+
+<script>
+  import echarts from 'echarts'
+  import { hiddenCountByType, collegCheckHiddenCountByType } from '@/api/safetyCheck/index.js'
+  export default {
+    name: 'hiddenDangerStatisticsEcharts',
+    data(){
+      return{
+        hdLevel:1,
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.schoolEcharts();
+      // this.departmentEcharts();
+    },
+    methods:{
+      titleButtonClick(type){
+        if(this.hdLevel != type){
+          this.$set(this,'hdLevel',type);
+          this.schoolEcharts();
+          // this.departmentEcharts();
+        }
+      },
+      schoolEcharts(){
+        hiddenCountByType({hdLevel:this.hdLevel}).then(response => {
+          let myChart = this.$echarts.init(document.getElementById('hiddenDangerStatisticsEcharts-box'));
+          let data = [];
+          for(let i=0;i<response.rows.length;i++){
+            // substring
+            console.log(response.rows[i].collegeName.length)
+            let obj = {
+              name:response.rows[i].collegeName.length>8?response.rows[i].collegeName.substring(0,8)+'..':response.rows[i].collegeName,
+              nameText:response.rows[i].collegeName,
+              value:response.rows[i].sumTotal,
+            }
+            data.push(obj);
+          }
+          let option = {
+            legend: {
+              show:false,
+            },
+            tooltip: {
+              confine: true,
+              trigger: 'item',
+              // formatter: '{b} : {c}'
+
+              formatter: params => {
+                console.log('params',params)
+                return `${params.data.nameText} 隐患:${params.data.value} 占比:${params.percent}%`
+              },
+            },
+            series: [
+              {
+                avoidLabelOverlap: false,
+                type: 'pie',
+                left:20,
+                right:20,
+                roseType: 'area', // 玫瑰图
+                center: ['50%', '50%'],
+                radius: ['0%', '40%'],
+                label: {
+                  normal: {
+                    formatter: '{b}\n隐患{c}\t占比{d}%',
+                    textStyle: {
+                      fontSize: 12
+                    },
+                    padding: [0, -110, 26, -110],
+                  }
+                },
+                labelLine: {
+                  normal: {
+                    length: 30,
+                    length2: 110,
+                  }
+                },
+                data: data,
+                itemStyle: {
+                  normal: {
+                    color: function (colors) {
+                      var colorList = ['#009DFF', '#FFA200', '#FF2A00', '#A069FF', '#41BE26', '#2758E0', '#39dbed', '#ff5e86','#a52a2a','#4682b4','#9400d3'];
+                      return colorList[colors.dataIndex];
+                    }
+                  },
+                }
+              }
+            ]
+          };
+          myChart.setOption(option);
+        });
+      },
+      departmentEcharts(){
+        collegCheckHiddenCountByType({hdLevel:this.hdLevel}).then(response => {
+          let myChart = this.$echarts.init(document.getElementById('hiddenDangerStatisticsEcharts-box'));
+          let data = {
+            name:[],
+            nameText:[],
+            text:[],
+            num: [],
+          }
+          for(let i=0;i<response.rows.length;i++){
+            data.name.push(response.rows[i].subjectName.length>8?response.rows[i].subjectName.substring(0,8)+'..':response.rows[i].subjectName)
+            data.nameText.push(response.rows[i].subjectName)
+            data.text.push(response.rows[i].hazardCheckName)
+            data.num.push(response.rows[i].sumTotal)
+          }
+          let option = {
+            grid: {
+              left: '30%',
+              top: '8%',
+              right: '15%',
+              bottom: '15%',
+            },
+            tooltip: {
+              trigger: 'axis',
+              formatter: params => {
+                console.log('params',params)
+                console.log('dataIndex',params[0].dataIndex)
+                return data.nameText[params[0].dataIndex] +' 隐患:'+ data.num[params[0].dataIndex]
+                // return `${params.data.nameText} 隐患:${params.data.value} 占比:${params.percent}%`
+              },
+              backgroundColor: 'rgba(0, 0, 0, 0.6)', // 提示框背景色
+              borderColor: '#05050F', // 提示框边框色
+              textStyle: {
+                color: '#fff', // 提示框文本颜色
+              },
+              axisPointer: {
+                type: 'none',
+              },
+            },
+            legend: {
+              show:false,
+            },
+            xAxis: {
+              type: 'value',
+              position: "bottom",
+              splitLine: {
+                show: false,
+              },
+              axisTick: {
+                show: false,
+              },
+              axisLabel: {
+                textStyle: {
+                  color: '#333',
+                  fontSize: 12,
+                },
+              },
+              axisLine: {
+                show: true,
+                lineStyle: {
+                  color: 'rgba(216,216,216,1)',
+                },
+              },
+            },
+            yAxis: {
+              type: 'category',
+              splitLine: {
+                show: false,
+              },
+              axisTick: {
+                show: false,
+              },
+              data: data.name,
+              axisLabel: {
+                textStyle: {
+                  color: '#333',
+                  fontSize: 12,
+                },
+              },
+              axisLine: {
+                lineStyle: {
+                  color: 'rgba(216,216,216,1)',
+                },
+              },
+            },
+            series: [
+              {
+                name: '隐患',
+                type: 'bar',
+                data: data.num,
+                itemStyle: {
+                  emphasis: {
+                    barBorderRadius: [0, 20, 20, 0],
+                  },
+                  normal: {
+                    barBorderRadius: [0, 20, 20, 0],
+                    color: new echarts.graphic.LinearGradient(
+                      0,
+                      0,
+                      1,
+                      0,
+                      [
+                        {
+                          offset: 0,
+                          color: 'rgba(246,111,0,0.1)', // 0% 处的颜色
+                        },
+                        {
+                          offset: 1,
+                          color: 'rgba(246,111,0,1)', // 100% 处的颜色
+                        },
+                      ],
+                      false
+                    ),
+                  },
+                },
+                label: {
+                  normal: {
+                    show: true,
+                    formatter: params => {
+                      return '隐患'+params.data
+                    },
+                    position: 'insideRight',
+                    offset: [40, 1.5],
+                    textStyle: {
+                      color: '#333',
+                      fontSize: 12,
+                    },
+                  },
+                },
+              },
+            ],
+            barCategoryGap: '60%',
+          };
+          myChart.setOption(option);
+        })
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .hiddenDangerStatisticsEcharts{
+    height:483px;
+    .title-button-box{
+      display: flex;
+      border:1px solid #0183fa;
+      width:300px;
+      margin:32px 71px 0;
+      p{
+        width:100px;
+        line-height:30px;
+        text-align: center;
+        color:#0183fa;
+        cursor: pointer;
+      }
+      p:nth-child(2){
+        border-left:1px solid #0183fa;
+        border-right:1px solid #0183fa;
+      }
+      .check-p{
+        background-color: #0183fa;
+        color:#fff;
+      }
+    }
+    .hiddenDangerStatisticsEcharts-box{
+      height:420px;
+    }
+  }
+</style>

+ 484 - 0
src/views/safetyCheck/worktable/index.vue

@@ -0,0 +1,484 @@
+<template>
+  <div class="app-container worktable">
+    <div class="top-max-big-box">
+      <!--校级数据卡-->
+      <div class="school-data-box">
+        <div class="left-min-box">
+          <img src="@/assets/ZDimages/safetyCheck/icon_gzt_xyxc.png">
+          <div>
+            <p>校院巡查</p>
+            <el-tooltip class="item" effect="dark" :content="'等:'+schoolWorkData.subCount" placement="top">
+              <p>{{schoolWorkData.subCount}}</p>
+            </el-tooltip>
+          </div>
+        </div>
+        <div class="right-min-box">
+          <div>
+            <img src="@/assets/ZDimages/safetyCheck/icon_gzt_aqyh.png">
+            <el-tooltip class="item" effect="dark" :content="'等:'+schoolWorkData.yhCount" placement="top">
+              <p>{{schoolWorkData.yhCount}}</p>
+            </el-tooltip>
+          </div>
+          <div>
+            <img src="@/assets/ZDimages/safetyCheck/icon_gzt_yjcsys.png">
+            <el-tooltip class="item" effect="dark" :content="'等:'+schoolWorkData.xcCount" placement="top">
+              <p>{{schoolWorkData.xcCount}}</p>
+            </el-tooltip>
+          </div>
+        </div>
+      </div>
+      <!--院级数据卡-->
+      <div class="department-data-box">
+        <div class="left-min-box">
+          <img src="@/assets/ZDimages/safetyCheck/icon_gzt_syszc.png">
+          <div>
+            <p>实验室自查</p>
+            <el-tooltip class="item" effect="dark" :content="'等:'+schoolWorkSubData.subCount" placement="top">
+              <p>{{schoolWorkSubData.subCount}}</p>
+            </el-tooltip>
+          </div>
+        </div>
+        <div class="right-min-box">
+          <div>
+            <img src="@/assets/ZDimages/safetyCheck/icon_gzt_aqyh.png">
+            <el-tooltip class="item" effect="dark" :content="'等:'+schoolWorkSubData.zcCount" placement="top">
+              <p>{{schoolWorkSubData.zcCount}}</p>
+            </el-tooltip>
+          </div>
+          <div>
+            <img src="@/assets/ZDimages/safetyCheck/icon_gzt_yjcsys.png">
+            <el-tooltip class="item" effect="dark" :content="'等:'+schoolWorkSubData.yhCount" placement="top">
+              <p>{{schoolWorkSubData.yhCount}}</p>
+            </el-tooltip>
+          </div>
+        </div>
+      </div>
+      <!--页面跳转按钮盒子-->
+      <div class="page-button-box">
+        <worktableButtonBox></worktableButtonBox>
+      </div>
+    </div>
+    <div class="bottom-max-big-box">
+      <!--待办事项-->
+      <div class="bottom-left-max-big-box">
+        <div class="min-title-box">
+          <p></p>
+          <p>待办事项</p>
+        </div>
+        <toDoListBox></toDoListBox>
+      </div>
+      <div class="bottom-center-max-big-box">
+        <!--存在隐患-->
+        <div class="hidden-danger-box">
+          <div class="min-title-box">
+            <p></p>
+            <p>存在隐患</p>
+          </div>
+          <div class="hidden-danger-big-box">
+            <div class="hidden-danger-min-box">
+              <img src="@/assets/ZDimages/safetyCheck/icon_gzt_gjyh_2.png">
+              <el-tooltip class="item" effect="dark" :content="'全校所有未整改隐患总数:'+hiddenCountData.hiddenCount" placement="top">
+                <p>共计{{hiddenCountData.hiddenCount}}项隐患</p>
+              </el-tooltip>
+            </div>
+            <p class="center-null-p"></p>
+            <div class="hidden-danger-min-box">
+              <img src="@/assets/ZDimages/safetyCheck/icon_gzt_sjsys_2.png">
+              <el-tooltip class="item" effect="dark" :content="'涉及实验室总数:'+hiddenCountData.subjectCount" placement="top">
+                <p>涉及{{hiddenCountData.subjectCount}}个实验室</p>
+              </el-tooltip>
+            </div>
+          </div>
+        </div>
+        <!--检查率覆盖-->
+        <div class="coverage-rate-box">
+          <div class="min-title-box">
+            <p></p>
+            <p>当年检查覆盖率</p>
+          </div>
+          <coverageRateEcharts></coverageRateEcharts>
+        </div>
+        <!--检查统计-->
+        <div class="statistics-box">
+          <div class="min-title-box">
+            <p></p>
+            <p>检查统计</p>
+          </div>
+          <inspectionStatisticsEcharts></inspectionStatisticsEcharts>
+        </div>
+      </div>
+      <div class="bottom-right-max-big-box">
+        <!--已处理隐患-->
+        <div class="dealt-with-danger">
+          <div class="min-title-box">
+            <p></p>
+            <p>已处理隐患</p>
+          </div>
+          <div class="dealt-with-danger-big-box" style="margin-top:7px;">
+            <div class="dealt-with-danger-min-box">
+              <img src="@/assets/ZDimages/safetyCheck/icon_gzt_dy.png">
+              <el-tooltip class="item" effect="dark" :content="'当周已处理隐患数:'+hiddenDangerRectifyData.weekCount" placement="top">
+                <p>当周 <span>{{hiddenDangerRectifyData.weekCount}}</span> 项</p>
+              </el-tooltip>
+            </div>
+            <div class="dealt-with-danger-min-box">
+              <img src="@/assets/ZDimages/safetyCheck/icon_gzt_sy.png">
+              <el-tooltip class="item" effect="dark" :content="'上月已处理隐患数:'+hiddenDangerRectifyData.lastMonthCount" placement="top">
+                <p>上月 <span>{{hiddenDangerRectifyData.lastMonthCount}}</span> 项</p>
+              </el-tooltip>
+            </div>
+          </div>
+          <div class="dealt-with-danger-big-box">
+            <div class="dealt-with-danger-min-box">
+              <img src="@/assets/ZDimages/safetyCheck/icon_gzt_by.png">
+              <el-tooltip class="item" effect="dark" :content="'当月已处理隐患数:'+hiddenDangerRectifyData.monthCount" placement="top">
+                <p>当月 <span>{{hiddenDangerRectifyData.monthCount}}</span> 项</p>
+              </el-tooltip>
+            </div>
+            <div class="dealt-with-danger-min-box">
+              <img src="@/assets/ZDimages/safetyCheck/icon_gzt_dn.png">
+              <el-tooltip class="item" effect="dark" :content="'当年已处理隐患数:'+hiddenDangerRectifyData.yearCount" placement="top">
+                <p>当年 <span>{{hiddenDangerRectifyData.yearCount}}</span> 项</p>
+              </el-tooltip>
+            </div>
+          </div>
+        </div>
+        <!--隐患统计-->
+        <div class="hidden-danger-statistics">
+          <div class="min-title-box">
+            <p></p>
+            <p>检查指标隐患统计</p>
+          </div>
+          <hiddenDangerStatisticsEcharts></hiddenDangerStatisticsEcharts>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { schoolWorkCheck, schoolWorkSubCheck, hiddenCount, hiddenDangerRectify } from '@/api/safetyCheck/index.js'
+  import toDoListBox from './toDoListBox.vue'
+  import worktableButtonBox from './worktableButtonBox.vue'
+  import coverageRateEcharts from './coverageRateEcharts.vue'
+  import inspectionStatisticsEcharts from './inspectionStatisticsEcharts.vue'
+  import hiddenDangerStatisticsEcharts from './hiddenDangerStatisticsEcharts.vue'
+  export default {
+    name: 'index',
+    components: {
+      toDoListBox,
+      worktableButtonBox,
+      coverageRateEcharts,
+      inspectionStatisticsEcharts,
+      hiddenDangerStatisticsEcharts,
+    },
+    data(){
+      return{
+        //用户身份 校级/院级
+        userType:"",
+        schoolWorkData:{
+          subCount:0,
+          yhCount:0,
+          xcCount:0
+        },
+        schoolWorkSubData:{
+          subCount:0,
+          zcCount:0,
+          yhCount:0
+        },
+        hiddenCountData:{
+          hiddenCount:0,
+          subjectCount:0
+        },
+        hiddenDangerRectifyData:{
+          yearCount:0,   //当年隐患总数
+          weekCount:0,   //本周隐患总数
+          lastMonthCount:0,   //上月隐患总数
+          monthCount:0,   //本月隐患总数
+        },
+      }
+    },
+    created(){
+      this.schoolWorkCheck();
+      this.schoolWorkSubCheck();
+      this.hiddenCount();
+      this.hiddenDangerRectify();
+    },
+    mounted(){
+
+    },
+    methods:{
+      //校级巡查数据
+      schoolWorkCheck(){
+        schoolWorkCheck().then(response => {
+          this.$set(this,'schoolWorkData',response.data);
+        });
+      },
+      //实验室巡查数据
+      schoolWorkSubCheck(){
+        schoolWorkSubCheck().then(response => {
+          this.$set(this,'schoolWorkSubData',response.data);
+        });
+      },
+      //存在隐患
+      hiddenCount(){
+        hiddenCount().then(response => {
+          this.$set(this,'hiddenCountData',response.data);
+        });
+      },
+      //已处理隐患
+      hiddenDangerRectify(){
+        hiddenDangerRectify().then(response => {
+          this.$set(this,'hiddenDangerRectifyData',response.data);
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .worktable{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    padding:10px!important;
+    font-weight: 400;
+    .top-max-big-box{
+      height:140px;
+      display: flex;
+      .school-data-box{
+        width:330px;
+        height:120px;
+        margin:10px;
+        background: #009DFF;
+        border-radius:10px;
+        display: flex;
+        .left-min-box{
+          display: flex;
+          img{
+            width:50px;
+            height:50px;
+            margin:35px 14px 35px 20px;
+          }
+          div{
+            width:118px;
+            color:#fff;
+            p:nth-child(1){
+              font-size:16px;
+              line-height:40px;
+              margin-top:20px;
+              font-weight: 400;
+            }
+            p:nth-child(2){
+              font-size:24px;
+              font-weight: 700;
+              line-height:40px;
+              cursor: default;
+            }
+          }
+        }
+        .right-min-box{
+          width:58px;
+          display: flex;
+          div{
+            width:94px;
+            img{
+              width:20px;
+              height:20px;
+              margin:38px 19px 8px;
+            }
+            p{
+              color:#fff;
+              text-align: center;
+              line-height:20px;
+              font-size:16px;
+              font-weight: 400;
+              cursor: default;
+            }
+          }
+        }
+      }
+      .department-data-box{
+        width:330px;
+        height:120px;
+        margin:10px;
+        background: #2CCFDA;
+        border-radius:10px;
+        display: flex;
+        .left-min-box{
+          display: flex;
+          img{
+            width:50px;
+            height:50px;
+            margin:35px 14px 35px 20px;
+          }
+          div{
+            width:118px;
+            color:#fff;
+            p:nth-child(1){
+              font-size:16px;
+              line-height:40px;
+              margin-top:20px;
+              font-weight: 400;
+            }
+            p:nth-child(2){
+              font-size:24px;
+              font-weight: 700;
+              line-height:40px;
+              cursor: default;
+            }
+          }
+        }
+        .right-min-box{
+          width:58px;
+          display: flex;
+          div{
+            width:94px;
+            img{
+              width:20px;
+              height:20px;
+              margin:38px 19px 8px;
+            }
+            p{
+              color:#fff;
+              text-align: center;
+              line-height:20px;
+              font-size:16px;
+              font-weight: 400;
+              cursor: default;
+            }
+          }
+        }
+      }
+      .page-button-box{
+        overflow: hidden;
+        flex:1;
+        height:120px;
+        margin:10px;
+        border-radius:10px;
+        box-shadow: 0 4px 10px 0 rgba(0,0,0,0.1);
+      }
+    }
+    .bottom-max-big-box{
+      flex:1;
+      display:flex;
+      .bottom-left-max-big-box{
+        overflow: hidden;
+        width:500px;
+        height:722px;
+        margin:10px;
+        box-shadow: 0 4px 10px 0 rgba(0,0,0,0.1);
+        border-radius: 10px 10px 10px 10px;
+      }
+      .bottom-center-max-big-box{
+        overflow: hidden;
+        .hidden-danger-box{
+          overflow: hidden;
+          width:556px;
+          height:174px;
+          margin:10px 10px 20px;
+          box-shadow: 0 4px 10px 0 rgba(0,0,0,0.1);
+          border-radius: 10px 10px 10px 10px;
+          .hidden-danger-big-box{
+            display: flex;
+            .center-null-p{
+              width:1px;
+              height:30px;
+              background-color: #d8d8d8;
+              margin-top:48px;
+            }
+            .hidden-danger-min-box{
+              display: flex;
+              flex:1;
+              img{
+                width:60px;
+                height:60px;
+                margin:33px 21px 0 41px;
+              }
+              p{
+                margin-top:58px;
+                font-size:16px;
+                line-height:16px;
+                cursor: default;
+              }
+            }
+          }
+        }
+        .coverage-rate-box{
+          overflow: hidden;
+          width:556px;
+          height:228px;
+          margin:0 10px 20px;
+          box-shadow: 0 4px 10px 0 rgba(0,0,0,0.1);
+          border-radius: 10px 10px 10px 10px;
+        }
+        .statistics-box{
+          overflow: hidden;
+          width:556px;
+          height:280px;
+          margin:0 10px 10px;
+          box-shadow: 0 4px 10px 0 rgba(0,0,0,0.1);
+          border-radius: 10px 10px 10px 10px;
+        }
+      }
+      .bottom-right-max-big-box{
+        .dealt-with-danger{
+          overflow: hidden;
+          width:440px;
+          height:174px;
+          margin:10px 10px 20px;
+          box-shadow: 0 4px 10px 0 rgba(0,0,0,0.1);
+          border-radius: 10px 10px 10px 10px;
+          .dealt-with-danger-big-box{
+            display: flex;
+            padding:17px 50px;
+            .dealt-with-danger-min-box:nth-child(1){
+              width:200px;
+            }
+            .dealt-with-danger-min-box{
+              display: flex;
+              img{
+                width:20px;
+                height:20px;
+                margin-right:13px;
+              }
+              p{
+                line-height:20px;
+                font-size:16px;
+                color:#333;
+                cursor: default;
+                span{
+                  color:#009DFF;
+                }
+              }
+            }
+          }
+        }
+        .hidden-danger-statistics{
+          width:440px;
+          height:528px;
+          margin:0 10px 10px;
+          box-shadow: 0 4px 10px 0 rgba(0,0,0,0.1);
+          border-radius: 10px 10px 10px 10px;
+        }
+      }
+      .min-title-box{
+        display: flex;
+        height:45px;
+        p:nth-child(1){
+          background-color: #0183FA;
+          height:18px;
+          width:4px;
+          margin:24px 10px 0 20px;
+        }
+        p:nth-child(2){
+          font-size:16px;
+          color:#333;
+          line-height:24px;
+          margin-top:21px;
+        }
+      }
+    }
+  }
+</style>

+ 260 - 0
src/views/safetyCheck/worktable/inspectionStatisticsEcharts.vue

@@ -0,0 +1,260 @@
+<template>
+  <div class="inspectionStatisticsEcharts" id="inspectionStatisticsEcharts-box"></div>
+</template>
+
+<script>
+  import { checkStatistics } from '@/api/safetyCheck/index.js'
+  export default {
+    name: 'inspectionStatisticsEcharts',
+    data(){
+      return{
+
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.eCharts();
+    },
+    methods:{
+      //eCharts方法
+      eCharts(){
+        checkStatistics().then(response => {
+          let data = {
+            name : [],
+            standards : [],
+            notStandards : [],
+          }
+          for(let i=0;i<response.rows.length;i++){
+            data.name.push(response.rows[i].yearMonth)
+            if(response.rows[i].notStandards.indexOf('%') != -1){
+              response.rows[i].notStandards = response.rows[i].notStandards.split('%')[0]
+              data.notStandards.push(response.rows[i].notStandards)
+            }else{
+              data.notStandards.push(response.rows[i].notStandards)
+            }
+            if(response.rows[i].standards.indexOf('%') != -1){
+              response.rows[i].standards = response.rows[i].standards.split('%')[0]
+              data.standards.push(response.rows[i].standards)
+            }else{
+              data.standards.push(response.rows[i].standards)
+            }
+          }
+          let myChart = this.$echarts.init(document.getElementById('inspectionStatisticsEcharts-box'));
+          let option = {
+            //你的代码
+            tooltip: {
+              show:true,
+              trigger: 'axis',
+              formatter: function(params) {
+                let html = '<div>';
+                html += '<p>'+params[0].name+'</p>'
+                for(let i=0;i<params.length;i++){
+                  html += '<p>'+params[i].marker+'&nbsp'+params[i].seriesName+'&nbsp:&nbsp'+parseInt(params[i].data)+'%<p>'
+                }
+                return html;
+              },
+              axisPointer: {
+                lineStyle: {
+                  color: 'rgb(126,199,255)',
+                },
+              },
+            },
+            legend: {
+              show: true,
+              icon: 'circle',
+              itemWidth: 30,
+              itemHeight: 10,
+              right:20,
+              textStyle: {
+                color: 'rgba(0, 0, 0, 1)',
+                fontSize: 14,
+                padding: [0, 8, 0, 8]
+              }
+            },
+            grid: {
+              top: '20%',
+              left: '10%',
+              right: '7%',
+              bottom: '15%',
+            },
+            xAxis: [
+              {
+                type: 'category',
+                boundaryGap: false,
+                axisLine: {
+                  show: true,
+                  lineStyle: {
+                    color: 'rgb(41,188,245)',
+                  },
+                },
+                axisLabel: {
+                  textStyle: {
+                    color: 'rgba(112, 151, 184, 1)',
+                    fontSize: 12,
+                  },
+                },
+                splitLine: {
+                  show: false,
+                },
+                axisTick: {
+                  show: false,
+                },
+                data: data.name,
+              },
+            ],
+            yAxis: [
+              {
+                name: "",
+                nameTextStyle: {
+                  color: "#fff",
+                  fontSize: 12,
+                  padding: [0, 60, 0, 0]
+                },
+                // minInterval: 1,
+                type: 'value',
+                splitLine: {
+                  show: false,
+                },
+                axisLine: {
+                  show: false,
+                },
+                axisLabel: {
+                  show: true,
+                  textStyle: {
+                    color: 'rgba(112, 151, 184, 1)',
+                    fontSize: 14
+                  }
+                },
+                axisTick: {
+                  show: false,
+                },
+              },
+            ],
+            series: [
+              {
+                name: '符合',
+                type: 'line',
+                symbol: 'circle',
+                smooth: true,
+                lineStyle: {
+                  normal: {
+                    width: 1,
+                    color: '#00AEFF', // 线条颜色
+                  },
+                },
+                showSymbol: false,
+                itemStyle: {
+                  normal: {
+                    color: '#00AEFF',//拐点颜色
+                    label: {
+                      show: true, //开启显示
+                      color: '#fff',
+                      position: 'top', //在上方显示
+                      formatter: function (res) {
+                        console.log('res',res)
+                        if (res.value) {
+                          return res.value
+                        } else {
+                          return 0
+                        }
+                      },
+                    },
+                  },
+                },
+                areaStyle: {
+                  color: {
+                    type: 'linear',
+                    x: 0,
+                    y: 0,
+                    x2: 0,
+                    y2: 1,
+                    colorStops: [  // 渐变颜色
+                      {
+                        offset: 0,
+                        color: 'rgba(0,174,255,1)',
+                      },
+                      {
+                        offset: 0.5,
+                        color: 'rgba(0,174,255,0.38)',
+                      },
+                      {
+                        offset: 1,
+                        color: 'rgba(0,174,255,0)',
+                      },
+                    ],
+                    global: false,
+                  },
+                },
+                data: data.standards,
+              },
+              {
+                name: '不符合',
+                type: 'line',
+                symbol: 'circle', // 默认是空心圆(中间是白色的),改成实心圆
+                smooth: true,
+                lineStyle: {
+                  normal: {
+                    width: 1,
+                    color: '#F66F00', // 线条颜色
+                  },
+                },
+                showSymbol: false,
+                itemStyle: {
+                  normal: {
+                    color: '#F66F00',//拐点颜色
+                    label: {
+                      show: true, //开启显示
+                      color: '#fff',
+                      position: 'top', //在上方显示
+                      formatter: function (res) {
+                        if (res.value) {
+                          return res.value
+                        } else {
+                          return 0
+                        }
+                      },
+                    },
+                  },
+                },
+                areaStyle: {
+                  color: {
+                    type: 'linear',
+                    x: 0,
+                    y: 0,
+                    x2: 0,
+                    y2: 1,
+                    colorStops: [  // 渐变颜色
+                      {
+                        offset: 0,
+                        color: 'rgba(246,111,0,1)',
+                      },
+                      {
+                        offset: 0.5,
+                        color: 'rgba(246,111,0,0.38)',
+                      },
+                      {
+                        offset: 1,
+                        color: 'rgba(246,111,0,0)',
+                      },
+                    ],
+                    global: false,
+                  },
+                },
+                data: data.notStandards,
+              }
+            ]
+          };
+          myChart.setOption(option);
+        })
+      },
+    }
+  }
+</script>
+
+<style scoped>
+  .inspectionStatisticsEcharts{
+    height:236px;
+  }
+</style>

+ 290 - 0
src/views/safetyCheck/worktable/toDoListBox.vue

@@ -0,0 +1,290 @@
+<template>
+  <div class="toDoListBox">
+    <div class="toDoListBox-form-box">
+      <div class="form-button-box">
+        <p :class="queryParams.manageStatus == 0?'check-p':''" @click="titleClickButton(0)">待检查</p>
+        <p :class="queryParams.manageStatus == 1?'check-p':''" @click="titleClickButton(1)">检查中</p>
+        <p :class="queryParams.manageStatus == 2?'check-p':''" @click="titleClickButton(2)">待复核</p>
+      </div>
+      <el-form :model="queryParams" class="form-box" ref="queryForm" :inline="true">
+        <el-form-item label="" prop="searchValue" label-width="80px">
+          <el-input
+            maxLength="30"
+            v-model="queryParams.searchValue"
+            placeholder="搜索实验室/房间号"
+            style="width: 186px">
+            <p slot="append" class="el-icon-search" @click="handleQuery"></p>
+          </el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="toDoListBox-list-box scrollbar-box">
+      <div  class="for-list-box"
+            v-for="(item,index) in tableList" :key="index">
+        <div class="for-name-box">
+          <p class="name-p">{{item.subjectName}}-{{item.roomNumber}}</p>
+          <p class="type-p" v-if="item.isOverdue == 1">已逾期</p>
+          <p class="null-p"></p>
+          <img src="@/assets/ZDimages/safetyCheck/icon_gzt_bg.png">
+        </div>
+        <div class="for-title-box">
+          <p>{{item.title}}</p>
+        </div>
+        <div class="for-button-box">
+          <p>{{item.manageStatus==0?'待检查':(item.manageStatus==1?'检查中':(item.manageStatus==2?'待复核':''))}}</p>
+          <p>{{item.checkType==1?'校院巡查':(item.checkType==2?'实验室自查':'')}}</p>
+          <p>{{item.collegeName}}</p>
+        </div>
+        <div class="for-time-box">
+          <p>计划周期:{{item.cycleStartTime}}至{{item.cycleEndTime}}</p>
+          <p v-if="queryParams.manageStatus == 0" :class="item.checkIsStatus?'':'noButton'">{{item.checkIsStatus?'开始检查':'计划未开始'}}</p>
+          <p v-if="queryParams.manageStatus == 1">编辑</p>
+          <p v-if="queryParams.manageStatus == 2">复核</p>
+        </div>
+        <img class="position-img" v-if="item.checkRange == 1" src="@/assets/ZDimages/safetyCheck/icon_xyxc_qx.png">
+        <img class="position-img" v-if="item.checkRange == 2" src="@/assets/ZDimages/safetyCheck/icon_xyxc_sys.png">
+        <img class="position-img" v-if="item.checkRange == 3" src="@/assets/ZDimages/safetyCheck/icon_xyxc_xy.png">
+      </div>
+      <p class="null-p" v-if="!tableList[0]">暂无数据</p>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { todoList, tobeReviewed } from '@/api/safetyCheck/index.js'
+  export default {
+    name: 'toDoListBox',
+    data(){
+      return{
+        queryParams:{
+          manageStatus:0,
+          searchValue:"",
+        },
+        tableList:[
+          {
+            subjectName:"实验室名称-房间号实验室名称-房间号实验室名称-房间号实验室名称-房间号",
+            title:"计划标题计划标题计划标题",
+            collegeName:"环境与测绘学院",
+            cycleStartTime:"2023-03-01",
+            cycleEndTime:"2023-03-31",
+            checkType:"1",
+            isOverdue:"1",
+            manageStatus:"1",
+          },
+        ],
+        total:0,
+      }
+    },
+    created(){
+      this.getList();
+    },
+    mounted(){
+
+    },
+    methods:{
+      titleClickButton(type){
+        if(this.queryParams.manageStatus != type){
+          this.$set(this.queryParams,'manageStatus',type);
+          this.getList();
+        }
+      },
+      //获取数据列表
+      getList(){
+        console.log(this.queryParams.manageStatus)
+        if(this.queryParams.manageStatus == 2){
+          tobeReviewed(this.queryParams.searchValue).then(response => {
+            this.$set(this,'tableList',response.rows);
+          });
+        }else{
+          todoList(this.queryParams).then(response => {
+            this.$set(this,'tableList',response.rows);
+          });
+        }
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.getList();
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .toDoListBox{
+    height:676px;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    .toDoListBox-form-box{
+      display: flex;
+      padding:30px 20px 0;
+      .form-button-box{
+        display: flex;
+        p{
+          cursor: pointer;
+          width:80px;
+          height:30px;
+          font-size:14px;
+          color:#333;
+          border:1px solid #E0E0E0;
+          border-radius:4px;
+          line-height:28px;
+          text-align: center;
+          margin-right:10px;
+        }
+        .check-p{
+          color:#fff;
+          border-color: #0183FA;
+          background-color: #0183FA;
+        }
+      }
+      ::v-deep .el-input__inner{
+        height:30px;
+        border: 1px solid #DCDFE6;
+        border-right:none;
+        padding-right:0;
+      }
+      ::v-deep .el-input-group__append{
+        padding:0 11px;
+        background-color: #fff;
+        cursor: pointer;
+      }
+    }
+    .toDoListBox-list-box{
+      padding:0 20px 20px;
+      flex:1;
+      .for-list-box:nth-child(1){
+        margin:0;
+      }
+      .for-list-box{
+        height:190px;
+        border-radius:20px;
+        border:1px solid rgba(0,0,0,0.1);
+        margin-top:20px;
+        position: relative;
+        .for-name-box{
+          overflow: hidden;
+          padding:0 20px 0 58px;
+          display: flex;
+          margin:20px 0 12px;
+          .name-p{
+            height:24px;
+            line-height:24px;
+            font-size:16px;
+            color:#333;
+            max-width:280px;
+            display:block;
+            overflow: hidden;
+            text-overflow:ellipsis;
+            white-space:nowrap;
+          }
+          .type-p{
+            border-radius:4px;
+            text-align: center;
+            width:60px;
+            margin:2px 0 2px 10px;
+            height:20px;
+            line-height:20px;
+            color:#FF3131;
+            font-size:14px;
+            background-color: rgba(255,49,49,0.2);
+          }
+          .null-p{
+            flex:1;
+          }
+          img{
+            width:15px;
+            height:16px;
+            margin:4px 0 0 10px;
+            cursor: pointer;
+          }
+        }
+        .for-title-box{
+          overflow: hidden;
+          padding:0 20px 0 58px;
+          display: flex;
+          margin-bottom:18px;
+          p{
+            height:20px;
+            line-height:20px;
+            font-size:14px;
+            color:#333;
+            max-width:375px;
+            display:block;
+            overflow: hidden;
+            text-overflow:ellipsis;
+            white-space:nowrap;
+          }
+        }
+        .for-button-box{
+          display: flex;
+          margin:0 20px 20px 58px;
+          font-size:14px;
+          p:nth-child(1){
+            width:80px;
+            line-height:30px;
+            background: rgba(1,131,250,0.1);
+            margin-right:13px;
+            border-radius:80px;
+            text-align: center;
+            color:#0183FA;
+          }
+          p:nth-child(2){
+            padding:0 12px;
+            line-height:30px;
+            border:1px solid #E0E0E0;
+            border-radius:80px;
+            text-align: center;
+            color:#666666;
+          }
+          p:nth-child(3){
+            width:165px;
+            line-height:30px;
+            color:#333;
+            margin-left:22px;
+            display:block;
+            overflow: hidden;
+            text-overflow:ellipsis;
+            white-space:nowrap;
+          }
+
+        }
+        .for-time-box{
+          display: flex;
+          height:42px;
+          border-top:1px dashed #D8D8D8;
+          line-height: 42px;
+          p:nth-child(1){
+            margin-left:20px;
+            font-size:14px;
+            flex:1;
+            overflow: hidden;
+          }
+          p:nth-child(2){
+            padding:0 20px;
+            text-align: center;
+            cursor: pointer;
+            color:#0183FA;
+            font-size:14px;
+          }
+          .noButton{
+            color:#999!important;
+            cursor: inherit!important;
+          }
+        }
+        .position-img{
+          width:80px;
+          height:80px;
+          position: absolute;
+          left:0;
+          top:0;
+        }
+      }
+      .null-p{
+        text-align: center;
+        color:#999;
+        line-height:100px;
+      }
+    }
+  }
+</style>

+ 139 - 0
src/views/safetyCheck/worktable/worktableButtonBox.vue

@@ -0,0 +1,139 @@
+<template>
+  <div class="worktableButtonBox">
+    <div class="for-button-box" @click="goPage(item)"
+         v-for="(item,index) in buttonList" :key="index">
+      <img :src="item.url">
+      <p class="for-name">{{item.name}}</p>
+      <p class="position-p" v-if="index!=0"></p>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'worktableButtonBox',
+    data(){
+      return{
+        routeList:[],
+        buttonList:[
+          {
+            name:"开展检查",
+            key:"startInspection",
+            url:require('@/assets/ZDimages/safetyCheck/icon_gzt_kzjc.png'),
+            path:"/safetyCheck/startInspection",
+            type:false,
+          },
+          {
+            name:"巡查管理",
+            key:"inspectionManagement",
+            url:require('@/assets/ZDimages/safetyCheck/icon_gzt_xcgl.png'),
+            path:"/safetyCheck/schoolInspection/inspectionManagement",
+            type:false,
+          },
+          {
+            name:"自查管理",
+            key:"selfInspectionManagement",
+            url:require('@/assets/ZDimages/safetyCheck/icon_gzt_zcgl.png'),
+            path:"/safetyCheck/laboratorySelfTest/selfInspectionManagement",
+            type:false,
+          },
+          {
+            name:"安全隐患",
+            key:"safetyHazard",
+            url:require('@/assets/ZDimages/safetyCheck/icon_gzt_aqyht.png'),
+            path:"/safetyCheck/safetyHazard",
+            type:false,
+          },
+          {
+            name:"随手拍",
+            key:"snapshotManagement",
+            url:require('@/assets/ZDimages/safetyCheck/icon_gzt_ssp.png'),
+            path:"/safetyCheck/snapshotManagement",
+            type:false,
+          },
+          {
+            name:"整改报告",
+            key:"rectificationReport",
+            url:require('@/assets/ZDimages/safetyCheck/icon_gzt_zgbg.png'),
+            path:"/safetyCheck/rectificationReport",
+            type:false,
+          },
+          {
+            name:"数据统计",
+            key:"dataStatistics",
+            url:require('@/assets/ZDimages/safetyCheck/icon_gzt_sjtj.png'),
+            path:"/safetyCheck/dataStatistics",
+            type:false,
+          },
+        ],
+      }
+    },
+    created(){
+    },
+    mounted(){
+      this.setButtonList();
+    },
+    methods:{
+      setButtonList(){
+        let self = this;
+        let localRoute = JSON.parse(localStorage.getItem("routeData"))
+        for(let i=0;i<localRoute.length;i++){
+          if(localRoute[i].path == '/safetyCheck'){
+            for(let x=0;x<self.buttonList.length;x++){
+              if(localRoute[i].children){
+                for(let o=0;o<localRoute[i].children.length;o++){
+                  if(self.buttonList[x].key == localRoute[i].children[o].path){
+                    self.buttonList[x].type = true;
+                  }else if(localRoute[i].children[o].children) {
+                    for(let z=0;z<localRoute[i].children[o].children.length;z++){
+                      if(self.buttonList[x].key == localRoute[i].children[o].children[z].path){
+                        self.buttonList[x].type = true;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      goPage(item){
+        if(!item.type){
+          this.$router.push({ path: item.path });
+        }else{
+          this.msgError('没有相关权限,请联系管理员')
+        }
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .worktableButtonBox{
+    height:120px;
+    display: flex;
+    .for-button-box{
+      cursor: pointer;
+      width:118px;
+      position: relative;
+      img{
+        width:44px;
+        height:44px;
+        margin:24px 37px 13px;
+      }
+      .for-name{
+        font-size:16px;
+        line-height:20px;
+        text-align: center;
+      }
+      .position-p{
+        width:1px;
+        height: 30px;
+        position: absolute;
+        left:0;
+        top:45px;
+        background-color: #d8d8d8;
+      }
+    }
+  }
+</style>