dedsudiyu vor 1 Jahr
Ursprung
Commit
49da2bdde4
28 geänderte Dateien mit 4339 neuen und 213 gelöschten Zeilen
  1. 41 0
      src/assets/styles/commonality.scss
  2. 1 1
      src/components/lookImgDialog/lookImgDialog.vue
  3. 362 0
      src/views/chemicalManage/basicManagement/basicConfig/index.vue
  4. 345 0
      src/views/chemicalManage/basicManagement/chemicalsCabinetManage/addPage.vue
  5. 25 41
      src/views/chemicalManage/basicManagement/chemicalsCabinetManage/index.vue
  6. 83 0
      src/views/chemicalManage/basicManagement/chemicalsCabinetManage/listPage.vue
  7. 83 0
      src/views/chemicalManage/basicManagement/chemicalsCabinetManage/recordsPage.vue
  8. 138 0
      src/views/chemicalManage/basicManagement/msdsSpecification/addPage.vue
  9. 330 0
      src/views/chemicalManage/basicManagement/msdsSpecification/index.vue
  10. 2 2
      src/views/chemicalManage/components/addChemicals.vue
  11. 242 0
      src/views/chemicalManage/earlyWarningEvent/index.vue
  12. 386 0
      src/views/chemicalManage/earlyWarningEvent/infoPage.vue
  13. 347 29
      src/views/integratedManagement/messageNotice/warningNotice/forewarningConfig.vue
  14. 9 41
      src/views/integratedManagement/messageNotice/warningNotice/index.vue
  15. 386 0
      src/views/integratedManagement/messageNotice/warningNotice/infoPage.vue
  16. 251 0
      src/views/integratedManagement/personnelManage/researchGroupManage/addPage.vue
  17. 251 0
      src/views/integratedManagement/personnelManage/researchGroupManage/index.vue
  18. 178 0
      src/views/integratedManagement/personnelManage/researchGroupManage/listInfoPage.vue
  19. 207 0
      src/views/integratedManagement/personnelManage/researchGroupManage/listPage.vue
  20. 326 0
      src/views/integratedManagement/personnelManage/researchGroupManage/userDialog.vue
  21. 2 2
      src/views/iotDevice/intelligenceIot/iotHardware/addPage.vue
  22. 67 9
      src/views/serviceCenter/logManagement/systemLogs/index.vue
  23. 1 1
      src/views/serviceCenter/timingTask/index.vue
  24. 2 0
      src/views/systemManagement/publicConfig/basicsConfig.vue
  25. 112 74
      src/views/systemManagement/publicConfig/chemicalsConfig.vue
  26. 158 12
      src/views/systemManagement/publicConfig/exploitConfig.vue
  27. 2 1
      src/views/systemManagement/publicConfig/integrationConfig.vue
  28. 2 0
      src/views/systemManagement/publicConfig/programConfig.vue

+ 41 - 0
src/assets/styles/commonality.scss

@@ -1043,6 +1043,47 @@
 .breadcrumb-leave-active {
   position: absolute;
 }
+/************* 页面switch样式 **************/
+.page-switch{
+  .el-switch{
+    margin-top:2px;
+  }
+  .el-switch__label {
+    position: absolute;
+    display: none;
+    color: #fff !important;
+  }
+  .el-switch__label--right {
+    z-index: 1;
+  }
+  .el-switch__label--right span{
+    margin-left: 14px;
+  }
+  .el-switch__label--left {
+    z-index: 1;
+  }
+  .el-switch__label--left span{
+    margin-left: 29px;
+  }
+  .el-switch__label.is-active {
+    display: block;
+  }
+  .el-switch .el-switch__core,
+  .el-switch .el-switch__label {
+    width: 70px !important;
+    margin: 0;
+    height: 30px;
+    line-height: 30px;
+    border-radius:15px;
+  }
+  .el-switch__core:after{
+    top: 6px;
+    left: 6px;
+  }
+  .el-switch.is-checked .el-switch__core::after{
+    margin-left:-21px;
+  }
+}
 /************* el-input-number 操作按钮样式修复 **************/
 .el-input-number--medium .el-input-number__increase, .el-input-number--medium .el-input-number__decrease{
   height:38px;

+ 1 - 1
src/components/lookImgDialog/lookImgDialog.vue

@@ -1,7 +1,7 @@
 <!--照片浏览DIALOG-->
 <!--
         <lookImgDialog ref="lookImgDialog"></lookImgDialog>
-  import lookImgDialog from '/@/components/lookImgDialog/lookImgDialog.vue'
+  import lookImgDialog from '@/components/lookImgDialog/lookImgDialog.vue'
         components: {
           lookImgDialog
         },

+ 362 - 0
src/views/chemicalManage/basicManagement/basicConfig/index.vue

@@ -0,0 +1,362 @@
+<!-- 基础配置 -->
+<template>
+  <div class="app-container basicConfig">
+    <div class="title-box">
+      <p>基础配置</p>
+    </div>
+    <div class="page-max-big-box scrollbar-box">
+      <el-form :model="configForm" ref="configForm"
+               :inline="true" :rules="configRules" label-width="140px">
+        <div class="page-top-box">
+          <div class="page-min-left-box">
+            <div>
+              <el-form-item label="化学品申购:" prop="data1" class="page-switch">
+                <el-switch
+                  :active-value="true"
+                  :inactive-value="false"
+                  active-color="#0183FA"
+                  inactive-color="#999"
+                  v-model="configForm.data1"
+                  active-text="启用"
+                  inactive-text="停用"
+                ></el-switch>
+              </el-form-item>
+            </div>
+            <div>
+              <el-form-item label="终端登录:" prop="data2">
+                <el-checkbox-group v-model="configForm.data2">
+                  <el-checkbox :label="1">人脸</el-checkbox>
+                  <el-checkbox :label="2">刷卡</el-checkbox>
+                  <el-checkbox :label="3">扫码</el-checkbox>
+                  <el-checkbox :label="4">人脸+刷卡</el-checkbox>
+                </el-checkbox-group>
+              </el-form-item>
+            </div>
+            <div>
+              <el-form-item label="双人验证方式:" prop="data3">
+                <el-checkbox-group v-model="configForm.data3">
+                  <el-checkbox :label="1">人脸</el-checkbox>
+                  <el-checkbox :label="2">刷卡</el-checkbox>
+                  <el-checkbox :label="3">扫码</el-checkbox>
+                </el-checkbox-group>
+              </el-form-item>
+            </div>
+          </div>
+          <div class="page-min-right-box">
+            <div>
+              <el-form-item label="超时入库:" prop="data4" class="border-right-radius-form-item">
+                <el-input-number v-model="configForm.data4" style="width:80px;"
+                                 :controls="false" :min="1" :max="168">
+                </el-input-number>
+              </el-form-item>
+              <p class="time-p">小时</p>
+              <p class="text-p">待入库化学品操作入库时间规定</p>
+            </div>
+            <div>
+              <el-form-item label="称重容差百分比:" prop="data5" class="border-right-radius-form-item">
+                <el-input-number v-model="configForm.data5" style="width:80px;"
+                                 :controls="false" :min="1" :max="1000">
+                </el-input-number>
+              </el-form-item>
+              <p class="time-p">%</p>
+              <p class="text-p">业务操作称重时,化学品当前净含量的容差占比</p>
+            </div>
+            <div>
+              <el-form-item label="超时未归还:" prop="data6" class="border-right-radius-form-item">
+                <el-input-number v-model="configForm.data6" style="width:80px;"
+                                 :controls="false" :min="1" :max="168">
+                </el-input-number>
+              </el-form-item>
+              <p class="time-p">小时</p>
+              <p class="text-p">化学品领用后,使用最大时长</p>
+            </div>
+            <div>
+              <el-form-item label="超时操作:" prop="data7" class="border-right-radius-form-item">
+                <el-input-number v-model="configForm.data7" style="width:80px;"
+                                 :controls="false" :min="1" :max="240">
+                </el-input-number>
+              </el-form-item>
+              <p class="time-p">分钟</p>
+              <p class="text-p">终端控制开锁后,未完成后续业务操作时间限制</p>
+            </div>
+          </div>
+        </div>
+        <div class="page-bottom-box">
+          <p class="min-title">管控配置</p>
+          <div class="page-bottom-table-box">
+            <p :class="checkType==1?'check-button':''" @click="checkButton(1)">管控类</p>
+            <p :class="checkType==2?'check-button':''" @click="checkButton(2)">非管控类</p>
+          </div>
+          <div>
+            <el-form-item label="双人认证" prop="data8" class="page-switch" label-width="70px">
+              <el-switch
+                :active-value="true"
+                :inactive-value="false"
+                active-color="#0183FA"
+                inactive-color="#999"
+                v-model="configForm.data8"
+                active-text="启用"
+                inactive-text="停用"
+              ></el-switch>
+            </el-form-item>
+            <el-form-item label="二维码打印" prop="data9" class="page-switch">
+              <el-switch
+                :active-value="true"
+                :inactive-value="false"
+                active-color="#0183FA"
+                inactive-color="#999"
+                v-model="configForm.data9"
+                active-text="启用"
+                inactive-text="停用"
+              ></el-switch>
+            </el-form-item>
+            <el-form-item label="领用称重" prop="data10" class="page-switch">
+              <el-switch
+                :active-value="true"
+                :inactive-value="false"
+                active-color="#0183FA"
+                inactive-color="#999"
+                v-model="configForm.data10"
+                active-text="启用"
+                inactive-text="停用"
+              ></el-switch>
+            </el-form-item>
+            <el-form-item label="手动录入重量" prop="data11" class="page-switch">
+              <el-switch
+                :active-value="true"
+                :inactive-value="false"
+                active-color="#0183FA"
+                inactive-color="#999"
+                v-model="configForm.data11"
+                active-text="启用"
+                inactive-text="停用"
+              ></el-switch>
+            </el-form-item>
+            <el-form-item label="" prop="data12" style="margin:2px 0 0 20px;">
+              <el-checkbox-group v-model="configForm.data12">
+                <el-checkbox :label="1">仅量程外</el-checkbox>
+              </el-checkbox-group>
+            </el-form-item>
+          </div>
+          <div style="margin-top:5px;">
+            <el-form-item label="实验室存放规定:" prop="data13">
+              <div class="border-radius-form-item">
+                <p class="text-p">液体总量</p>
+                <el-input-number v-model="configForm.data13" style="width:80px;"
+                                 :controls="false" :min="1" :max="240">
+                </el-input-number>
+                <p class="time-p">L</p>
+              </div>
+            </el-form-item>
+            <el-form-item label="" prop="data14" style="margin-left:50px;">
+              <div class="border-radius-form-item">
+                <p class="text-p">固体总量</p>
+                <el-input-number v-model="configForm.data14" style="width:80px;"
+                                 :controls="false" :min="1" :max="240">
+                </el-input-number>
+                <p class="time-p">KG</p>
+              </div>
+            </el-form-item>
+          </div>
+        </div>
+      </el-form>
+    </div>
+    <div class="button-bottom-box">
+      <p class="null-p"></p>
+      <p class="page-submit-common-style-button submit-p" @click="submitButton">保存</p>
+      <p class="null-p"></p>
+    </div>
+  </div>
+</template>
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  //import addPage from "./addPage.vue";
+  export default {
+    name: 'index',
+    //components: {
+    //  addPage
+    //},
+    data () {
+      return {
+        checkType:1,
+        configForm:{
+          data1:null,
+          data2:[],
+          data3:[],
+          data4:null,
+          data5:null,
+          data6:null,
+          data7:null,
+          data8:null,
+          data9:null,
+          data10:null,
+          data11:null,
+          data12:[],
+          data13:null,
+          data14:null,
+        },
+        configRules:{
+          data1: [
+            { required: true, message: "", trigger: "blur" },
+            { required: true, message: "", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data2: [
+            { required: true, message: "", trigger: "blur" },
+            { required: true, message: "", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+        },
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      //this.getList();
+    },
+    methods: {
+      //切换
+      checkButton(type){
+        if(type != this.checkType){
+          this.$set(this,'checkType',type);
+        }
+      },
+      //提交
+      submitButton(){
+
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .basicConfig{
+    display: flex;
+    flex-direction: column;
+    flex:1;
+    .title-box{
+      height:80px;
+      border-bottom:1px solid #dedede;
+      p{
+        color:#0045AF;
+        font-size:18px;
+        margin-left:20px;
+        line-height:80px;
+      }
+    }
+    .page-max-big-box{
+      flex:1;
+      .page-top-box{
+        display: flex;
+        padding:34px 50px;
+        border-bottom:20px solid #F5F5F5;
+        .page-min-left-box{
+          width:750px;
+        }
+        .page-min-right-box{
+          flex:1;
+          border-left:1px dashed #E0E0E0;
+          div{
+            display: flex;
+            .border-right-radius-form-item{
+              margin-right:0;
+            }
+            ::v-deep input{
+              border-bottom-right-radius:0;
+              border-top-right-radius:0;
+            }
+            .time-p{
+              font-size:14px;
+              color:#333;
+              width:60px;
+              height:40px;
+              line-height:40px;
+              background-color: #E0E0E0;
+              text-align: center;
+              border-top-right-radius:4px;
+              border-bottom-right-radius:4px;
+            }
+            .text-p{
+              color:#999999;
+              font-size:16px;
+              line-height:40px;
+              margin-left:20px;
+            }
+          }
+        }
+      }
+      .page-bottom-box{
+        padding:0 80px;
+        .min-title{
+          margin:28px 0;
+        }
+        .page-bottom-table-box{
+          display: flex;
+          margin-bottom:30px;
+          p{
+            cursor:pointer;
+            width:100px;
+            height:40px;
+            line-height:38px;
+            text-align: center;
+            border:1px solid #E0E0E0;
+            color:#333;
+          }
+          p:nth-child(1){
+            border-top-left-radius:6px;
+            border-bottom-left-radius:6px;
+            border-right:none;
+          }
+          p:nth-child(2){
+            border-top-right-radius:6px;
+            border-bottom-right-radius:6px;
+            border-left:none;
+          }
+          .check-button{
+            border:1px solid #0183FA;
+            background-color: #0183FA;
+            color:#fff;
+          }
+        }
+        .border-radius-form-item{
+          display: flex;
+          .text-p{
+            color:#333;
+            width:100px;
+            text-align: center;
+            font-size:14px;
+            border:1px solid #E0E0E0;
+            border-right:none;
+            border-top-left-radius:4px;
+            border-bottom-left-radius:4px;
+          }
+          ::v-deep input{
+            border-radius:0;
+          }
+          .time-p{
+            border-top-right-radius:4px;
+            border-bottom-right-radius:4px;
+            font-size:14px;
+            color:#333;
+            width:60px;
+            height:40px;
+            line-height:40px;
+            background-color: #E0E0E0;
+            text-align: center;
+          }
+        }
+      }
+    }
+    .button-bottom-box{
+      width:100%;
+      display: flex;
+      padding-bottom:20px;
+      .null-p{
+        flex:1;
+      }
+      .submit-p{
+        width:100px;
+      }
+    }
+  }
+</style>

+ 345 - 0
src/views/chemicalManage/basicManagement/chemicalsCabinetManage/addPage.vue

@@ -0,0 +1,345 @@
+<template>
+  <div class="page-container chemicalsCabinetManage-addPage">
+    <div class="page-top-title-box">
+      <p class="page-top-title-name-p">{{newData.id?'编辑':'新增'}}</p>
+      <p class="page-top-title-out-p" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <el-form class="add-form-box" :model="newData" ref="form" :rules="rules" label-width="140px">
+        <div class="form-max-box">
+          <el-form-item label="名称:" prop="data1">
+            <el-input v-model="newData.data1" placeholder="请输入名称" maxLength="20" style="width:500px;"></el-input>
+          </el-form-item>
+          <el-form-item label="学院:" prop="data2">
+            <el-select v-model="newData.data2" placeholder="请选择学院" style="width: 500px">
+              <el-option
+                v-for="item in deptOptions"
+                :key="item.deptId"
+                :label="item.deptName"
+                :value="item.deptId"
+              />
+            </el-select>
+          </el-form-item>
+        </div>
+        <div class="form-max-box">
+          <el-form-item label="实验室:" prop="data3">
+            <el-select v-model="newData.data3" placeholder="请选择实验室" style="width: 500px">
+              <el-option
+                v-for="item in subOptions"
+                :key="item.deptId"
+                :label="item.deptName"
+                :value="item.deptId"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="摄像头:" prop="data4">
+            <el-select v-model="newData.data4" placeholder="请选择摄像头" style="width: 500px">
+              <el-option
+                v-for="item in cameraOptions"
+                :key="item.deptId"
+                :label="item.deptName"
+                :value="item.deptId"
+              />
+            </el-select>
+          </el-form-item>
+        </div>
+        <div class="form-max-box">
+          <el-form-item label="采集器:" prop="data5">
+            <el-select v-model="newData.data5" placeholder="请选择采集器" style="width: 500px">
+              <el-option
+                v-for="item in harvesterOptions"
+                :key="item.deptId"
+                :label="item.deptName"
+                :value="item.deptId"
+              />
+            </el-select>
+          </el-form-item>
+        </div>
+        <div class="form-max-box">
+          <el-form-item label="采集器:" prop="data6">
+            <div class="form-add-box">
+              <p class="add-time-button-p" @click="addItemButton">+ 新增柜门</p>
+              <p>请按照从上到下的顺序进行添加</p>
+            </div>
+          </el-form-item>
+        </div>
+        <div class="form-big-box">
+          <div class="form-for-max-box" v-for="(item,index) in newData.data6" :key="index">
+            <p class="el-icon-circle-close del-position-p"></p>
+            <div class="item-box">
+              <el-form-item label="柜门名称:" label-width="120px"
+                            :prop="'data6.'+ index +'.itemData1'" :rules="rules.itemData1">
+                <el-input v-model="item.itemData1" placeholder="请输入柜门名称"
+                          clearable maxLength="20" style="width:280px;"></el-input>
+              </el-form-item>
+            </div>
+            <!--<div class="item-name-box">-->
+              <!--<el-form-item label="柜门名称:" label-width="120px"-->
+                            <!--:prop="'data6.'+ index +'.itemData1'" :rules="rules.itemData1">-->
+                <!--<el-input v-model="item.itemData1" placeholder="请输入柜门名称"-->
+                          <!--clearable maxLength="20" style="width:200px;"></el-input>-->
+              <!--</el-form-item>-->
+              <!--<p class="del-item-p">删除柜门</p>-->
+            <!--</div>-->
+            <div class="item-name-box">
+              <el-form-item label="层数:" label-width="120px"
+                            :prop="'data6.'+ index +'.itemData2'" :rules="rules.itemData2">
+                <el-input-number v-model="item.itemData2" style="width:200px;"
+                                 :controls="false" :min="1" :max="168">
+                </el-input-number>
+              </el-form-item>
+              <p class="tips-p">层</p>
+            </div>
+            <div class="item-box">
+              <el-form-item label="管理员:" label-width="120px"
+                            :prop="'data6.'+ index +'.itemData3'" :rules="rules.itemData3">
+                <el-select v-model="item.itemData3" placeholder="请选择实验室" style="width: 460px">
+                  <el-option
+                    v-for="item in subOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+            </div>
+            <div class="item-box">
+              <el-form-item label="开门方式:" label-width="120px"
+                            :prop="'data6.'+ index +'.itemData4'" :rules="rules.itemData4">
+                <el-select v-model="item.itemData4" placeholder="请选择实验室" style="width: 460px">
+                  <el-option
+                    v-for="item in subOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+            </div>
+            <div class="item-box">
+              <el-form-item label="开门方式:" label-width="120px"
+                            :prop="'data6.'+ index +'.itemData5'" :rules="rules.itemData5">
+                <el-select v-model="item.itemData5" multiple placeholder="请选择" multiple-limit='2' style="width: 460px">
+                  <el-option
+                    v-for="item in lockOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                    {{item.label}}-{{item.num}}
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </div>
+          </div>
+        </div>
+      </el-form>
+    </div>
+    <div class="page-bottom-button-box" v-if="!showType">
+      <p class="page-bottom-button-null-p"></p>
+      <p class="page-bottom-button-submit-p" @click="submitForm">提交</p>
+      <p class="page-bottom-button-null-p"></p>
+    </div>
+  </div>
+</template>
+
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  export default {
+    name: 'addPage',
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        showType:false,
+        deptOptions:[],
+        subOptions:[],
+        cameraOptions:[],
+        harvesterOptions:[],
+        openOptions:[
+          {label:'无锁',value:'1'},
+          {label:'智能锁',value:'2'},
+        ],
+        lockOptions:[
+          {label:'智能锁1',value:'1',num:'00001'},
+          {label:'智能锁2',value:'2',num:'00002'},
+          {label:'智能锁3',value:'3',num:'00003'},
+        ],
+        newData:{
+          data1:'',
+          data2:'',
+          data3:'',
+          data4:'',
+          data5:'',
+          data6:[
+            {
+              itemData1:'',
+              itemData2:'',
+              itemData3:'',
+              itemData4:'',
+            }
+          ],
+        },
+        rules:{
+          data1: [
+            { required: true, message: "请输入姓名", trigger: "blur" },
+            { required: true, message: "请输入姓名", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data2: [
+            { required: true, message: "请输入名称", trigger: "blur" },
+            { required: true, message: "请输入名称", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data3: [
+            { required: true, message: "请选择学院", trigger: "blur" },
+            { required: true, message: "请选择学院", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data4: [
+            { required: true, message: "请选择实验室", trigger: "blur" },
+            { required: true, message: "请选择实验室", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data5: [
+            { required: true, message: "请选择摄像头", trigger: "blur" },
+            { required: true, message: "请选择摄像头", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data6: [
+            { required: true, message: "请添加柜门", trigger: "blur" },
+            { required: true, message: "请添加柜门", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          itemData1: [
+            { required: true, message: "请输入柜门名称", trigger: "blur" },
+            { required: true, message: "请输入柜门名称", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          itemData2: [
+            { required: true, message: "请输入层数", trigger: "blur" },
+            { required: true, message: "请输入层数", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          itemData3: [
+            { required: true, message: "请选择管理员", trigger: "blur" },
+            { required: true, message: "请选择管理员", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          itemData4: [
+            { required: true, message: "请选择开门方式", trigger: "blur" },
+            { required: true, message: "请选择开门方式", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+        }
+      }
+    },
+    created(){
+      this.initialize();
+    },
+    mounted(){
+
+    },
+    methods:{
+      //初始化
+      initialize(){
+
+      },
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(5);
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+
+          }
+        })
+      },
+      //添加柜门
+      addItemButton(){
+        if(this.newData.data6[5]){
+          this.msgError('最多添加6个柜门')
+        }else{
+          this.newData.data6.push({
+            itemData1:'',
+            itemData2:'',
+          })
+        }
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .chemicalsCabinetManage-addPage{
+    .content-box{
+      flex:1;
+      display: flex;
+      padding:30px;
+      .form-max-box{
+        display: flex;
+        .form-add-box{
+          display: flex;
+          .add-time-button-p{
+            width:100px;
+            height:40px;
+            line-height:40px;
+            text-align: center;
+            cursor: pointer;
+            background-color: #0183FA;
+            border-radius:4px;
+            color:#fff;
+            margin-right: 35px;
+          }
+          p:nth-child(2){
+            font-size:14px;
+            color:#999999;
+          }
+        }
+      }
+      .form-big-box{
+        .form-for-max-box{
+          width:600px;
+          margin-left:140px;
+          border:1px solid #E0E0E0;
+          border-radius:4px;
+          padding-top:20px;
+          position: relative;
+          .item-name-box{
+            display: flex;
+            ::v-deep input{
+              border-top-right-radius: 0;
+              border-bottom-right-radius: 0;
+            }
+            .del-item-p{
+              width:80px;
+              line-height:40px;
+              height:40px;
+              text-align: center;
+              background-color: #0045AF;
+              color:#fff;
+              border-top-right-radius: 4px;
+              border-bottom-right-radius: 4px;
+            }
+            .tips-p{
+              width:80px;
+              line-height:40px;
+              height:40px;
+              text-align: center;
+              background-color: #E0E0E0;
+              color:#333;
+              border-top-right-radius: 4px;
+              border-bottom-right-radius: 4px;
+            }
+          }
+          .item-box{
+
+          }
+          .del-position-p{
+            z-index:10;
+            position: absolute;
+            top:10px;
+            right: 10px;
+            font-size:24px;
+            color:#FF6666;
+            cursor: pointer;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 25 - 41
src/views/chemicalManage/basicManagement/chemicalsCabinetManage/index.vue

@@ -35,7 +35,7 @@
           <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
           <p class="page-add-common-style-button"
              style="float: right;"
-             @click="tableButton(1)"
+             @click="tableButton(2)"
              v-hasPermiRouter="['demo:demo:add']"
           >新增</p>
         </el-form>
@@ -56,11 +56,11 @@
               <div class="table-button-box">
                 <p class="table-button-null"></p>
                 <p class="table-button-p"
-                   @click="tableButton(2,scope.row)"
+                   @click="tableButton(3,scope.row)"
                    v-hasPermiRouter="['demo:demo:detail']"
                 >化学品</p>
                 <p class="table-button-p"
-                   @click="tableButton(3,scope.row)"
+                   @click="tableButton(4,scope.row)"
                    v-hasPermiRouter="['demo:demo:edit']"
                 >开门记录</p>
                 <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)"
@@ -87,26 +87,33 @@
       </div>
     </div>
     <qr-code-dialog v-if="qrCodeDialogType" :qrCodeDialogData="qrCodeDialogData"></qr-code-dialog>
-    <!--<add-page :propsData="propsData" v-if="pageType === 2"></add-page>-->
+    <add-page :propsData="propsData" v-if="pageType === 2"></add-page>
+    <list-page :propsData="propsData" v-if="pageType === 3"></list-page>
+    <records-page :propsData="propsData" v-if="pageType === 4"></records-page>
   </div>
 </template>
 <script>
   //import { getDicts } from "@/api/commonality/noPermission";
   //import { systemUserSelect } from "@/api/commonality/permission";
   //import { getInfo } from "@/api/basicsModules/index";
-  //import addPage from "./addPage.vue";
+  import addPage from "./addPage.vue";
+  import listPage from "./listPage.vue";
+  import recordsPage from "./recordsPage.vue";
   import qrCodeDialog from "@/components/qrCodeDialog/index.vue"
   import { getDeptDropList,systemBuildingGetTreeList,} from "@/api/commonality/permission";
   export default {
     name: 'index',
     components: {
-      qrCodeDialog
+      addPage,
+      listPage,
+      recordsPage,
+      qrCodeDialog,
     },
     data () {
       return {
         tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
         //页面状态
-        pageType:1,
+        pageType:2,
         //页面遮罩
         loading:false,
         //学院
@@ -124,25 +131,6 @@
         //列表数据
         dataList:[
           {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
-          {name:"1"},
         ],
         //数据数量
         total:0,
@@ -190,23 +178,18 @@
       //操作按钮
       tableButton(type,row){
         let self = this;
-        if(type == 1){
+        if(type == 2){
           //新增
-          this.$set(this,'pageType',2);
-          this.$set(this,'propsData',{});
-        }else if(type == 2){
-          //详情
-          this.$set(this,'pageType',2);
-          let obj = JSON.parse(JSON.stringify(row))
-          obj.showType = true;
-          this.$set(this,'propsData',obj);
+          this.$set(this,'pageType',type);
         }else if(type == 3){
-          //编辑
-          this.$set(this,'pageType',2);
-          let obj = JSON.parse(JSON.stringify(row))
-          obj.showType = false;
-          this.$set(this,'propsData',obj);
+          //化学品
+          this.$set(this,'propsData',row);
+          this.$set(this,'pageType',type);
         }else if(type == 4){
+          //开门记录
+          this.$set(this,'propsData',row);
+          this.$set(this,'pageType',type);
+        }else if(type == 5){
           //返回并刷新
           this.$set(this,'pageType',1);
           this.getList();
@@ -220,7 +203,8 @@
           this.qrCodeDialogButton(1,'asd','名称');
         }else if(val == '2'){
           //编辑
-
+          this.$set(this,'propsData',row);
+          this.$set(this,'pageType',type);
         }else if(val == '3'){
           //删除
           this.$confirm('是否确认删除?', "警告", {

+ 83 - 0
src/views/chemicalManage/basicManagement/chemicalsCabinetManage/listPage.vue

@@ -0,0 +1,83 @@
+<template>
+  <div class="page-container chemicalsCabinetManage-listPage">
+    <div class="page-top-title-box">
+      <p class="page-top-title-name-p">{{showType?'详情':(newData.id?'编辑':'新增')}}</p>
+      <p class="page-top-title-out-p" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <el-form class="add-form-box" :model="newData" ref="form" :rules="showType?noRules:rules" label-width="120px">
+        <el-form-item label="名称:" prop="name">
+          <el-input :disabled="showType" v-model="newData.name" placeholder="请输入名称" maxLength="20" style="width:500px;"></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="page-bottom-button-box" v-if="!showType">
+      <p class="page-bottom-button-null-p"></p>
+      <p class="page-bottom-button-submit-p" @click="submitForm">提交</p>
+      <p class="page-bottom-button-null-p"></p>
+    </div>
+  </div>
+</template>
+
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  export default {
+    name: 'listPage',
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        showType:false,
+        newData:{},
+      }
+    },
+    created(){
+      this.initialize();
+    },
+    mounted(){
+
+    },
+    methods:{
+      //初始化
+      initialize(){
+        this.$set(this,'showType',this.propsData.showType);
+        if(this.propsData.id){
+          let obj = {
+            id:this.propsData.id,
+            name:this.propsData.name,
+          };
+          this.$set(this,'newData',obj);
+        }else{
+          this.$set(this,'newData',{
+            name:"",
+          });
+        }
+      },
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(5);
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+
+          }
+        })
+      }
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .chemicalsCabinetManage-listPage{
+    .content-box{
+      flex:1;
+      display: flex;
+      padding:20px;
+    }
+  }
+</style>

+ 83 - 0
src/views/chemicalManage/basicManagement/chemicalsCabinetManage/recordsPage.vue

@@ -0,0 +1,83 @@
+<template>
+  <div class="page-container chemicalsCabinetManage-recordsPage">
+    <div class="page-top-title-box">
+      <p class="page-top-title-name-p">{{showType?'详情':(newData.id?'编辑':'新增')}}</p>
+      <p class="page-top-title-out-p" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <el-form class="add-form-box" :model="newData" ref="form" :rules="showType?noRules:rules" label-width="120px">
+        <el-form-item label="名称:" prop="name">
+          <el-input :disabled="showType" v-model="newData.name" placeholder="请输入名称" maxLength="20" style="width:500px;"></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="page-bottom-button-box" v-if="!showType">
+      <p class="page-bottom-button-null-p"></p>
+      <p class="page-bottom-button-submit-p" @click="submitForm">提交</p>
+      <p class="page-bottom-button-null-p"></p>
+    </div>
+  </div>
+</template>
+
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  export default {
+    name: 'recordsPage',
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        showType:false,
+        newData:{},
+      }
+    },
+    created(){
+      this.initialize();
+    },
+    mounted(){
+
+    },
+    methods:{
+      //初始化
+      initialize(){
+        this.$set(this,'showType',this.propsData.showType);
+        if(this.propsData.id){
+          let obj = {
+            id:this.propsData.id,
+            name:this.propsData.name,
+          };
+          this.$set(this,'newData',obj);
+        }else{
+          this.$set(this,'newData',{
+            name:"",
+          });
+        }
+      },
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(5);
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+
+          }
+        })
+      }
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .chemicalsCabinetManage-recordsPage{
+    .content-box{
+      flex:1;
+      display: flex;
+      padding:20px;
+    }
+  }
+</style>

+ 138 - 0
src/views/chemicalManage/basicManagement/msdsSpecification/addPage.vue

@@ -0,0 +1,138 @@
+<template>
+  <div class="addPage">
+    <div class="title-box">
+      <p>{{addPropsData.id?'编辑':'新增'}}</p>
+      <p class="reset-button-one" @click="backPage"><i class="el-icon-arrow-left"></i>返回</p>
+    </div>
+    <div class="addPage-min safe-book-el-dialog" v-if="addType">
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="化学品名称" prop="name" style="width:498px;">
+          <el-input v-model="form.name" placeholder="请输入化学品名称" maxLength="20" style="width:500px;"/>
+        </el-form-item>
+        <el-form-item label="化学品编号" prop="code" style="width:498px;">
+          <el-input v-model="form.code" placeholder="请输入化学品编号" maxLength="20" style="width:500px;"/>
+        </el-form-item>
+        <el-form-item label="化学品详情" prop="content" style="color:#606266;font-size:16px;font-weight:500;" class="wang-editor-form-item-box">
+          <wangEditor :content="form.content" placeholder="请输入化学品详情" @change="change" :min-height="192" style="width:1000px;"/>
+        </el-form-item>
+      </el-form>
+      <p class="bottom-button-p inquire-button-one" @click="submitForm">提交</p>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { addHazard_book, updateHazard_book } from "@/apiDemo/laboratory/hazard_book";
+  export default {
+    name: "addPage",
+    props:{
+      addPropsData:{},
+    },
+    data() {
+      return {
+        addType:false,
+        // 表单参数
+        form: {},
+        // 表单校验
+        rules: {
+          name:[
+            {required: true, message: '请输入化学品名称', trigger: 'blur'},
+            { required: true, message: "请输入化学品名称", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          code:[
+            {required: true, message: '请输入化学品编号', trigger: 'blur'},
+            { required: true, message: "请输入化学品编号", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          content:[
+            {required: true, message: '请输入化学品详情', trigger: 'blur'},
+            { required: true, message: "请输入化学品详情", validator: this.spaceJudgmentHTML, trigger: "blur" }
+          ],
+        },
+      };
+    },
+    created() {
+    },
+    mounted(){
+      if(this.addPropsData.id){
+        this.$set(this,'form',this.addPropsData);
+        this.addType=true;
+      }else{
+        this.addType=true;
+      }
+    },
+    methods: {
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            this.form.content = escape(this.form.content);
+            if (this.form.id != null) {
+              updateHazard_book(this.form).then( response => {
+                this.msgSuccess("修改成功");
+                this.$parent.pageToggle(1);
+              });
+            } else {
+              addHazard_book(this.form).then( response => {
+                this.msgSuccess("新增成功");
+                this.$parent.pageToggle(1);
+              });
+            }
+          }
+        });
+      },
+      backPage(){
+        this.$parent.pageToggle(0);
+      },
+      change(val) {
+        this.$set(this.form,'content',val);
+        // this.form.content = val;
+        console.log(val)
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .addPage{
+    flex:1;
+    display: flex !important;
+    flex-direction: column;
+    p{
+      margin:0;
+    }
+    .title-box{
+      display: flex;
+      height:90px;
+      border-bottom: 1px solid #D8D8D8;
+      p:nth-child(1){
+        flex:1;
+        font-size:16px;
+        line-height:90px;
+        margin-left:18px;
+        color:#0045AF;
+      }
+      p:nth-child(2){
+        margin:25px 25px 0 0;
+      }
+    }
+    .addPage-min{
+      flex:1;
+      display: flex !important;
+      flex-direction: column;
+      padding:20px!important;
+      .bottom-button-p{
+        margin:40px auto;
+        line-height:40px;
+        width:100px;
+        text-align: center;
+      }
+    }
+  }
+</style>
+<style lang="scss">
+  .wang-editor-form-item-box{
+    .el-form-item__content{
+      z-index:0;
+    }
+  }
+</style>

+ 330 - 0
src/views/chemicalManage/basicManagement/msdsSpecification/index.vue

@@ -0,0 +1,330 @@
+<!--危化品安全技术说明书-->
+<template>
+  <div class="app-container msdsSpecification">
+    <div class="page-container msdsSpecificationPage" v-if="pageType === 1">
+      <div class="page-form-title-box">
+        <el-form :model="queryParamsData" ref="queryForm" :inline="true" v-show="showSearch" label-width="108px">
+          <el-form-item label="化学品名称" prop="name">
+            <el-input
+              v-model="queryParamsData.name"
+              placeholder="请输入化学品名称"
+              maxLength="20"
+              clearable
+              size="small"
+            />
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+          <p class="page-add-common-style-button"
+             style="float: right;"
+             @click="pageToggle(2)"
+             v-hasPermiRouter="['laboratory:hazard_book:add']"
+          >新增</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="hazard_bookList" @selection-change="handleSelectionChange">
+          <el-table-column label="序号" type="index" align="center" width="50"/>
+          <el-table-column label="名称" align="center" prop="name" />
+          <el-table-column label="编号" align="center" prop="code"/>
+          <el-table-column label="创建时间" align="center" prop="createTime"/>
+          <el-table-column label="创建人" align="center" prop="createBy" width="200"/>
+          <el-table-column label="查看次数" align="center" prop="scanCount" width="100"/>
+          <el-table-column label="二维码" align="center" width="100">
+            <template slot-scope="scope">
+              <div style="height:23px;" @click="dialogQrCodeOn(scope.row.qrCodeUrl)">
+                <vue-qr style="height:23px;width:23px;cursor:pointer;" :text="scope.row.qrCodeUrl" :size="200"></vue-qr>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="160" v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="pageToggle(3,scope.row)"
+                   v-hasPermiAnd="['laboratory:hazard_book:query','laboratory:hazard_book:edit']"
+                >编辑</p>
+                <p class="table-button-p"
+                   @click="handleDelete(scope.row)"
+                   v-hasPermi="['laboratory:hazard_book:remove']"
+                >删除</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <!--新增页面-->
+    <add-page v-if="pageType == 2" :addPropsData="addPropsData"></add-page>
+    <!-- 添加或修改危化品安全技术说明书对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="化学品名称" prop="name" style="width:498px;">
+          <el-input v-model="form.name" placeholder="请输入化学品名称" maxLength="20"/>
+        </el-form-item>
+        <el-form-item label="化学品编号" prop="code" style="width:498px;">
+          <el-input v-model="form.code" placeholder="请输入化学品编号" maxLength="20"/>
+        </el-form-item>
+        <el-form-item label="化学品详情" prop="content" v-if="open">
+          <wangEditor :content="form.content" @change="change" :min-height="192"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 二维码展示 -->
+    <el-dialog title="二维码" class="qr-codeUrl-dialog" :visible.sync="dialogQrCodeType" width="300px" append-to-body :close-on-click-modal="false">
+      <vue-qr style="display: block;height:200px;width:200px;cursor:pointer;margin:0 auto;" :text="dialogQrCodeUrl" :size="200"></vue-qr>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listHazard_book, getHazard_book, delHazard_book, addHazard_book, updateHazard_book } from "@/apiDemo/laboratory/hazard_book";
+import vueQr from 'vue-qr'
+import addPage from "./addPage.vue"
+
+export default {
+  components:{
+    vueQr,
+    addPage
+  },
+  name: "Hazard_book",
+  data() {
+    return {
+      tableButtonType:this.hasPermiDom(['laboratory:hazard_book:query','laboratory:hazard_book:edit','laboratory:hazard_book:remove']),
+      //页面状态
+      pageType:1,
+      //新增页面传参
+      addPropsData:{},
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 危化品安全技术说明书表格数据
+      hazard_bookList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 搜索数据
+      queryParamsData:{
+        pageNum:1,
+        pageSize:20,
+      },
+      // 搜索实际发送数据
+      queryParams:{
+        pageNum:1,
+        pageSize:20,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name:[
+          {required: true, message: '请输入危险品名称', trigger: 'blur'},
+          { required: true, message: "请输入危险品名称", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        code:[
+          {required: true, message: '请输入编号', trigger: 'blur'},
+          { required: true, message: "请输入危险品名称", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        content:[
+          {required: true, message: '请输入详情', trigger: 'blur'},
+          { required: true, message: "请输入危险品名称", validator: this.spaceJudgmentHTML, trigger: "blur" }
+        ],
+      },
+      //二维码展示数据
+      dialogQrCodeType:false,
+      dialogQrCodeUrl:"",
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 页面状态切换
+    pageToggle(type,item){
+      if(type == 0){
+        this.pageType = 1;
+      }else if(type == 1){
+        this.pageType = 1;
+        this.getList();
+      }else if(type == 2){
+        //新增
+        this.addPropsData = {};
+        this.pageType = 2;
+      }else if(type == 3){
+        //编辑
+        getHazard_book(item.id).then( response => {
+          this.addPropsData =  response.data;
+          this.addPropsData.content = unescape(response.data.content);
+          this.pageType = 2;
+        });
+      }
+    },
+    dialogQrCodeOn(url){
+      this.dialogQrCodeUrl = url;
+      this.dialogQrCodeType = true;
+    },
+    change(val) {
+      this.$set(this.form,'content',val);
+      // this.form.content = val;
+      console.log(val)
+    },
+    /** 查询危化品安全技术说明书列表 */
+    getList() {
+      this.loading = true;
+      this.queryParamsData = JSON.parse(JSON.stringify(this.queryParams));
+      listHazard_book(this.queryParamsData).then( response => {
+        this.hazard_bookList =  response.rows;
+        this.total =  response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        code: null,
+        content: null,
+        qrCodeUrl: null,
+        scanCount: null,
+        userId: null,
+        createBy: null,
+        updateBy: null,
+        deptId: null,
+        deptName: null,
+        createTime: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParamsData.pageNum = 1;
+      this.queryParamsData.pageSize = 20;
+      this.queryParams = JSON.parse(JSON.stringify(this.queryParamsData));
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.$set(this,'queryParamsData',{});
+      this.$set(this,'queryParams',{});
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "新增";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getHazard_book(id).then( response => {
+        this.form =  response.data;
+        this.form.content = unescape(response.data.content);
+        this.open = true;
+        this.title = "编辑";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.form.content = escape(this.form.content);
+          if (this.form.id != null) {
+            updateHazard_book(this.form).then( response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addHazard_book(this.form).then( response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.resetQuery();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delHazard_book(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('laboratory/hazard_book/export', {
+        ...this.queryParams
+      }, `laboratory_hazard_book.xlsx`)
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+  .msdsSpecification {
+    .msdsSpecificationPage{
+      .hazard-book-page{
+        flex:1;
+        display: flex !important;
+        flex-direction: column;
+        padding:20px!important;
+        overflow: hidden;
+      }
+      .button-box{
+        margin:0 auto;
+        width:190px;
+        display: flex;
+      }
+      .el-input--small{
+        width:260px;
+      }
+    }
+  }
+</style>

+ 2 - 2
src/views/chemicalManage/components/addChemicals.vue

@@ -116,7 +116,7 @@
           data6:null,
           data7:1,
           data8:null,
-          data9:1,
+          data9:'1',
         },
         dialogRules:{
           data1: [
@@ -158,7 +158,7 @@
             data6:null,
             data7:1,
             data8:null,
-            data9:1,
+            data9:'1',
           });
           this.$set(this,'lookImgDialogTitle','添加化学品');
           this.$set(this,'lookImgDialogType',true);

+ 242 - 0
src/views/chemicalManage/earlyWarningEvent/index.vue

@@ -0,0 +1,242 @@
+<!-- 预警事件 -->
+<template>
+  <div class="app-container earlyWarningEvent">
+    <div class="page-container earlyWarningEventPage" v-if="pageType === 1">
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="queryParamsData1">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.queryParamsData1"
+              placeholder="实验室/房间号/预警事件/姓名"
+              style="width: 220px"
+            />
+          </el-form-item>
+          <el-form-item label="学院" prop="queryParamsData2">
+            <el-select v-model="queryParams.queryParamsData2" placeholder="请选择" style="width: 200px">
+              <el-option
+                v-for="item in deptOptions"
+                :key="item.deptId"
+                :label="item.deptName"
+                :value="item.deptId"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="楼栋楼层" prop="queryParamsData3">
+            <el-cascader
+              :props="{value: 'id', label: 'name',children:'buildFloorVoList'}"
+              v-model="queryParams.queryParamsData3"
+              :options="buildFloorOptions">
+            </el-cascader>
+          </el-form-item>
+          <el-form-item label="时间" prop="state">
+            <el-date-picker
+              :clearable="false"
+              v-model="dateRange"
+              size="small"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            ></el-date-picker>
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table-column label="报警时间" prop="createTime" width="180" fixed show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="预警类型" prop="content" width="200" fixed show-overflow-tooltip/>
+          <el-table-column label="预警事件" prop="name" width="625" show-overflow-tooltip/>
+          <el-table-column label="学院" prop="content" width="200" show-overflow-tooltip/>
+          <el-table-column label="楼栋楼层" prop="content" width="200" show-overflow-tooltip/>
+          <el-table-column label="实验室" prop="content" width="200" show-overflow-tooltip/>
+          <el-table-column label="安全员" prop="content" width="200" show-overflow-tooltip/>
+          <el-table-column label="操作" width="100" show-overflow-tooltip v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="tableButton(2,scope.row)"
+                   v-hasPermiRouter="['demo:demo:detail']"
+                >处理</p>
+                <p class="table-button-p"
+                   @click="tableButton(3,scope.row)"
+                   v-hasPermiRouter="['demo:demo:edit']"
+                >详情</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.page"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <info-page :propsData="propsData" v-if="pageType === 2"></info-page>
+  </div>
+</template>
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import infoPage from "./infoPage.vue";
+  import { getDeptDropList,systemBuildingGetTreeList,} from "@/api/commonality/permission";
+  export default {
+    name: 'index',
+    components: {
+     infoPage
+    },
+    data () {
+      return {
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        //页面状态
+        pageType:2,
+        //页面遮罩
+        loading:false,
+        //学院
+        deptOptions:[],
+        //楼栋楼层
+        buildFloorOptions:[],
+        //查询条件
+        queryParams:{
+          page:1,
+          pageSize:20,
+          queryParamsData1:"",
+          queryParamsData2 :null,
+          queryParamsData3 :null,
+        },
+        //时间数据
+        dateRange:[],
+        //列表数据
+        dataList:[{}],
+        //数据数量
+        total:0,
+        //组件传参
+        propsData:{},
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      this.getDeptDropList();
+      this.systemBuildingGetTreeList();
+      //this.getList();
+    },
+    methods: {
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'page',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          page:1,
+          pageSize:20,
+          queryParamsData1:"",
+          queryParamsData2 :null,
+          queryParamsData3 :null,
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        // this.$set(this,'loading',true);
+        // let obj = JSON.parse(JSON.stringify(this.queryParams))
+        // if(this.dateRange[0]){
+        //   obj.startTime = this.dateRange[0]+'T00:00:00'
+        //   obj.endTime = this.dateRange[1]+'T23:59:59'
+        // }else{
+        //   obj.startTime = "";
+        //   obj.endTime = "";
+        // }
+        // getListFunction(obj).then(response => {
+        //   this.$set(this,'loading',false);
+        //   this.$set(this,'dataList',response.data.records);
+        //   this.$set(this,'total',response.data.total);
+        // });
+      },
+      //操作按钮
+      tableButton(type,row){
+        if(type == 2){
+          //处理
+          this.$set(this,'pageType',3);
+          this.$set(this,'propsData',row);
+        }else if(type == 3){
+          //详情
+          this.$set(this,'pageType',3);
+          this.$set(this,'propsData',row);
+        }else if(type == 4){
+          //返回并刷新
+          this.$set(this,'pageType',1);
+          this.getList();
+        }
+      },
+      //查询学院列表
+      getDeptDropList(){
+        getDeptDropList({deptName:"",level:2,deptType:1}).then(response => {
+          this.$set(this, 'deptOptions', response.data)
+        });
+      },
+      //查询楼栋楼层
+      systemBuildingGetTreeList(){
+        systemBuildingGetTreeList({}).then(response => {
+          if (response.data[0]) {
+            let list = this.forBuildFloor(response.data);
+            let newList = [];
+            for(let i=0;i<list.length;i++){
+              if(list[i].buildFloorVoList){
+                for(let o=0;o<list[i].buildFloorVoList.length;o++){
+                  if(list[i].buildFloorVoList[o].buildFloorVoList){
+                    newList.push(list[i].buildFloorVoList[o])
+                  }
+                }
+              }
+            }
+            console.log('newList========>',newList);
+            this.$set(this, 'buildFloorOptions', newList)
+          }
+        })
+      },
+      //处理楼栋楼层数据
+      forBuildFloor(list){
+        let self = this;
+        for(let i=0;i<list.length;i++){
+          if(list[i].buildFloorVoList){
+            if(list[i].buildFloorVoList[0]){
+              list[i].buildFloorVoList = self.forBuildFloor(list[i].buildFloorVoList);
+            }else{
+              delete list[i].buildFloorVoList;
+            }
+          }else{
+            delete list[i].buildFloorVoList;
+          }
+        }
+        return list
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .earlyWarningEvent{
+    .earlyWarningEventPage{
+
+    }
+  }
+</style>

+ 386 - 0
src/views/chemicalManage/earlyWarningEvent/infoPage.vue

@@ -0,0 +1,386 @@
+<template>
+  <div class="page-container earlyWarningEvent-infoPage">
+    <div class="page-top-title-box">
+      <p class="page-top-title-name-p">{{infoData.infoType == 1?'处理':'详情'}}</p>
+      <p class="page-top-title-out-p" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <div class="top-max-big-box">
+        <p class="title-p">预警信息</p>
+        <div class="text-max-box">
+          <div class="text-left-box">
+            <p>报警时间:</p>
+            <p>{{infoData.data1}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>预警类型:</p>
+            <p>{{infoData.data2}}</p>
+          </div>
+          <div class="text-right-box">
+            <p>实验室负责人:</p>
+            <p>{{infoData.data3}}</p>
+          </div>
+        </div>
+        <div class="text-max-box">
+          <div class="text-left-box">
+            <p>学院:</p>
+            <p>{{infoData.data4}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>实验室:</p>
+            <p>{{infoData.data5}}</p>
+          </div>
+          <div class="text-right-box">
+            <p>安全员:</p>
+            <p>{{infoData.data6}}</p>
+          </div>
+        </div>
+        <div class="text-max-big-box">
+          <div class="text-box">
+            <p>预警事件:</p>
+            <p>{{infoData.data7}}</p>
+          </div>
+        </div>
+        <p class="top-position-p" :class="infoData.infoType != 1?'position-type':''">{{infoData.infoType == 1?'待处理':'已处理'}}</p>
+      </div>
+      <div class="bottom-max-big-box">
+        <p class="title-p">化学品信息</p>
+        <div class="text-max-box">
+          <div class="text-left-box">
+            <p style="width:96px;">化学品名称:</p>
+            <p>{{infoData.data8}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>规格:</p>
+            <p>{{infoData.data9}}</p>
+          </div>
+          <div class="text-right-box">
+            <p>存放位置:</p>
+            <p>{{infoData.data10}}</p>
+          </div>
+        </div>
+        <div class="text-max-box">
+          <div class="text-left-box">
+            <p style="width:96px;">余量:</p>
+            <p>{{infoData.data11}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>归属人:</p>
+            <p>{{infoData.data12}}</p>
+          </div>
+        </div>
+      </div>
+      <div class="bottom-max-big-box">
+        <p class="title-p">报警抓拍</p>
+        <div class="img-list-box">
+          <img v-for="(item,index) in infoData.data13" :key="index"
+               :src="item" @click="lookImg(index)">
+        </div>
+      </div>
+      <div class="bottom-max-big-box ">
+        <p class="title-p">通知记录</p>
+        <div class="table-max-big-box">
+          <el-table class="table-box" v-loading="loading" border :data="infoData.data14">
+            <el-table-column label="通知时间" prop="createTime" width="200" fixed show-overflow-tooltip>
+              <template slot-scope="scope">
+                <span>{{ parseTime(scope.row.createTime) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="通知方式" prop="content" width="180" fixed show-overflow-tooltip/>
+            <el-table-column label="报警级别" prop="name" width="120" show-overflow-tooltip/>
+            <el-table-column label="通知人" prop="content" show-overflow-tooltip/>
+          </el-table>
+        </div>
+      </div>
+      <div class="bottom-max-big-box">
+        <p class="title-p">预警处理</p>
+        <div class="text-max-box" v-if="infoData.infoType != 1">
+          <div class="text-left-box">
+            <p>报警时间:</p>
+            <p>{{infoData.data15}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>预警类型:</p>
+            <p>{{infoData.data16}}</p>
+          </div>
+          <div class="text-right-box">
+            <p>实验室负责人:</p>
+            <p>{{infoData.data17}}</p>
+          </div>
+        </div>
+        <div class="text-max-big-box" v-if="infoData.infoType != 1">
+          <div class="text-box">
+            <p>处理备注:</p>
+            <p>{{infoData.data18}}</p>
+          </div>
+        </div>
+        <div class="form-max-box" v-if="infoData.infoType == 1">
+          <div class="text-max-box">
+            <div class="text-left-box">
+              <p>处理方式:</p>
+              <p>手动处理</p>
+            </div>
+          </div>
+          <el-form :model="infoDataForm" ref="form" label-width="0">
+            <el-form-item label="" prop="name">
+              <span style="font-size:16px;">处理备注:</span>
+              <el-input v-model="infoDataForm.name" placeholder="请输入名称" maxLength="70" style="width:1335px;"></el-input>
+            </el-form-item>
+          </el-form>
+          <div class="button-bottom-box">
+            <p></p>
+            <p class="page-submit-common-style-button" @click="submitForm">处理</p>
+            <p></p>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--全屏视图组件-->
+    <fullScreenView :fullScreenViewProps="infoData.data13" ref="fullScreenView"></fullScreenView>
+  </div>
+</template>
+
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import fullScreenView from "@/components/fullScreenView/fullScreenView.vue";
+  export default {
+    name: 'infoPage',
+    components: {
+      fullScreenView,
+    },
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        showType:false,
+        infoData:{
+          infoType:1,
+          data1:'2023-05-27 14:46:18',
+          data2:'化学品',
+          data3:'李苗苗-13255668899、李苗苗-13255668899',
+          data4:'学员名称',
+          data5:'实验室名称(房间号)',
+          data6:'李苗苗-13255668899、李苗苗-13255668899',
+          data7:'【化学品预警】化学品名称(编码)-违规携带离开实验室名称(房间号),请尽快确认!',
+          data8:'2023-05-27 14:46:18',
+          data9:'500ml/瓶',
+          data10:'化学品柜-柜门-柜层',
+          data11:'300ml',
+          data12:'姓名-联系电话',
+          data13:[
+            'https://img1.baidu.com/it/u=1422064840,2936115861&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500',
+            'https://img1.baidu.com/it/u=716638254,3920932970&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500',
+            'https://img2.baidu.com/it/u=2537370952,3446004972&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500',
+            'https://img2.baidu.com/it/u=2312383180,3750420672&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800',
+          ],
+          data14:[],
+          data15:'归还操作',
+          data16:'姓名-联系电话',
+          data17:'2023-05-27 14:46:18',
+          data18:'手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容'
+        },
+        infoDataForm:{
+          remark:"",
+        },
+      }
+    },
+    created(){
+      this.initialize();
+    },
+    mounted(){
+
+    },
+    methods:{
+      //初始化
+      initialize(){
+        // this.$set(this,'showType',this.propsData.showType);
+        // if(this.propsData.id){
+        //   let obj = {
+        //     id:this.propsData.id,
+        //     name:this.propsData.name,
+        //   };
+        //   this.$set(this,'infoData',obj);
+        // }else{
+        //   this.$set(this,'infoData',{
+        //     name:"",
+        //   });
+        // }
+      },
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(4);
+      },
+      /** 提交按钮 */
+      submitForm() {
+
+      },
+      // 照片预览
+      lookImg(index){
+        this.$refs['fullScreenView'].initialize(index);
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .earlyWarningEvent-infoPage{
+    .content-box{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      .top-max-big-box , .bottom-max-big-box{
+        padding:25px 80px;
+        .title-p{
+          line-height:48px;
+          font-size:16px;
+          font-weight: 700;
+          color:#333;
+        }
+        .text-max-box{
+          display: flex;
+          .text-left-box{
+            width:390px;
+            display: flex;
+            padding:16px 0;
+            p{
+              font-size:16px;
+              line-height:24px;
+              /*单行省略号*/
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+            p:nth-child(1){
+              width:80px;
+              text-align: right;
+            }
+            p:nth-child(2){
+              flex:1;
+            }
+          }
+          .text-center-box{
+            width:410px;
+            display: flex;
+            padding:16px 0;
+            p{
+              font-size:16px;
+              line-height:24px;
+              /*单行省略号*/
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+            p:nth-child(1){
+              width:90px;
+              text-align: right;
+            }
+            p:nth-child(2){
+              flex:1;
+            }
+          }
+          .text-right-box{
+            width:610px;
+            display: flex;
+            padding:16px 0;
+            p{
+              font-size:16px;
+              line-height:24px;
+              /*单行省略号*/
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+            p:nth-child(1){
+              width:120px;
+              text-align: right;
+            }
+            p:nth-child(2){
+              flex:1;
+            }
+          }
+        }
+        .text-max-big-box{
+          display: flex;
+          .text-box{
+            flex: 1;
+            display: flex;
+            padding:16px 0;
+            p{
+              font-size:16px;
+              line-height:24px;
+              /*单行省略号*/
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+            p:nth-child(1){
+              width:80px;
+              text-align: right;
+            }
+            p:nth-child(2){
+              flex:1;
+            }
+          }
+        }
+        .img-list-box{
+          padding-top:12px;
+          img{
+            cursor: pointer;
+            display:inline-block;
+            width:130px;
+            height:130px;
+            margin-right:10px;
+            margin-bottom:10px;
+          }
+        }
+        .table-max-big-box{
+          padding:12px 0;
+          height:260px!important;
+          display: flex;
+          flex-direction: column;
+        }
+        .button-bottom-box{
+          display: flex;
+          p:nth-child(1){
+            flex:1;
+          }
+          p:nth-child(2){
+            width:100px;
+          }
+          p:nth-child(3){
+            flex:1;
+          }
+        }
+      }
+      .top-max-big-box{
+        position: relative;
+        .top-position-p{
+          position: absolute;
+          top:0;
+          right:0;
+          width:100px;
+          height:40px;
+          border-bottom-left-radius:20px;
+          background-color: #FFA200;
+          color:#fff;
+          font-size:16px;
+          text-align: center;
+          line-height:40px;
+        }
+        .position-type{
+          background-color: #0183FA;
+        }
+      }
+      .bottom-max-big-box{
+        border-top:20px solid #F5F5F5;
+      }
+    }
+  }
+</style>

+ 347 - 29
src/views/integratedManagement/messageNotice/warningNotice/forewarningConfig.vue

@@ -11,7 +11,7 @@
         <p></p>
       </div>
       <p class="null-p"></p>
-      <p class="page-out-common-style-button out-p">返回</p>
+      <p class="page-out-common-style-button out-p" @click="outButton">返回</p>
     </div>
     <!--危险源预警-->
     <div class="page-max-big-box-a scrollbar-box" v-show="checkTypeA == 1">
@@ -199,7 +199,7 @@
           </el-form>
         </div>
         <div class="page-content-box">
-          <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table class="table-box" border :data="dataList">
             <el-table-column label="适用学院" prop="name" show-overflow-tooltip/>
             <el-table-column label="报警层级" prop="content" width="180" show-overflow-tooltip/>
             <el-table-column label="通知人数" prop="content" width="150" show-overflow-tooltip/>
@@ -254,7 +254,69 @@
     </div>
     <!--算法预警-->
     <div class="page-max-big-box-b scrollbar-box" v-show="checkTypeA == 2">
-
+      <el-form class="form-box" :model="algorithmForm" ref="algorithmForm"
+               :inline="true" :rules="algorithmRules" label-width="140px">
+        <div>
+          <el-form-item label="穿戴抓拍周期" prop="data11" label-width="170px">
+            <el-input-number v-model="algorithmForm.data11" style="width:320px;"
+                              :min="1" :max="360">
+            </el-input-number>
+          </el-form-item>
+          <el-form-item label="异常再识别数" prop="data12" label-width="170px">
+            <el-input-number v-model="algorithmForm.data12" style="width:320px;"
+                              :min="1" :max="100">
+            </el-input-number>
+          </el-form-item>
+          <el-form-item label="异常再识别数" prop="data13" label-width="170px">
+            <el-input-number v-model="algorithmForm.data13" style="width:320px;"
+                              :min="1" :max="100">
+            </el-input-number>
+          </el-form-item>
+        </div>
+        <p class="text-p">穿戴识别</p>
+        <div>
+          <el-form-item label="系统通知 监测异常" prop="data14" label-width="234px">
+            <el-select v-model="algorithmForm.data14" placeholder="请选择" style="width:90px;">
+              <el-option
+                v-for="item in numOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+            <span class="span-a">次</span>
+            <span class="span-b">监测到实验人员未正确穿戴实验服,三次后通过该方式惊醒预警通知。</span>
+          </el-form-item>
+        </div>
+        <div>
+          <el-form-item label="短信通知 监测异常" prop="data15" label-width="234px">
+            <el-select v-model="algorithmForm.data15" placeholder="请选择" style="width:90px;">
+              <el-option
+                v-for="item in numOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+            <span class="span-a">次</span>
+            <span class="span-b">监测到实验人员未正确穿戴实验服,三次后通过该方式惊醒预警通知。</span>
+          </el-form-item>
+        </div>
+        <div>
+          <el-form-item label="语音播报 监测异常" prop="data16" label-width="234px">
+            <el-select v-model="algorithmForm.data16" placeholder="请选择" style="width:90px;">
+              <el-option
+                v-for="item in numOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+            <span class="span-a">次</span>
+            <span class="span-b">监测到实验人员未正确穿戴实验服,三次后通过该方式惊醒预警通知。</span>
+          </el-form-item>
+        </div>
+      </el-form>
     </div>
     <div class="button-bottom-box">
       <p class="null-p"></p>
@@ -264,14 +326,47 @@
     <el-dialog class="forewarningUp-dialog" title='预警升级配置' width="1300px" append-to-body
                :visible.sync="dialogType" v-if="dialogType" @close="dialogOff()"
                :close-on-click-modal="false" :close-on-press-escape="false">
-      <div class="forewarningUp-dialog-max-box">
+      <div class="shade-big-box" v-if="shadeType">
+        <div class="shade-box">
+          <div class="shade-min-box">
+            <el-form :model="shadeForm" ref="shadeForm" :inline="true" :rules="shadeRules">
+              <el-form-item label="人员查询" prop="userId" class="form-item" label-width="90px">
+                <el-select
+                  style="width:300px;"
+                  v-model="shadeForm.userId"
+                  filterable
+                  remote
+                  clearable
+                  reserve-keyword
+                  @change="userChange"
+                  placeholder="请输入姓名/工号/手机号"
+                  :remote-method="userSelectList">
+                  <el-option
+                    v-for="item in optionsUser"
+                    :key="item.userId"
+                    :label="item.userName"
+                    :value="item.userId">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-form>
+          </div>
+          <div class="dialog-footer dialog-footer-box">
+            <p class="dialog-footer-button-null"></p>
+            <p class="dialog-footer-button-info" @click="shadeOut()">取消</p>
+            <p class="dialog-footer-button-primary" @click="shadeUp">确定</p>
+            <p class="dialog-footer-button-null"></p>
+          </div>
+        </div>
+      </div>
+      <div class="forewarningUp-dialog-max-box scrollbar-box">
         <div class="question-box">
           <p class="el-icon-question question-icon"></p>
           <p class="question-text">如在设定的处理时间内未处理,则报警升级执行下一步流程。</p>
         </div>
         <el-form :model="dialogForm" ref="dialogForm" :inline="true"
                  :rules="dialogRules" class="addCheckPage-min">
-          <el-form-item label="适合学院:" prop="dialogData1" label-width="90px">
+          <el-form-item label="适合学院:" prop="dialogData1" label-width="100px">
             <el-select v-model="dialogForm.dialogData1" placeholder="请选择" style="width: 435px">
               <el-option
                 v-for="dict in deptOptions"
@@ -284,19 +379,22 @@
           <div class="for-max-big-box" v-for="(item,index) in dialogForm.dialogData2" :key="index">
             <div class="for-max-big-title-box">
               <p class="position-index">{{index+1}}</p>
-              <el-form-item label="处理时间:" class="time-form-item" prop="searchValue" label-width="142px">
+              <el-form-item label="处理时间:" class="time-form-item" label-width="142px"
+                            :prop="'dialogData2.' + index + '.dialogTime'" :rules="dialogRules.dialogTime">
                 <el-input-number v-model="item.dialogTime" style="width:435px;"
                                  :controls="false" :min="1" :max="1440">
                 </el-input-number>
               </el-form-item>
               <p class="time-p">分钟</p>
               <p class="null-p"></p>
-              <p class="page-submit-common-style-button for-del-button" @click="delBigDialogData(index)">删除</p>
+              <p class="page-submit-common-style-button for-del-button" v-if="dialogForm.dialogData2[1]" @click="delBigDialogData(index)">删除</p>
               <p class="page-submit-common-style-button for-add-button" @click="addBigDialogData(index)">+  添加处理流程</p>
             </div>
             <div class="for-max-box">
               <div class="for-box" v-for="(minItem,minIndex) in item.dialogUserList" :key="minIndex">
-                <el-form-item label="通知对象:" prop="searchValue" label-width="142px">
+                <el-form-item label="通知对象:" label-width="142px"
+                              :prop="'dialogData2.'+ index +'.dialogUserList.'+ minIndex +'.dialogName'"
+                              :rules="dialogRules.dialogName">
                   <el-input
                     style="width:300px;"
                     maxlength="8"
@@ -304,8 +402,10 @@
                     placeholder="未填写"
                   />
                 </el-form-item>
-                <p class="el-icon-search look-min-button"></p>
-                <el-form-item label="手机号码:" prop="searchValue" label-width="120px">
+                <p class="el-icon-search look-min-button" @click="shadeOpen(index,minIndex)"></p>
+                <el-form-item label="手机号码:" label-width="120px"
+                              :prop="'dialogData2.'+ index +'.dialogUserList.'+ minIndex +'.dialogValue'"
+                              :rules="dialogRules.dialogValue">
                   <el-input
                     style="width:300px;"
                     maxlength="11"
@@ -314,14 +414,14 @@
                     onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')"
                   />
                 </el-form-item>
-                <p class="el-icon-delete del-min-button" @click="delMinDialogData"></p>
-                <p class="el-icon-circle-plus-outline add-min-button" @click="addMinDialogData"></p>
+                <p class="el-icon-delete del-min-button" v-if="item.dialogUserList[1]" @click="delMinDialogData(index,minIndex)"></p>
+                <p class="el-icon-circle-plus-outline add-min-button" @click="addMinDialogData(index,minIndex)"></p>
               </div>
             </div>
           </div>
         </el-form>
       </div>
-      <div slot="footer" class="dialog-footer dialog-footer-box">
+      <div class="dialog-footer dialog-footer-box">
         <p class="dialog-footer-button-null"></p>
         <p class="dialog-footer-button-info" @click="dialogOff()">取消</p>
         <p class="dialog-footer-button-primary" @click="dialogSubmit">确定</p>
@@ -335,6 +435,7 @@
   //import { getDicts } from "@/api/commonality/noPermission";
   //import { systemUserSelect } from "@/api/commonality/permission";
   //import { getInfo } from "@/api/basicsModules/index";
+  import { systemUserSelectUser } from "@/api/commonality/permission";
   export default {
     name: 'addPage',
     props:{
@@ -407,11 +508,38 @@
           ],
         },
         //算法预警数据
-        algorithmForm:{},
+        algorithmForm:{
+          data11:null,
+          data12:null,
+          data13:null,
+          data14:null,
+          data15:null,
+          data16:null,
+        },
         algorithmRules:{
-          dictKey: [
-            { required: true, message: "请输入名称", trigger: "blur" },
-            { required: true, message: "请输入名称", validator: this.spaceJudgment, trigger: "blur" }
+          data11: [
+            { required: true, message: "请输入穿戴抓拍周期", trigger: "blur" },
+            { required: true, message: "请输入穿戴抓拍周期", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data12: [
+            { required: true, message: "请输入异常再识别数", trigger: "blur" },
+            { required: true, message: "请输入异常再识别数", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data13: [
+            { required: true, message: "请输入异常再识别数", trigger: "blur" },
+            { required: true, message: "请输入异常再识别数", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data14: [
+            { required: true, message: "请输入系统通知监测异常次数", trigger: "blur" },
+            { required: true, message: "请输入系统通知监测异常次数", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data15: [
+            { required: true, message: "请输入短信通知监测异常次数", trigger: "blur" },
+            { required: true, message: "请输入短信通知监测异常次数", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data16: [
+            { required: true, message: "请输入语音播报监测异常次数", trigger: "blur" },
+            { required: true, message: "请输入语音播报监测异常次数", validator: this.spaceJudgment, trigger: "blur" }
           ],
         },
         //违规带离
@@ -427,6 +555,19 @@
           {label:'报警电话',value:'2'},
           {label:'企业微信',value:'3'},
         ],
+        //次数
+        numOptions:[
+          {label:'1',value:1},
+          {label:'2',value:2},
+          {label:'3',value:3},
+          {label:'4',value:4},
+          {label:'5',value:5},
+          {label:'6',value:6},
+          {label:'7',value:7},
+          {label:'8',value:8},
+          {label:'9',value:9},
+          {label:'10',value:10},
+        ],
         //预警升级规则
         queryParams:{
           tabeleData1:'',
@@ -438,11 +579,11 @@
         //部门列表
         sectionOptions:[],
         //升级规则列表
-        dataList:[{},{},{},{},{},{},{},{},{},{},],
+        dataList:[{}],
         total:10,
         tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
         //dialog配置
-        dialogType:true,
+        dialogType:false,
         dialogForm:{
           dialogData1:null,
           dialogData2:[
@@ -457,8 +598,44 @@
             }
           ],
         },
+        dialogRules:{
+          dialogData1: [
+            { required: true, message: "请选择学院", trigger: "blur" },
+            { required: true, message: "请选择学院", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          dialogTime: [
+            { required: true, message: "请输入处理时间", trigger: "blur" },
+            { required: true, message: "请输入处理时间", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          dialogName: [
+            { required: true, message: "请输入通知对象", trigger: "blur" },
+            { required: true, message: "请输入通知对象", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          dialogValue: [
+            { required: true, message: "请输入手机号码", trigger: "blur" },
+            { validator: this.checkPhone, trigger: 'blur' },
+            { required: true, message: "请输入手机号码", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+        },
         //学院列表
         deptOptions:[],
+        //选择人员
+        shadeType:false,
+        shadeIndex:null,
+        shadeMinIndex:null,
+        shadeForm:{
+          userId:null,
+        },
+        shadeRules:{
+          userId: [
+            { required: true, message: "请选择人员", trigger: "blur" },
+            { required: true, message: "请选择人员", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+        },
+        shadeName:"",
+        shadeMobile:"",
+        // 人员列表
+        optionsUser:[],
       }
     },
     created(){
@@ -492,6 +669,10 @@
           this.$refs.algorithmForm.resetFields()
         }
       },
+      //返回按钮
+      outButton(){
+        this.$parent.tableButton(4);
+      },
       //提交
       submitButton(){
         if(this.checkTypeA == 1 && this.checkTypeB == 1){
@@ -504,6 +685,12 @@
           this.$refs["gasBottleForm"].validate(valid => {
             if (valid) {
 
+            }
+          })
+        }else if(this.checkTypeA == 2){
+          this.$refs["algorithmForm"].validate(valid => {
+            if (valid) {
+
             }
           })
         }
@@ -521,14 +708,29 @@
 
       },
       //新增/编辑/删除升级规则
-      tableButton(type){
+      tableButton(type,row){
         let self = this;
         if(type == 1){
           //新增
-          this.dataList.push({});
+          this.$set(this,'dialogForm',{
+            dialogData1:null,
+            dialogData2:[
+              {
+                dialogTime:null,
+                dialogUserList:[
+                  {
+                    dialogName:null,
+                    dialogValue:null,
+                  }
+                ],
+              }
+            ],
+          });
+          this.$set(this,'dialogType',true);
         }else if(type == 2){
           //编辑
-
+          this.$set(this,'dialogForm',row);
+          this.$set(this,'dialogType',true);
         }else if(type == 3){
           //删除
           this.$confirm('是否确认删除?', "警告", {
@@ -560,27 +762,58 @@
       },
       //关闭弹层
       dialogOff(){
-
+        this.$set(this,'dialogType',false);
       },
       //新增规则流程
       addBigDialogData(index){
-
+        if(this.dialogForm.dialogData2[4]){
+          this.msgError('最多添加5个流程')
+        }else{
+          this.dialogForm.dialogData2.splice(index+1, 0, {
+            dialogTime:null,
+            dialogUserList:[
+              {
+                dialogName:null,
+                dialogValue:null,
+              }
+            ],
+          })
+        }
       },
       //删除规则流程
       delBigDialogData(index){
-
+        if(!this.dialogForm.dialogData2[1]){
+          this.msgError('至少保留一个流程')
+        }else{
+          this.dialogForm.dialogData2.splice(index,1)
+        }
       },
       //新增规则人员
-      addMinDialogData(index){
-
+      addMinDialogData(index,minIndex){
+        if(this.dialogForm.dialogData2[index].dialogUserList[4]){
+          this.msgError('最多添加5个成员')
+        }else{
+          this.dialogForm.dialogData2[index].dialogUserList.splice(minIndex+1, 0, {
+            dialogName:null,
+            dialogValue:null,
+          })
+        }
       },
       //删除规则人员
-      delMinDialogData(index){
-
+      delMinDialogData(index,minIndex){
+        if(!this.dialogForm.dialogData2[index].dialogUserList[1]){
+          this.msgError('至少保留一个成员')
+        }else{
+          this.dialogForm.dialogData2[index].dialogUserList.splice(minIndex,1)
+        }
       },
       //弹层提交
       dialogSubmit(){
+        this.$refs["dialogForm"].validate(valid => {
+          if (valid) {
 
+          }
+        })
       },
       //手机号验证
       checkPhone(rule, value, callback) {
@@ -595,6 +828,50 @@
           }
         }
       },
+      shadeOpen(index,minIndex){
+        this.$set(this,'shadeIndex',index);
+        this.$set(this,'shadeMinIndex',minIndex);
+        this.$set(this,'shadeName','');
+        this.$set(this,'shadeMobile','');
+        this.$set(this.shadeForm,'userId','');
+        this.$set(this,'shadeType',true);
+      },
+      shadeOut(){
+        this.$set(this,'shadeIndex',null);
+        this.$set(this,'shadeMinIndex',null);
+        this.$set(this,'shadeName','');
+        this.$set(this,'shadeMobile','');
+        this.$set(this.shadeForm,'userId','');
+        this.$set(this,'shadeType',false);
+      },
+      shadeUp(){
+        this.$refs["shadeForm"].validate(valid => {
+          if (valid) {
+            this.$set(this.dialogForm.dialogData2[this.shadeIndex].dialogUserList[this.shadeMinIndex],'dialogName',this.shadeName);
+            this.$set(this.dialogForm.dialogData2[this.shadeIndex].dialogUserList[this.shadeMinIndex],'dialogValue',this.shadeMobile);
+            this.$set(this,'shadeType',false);
+          }
+        })
+      },
+      userChange(val){
+        let self = this;
+        console.log(val)
+        for(let i=0;i<self.optionsUser.length;i++){
+          if(self.optionsUser[i].userId == val){
+            this.$set(this,'shadeName',self.optionsUser[i].userName);
+            this.$set(this,'shadeMobile',self.optionsUser[i].mobile);
+          }
+        }
+      },
+      userSelectList(query) {
+        if (query !== '' && query.length>1) {
+          systemUserSelectUser({"userName":query,'userType':'1'}).then(response => {
+            this.$set(this,'optionsUser',response.data);
+          });
+        } else {
+          this.$set(this,'optionsUser',[]);
+        }
+      },
     },
   }
 </script>
@@ -729,6 +1006,22 @@
     }
     .page-max-big-box-b{
       flex:1;
+      padding-top:42px;
+      .text-p{
+        margin:10px 0 28px 72px;
+      }
+      .span-a{
+        margin-left:10px;
+        color:#333;
+        font-size:16px;
+        line-height:40px;
+      }
+      .span-b{
+        margin-left:33px;
+        line-height:40px;
+        color:#CCCCCC;
+        font-size:14px;
+      }
     }
     .button-bottom-box{
       width:100%;
@@ -745,7 +1038,31 @@
 </style>
 <style lang="scss">
   .forewarningUp-dialog{
+    .shade-big-box{
+      position: absolute;
+      top:0;
+      left:0;
+      z-index: 10000;
+      width:100%;
+      height:100%;
+      border-radius:10px;
+      background-color: rgba(0,0,0,0.6);
+      .shade-box{
+        margin:200px auto;
+        width:460px;
+        height:200px;
+        background-color: #fff;
+        border-radius:10px;
+        display: flex;
+        flex-direction:column;
+        padding:60px 20px 20px;
+        .shade-min-box{
+          flex:1;
+        }
+      }
+    }
     .forewarningUp-dialog-max-box{
+      height:600px;
       padding:0 40px;
       .question-box{
         display: flex;
@@ -765,6 +1082,7 @@
         }
       }
       .for-max-big-box{
+        margin-bottom:20px;
         .for-max-big-title-box{
           display: flex;
           background-color: #F5F5F5;

+ 9 - 41
src/views/integratedManagement/messageNotice/warningNotice/index.vue

@@ -103,26 +103,26 @@
       </div>
     </div>
     <forewarning-config v-if="pageType === 2"></forewarning-config>
-    <!--<add-page :propsData="propsData" v-if="pageType === 2"></add-page>-->
+    <info-page :propsData="propsData" v-if="pageType === 3"></info-page>
   </div>
 </template>
 <script>
   //import { getDicts } from "@/api/commonality/noPermission";
   //import { systemUserSelect } from "@/api/commonality/permission";
   //import { getInfo } from "@/api/basicsModules/index";
-  //import addPage from "./addPage.vue";
+  import infoPage from "./infoPage.vue";
   import forewarningConfig from "./forewarningConfig.vue"
   import { getDeptDropList,systemBuildingGetTreeList,} from "@/api/commonality/permission";
   export default {
     name: 'index',
     components: {
-      forewarningConfig
+      infoPage
     },
     data () {
       return {
         tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
         //页面状态
-        pageType:2,
+        pageType:1,
         //页面遮罩
         loading:false,
         //学院
@@ -200,47 +200,15 @@
         if(type == 1){
           //新增
           this.$set(this,'pageType',2);
-          this.$set(this,'propsData',{});
         }else if(type == 2){
           //详情
-          this.$set(this,'pageType',2);
-          let obj = JSON.parse(JSON.stringify(row))
-          obj.showType = true;
-          this.$set(this,'propsData',obj);
+          this.$set(this,'pageType',3);
+          this.$set(this,'propsData',row);
         }else if(type == 3){
-          //编辑
-          this.$set(this,'pageType',2);
-          let obj = JSON.parse(JSON.stringify(row))
-          obj.showType = false;
-          this.$set(this,'propsData',obj);
+          //处理
+          this.$set(this,'pageType',3);
+          this.$set(this,'propsData',row);
         }else if(type == 4){
-          //删除
-          this.$confirm('是否确认删除?', "警告", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
-            type: "warning"
-          }).then(function() {
-          }).then(() => {
-            deleteFunction({id:row.id}).then(response => {
-              self.msgSuccess(response.message)
-              self.getList();
-            });
-          }).catch(() => {});
-        }else if(type == 5){
-          //启用&停用
-          let text = row.state  ? "停用" : "启用";
-          this.$confirm('是否确认' + text + '?', "警告", {
-            confirmButtonText: "确定",
-            cancelButtonText: "取消",
-            type: "warning"
-          }).then(function() {
-          }).then(() => {
-            stateFunction({id:row.id,state:!row.state,}).then(response => {
-              self.msgSuccess(response.message)
-              self.getList();
-            });
-          }).catch(() => {});
-        }else if(type == 6){
           //返回并刷新
           this.$set(this,'pageType',1);
           this.getList();

+ 386 - 0
src/views/integratedManagement/messageNotice/warningNotice/infoPage.vue

@@ -0,0 +1,386 @@
+<template>
+  <div class="page-container earlyWarningEvent-infoPage">
+    <div class="page-top-title-box">
+      <p class="page-top-title-name-p">{{infoData.infoType == 1?'处理':'详情'}}</p>
+      <p class="page-top-title-out-p" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <div class="top-max-big-box">
+        <p class="title-p">预警信息</p>
+        <div class="text-max-box">
+          <div class="text-left-box">
+            <p>报警时间:</p>
+            <p>{{infoData.data1}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>预警类型:</p>
+            <p>{{infoData.data2}}</p>
+          </div>
+          <div class="text-right-box">
+            <p>实验室负责人:</p>
+            <p>{{infoData.data3}}</p>
+          </div>
+        </div>
+        <div class="text-max-box">
+          <div class="text-left-box">
+            <p>学院:</p>
+            <p>{{infoData.data4}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>实验室:</p>
+            <p>{{infoData.data5}}</p>
+          </div>
+          <div class="text-right-box">
+            <p>安全员:</p>
+            <p>{{infoData.data6}}</p>
+          </div>
+        </div>
+        <div class="text-max-big-box">
+          <div class="text-box">
+            <p>预警事件:</p>
+            <p>{{infoData.data7}}</p>
+          </div>
+        </div>
+        <p class="top-position-p" :class="infoData.infoType != 1?'position-type':''">{{infoData.infoType == 1?'待处理':'已处理'}}</p>
+      </div>
+      <div class="bottom-max-big-box">
+        <p class="title-p">化学品信息</p>
+        <div class="text-max-box">
+          <div class="text-left-box">
+            <p style="width:96px;">化学品名称:</p>
+            <p>{{infoData.data8}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>规格:</p>
+            <p>{{infoData.data9}}</p>
+          </div>
+          <div class="text-right-box">
+            <p>存放位置:</p>
+            <p>{{infoData.data10}}</p>
+          </div>
+        </div>
+        <div class="text-max-box">
+          <div class="text-left-box">
+            <p style="width:96px;">余量:</p>
+            <p>{{infoData.data11}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>归属人:</p>
+            <p>{{infoData.data12}}</p>
+          </div>
+        </div>
+      </div>
+      <div class="bottom-max-big-box">
+        <p class="title-p">报警抓拍</p>
+        <div class="img-list-box">
+          <img v-for="(item,index) in infoData.data13" :key="index"
+               :src="item" @click="lookImg(index)">
+        </div>
+      </div>
+      <div class="bottom-max-big-box ">
+        <p class="title-p">通知记录</p>
+        <div class="table-max-big-box">
+          <el-table class="table-box" v-loading="loading" border :data="infoData.data14">
+            <el-table-column label="通知时间" prop="createTime" width="200" fixed show-overflow-tooltip>
+              <template slot-scope="scope">
+                <span>{{ parseTime(scope.row.createTime) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="通知方式" prop="content" width="180" fixed show-overflow-tooltip/>
+            <el-table-column label="报警级别" prop="name" width="120" show-overflow-tooltip/>
+            <el-table-column label="通知人" prop="content" show-overflow-tooltip/>
+          </el-table>
+        </div>
+      </div>
+      <div class="bottom-max-big-box">
+        <p class="title-p">预警处理</p>
+        <div class="text-max-box" v-if="infoData.infoType != 1">
+          <div class="text-left-box">
+            <p>报警时间:</p>
+            <p>{{infoData.data15}}</p>
+          </div>
+          <div class="text-center-box">
+            <p>预警类型:</p>
+            <p>{{infoData.data16}}</p>
+          </div>
+          <div class="text-right-box">
+            <p>实验室负责人:</p>
+            <p>{{infoData.data17}}</p>
+          </div>
+        </div>
+        <div class="text-max-big-box" v-if="infoData.infoType != 1">
+          <div class="text-box">
+            <p>处理备注:</p>
+            <p>{{infoData.data18}}</p>
+          </div>
+        </div>
+        <div class="form-max-box" v-if="infoData.infoType == 1">
+          <div class="text-max-box">
+            <div class="text-left-box">
+              <p>处理方式:</p>
+              <p>手动处理</p>
+            </div>
+          </div>
+          <el-form :model="infoDataForm" ref="form" label-width="0">
+            <el-form-item label="" prop="name">
+              <span style="font-size:16px;">处理备注:</span>
+              <el-input v-model="infoDataForm.name" placeholder="请输入名称" maxLength="70" style="width:1335px;"></el-input>
+            </el-form-item>
+          </el-form>
+          <div class="button-bottom-box">
+            <p></p>
+            <p class="page-submit-common-style-button" @click="submitForm">处理</p>
+            <p></p>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--全屏视图组件-->
+    <fullScreenView :fullScreenViewProps="infoData.data13" ref="fullScreenView"></fullScreenView>
+  </div>
+</template>
+
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import fullScreenView from "@/components/fullScreenView/fullScreenView.vue";
+  export default {
+    name: 'infoPage',
+    components: {
+      fullScreenView,
+    },
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        showType:false,
+        infoData:{
+          infoType:1,
+          data1:'2023-05-27 14:46:18',
+          data2:'化学品',
+          data3:'李苗苗-13255668899、李苗苗-13255668899',
+          data4:'学员名称',
+          data5:'实验室名称(房间号)',
+          data6:'李苗苗-13255668899、李苗苗-13255668899',
+          data7:'【化学品预警】化学品名称(编码)-违规携带离开实验室名称(房间号),请尽快确认!',
+          data8:'2023-05-27 14:46:18',
+          data9:'500ml/瓶',
+          data10:'化学品柜-柜门-柜层',
+          data11:'300ml',
+          data12:'姓名-联系电话',
+          data13:[
+            'https://img1.baidu.com/it/u=1422064840,2936115861&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500',
+            'https://img1.baidu.com/it/u=716638254,3920932970&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500',
+            'https://img2.baidu.com/it/u=2537370952,3446004972&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500',
+            'https://img2.baidu.com/it/u=2312383180,3750420672&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800',
+          ],
+          data14:[],
+          data15:'归还操作',
+          data16:'姓名-联系电话',
+          data17:'2023-05-27 14:46:18',
+          data18:'手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容手动处理输入的备注内容'
+        },
+        infoDataForm:{
+          remark:"",
+        },
+      }
+    },
+    created(){
+      this.initialize();
+    },
+    mounted(){
+
+    },
+    methods:{
+      //初始化
+      initialize(){
+        // this.$set(this,'showType',this.propsData.showType);
+        // if(this.propsData.id){
+        //   let obj = {
+        //     id:this.propsData.id,
+        //     name:this.propsData.name,
+        //   };
+        //   this.$set(this,'infoData',obj);
+        // }else{
+        //   this.$set(this,'infoData',{
+        //     name:"",
+        //   });
+        // }
+      },
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(4);
+      },
+      /** 提交按钮 */
+      submitForm() {
+
+      },
+      // 照片预览
+      lookImg(index){
+        this.$refs['fullScreenView'].initialize(index);
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .earlyWarningEvent-infoPage{
+    .content-box{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      .top-max-big-box , .bottom-max-big-box{
+        padding:25px 80px;
+        .title-p{
+          line-height:48px;
+          font-size:16px;
+          font-weight: 700;
+          color:#333;
+        }
+        .text-max-box{
+          display: flex;
+          .text-left-box{
+            width:390px;
+            display: flex;
+            padding:16px 0;
+            p{
+              font-size:16px;
+              line-height:24px;
+              /*单行省略号*/
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+            p:nth-child(1){
+              width:80px;
+              text-align: right;
+            }
+            p:nth-child(2){
+              flex:1;
+            }
+          }
+          .text-center-box{
+            width:410px;
+            display: flex;
+            padding:16px 0;
+            p{
+              font-size:16px;
+              line-height:24px;
+              /*单行省略号*/
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+            p:nth-child(1){
+              width:90px;
+              text-align: right;
+            }
+            p:nth-child(2){
+              flex:1;
+            }
+          }
+          .text-right-box{
+            width:610px;
+            display: flex;
+            padding:16px 0;
+            p{
+              font-size:16px;
+              line-height:24px;
+              /*单行省略号*/
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+            p:nth-child(1){
+              width:120px;
+              text-align: right;
+            }
+            p:nth-child(2){
+              flex:1;
+            }
+          }
+        }
+        .text-max-big-box{
+          display: flex;
+          .text-box{
+            flex: 1;
+            display: flex;
+            padding:16px 0;
+            p{
+              font-size:16px;
+              line-height:24px;
+              /*单行省略号*/
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+            p:nth-child(1){
+              width:80px;
+              text-align: right;
+            }
+            p:nth-child(2){
+              flex:1;
+            }
+          }
+        }
+        .img-list-box{
+          padding-top:12px;
+          img{
+            cursor: pointer;
+            display:inline-block;
+            width:130px;
+            height:130px;
+            margin-right:10px;
+            margin-bottom:10px;
+          }
+        }
+        .table-max-big-box{
+          padding:12px 0;
+          height:260px!important;
+          display: flex;
+          flex-direction: column;
+        }
+        .button-bottom-box{
+          display: flex;
+          p:nth-child(1){
+            flex:1;
+          }
+          p:nth-child(2){
+            width:100px;
+          }
+          p:nth-child(3){
+            flex:1;
+          }
+        }
+      }
+      .top-max-big-box{
+        position: relative;
+        .top-position-p{
+          position: absolute;
+          top:0;
+          right:0;
+          width:100px;
+          height:40px;
+          border-bottom-left-radius:20px;
+          background-color: #FFA200;
+          color:#fff;
+          font-size:16px;
+          text-align: center;
+          line-height:40px;
+        }
+        .position-type{
+          background-color: #0183FA;
+        }
+      }
+      .bottom-max-big-box{
+        border-top:20px solid #F5F5F5;
+      }
+    }
+  }
+</style>

+ 251 - 0
src/views/integratedManagement/personnelManage/researchGroupManage/addPage.vue

@@ -0,0 +1,251 @@
+<template>
+  <div class="page-container researchGroupManage-addPage">
+    <div class="page-top-title-box">
+      <p class="page-top-title-name-p">{{addForm.id?'编辑课题组':'新增课题组'}}</p>
+      <p class="page-top-title-out-p" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <el-form class="add-form-box" :model="addForm" ref="form" :rules="rules" label-width="160px">
+        <div style="display: flex">
+          <el-form-item label="课题名称:" prop="data1">
+            <el-input v-model="addForm.data1" placeholder="请输入课题名称" maxLength="20" style="width:1260px;"></el-input>
+          </el-form-item>
+          <el-form-item label="" prop="data2" class="page-switch" label-width="40px">
+            <el-switch
+              :active-value="true"
+              :inactive-value="false"
+              active-color="#0183FA"
+              inactive-color="#999"
+              v-model="addForm.data2"
+              active-text="启用"
+              inactive-text="停用"
+            ></el-switch>
+          </el-form-item>
+        </div>
+        <div style="display: flex">
+          <el-form-item label="课题负责人:" prop="data3">
+            <el-select
+              style="width:600px;"
+              v-model="addForm.data3"
+              filterable
+              remote
+              reserve-keyword
+              placeholder="搜索选择课题负责人"
+              :remote-method="userSelectList">
+              <el-option
+                v-for="item in optionsUser"
+                :key="item.userId"
+                :label="item.userName"
+                :value="item.userId">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="手机号码:" label-width="170px" prop="data4">
+            <el-input
+              style="width:600px;"
+              maxlength="11"
+              v-model="addForm.data4"
+              placeholder="未填写"
+              onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')"
+            />
+          </el-form-item>
+        </div>
+        <div class="add-form-title-box">
+          <p class="left-num-p">成员列表({{maxUserNum}})</p>
+          <p class="null-p"></p>
+          <p class="page-submit-common-style-button right-button-p"
+             @click="tableButton(1)"
+          >+  添加成员</p>
+        </div>
+        <div class="page-content-box">
+          <el-table class="table-box" border :data="dataList">
+            <el-table-column label="序号" prop="name"  show-overflow-tooltip/>
+            <el-table-column label="姓名" prop="content" width="180" show-overflow-tooltip/>
+            <el-table-column label="联系电话" prop="content" width="230" show-overflow-tooltip/>
+            <el-table-column label="所属部门" prop="content" width="470" show-overflow-tooltip/>
+            <el-table-column label="状态" prop="state" width="200" show-overflow-tooltip>
+              <template slot-scope="scope">
+                <el-switch
+                  class="switch captcha-img"
+                  :active-value="true"
+                  :inactive-value="false"
+                  active-color="#0183FA"
+                  inactive-color="#999"
+                  v-model="scope.row.state"
+                  active-text="启用"
+                  inactive-text="停用"
+                ></el-switch>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="200" show-overflow-tooltip>
+              <template slot-scope="scope">
+                <div class="table-button-box">
+                  <p class="table-button-null"></p>
+                  <p class="table-button-p"
+                     @click="tableButton(3,scope.row)"
+                  >删除</p>
+                  <p class="table-button-null"></p>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <pagination :page-sizes="[20, 30, 40, 50]"
+                      v-show="total>0"
+                      :total="total"
+                      :page.sync="queryParams.page"
+                      :limit.sync="queryParams.pageSize"
+                      @pagination="getList"
+          />
+        </div>
+      </el-form>
+    </div>
+    <div class="page-bottom-button-box">
+      <p class="page-bottom-button-null-p"></p>
+      <p class="page-bottom-button-submit-p" @click="submitForm">提交</p>
+      <p class="page-bottom-button-null-p"></p>
+    </div>
+    <user-dialog ref="userDialog"></user-dialog>
+  </div>
+</template>
+
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import { systemUserSelectUser } from "@/api/commonality/permission";
+  import userDialog from "./userDialog.vue";
+  export default {
+    name: 'addPage',
+    components: {
+      userDialog
+    },
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        showType:false,
+        optionsUser:[],
+        addForm:{},
+        rules:{
+          data1: [
+            { required: true, message: "请输入课题名称", trigger: "blur" },
+            { required: true, message: "请输入课题名称", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data3: [
+            { required: true, message: "搜索选择课题负责人", trigger: "blur" },
+            { required: true, message: "搜索选择课题负责人", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          data4: [
+            { required: true, message: "请输入手机号码", trigger: "blur" },
+            { validator: this.checkPhone, trigger: 'blur' },
+            { required: true, message: "请输入手机号码", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+        },
+        queryParams:{
+          page:1,
+          pageSize:20,
+        },
+        //列表数据
+        dataList:[{}],
+        //数据数量
+        total:0,
+        maxUserNum:999,
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+
+    },
+    methods:{
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(6);
+      },
+      getList(){
+
+      },
+      //操作按钮
+      tableButton(type,row){
+        let self = this;
+        if(type == 1){
+          //新增
+          this.$refs['userDialog'].userDialogOpen();
+        }else if(type == 2){
+          //启用停用
+        }else if(type == 3){
+          //删除
+        }
+      },
+      /** 提交按钮 */
+      submitForm() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+
+          }
+        })
+      },
+      //人员查询
+      userSelectList(query) {
+        if (query !== '' && query.length>1) {
+          systemUserSelectUser({"userName":query,'userType':'1'}).then(response => {
+            this.$set(this,'optionsUser',response.data);
+          });
+        } else {
+          this.$set(this,'optionsUser',[]);
+        }
+      },
+      //手机号验证
+      checkPhone(rule, value, callback) {
+        if (!value) {
+          return callback(new Error('不能为空'))
+        } else {
+          const reg = /^1[3|4|5|7|8|9][0-9]\d{8}$/
+          if (reg.test(value)) {
+            callback()
+          } else {
+            return callback(new Error('请输入正确的手机号码'))
+          }
+        }
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .researchGroupManage-addPage{
+    .content-box{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      padding:40px 0 20px;
+      overflow: hidden;
+      .add-form-box{
+        flex:1;
+        display: flex;
+        flex-direction: column;
+        overflow: hidden;
+        .add-form-title-box{
+          padding:20px 52px 20px;
+          display: flex;
+          .left-num-p{
+            line-height:40px;
+            font-size:16px;
+          }
+          .null-p{
+            flex:1;
+          }
+          .right-button-p{
+            width:120px;
+            margin-right:300px;
+          }
+        }
+        .page-content-box{
+          padding:0 52px;
+        }
+      }
+    }
+  }
+</style>

+ 251 - 0
src/views/integratedManagement/personnelManage/researchGroupManage/index.vue

@@ -0,0 +1,251 @@
+<!-- 课题组管理 -->
+<template>
+  <div class="app-container researchGroupManage">
+    <div class="page-container researchGroupManagePage" v-if="pageType === 1">
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="queryParamsData1">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.queryParamsData1"
+              placeholder="请输入"
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-form-item label="状态" prop="queryParamsData2">
+            <el-select v-model="queryParams.queryParamsData2" placeholder="请选择" style="width: 200px">
+              <el-option
+                v-for="dict in optionList"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="部门" prop="queryParamsData3">
+            <el-select v-model="queryParams.queryParamsData3" placeholder="请选择" style="width: 200px">
+              <el-option
+                v-for="dict in sectionOptionList"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+          <p class="page-add-common-style-button"
+             style="float: right;"
+             @click="tableButton(1)"
+             v-hasPermiRouter="['demo:demo:add']"
+          >新增</p>
+          <el-form-item style="float: right;">
+            <import-component :importConfig="importConfig" v-hasPermiRouter="['demo:demo:demo']"></import-component>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table-column label="课题组" prop="name"  show-overflow-tooltip/>
+          <el-table-column label="负责人" prop="content" width="180" show-overflow-tooltip/>
+          <el-table-column label="联系电话" prop="content" width="150" show-overflow-tooltip/>
+          <el-table-column label="所属部门" prop="content" width="150" show-overflow-tooltip/>
+          <el-table-column label="成员数" prop="content" width="100" show-overflow-tooltip/>
+          <el-table-column label="状态" prop="state" width="135" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <el-switch
+                @click.native="tableButton(5,scope.row)"
+                class="switch captcha-img"
+                :active-value="true"
+                :inactive-value="false"
+                active-color="#0183FA"
+                inactive-color="#999"
+                v-model="scope.row.state"
+                active-text="启用"
+                inactive-text="停用"
+                disabled
+              ></el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column label="创建时间" prop="createTime" width="180" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="创建人" prop="content" width="150" show-overflow-tooltip/>
+          <el-table-column label="操作" width="200" show-overflow-tooltip v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="tableButton(2,scope.row)"
+                   v-hasPermiRouter="['demo:demo:detail']"
+                >成员</p>
+                <p class="table-button-p"
+                   @click="tableButton(3,scope.row)"
+                   v-hasPermiRouter="['demo:demo:edit']"
+                >编辑</p>
+                <p class="table-button-p"
+                   @click="tableButton(4,scope.row)"
+                   v-hasPermiRouter="['demo:demo:del']"
+                >删除</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.page"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <add-page :propsData="propsData" v-if="pageType === 2"></add-page>
+    <list-page :propsData="propsData" v-if="pageType === 3"></list-page>
+  </div>
+</template>
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import importComponent from "@/components/importComponent/importComponent.vue";
+  import addPage from "./addPage.vue";
+  import listPage from "./listPage.vue";
+  export default {
+    name: 'index',
+    components: {
+      importComponent,
+      addPage,
+      listPage,
+    },
+    data () {
+      return {
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        //页面状态
+        pageType:1,
+        //页面遮罩
+        loading:false,
+        //导入设置
+        importConfig:{
+          upLoadApi:'/system/user/student/importData',                //上传接口地址
+          downloadApi:'/system/user/student/importTemplate',          //下载模板接口地址
+          loseApi:'/system/user/student/importErrorData',             //失败报表接口地址
+          fileName:'导入模板-',                                   //下载模板命名
+        },
+        //状态
+        optionList:[{value:true,label:'启用'},{value:false,label:'停用'}],
+        //部门列表
+        sectionOptionList:[],
+        //查询条件
+        queryParams:{
+          page:1,
+          pageSize:20,
+          queryParamsData1:"",
+          queryParamsData2 :null,
+          queryParamsData3 :null,
+        },
+        //列表数据
+        dataList:[{}],
+        //数据数量
+        total:0,
+        //组件传参
+        propsData:{},
+      }
+    },
+    created () {
+
+    },
+    mounted () {
+      //this.getList();
+    },
+    methods: {
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'page',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'queryParams',{
+          page:1,
+          pageSize:20,
+          queryParamsData1:"",
+          queryParamsData2 :null,
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        // this.$set(this,'loading',true);
+        // getListFunction(this.queryParams).then(response => {
+        //   this.$set(this,'loading',false);
+        //   this.$set(this,'dataList',response.data.records);
+        //   this.$set(this,'total',response.data.total);
+        // });
+      },
+      //操作按钮
+      tableButton(type,row){
+        let self = this;
+        if(type == 1){
+          //新增
+          this.$set(this,'pageType',2);
+          this.$set(this,'propsData',{});
+        }else if(type == 2){
+          //成员列表
+          this.$set(this,'pageType',3);
+          let obj = JSON.parse(JSON.stringify(row))
+          obj.showType = true;
+          this.$set(this,'propsData',obj);
+        }else if(type == 3){
+          //编辑
+          this.$set(this,'pageType',2);
+          let obj = JSON.parse(JSON.stringify(row))
+          obj.showType = false;
+          this.$set(this,'propsData',obj);
+        }else if(type == 4){
+          //删除
+          this.$confirm('是否确认删除?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+          }).then(() => {
+            deleteFunction({id:row.id}).then(response => {
+              self.msgSuccess(response.message)
+              self.getList();
+            });
+          }).catch(() => {});
+        }else if(type == 5){
+          //启用&停用
+          let text = row.state  ? "停用" : "启用";
+          this.$confirm('是否确认' + text + '?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+          }).then(() => {
+            stateFunction({id:row.id,state:!row.state,}).then(response => {
+              self.msgSuccess(response.message)
+              self.getList();
+            });
+          }).catch(() => {});
+        }else if(type == 6){
+          //返回并刷新
+          this.$set(this,'pageType',1);
+          this.getList();
+        }
+      },
+    },
+  }
+</script>
+<style scoped lang="scss">
+  .researchGroupManage{
+    .researchGroupManagePage{
+
+    }
+  }
+</style>

+ 178 - 0
src/views/integratedManagement/personnelManage/researchGroupManage/listInfoPage.vue

@@ -0,0 +1,178 @@
+<template>
+  <div class="page-container researchGroupManage-listInfoPage">
+    <div class="page-top-title-box">
+      <p class="page-top-title-name-p">成员详情</p>
+      <p class="page-top-title-out-p" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <div class="left-content-box">
+        <img v-if="userData.img" src="@/assets/ZDimages/basicsModules/tx_cion_one.png" alt="">
+        <img v-else :src="userData.img" alt="">
+      </div>
+      <div class="right-content-box">
+        <div class="form-box">
+          <div class="form-min-box">
+            <p>姓名:</p>
+            <p>{{userData.data1}}</p>
+          </div>
+          <div class="form-min-box">
+            <p>性别:</p>
+            <p>{{userData.data2}}</p>
+          </div>
+          <div class="form-min-box">
+            <p>{{userData.userType == 1?'工号':'学号'}}:</p>
+            <p>{{userData.data3}}</p>
+          </div>
+        </div>
+        <div class="form-box">
+          <div class="form-min-box">
+            <p>所属部门:</p>
+            <p>{{userData.data4}}</p>
+          </div>
+          <div class="form-min-box">
+            <p>身份:</p>
+            <p>{{userData.data5}}</p>
+          </div>
+          <div class="form-min-box">
+            <p>手机号码:</p>
+            <p>{{userData.data6}}</p>
+          </div>
+        </div>
+        <div class="form-box">
+          <div class="form-min-box">
+            <p>职称:</p>
+            <p>{{userData.data7}}</p>
+          </div>
+          <div class="form-min-box">
+            <p>邮箱:</p>
+            <p>{{userData.data8}}</p>
+          </div>
+          <div class="form-min-box">
+            <p>校园卡号:</p>
+            <p>{{userData.data9}}</p>
+          </div>
+        </div>
+        <div class="form-box">
+          <div class="form-min-box">
+            <p>文化程度:</p>
+            <p>{{userData.data10}}</p>
+          </div>
+          <div class="form-min-box">
+            <p>出生日期:</p>
+            <p>{{userData.data11}}</p>
+          </div>
+        </div>
+        <div class="form-box">
+          <div class="form-big-box">
+            <p>所属课题组:</p>
+            <p>{{userData.data12}}</p>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  export default {
+    name: 'listInfoPage',
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        userData:{
+          img:false,
+          userType:1,
+          data1:'内容内容内容内容内容内容内容内容内容',
+        },
+      }
+    },
+    created(){
+    },
+    mounted(){
+
+    },
+    methods:{
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(3);
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .researchGroupManage-listInfoPage{
+    .content-box{
+      flex:1;
+      display: flex;
+      .left-content-box{
+        img{
+          width:100px;
+          height:120px;
+          margin:42px 10px 0 80px;
+        }
+      }
+      .right-content-box{
+        padding-top:42px;
+        .form-box{
+          display: flex;
+          .form-min-box{
+            display: flex;
+            margin-bottom:20px;
+            p{
+              font-size:16px;
+            }
+            p:nth-child(1){
+              width:174px;
+              text-align: right;
+              margin-right:14px;
+              line-height:40px;
+            }
+            p:nth-child(2){
+              border-radius:4px;
+              width:250px;
+              padding:0 13px;
+              height:40px;
+              line-height:40px;
+              background-color: #F5F5F5;
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+          }
+          .form-big-box{
+            display: flex;
+            margin-bottom:20px;
+            p{
+              font-size:16px;
+            }
+            p:nth-child(1){
+              width:174px;
+              text-align: right;
+              margin-right:14px;
+              line-height:40px;
+            }
+            p:nth-child(2){
+              border-radius:4px;
+              width:688px;
+              padding:0 13px;
+              height:40px;
+              line-height:40px;
+              background-color: #F5F5F5;
+              display:block;
+              overflow:hidden;
+              text-overflow:ellipsis;
+              white-space:nowrap;
+            }
+          }
+        }
+      }
+    }
+  }
+</style>

+ 207 - 0
src/views/integratedManagement/personnelManage/researchGroupManage/listPage.vue

@@ -0,0 +1,207 @@
+<template>
+  <div class="page-container researchGroupManage-listPage">
+    <div class="researchGroupManage-listPage-min" v-if="pageType == 1">
+      <div class="page-top-title-box">
+        <p class="page-top-title-name-p">{{newData.researchGroupName}}</p>
+        <p class="page-top-title-out-p" @click="backPage">返回</p>
+      </div>
+      <div class="page-form-title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="关键字" prop="queryParamsData1">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.queryParamsData1"
+              placeholder="请输入"
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-form-item label="状态" prop="queryParamsData2">
+            <el-select v-model="queryParams.queryParamsData2" placeholder="请选择" style="width: 200px">
+              <el-option
+                v-for="dict in optionList"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="部门" prop="queryParamsData3">
+            <el-select v-model="queryParams.queryParamsData3" placeholder="请选择" style="width: 200px">
+              <el-option
+                v-for="dict in sectionOptionList"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <p class="page-inquire-common-style-button" @click="handleQuery">查询</p>
+          <p class="page-reset-common-style-button" @click="resetQuery">重置</p>
+          <p style="float: right;line-height:40px;font-size:16px;color:#0045AF;">成员数:{{newData.userNun}}</p>
+        </el-form>
+      </div>
+      <div class="page-content-box">
+        <el-table class="table-box" v-loading="loading" border :data="dataList">
+          <el-table-column label="姓名" prop="name"  show-overflow-tooltip/>
+          <el-table-column label="身份" prop="content" width="250" show-overflow-tooltip/>
+          <el-table-column label="手机号码" prop="content" width="300" show-overflow-tooltip/>
+          <el-table-column label="所属部门" prop="content" width="250" show-overflow-tooltip/>
+          <el-table-column label="状态" prop="state" width="200" show-overflow-tooltip>
+            <template slot-scope="scope">
+              <el-switch
+                @click.native="tableButton(2,scope.row)"
+                class="switch captcha-img"
+                :active-value="true"
+                :inactive-value="false"
+                active-color="#0183FA"
+                inactive-color="#999"
+                v-model="scope.row.state"
+                active-text="启用"
+                inactive-text="停用"
+                disabled
+              ></el-switch>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="200" show-overflow-tooltip v-if="tableButtonType">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p"
+                   @click="tableButton(1,scope.row)"
+                   v-hasPermiRouter="['demo:demo:detail']"
+                >详情</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.page"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <list-info-page v-if="pageType == 2"></list-info-page>
+  </div>
+</template>
+
+<script>
+  //import { getDicts } from "@/api/commonality/noPermission";
+  //import { systemUserSelect } from "@/api/commonality/permission";
+  //import { getInfo } from "@/api/basicsModules/index";
+  import listInfoPage from "./listInfoPage.vue";
+  export default {
+    name: 'listPage',
+    components: {
+      listInfoPage,
+    },
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+        tableButtonType:this.hasPermiDom(['demo:demo:detail','demo:demo:edit','demo:demo:del',]),
+        pageType:1,
+        //状态
+        optionList:[{value:true,label:'启用'},{value:false,label:'停用'}],
+        //部门列表
+        sectionOptionList:[],
+        newData:{
+          researchGroupName:"课题组名称等待传参",
+          userNun:"999"
+        },
+        //查询条件
+        queryParams:{
+          page:1,
+          pageSize:20,
+          queryParamsData1:"",
+          queryParamsData2 :null,
+          queryParamsData3 :null,
+        },
+        //列表数据
+        dataList:[{}],
+        //数据数量
+        total:0,
+      }
+    },
+    created(){
+      this.initialize();
+    },
+    mounted(){
+
+    },
+    methods:{
+      tableButton(type,row){
+        let self = this;
+        if(type == 1){
+          //详情
+          this.$set(this,'pageType',2);
+        }else if(type == 2){
+          //启用&停用
+          let text = row.state  ? "停用" : "启用";
+          this.$confirm('是否确认' + text + '?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+          }).then(() => {
+            stateFunction({id:row.id,state:!row.state,}).then(response => {
+              self.msgSuccess(response.message)
+              self.getList();
+            });
+          }).catch(() => {});
+        }else if(type == 3){
+          this.$set(this,'pageType',1);
+        }
+      },
+      // 返回按钮
+      backPage(){
+        this.$parent.tableButton(6);
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'page',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'queryParams',{
+          page:1,
+          pageSize:20,
+          queryParamsData1:"",
+          queryParamsData2 :null,
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        // this.$set(this,'loading',true);
+        // getListFunction(this.queryParams).then(response => {
+        //   this.$set(this,'loading',false);
+        //   this.$set(this,'dataList',response.data.records);
+        //   this.$set(this,'total',response.data.total);
+        // });
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .researchGroupManage-listPage{
+    .researchGroupManage-listPage-min{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      .page-form-title-box{
+        border:none!important;
+      }
+      .page-content-box{
+        padding-top:0;
+      }
+    }
+  }
+</style>

+ 326 - 0
src/views/integratedManagement/personnelManage/researchGroupManage/userDialog.vue

@@ -0,0 +1,326 @@
+<template>
+  <el-dialog class="researchGroupManage-userDialog"
+             :close-on-click-modal="false"
+             title="选择成员" :visible.sync="userDialogType" v-if="userDialogType"
+             @close="userDialogOff" width="1573px" append-to-body>
+    <div class="user-dialog-max-big-box">
+      <div class="user-dialog-max-left-box">
+        <div class="title-top-box">
+          <p>待选人员</p>
+          <p>{{leftCheckNum}}/{{leftMaxUserNum}}</p>
+        </div>
+        <div class="table-max-big-box">
+          <div class="page-form-title-box">
+            <el-form :model="leftQueryParams" class="form-box" ref="queryForm"
+                     :inline="true" style="width:100%;">
+              <el-form-item label="" prop="queryParamsData1">
+                <el-input
+                  maxLength="30"
+                  v-model="leftQueryParams.queryParamsData1"
+                  placeholder="搜索姓名/学号/手机号/实验室"
+                  style="width: 220px"
+                />
+              </el-form-item>
+              <el-form-item label="" prop="queryParamsData3">
+                <el-select v-model="leftQueryParams.queryParamsData2" placeholder="部门" style="width: 140px">
+                  <el-option
+                    v-for="dict in sectionOptionList"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="" prop="queryParamsData3">
+                <el-select v-model="leftQueryParams.queryParamsData3" placeholder="类型" style="width: 100px">
+                  <el-option
+                    v-for="dict in classOptionList"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <p class="page-inquire-common-style-button" @click="leftHandleQuery">查询</p>
+              <p class="page-reset-common-style-button" @click="leftResetQuery">重置</p>
+            </el-form>
+          </div>
+          <div class="page-content-box">
+            <el-table class="table-box" border :data="leftDataList" @selection-change="userChangeLeft" :row-key="getRowKeys">
+              <el-table-column type="selection" width="50" :reserve-selection="true" align="center"/>
+              <el-table-column label="姓名" prop="name"  show-overflow-tooltip/>
+              <el-table-column label="联系电话" prop="phone" width="150" show-overflow-tooltip/>
+              <el-table-column label="所在部门" prop="section" width="220" show-overflow-tooltip/>
+            </el-table>
+            <pagination :page-sizes="[10, 20]"
+                        v-show="leftTotal>0"
+                        :total="leftTotal"
+                        :page.sync="leftQueryParams.page"
+                        :limit.sync="leftQueryParams.pageSize"
+                        @pagination="leftGetList"
+            />
+          </div>
+        </div>
+      </div>
+      <div class="user-dialog-max-center-box">
+        <p class="el-icon-arrow-right"></p>
+        <p class="el-icon-arrow-left"></p>
+      </div>
+      <div class="user-dialog-max-right-box">
+        <div class="title-top-box">
+          <p>待选人员</p>
+          <p>{{rightCheckNum}}/{{rightMaxUserNum}}</p>
+        </div>
+        <div class="table-max-big-box">
+          <div class="page-form-title-box">
+            <el-form :model="rightQueryParams" class="form-box" ref="queryForm"
+                     :inline="true" style="width:100%;">
+              <el-form-item label="" prop="queryParamsData1">
+                <el-input
+                  maxLength="30"
+                  v-model="rightQueryParams.queryParamsData1"
+                  placeholder="搜索姓名/学号/手机号/实验室"
+                  style="width: 220px"
+                />
+              </el-form-item>
+              <el-form-item label="" prop="queryParamsData3">
+                <el-select v-model="rightQueryParams.queryParamsData2" placeholder="部门" style="width: 140px">
+                  <el-option
+                    v-for="dict in sectionOptionList"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="" prop="queryParamsData3">
+                <el-select v-model="rightQueryParams.queryParamsData3" placeholder="类型" style="width: 100px">
+                  <el-option
+                    v-for="dict in classOptionList"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+              <p class="page-inquire-common-style-button" @click="rightHandleQuery">查询</p>
+              <p class="page-reset-common-style-button" @click="rightResetQuery">重置</p>
+            </el-form>
+          </div>
+          <div class="page-content-box">
+            <el-table class="table-box" border :data="rightDataList" @selection-change="userChangeRight" :row-key="getRowKeys">
+              <el-table-column type="selection" width="50" :reserve-selection="true" align="center"/>
+              <el-table-column label="姓名" prop="name"  show-overflow-tooltip/>
+              <el-table-column label="联系电话" prop="phone" width="150" show-overflow-tooltip/>
+              <el-table-column label="所在部门" prop="section" width="220" show-overflow-tooltip/>
+            </el-table>
+            <pagination :page-sizes="[10, 20]"
+                        v-show="rightTotal>0"
+                        :total="rightTotal"
+                        :page.sync="rightQueryParams.page"
+                        :limit.sync="rightQueryParams.pageSize"
+                        @pagination="rightGetList"
+            />
+          </div>
+        </div>
+      </div>
+    </div>
+    <div slot="footer" class="dialog-footer dialog-footer-box" style="display: flex">
+      <p class="dialog-footer-button-null"></p>
+      <p class="dialog-footer-button-info" @click="userDialogOff">取消</p>
+      <p class="dialog-footer-button-primary" @click="dialogSubmit">确认</p>
+      <p class="dialog-footer-button-null"></p>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+
+  export default {
+    name: 'addDialog',
+    props:{
+      addDialogData:{},
+    },
+    data(){
+      return{
+        userDialogType:false,
+        //左侧数据
+        leftQueryParams:{
+          page:1,
+          pageSize:20,
+          leftQueryParamsData1:null,
+          leftQueryParamsData2:null,
+          leftQueryParamsData3:null,
+        },
+        leftDataList:[
+          {userId:'1',name:'名称',phone:'电话',section:'部门1'}
+        ],
+        leftTotal:10,
+        leftCheckNum:0,
+        leftMaxUserNum:0,
+        leftCheckUserIds:[],
+        //右侧数据
+        rightQueryParams:{
+          page:1,
+          pageSize:20,
+          rightQueryParamsData1:null,
+          rightQueryParamsData2:null,
+          rightQueryParamsData3:null,
+        },
+        rightDataList:[
+          {userId:'12',name:'名称',phone:'电话',section:'部门1'}
+        ],
+        rightTotal:10,
+        rightCheckNum:0,
+        rightMaxUserNum:0,
+        rightCheckUserIds:[],
+        //部门列表
+        sectionOptionList:[
+          {label:"部门名称一号",value:'1'},
+        ],
+        //类型列表
+        classOptionList:[
+          {label:"教职工",value:'1'},
+          {label:"学生",value:'2'},
+        ],
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+
+    },
+    methods:{
+      //开启
+      userDialogOpen(){
+        this.$set(this,'userDialogType',true);
+      },
+      //关闭
+      userDialogOff(){
+        this.$set(this,'userDialogType',false);
+      },
+      //提交
+      dialogSubmit(){
+
+      },
+      //左侧查询相关
+      leftHandleQuery(){
+
+      },
+      leftResetQuery(){
+
+      },
+      leftGetList(){
+
+      },
+      userChangeLeft(selection){
+        this.leftCheckNum = selection.length;
+        this.leftCheckUserIds = selection.map(item => item.userId);
+      },
+      //右侧查询相关
+      rightHandleQuery(){
+
+      },
+      rightResetQuery(){
+
+      },
+      rightGetList(){
+
+      },
+      userChangeRight(selection){
+        this.rightCheckNum = selection.length;
+        this.rightCheckUserIds = selection.map(item => item.userId);
+      },
+      /*===记录勾选数据===
+        需要再el-table 添加  :row-key="getRowKeys"
+        需要在selection 添加 :reserve-selection="true"
+      */
+      getRowKeys(row) {
+        return row.userId
+      },
+    }
+  }
+</script>
+
+<style lang="scss">
+  .researchGroupManage-userDialog{
+    .user-dialog-max-big-box{
+      display: flex;
+      padding:0 9px;
+      .user-dialog-max-left-box{
+        height:518px;
+        width:700px;
+        display: flex;
+        flex-direction: column;
+        .title-top-box{
+          height:40px;
+          display: flex;
+          background: rgba(1,131,250,0.1);
+          padding:0 48px 0 21px;
+          p{
+            color:#0183FA;
+            font-size:16px;
+            line-height:40px;
+          }
+          p:nth-child(2){
+            flex:1;
+            text-align: right;
+          }
+        }
+        .table-max-big-box{
+          display: flex;
+          flex-direction: column;
+          flex:1;
+          border:1px solid #E0E0E0;
+        }
+      }
+      .user-dialog-max-center-box{
+        width:74px;
+        display: flex;
+        flex-direction: column;
+        p{
+          cursor: pointer;
+          margin:0 22px 40px;
+          width:30px;
+          height:30px;
+          line-height: 30px;
+          text-align: center;
+          border-radius:50%;
+          background-color: #0183FA;
+          color:#fff;
+        }
+        p:nth-child(1){
+          margin-top:200px;
+        }
+      }
+      .user-dialog-max-right-box{
+        height:518px;
+        width:700px;
+        display: flex;
+        flex-direction: column;
+        .title-top-box{
+          height:40px;
+          display: flex;
+          background: rgba(1,131,250,0.1);
+          padding:0 48px 0 21px;
+          p{
+            color:#0183FA;
+            font-size:16px;
+            line-height:40px;
+          }
+          p:nth-child(2){
+            flex:1;
+            text-align: right;
+          }
+        }
+        .table-max-big-box{
+          display: flex;
+          flex-direction: column;
+          flex:1;
+          border:1px solid #E0E0E0;
+        }
+      }
+    }
+  }
+</style>

+ 2 - 2
src/views/iotDevice/intelligenceIot/iotHardware/addPage.vue

@@ -246,7 +246,7 @@
             subId:this.propsData.subjectId,
             remark:this.propsData.remark,
           });
-          let minData = JSON.parse(this.propsData.reservedField);
+          let minData = this.propsData.reservedField?JSON.parse(this.propsData.reservedField):{};
           laboratorySubRelInfoGetListByFloor({floorId:this.propsData.floorId}).then(response => {
             this.$set(this,'subOptions',response.data);
           })
@@ -336,7 +336,7 @@
           code:this.newData.code,
           state:this.newData.state,
           remark:this.newData.remark,
-          reservedField:type==1?JSON.stringify(this.$refs.forElFormItem.formData):'',
+          reservedField:type==1 ? (this.$refs.forElFormItem.formData?JSON.stringify(this.$refs.forElFormItem.formData):''):'',
         };
         //获取校区-楼栋-楼层数据
         for(let i=0;i<self.treeOptions.length;i++){

+ 67 - 9
src/views/serviceCenter/logManagement/systemLogs/index.vue

@@ -2,15 +2,25 @@
 <template>
   <div class="app-container systemLogs">
     <div class="page-container systemLogsPage" v-if="pageType == 1">
+      <div class="title-max-big-box">
+        <div :class="queryParams.logType == 1?'checkTitle':''" @click="titleButton(1)">
+          <p>登录日志</p>
+          <p></p>
+        </div>
+        <div :class="queryParams.logType == 2?'checkTitle':''" @click="titleButton(2)">
+          <p>操作日志</p>
+          <p></p>
+        </div>
+      </div>
       <div class="page-form-title-box">
         <el-form :model="queryParams" class="form-box" ref="queryForm" :inline="true">
-          <el-form-item label="日志类型" prop="logType" label-width="90px">
-            <el-select v-model="queryParams.logType" clearable placeholder="请选择" style="width: 200px">
-              <el-option label="登录" :value="1"></el-option>
-              <el-option label="操作" :value="2"></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="请求IP" prop="ipAddr">
+          <!--<el-form-item label="日志类型" prop="logType" label-width="90px">-->
+            <!--<el-select v-model="queryParams.logType" clearable placeholder="请选择" style="width: 200px">-->
+              <!--<el-option label="登录" :value="1"></el-option>-->
+              <!--<el-option label="操作" :value="2"></el-option>-->
+            <!--</el-select>-->
+          <!--</el-form-item>-->
+          <el-form-item label="请求IP" prop="ipAddr" label-width="60px">
             <el-input
               maxLength="30"
               v-model="queryParams.ipAddr"
@@ -109,7 +119,7 @@
         queryParams:{
           page:1,
           pageSize:20,
-          logType:"",
+          logType:"1",
           ipAddr:"",
           state:"",
         },
@@ -125,6 +135,19 @@
       this.getList();
     },
     methods:{
+      titleButton(type){
+        if(type != this.queryParams.logType){
+          this.$set(this,'dateRange',[])
+          this.$set(this,'queryParams',{
+            page:1,
+            pageSize:20,
+            logType:type,
+            ipAddr:"",
+            state:"",
+          });
+          this.getList();
+        }
+      },
       goPage(type){
         if(this.pageType!=type){
           this.$set(this,'pageType',type)
@@ -149,7 +172,7 @@
         this.$set(this,'queryParams',{
           page:1,
           pageSize:20,
-          logType:"",
+          logType:"1",
           state:"",
           ipAddr:"",
         });
@@ -179,6 +202,41 @@
 <style scoped lang="scss">
   .systemLogs{
     .systemLogsPage{
+      .title-max-big-box{
+        border-bottom:1px solid #dedede;
+        display: flex;
+        div{
+          width:80px;
+          height:80px;
+          margin-left:70px;
+          cursor: pointer;
+          p{
+            line-height:76px;
+          }
+          p:nth-child(1){
+            text-align: center;
+          }
+          p:nth-child(2){
+            width:80px;
+            height:4px;
+            border-radius:2px;
+          }
+        }
+        .checkTitle{
+          p:nth-child(1){
+            color:#0045AF;
+          }
+          p:nth-child(2){
+            background-color: #0045AF;
+          }
+        }
+      }
+      .page-form-title-box{
+        border:none;
+      }
+      .page-content-box{
+        padding-top:0;
+      }
     }
   }
 </style>

+ 1 - 1
src/views/serviceCenter/timingTask/index.vue

@@ -110,7 +110,7 @@
           status:null,
         },
         dateRange:[],
-        dataList:[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},],
+        dataList:[{}],
         total:110,
         //dialog弹层数据
         dialogTitle:"",

+ 2 - 0
src/views/systemManagement/publicConfig/basicsConfig.vue

@@ -236,6 +236,8 @@
       font-size: 16px;
       font-weight: 400;
       color: #CCCCCC;
+      border:1px dashed #CCCCCC;
+      border-radius:10px;
     }
     .avatar{
       width: 200px;

+ 112 - 74
src/views/systemManagement/publicConfig/chemicalsConfig.vue

@@ -3,20 +3,51 @@
   <div class="public-config-page">
     <el-form class="public-form-box scrollbar-box" :model="form" ref="form" :inline="true" :rules="rules" label-width="160px">
       <div class="form-max-box">
-        <el-form-item label="使用身份配置" prop="userType">
-          <el-checkbox-group v-model="form.userType">
-            <el-checkbox style="margin:4px 87px 0 20px;" label="11">教职工</el-checkbox>
-            <el-checkbox label="22">学生</el-checkbox>
-          </el-checkbox-group>
-
+        <el-form-item label="自动返回时间" prop="backTime">
+          <div class="form-flex-box">
+            <el-input-number v-model="form.backTime" style="width:150px;"
+                             :controls="false" :min="1" :max="3600">
+            </el-input-number>
+            <p class="form-flex-right-p">秒</p>
+          </div>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="自动注销时间" prop="signOutTime">
+          <div class="form-flex-box">
+            <el-input-number v-model="form.signOutTime" style="width:150px;"
+                             :controls="false" :min="1" :max="3600">
+            </el-input-number>
+            <p class="form-flex-right-p">秒</p>
+          </div>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="弹窗关闭时间" prop="offTime">
+          <div class="form-flex-box">
+            <el-input-number v-model="form.offTime" style="width:150px;"
+                             :controls="false" :min="1" :max="3600">
+            </el-input-number>
+            <p class="form-flex-right-p">秒</p>
+          </div>
         </el-form-item>
       </div>
       <div class="form-max-box">
-        <el-form-item label="扩展配置" prop="expandType">
-          <el-checkbox-group v-model="form.expandType">
-            <el-checkbox style="margin:4px 30px 0 20px;" label="11">化学品柜智能锁</el-checkbox>
-            <el-checkbox label="22">气瓶标签</el-checkbox>
-          </el-checkbox-group>
+        <el-form-item label="称重示意图" prop="weighHintPicture">
+          <el-upload
+            class="certificate-avatar-uploader"
+            :action="uploadImgUrl"
+            :show-file-list="false"
+            accept="image/jpeg,image/gif,image/png"
+            :on-success="(res)=>handleAvatarSuccess(res,'weighHintPicture')"
+            :headers="headers"
+            :before-upload="beforeAvatarUpload">
+            <img v-if="form.weighHintPicture" :src="form.weighHintPicture" class="avatar" >
+            <i v-if="!form.weighHintPicture" class="el-icon-plus avatar-uploader-icon">上传</i>
+          </el-upload>
+          <i v-if="form.weighHintPicture" class="el-icon-view" @click="fullScreenViewClick(form.weighHintPicture)"
+             style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;
+            height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
         </el-form-item>
       </div>
     </el-form>
@@ -35,31 +66,37 @@
 </template>
 
 <script>
+  import { getToken } from "@/utils/auth";
   import { getConfigByType } from "@/api/commonality/permission";
   import { addOrUpdate } from "@/api/systemManagement/index";
   export default {
     name: "publicConfig",
     data() {
       return {
+        uploadImgUrl: this.uploadUrl(), // 上传的图片服务器地址
+        headers: {
+          Authorization:getToken(),
+        },
         configId:null,
         form:{
-          userType:[],
-          expandType:[]
+          backTime:1,
+          signOutTime:1,
+          offTime:1,
+          weighHintPicture:"",
         },
         rules: {
-
-          userType: [
-            { required: true, message: "请配置使用身份", trigger: "blur" }
+          backTime: [
+            { required: true, message: "请输入自动返回时间", trigger: "blur" }
+          ],
+          signOutTime: [
+            { required: true, message: "请输入自动注销时间", trigger: "blur" }
           ],
-          smartLock: [
-            { required: true, message: "请配置智能锁", trigger: "blur" }
+          offTime: [
+            { required: true, message: "请输入弹窗关闭时间", trigger: "blur" }
           ],
-          airBottle: [
-            { required: true, message: "请配置气瓶标签", trigger: "blur" }
+          weighHintPicture: [
+            { required: true, message: "请上传称重示意图", trigger: "blur" }
           ],
-          expandType: [
-            { required: true, message: "请配置扩展配置", trigger: "blur" }
-          ]
         },
         imgUrl:"",
         imgOpen:false,
@@ -77,41 +114,12 @@
         let self = this;
         this.$refs["form"].validate(valid => {
           if (valid) {
-            let configValue = {}
-            //判断使用身份配置
-            if(self.form.userType[1]){
-              configValue.userType = '-1';
-            }else{
-              if(self.form.userType[0] == '11'){
-                configValue.userType = '11';
-              }else if(self.form.userType[0] == '22'){
-                configValue.userType = '22';
-              }
-            }
-            //判断扩展配置(智能锁配置/气瓶标签配置)
-            let oneType = 0;
-            let twoType = 0;
-            for(let i=0;i<self.form.expandType.length;i++){
-              if(self.form.expandType[i] == '11'){
-                configValue.smartLock = 1;
-                oneType++
-              }else if(self.form.expandType[i] == '22'){
-                configValue.airBottle = 1;
-                twoType++
-              }
-            }
-            if(oneType==0){
-              configValue.smartLock = 0;
-            }
-            if(twoType==0){
-              configValue.airBottle = 0;
-            }
             let obj = {
               id:this.configId,
               configName: "化学品终端配置",
               category:2,
               configKey:3,
-              configValue : JSON.stringify(configValue),
+              configValue : JSON.stringify(this.form),
             }
             addOrUpdate(obj).then(response => {
               this.msgSuccess(response.message);
@@ -130,30 +138,30 @@
         getConfigByType({ category: 2, configType: 3 }).then(response => {this.$set(
           this,'configId',response.data.id);
           let obj = JSON.parse(response.data.configValue)
-          //判断使用身份配置
-          let listOne = [];
-          if(obj.userType == -1){
-            listOne.push('11')
-            listOne.push('22')
-          }else if(obj.userType == 11){
-            listOne.push('11')
-          }else if(obj.userType == 22){
-            listOne.push('22')
-          }
-          this.$set(obj,'userType',listOne);
-          //判断扩展配置
-          let listTwo = [];
-          if(obj.smartLock == 1){
-            listTwo.push('11')
-          }
-          if(obj.airBottle == 1){
-            listTwo.push('22')
-          }
-          this.$set(obj,'expandType',listTwo);
+
           this.$set(this,'form',obj)
         });
       },
-
+      fullScreenViewClick(url){
+        this.$set(this,'fullScreenViewProps',[url]);
+        this.$refs['fullScreenView'].initialize();
+      },
+      //上传
+      handleAvatarSuccess(res,type) {
+        this.$set(this.form,'weighHintPicture',res.data.url);
+        this.$forceUpdate()
+      },
+      beforeAvatarUpload(file) {
+        let type = false;
+        console.log('file',file);
+        if (file.type == 'image/png' || file.type == 'image/jpeg' || file.type == 'image/gif') {
+          type = true;
+        }else{
+          this.$message.error('只能上传png/jpeg/gif格式图片');
+          type = false;
+        }
+        return type;
+      },
     },
   };
 </script>
@@ -200,6 +208,36 @@
     }
     .form-max-box{
       margin-top:20px;
+      .form-flex-box{
+        display: flex;
+        ::v-deep input{
+          border-top-right-radius: 0;
+          border-bottom-right-radius: 0;
+        }
+        .form-flex-right-p{
+          width:50px;
+          line-height:40px;
+          background-color: #E0E0E0;
+          text-align: center;
+          font-size:16px;
+          border-top-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+        }
+      }
+    }
+    .avatar-uploader-icon{
+      width: 200px;
+      height: 120px;
+      line-height: 120px;
+      font-size: 16px;
+      font-weight: 400;
+      color: #CCCCCC;
+      border:1px dashed #CCCCCC;
+      border-radius:10px;
+    }
+    .avatar{
+      width: 200px;
+      height: 120px;
     }
   }
 </style>

+ 158 - 12
src/views/systemManagement/publicConfig/exploitConfig.vue

@@ -151,6 +151,124 @@
         </el-form-item>
         <i class="tip"><i class="el-icon-question"></i>用于微信外部扫一扫跳转指引,需与微信小程序后台二维码规则配置一致</i>
       </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>Android端配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="安全准入检测环境:">
+          <el-input placeholder="请输入"  v-model="form.secureAccessEnvironment" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>安全准入相关的调用地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="api版本:">
+          <el-input placeholder="请输入"  v-model="form.apiVersions" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于对应后台服务版本</i>
+      </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>管控一体机配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="工程模式密码:">
+          <el-input placeholder="请输入"  v-model="form.controlMachinePassword" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于管控一体机</i>
+      </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>学习考试一体机配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="文件浏览环境:">
+          <el-input placeholder="请输入"  v-model="form.fileBrowseEnvironment" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>文件浏览相关的调用地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="工程模式密码:">
+          <el-input placeholder="请输入"  v-model="form.learnMachinePassword" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于学习考试一体机</i>
+      </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>电子信息牌配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="读卡器串口:">
+          <el-input placeholder="请输入"  v-model="form.cardReaderSerialPort" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于匹配读卡器</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="工程模式密码:">
+          <el-input placeholder="请输入"  v-model="form.informationBoardPassword" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于电子信息牌</i>
+      </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>化学品终端配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="电子秤串口:">
+          <el-input placeholder="请输入"  v-model="form.electronicScaleSerialport" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于匹配电子秤</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="刷卡/RFID串口:">
+          <el-input placeholder="请输入"  v-model="form.rfidSerialport" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于匹配刷卡/RFID</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="打印机串口:">
+          <el-input placeholder="请输入"  v-model="form.printerSerialport" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于匹配打印机</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="蓝牙称名称:">
+          <el-input placeholder="请输入"  v-model="form.bluetoothName" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于匹配蓝牙称</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="人脸识别环境:">
+          <el-input placeholder="请输入"  v-model="form.faceRecognitionEnvironment" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>人脸识别相关的调用地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="称重录像环境:">
+          <el-input placeholder="请输入"  v-model="form.videoRecordingEnvironment" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>称重录像相关的调用地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="工程模式密码:">
+          <el-input placeholder="请输入"  v-model="form.chemicalRerminalPassword" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于化学品终端</i>
+      </div>
     </el-form>
     <div class="page-bottom-button-box" v-hasPermiRouter="['system:conf:edit']">
       <p class="page-bottom-button-null-p"></p>
@@ -188,12 +306,26 @@
         this.$refs["form"].validate(valid => {
           if (valid) {
             let configValue = JSON.parse(JSON.stringify(this.form))
-            configValue.mqttExtranetUrl=Encrypt(configValue.mqttExtranetUrl)
-            configValue.mqttExtranetUser=Encrypt(configValue.mqttExtranetUser)
-            configValue.mqttExtranetPassword=Encrypt(configValue.mqttExtranetPassword)
-            configValue.mqttIntranetUrl=Encrypt(configValue.mqttIntranetUrl)
-            configValue.mqttIntranetUser=Encrypt(configValue.mqttIntranetUser)
-            configValue.mqttIntranetPassword=Encrypt(configValue.mqttIntranetPassword)
+            configValue.mqttExtranetUrl = configValue.mqttExtranetUrl ? Encrypt(configValue.mqttExtranetUrl) : '';
+            configValue.mqttExtranetUser = configValue.mqttExtranetUser ? Encrypt(configValue.mqttExtranetUser) : '';
+            configValue.mqttExtranetPassword = configValue.mqttExtranetPassword ? Encrypt(configValue.mqttExtranetPassword) : '';
+            configValue.mqttIntranetUrl = configValue.mqttIntranetUrl ? Encrypt(configValue.mqttIntranetUrl) : '';
+            configValue.mqttIntranetUser = configValue.mqttIntranetUser ? Encrypt(configValue.mqttIntranetUser) : '';
+            configValue.mqttIntranetPassword = configValue.mqttIntranetPassword ? Encrypt(configValue.mqttIntranetPassword) : '';
+            configValue.secureAccessEnvironment = configValue.secureAccessEnvironment ? Encrypt(configValue.secureAccessEnvironment) : '';
+            configValue.apiVersions = configValue.apiVersions ? Encrypt(configValue.apiVersions) : '';
+            configValue.controlMachinePassword = configValue.controlMachinePassword ? Encrypt(configValue.controlMachinePassword) : '';
+            configValue.fileBrowseEnvironment = configValue.fileBrowseEnvironment ? Encrypt(configValue.fileBrowseEnvironment) : '';
+            configValue.learnMachinePassword = configValue.learnMachinePassword ? Encrypt(configValue.learnMachinePassword) : '';
+            configValue.cardReaderSerialPort = configValue.cardReaderSerialPort ? Encrypt(configValue.cardReaderSerialPort) : '';
+            configValue.informationBoardPassword = configValue.informationBoardPassword ? Encrypt(configValue.informationBoardPassword) : '';
+            configValue.electronicScaleSerialport = configValue.electronicScaleSerialport ? Encrypt(configValue.electronicScaleSerialport) : '';
+            configValue.rfidSerialport = configValue.rfidSerialport ? Encrypt(configValue.rfidSerialport) : '';
+            configValue.printerSerialport = configValue.printerSerialport ? Encrypt(configValue.printerSerialport) : '';
+            configValue.bluetoothName = configValue.bluetoothName ? Encrypt(configValue.bluetoothName) : '';
+            configValue.faceRecognitionEnvironment = configValue.faceRecognitionEnvironment ? Encrypt(configValue.faceRecognitionEnvironment) : '';
+            configValue.videoRecordingEnvironment = configValue.videoRecordingEnvironment ? Encrypt(configValue.videoRecordingEnvironment) : '';
+            configValue.chemicalRerminalPassword = configValue.chemicalRerminalPassword ? Encrypt(configValue.chemicalRerminalPassword) : '';
 
             let obj = {
               id:this.configId,
@@ -213,12 +345,26 @@
         getConfigByType({ category: 2, configType: 5 }).then(response => {
           this.$set(this,'configId',response.data.id);
           let obj = JSON.parse(response.data.configValue)
-          obj.mqttExtranetUrl=Decrypt(obj.mqttExtranetUrl)
-          obj.mqttExtranetUser=Decrypt(obj.mqttExtranetUser)
-          obj.mqttExtranetPassword=Decrypt(obj.mqttExtranetPassword)
-          obj.mqttIntranetUrl=Decrypt(obj.mqttIntranetUrl)
-          obj.mqttIntranetUser=Decrypt(obj.mqttIntranetUser)
-          obj.mqttIntranetPassword=Decrypt(obj.mqttIntranetPassword)
+          obj.mqttExtranetUrl = obj.mqttExtranetUrl ? Decrypt(obj.mqttExtranetUrl) : '';
+          obj.mqttExtranetUser = obj.mqttExtranetUser ? Decrypt(obj.mqttExtranetUser) : '';
+          obj.mqttExtranetPassword = obj.mqttExtranetPassword ? Decrypt(obj.mqttExtranetPassword) : '';
+          obj.mqttIntranetUrl = obj.mqttIntranetUrl ? Decrypt(obj.mqttIntranetUrl) : '';
+          obj.mqttIntranetUser = obj.mqttIntranetUser ? Decrypt(obj.mqttIntranetUser) : '';
+          obj.mqttIntranetPassword = obj.mqttIntranetPassword ? Decrypt(obj.mqttIntranetPassword) : '';
+          obj.secureAccessEnvironment = obj.secureAccessEnvironment ? Decrypt(obj.secureAccessEnvironment) : '';
+          obj.apiVersions = obj.apiVersions ? Decrypt(obj.apiVersions) : '';
+          obj.controlMachinePassword = obj.controlMachinePassword ? Decrypt(obj.controlMachinePassword) : '';
+          obj.fileBrowseEnvironment = obj.fileBrowseEnvironment ? Decrypt(obj.fileBrowseEnvironment) : '';
+          obj.learnMachinePassword = obj.learnMachinePassword ? Decrypt(obj.learnMachinePassword) : '';
+          obj.cardReaderSerialPort = obj.cardReaderSerialPort ? Decrypt(obj.cardReaderSerialPort) : '';
+          obj.informationBoardPassword = obj.informationBoardPassword ? Decrypt(obj.informationBoardPassword) : '';
+          obj.electronicScaleSerialport = obj.electronicScaleSerialport ? Decrypt(obj.electronicScaleSerialport) : '';
+          obj.rfidSerialport = obj.rfidSerialport ? Decrypt(obj.rfidSerialport) : '';
+          obj.printerSerialport = obj.printerSerialport ? Decrypt(obj.printerSerialport) : '';
+          obj.bluetoothName = obj.bluetoothName ? Decrypt(obj.bluetoothName) : '';
+          obj.faceRecognitionEnvironment = obj.faceRecognitionEnvironment ? Decrypt(obj.faceRecognitionEnvironment) : '';
+          obj.videoRecordingEnvironment = obj.videoRecordingEnvironment ? Decrypt(obj.videoRecordingEnvironment) : '';
+          obj.chemicalRerminalPassword = obj.chemicalRerminalPassword ? Decrypt(obj.chemicalRerminalPassword) : '';
           this.$set(this,'form',obj);
         })
       },

+ 2 - 1
src/views/systemManagement/publicConfig/integrationConfig.vue

@@ -324,7 +324,8 @@ export default {
     font-size: 16px;
     font-weight: 400;
     color: #CCCCCC;
-    border:1px solid #CCCCCC;
+    border:1px dashed #CCCCCC;
+    border-radius:10px;
   }
   .avatar{
     width: 200px;

+ 2 - 0
src/views/systemManagement/publicConfig/programConfig.vue

@@ -209,6 +209,8 @@ export default {
     font-size: 16px;
     font-weight: 400;
     color: #CCCCCC;
+    border:1px dashed #CCCCCC;
+    border-radius:10px;
   }
   .avatar{
     width: 200px;