张佳燕 9 months ago
parent
commit
04700d36f6

+ 4 - 3
public/config.js

@@ -1,5 +1,6 @@
 window.g = {
-  ApiUrl: 'https://tx.hz-hanghui.com:8088/yx-fyzd', //塘栖
-  // ApiUrl: 'http://192.168.11.17:9200/yx-fyzd', //塘栖本地
-
+  // ApiUrl: 'https://test.hz-hanghui.com:18890/yx-fyzd', //测试
+  ApiUrl: 'https://tx.hz-hanghui.com:8088/yx-fyzd', //线上
+  // ApiUrl: 'http://192.168.10.8:9100/yx-fyzd', //塘栖本地
+  wsPath: 'wss://test.hz-hanghui.com:18890/websocket?token=',
 }

+ 18 - 0
src/api/exam.js

@@ -31,3 +31,21 @@ export function uploadExcel(data) {
     data,
   })
 }
+// 考试人员-导出
+export function excelOut(data) {
+  return request({
+    url: '/admin/examUserWhitelist/excelOut',
+    method: 'post',
+    responseType: 'blob',
+    data: data
+  })
+}
+
+// 考试人员-一键删除
+export function examUserWhitelistDeleteAll(params) {
+  return request({
+    url: '/admin/examUserWhitelist/deleteAll',
+    method: 'get',
+    params
+  })
+}

+ 70 - 0
src/api/user_manage.js

@@ -486,6 +486,30 @@ export function batchEditUserWhitelist(data) {
     data,
   });
 }
+// 批量修改常客
+export function batchUpdate(data) {
+  return request({
+    url: "/admin/userWhitelis/batchUpdate",
+    method: "post",
+    data,
+  });
+}
+// 批量删除用户数据
+export function batchDelete(data) {
+  return request({
+    url: "/admin/userWhitelis/batchDelete",
+    method: "post",
+    data
+  });
+}
+// 批量下发用户数据
+export function batchDistribution(data) {
+  return request({
+    url: "/admin/userWhitelis/batchDistribution",
+    method: "post",
+    data
+  });
+}
 // ---------------进出预警记录--------------------
 // 预警记录-分页列表
 export function doGetWaringServerLog(data) {
@@ -527,3 +551,49 @@ export function warningBlack(waringLogId) {
     data:{waringLogId},
   });
 }
+// -----------------------下发列表-------------------------
+// 下发设备分页列表
+export function devicePage(data) {
+  return request({
+    url: "/admin/issue/device/page",
+    method: "post",
+    data,
+  });
+}
+// 下发设备详情
+export function deviceDetail(issueDeviceId) {
+  return request({
+    url: `/admin/issue/device/detail/${issueDeviceId}`,
+    method: "get",
+  });
+}
+// 导出下发详情列表
+export function itemExport(data) {
+  return request({
+    url: "/admin/issue/device/item/export",
+    method: "post",
+    data,
+  });
+}
+// 下发设备详情分页列表
+export function itemPage(data) {
+  return request({
+    url: "/admin/issue/device/item/page",
+    method: "post",
+    data,
+  });
+}
+// 取消下发
+export function deviceCancel(issueDeviceId) {
+  return request({
+    url: `/admin/issue/device/cancel/${issueDeviceId}`,
+    method: "get",
+  });
+}
+// 重试
+export function deviceRetry(issueDeviceId) {
+  return request({
+    url: `/admin/issue/device/retry/${issueDeviceId}`,
+    method: "get",
+  });
+}

+ 33 - 52
src/router/index.js

@@ -133,18 +133,6 @@ export const constantRoutes = [
       },
     ],
   },
-  // {
-  //   path: '/tree_month_record',
-  //   component: Layout,
-  //   children: [
-  //     {
-  //       path: 'index',
-  //       name: 'tree_month_record',
-  //       component: () => import('@/views/tree_month_record/index'),
-  //       meta: { title: '近期进出记录', role: [1, 2,3,4,5,99], icon: 'el-icon-monitor' }
-  //     }
-  //   ]
-  // },
   {
     path: "/pass_records",
     component: Layout,
@@ -191,18 +179,6 @@ export const constantRoutes = [
       },
     ],
   },
-  // {
-  //   path: '/white_school_list',
-  //   component: Layout,
-  //   children: [
-  //     {
-  //       path: 'index',
-  //       name: 'white_school_list',
-  //       component: () => import('@/views/white_school_list/index'),
-  //       meta: { title: '学生/教职工列表', role: [1, 2, 3, 4,5], visitorType: ['1'], icon: 'el-icon-s-custom' }
-  //     }
-  //   ]
-  // },
   {
     path: "/audit_authority",
     component: Layout,
@@ -323,18 +299,6 @@ export const constantRoutes = [
       },
     ],
   },
-  // {
-  //   path: '/place_code_record',
-  //   component: Layout,
-  //   children: [
-  //     {
-  //       path: 'index',
-  //       name: 'place_code_record',
-  //       component: () => import('@/views/place_code_record/index'),
-  //       meta: { title: '场所码记录', role: [2, 3, 4, 5], icon: 'el-icon-monitor' }
-  //     }
-  //   ]
-  // },
   {
     path: "/issue_records",
     component: Layout,
@@ -352,6 +316,38 @@ export const constantRoutes = [
       },
     ],
   },
+  {
+    path: "/task_list",
+    component: Layout,
+    children: [
+      {
+        path: "index",
+        name: "task_list",
+        component: () => import("@/views/task_list/index"),
+        meta: {
+          title: "任务列表",
+          role: [1, 2, 5, 99],
+          icon: "el-icon-edit-outline",
+        },
+      },
+    ],
+  },
+  // {
+  //   path: "/issue_list",
+  //   component: Layout,
+  //   children: [
+  //     {
+  //       path: "index",
+  //       name: "issue_list",
+  //       component: () => import("@/views/issue_list/index"),
+  //       meta: {
+  //         title: "下发列表",
+  //         role: [1, 2, 5, 99],
+  //         icon: "el-icon-edit-outline",
+  //       },
+  //     },
+  //   ],
+  // },
   {
     path: "/monitor_management",
     component: Layout,
@@ -407,22 +403,7 @@ export const constantRoutes = [
       },
     ],
   },
-  {
-    path: "/task_list",
-    component: Layout,
-    children: [
-      {
-        path: "index",
-        name: "task_list",
-        component: () => import("@/views/task_list/index"),
-        meta: {
-          title: "任务列表",
-          role: [1, 2, 5, 99],
-          icon: "el-icon-edit-outline",
-        },
-      },
-    ],
-  },
+
   {
     path: "/QRCode",
     component: Layout,

+ 2 - 0
src/store/getters.js

@@ -38,6 +38,8 @@ const getters = {
   enterpriseName:state=>state.user.enterpriseName,
   tenantEnterpriseName:state=>state.user.tenantEnterpriseName,
   isOpenInoutWarning:state=>state.user.isOpenInoutWarning,
+  isOpenLadder:state=>state.user.isOpenLadder,
+  WebSocketData:state=>state.user.WebSocketData,
 
 }
 export default getters

+ 15 - 1
src/store/modules/user.js

@@ -42,6 +42,8 @@ const getDefaultState = () => {
     tenantEnterpriseName:null,//上级名称-显示使用
     enterpriseName:null,//下级名称-显示使用
     isOpenInoutWarning:false,
+    isOpenLadder:false,
+    WebSocketData: null,
   }
 }
 
@@ -150,6 +152,12 @@ const mutations = {
   SET_INOUTWARNING: (state, isOpenInoutWarning) => {
     state.isOpenInoutWarning = isOpenInoutWarning
   },
+  SET_ISOPENLADDER: (state, isOpenLadder) => {
+    state.isOpenLadder = isOpenLadder
+  },
+  SET_WEBSOCKETDATA: (state, WebSocketData) => {
+    state.WebSocketData = WebSocketData;
+  },
   // SET_TITLE: (state, title) => {
   //   state.title = title
   // },
@@ -252,13 +260,19 @@ const actions = {
         commit('SET_ENTERPRISENAME', data.enterpriseName)
         commit('SET_TENANTENTERPRISENAME', data.tenantEnterpriseName)
         commit('SET_INOUTWARNING', data.isOpenInoutWarning)
+        commit('SET_ISOPENLADDER', data.isOpenLadder)
         resolve(data)
       }).catch(error => {
         reject(error)
       })
     })
   },
-
+  getWebSocket({ commit,state }, WebSocketData) {
+    return new Promise((resolve, reject) => {
+      commit("SET_WEBSOCKETDATA", WebSocketData);
+      resolve(state);
+    });
+  },
   // user logout
   logout({ commit, state }) {
     return new Promise((resolve, reject) => {

+ 29 - 26
src/utils/defaultTime.js

@@ -1,25 +1,29 @@
-export function defaultTime(num) {
-  var date = new Date();
-  var s1 =
-    date.getFullYear() +
-    num +
-    "-" +
-    (date.getMonth() + 1) +
-    "-" +
-    date.getDate() +
-    " " +
-    date.getHours() +
-    ":" +
-    date.getMinutes() +
-    ":" +
-    date.getSeconds();
-  return s1;
+export function defaultTime(num, dayNum = 0) {
+  var change = new Date();
+  change.setDate(change.getDate() + dayNum);
+  console.log(num);
+  console.log(change.getFullYear());
+  var Y = change.getFullYear()+ num + "-" ;
+  var M = change.getMonth() + 1 + "-";
+  var D =
+    (change.getDate() < 10 ? "0" + change.getDate() : change.getDate()) + " ";
+  var h =
+    (change.getHours() < 10 ? "0" + change.getHours() : change.getHours()) +
+    ":";
+  var m =
+    (change.getMinutes() < 10
+      ? "0" + change.getMinutes()
+      : change.getMinutes()) + ":";
+  var s =
+    change.getSeconds() < 10 ? "0" + change.getSeconds() : change.getSeconds();
+  return Y + M + D + h + m + s;
 }
 // 校验时间格式
 export function checkTime(time) {
-  var pattern = /([0-9]{3}[1-9]|[0-9][1-9][0-9]2022-01-07 19:29:33|[0-9]2022-01-07 19:29:33[1-9][0-9]|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))([ ])([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/
+  var pattern =
+    /([0-9]{3}[1-9]|[0-9][1-9][0-9]2022-01-07 19:29:33|[0-9]2022-01-07 19:29:33[1-9][0-9]|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))([ ])([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/;
   // console.log(pattern.test(time.trim()));
-  return pattern.test(time)
+  return pattern.test(time);
 }
 // 判断开始时间与结束时间
 export function calculateTime(startTime, endTime) {
@@ -28,17 +32,16 @@ export function calculateTime(startTime, endTime) {
     incorrect: {
       err: "",
     },
-  }
-  let time = new Date().getTime()
-  let newStartTime = (new Date(startTime).getTime())
-  let newEndTime = (new Date(endTime).getTime())
+  };
+  let time = new Date().getTime();
+  let newStartTime = new Date(startTime).getTime();
+  let newEndTime = new Date(endTime).getTime();
   if (newEndTime <= newStartTime) {
     isPass.isOk = false;
-    isPass.incorrect.err = "开始时间必须小于结束时间"
-  }else if (newEndTime <= time) {
+    isPass.incorrect.err = "开始时间必须小于结束时间";
+  } else if (newEndTime <= time) {
     isPass.isOk = false;
-    isPass.incorrect.err = "开始时间必须小于当前时间"
+    isPass.incorrect.err = "开始时间必须小于当前时间";
   }
   return isPass;
-
 }

+ 105 - 0
src/utils/getWebSocket.js

@@ -0,0 +1,105 @@
+import { getToken } from "@/utils/auth";
+import store from "../store";
+import { Message } from "element-ui";
+// let server = "wss://hhomc.hz-hanghui.com:18096/websocket?token=" + getToken();
+let server = window.g.wsPath + getToken()+'&source=TQ';
+let ws = {};
+let lockReconnect = false; //避免ws重复连接
+let count = 0; // 记录计数
+// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
+window.onbeforeunload = function () {
+  ws.close();
+};
+// 重连
+let reconnect = (server) => {
+  if (count >= 10) return console.log("超出重连次数!");
+  if (lockReconnect) return false;
+  lockReconnect = true;
+  setTimeout(function () {
+    //没连接上会一直重连,设置延迟避免请求过多
+    createWebSocket(server);
+    lockReconnect = false;
+    count++;
+  }, 10*1000);
+};
+// 创建实例websocket
+let createWebSocket = (server) => {
+  try {
+    if('WebSocket' in window){
+      ws = new WebSocket(server)
+    }else if('MozWebSocket' in window){
+      ws = new MozWebSocket(server)
+    } else  {
+      Message({message:"当前浏览器不支持websocket协议,建议使用现代浏览器",type:"warning"})
+    }
+    // 连接建立时触发
+    init()
+  } catch (e) {
+    console.log("ERR-----------捕获异常", e)
+  }
+};
+//init函数可在页面加载的时候就进行初始化或者根据自己的业务需求在需要打开通讯的时候在进行初始化
+export function init() {
+  // 实例化socket,这里的实例化直接赋值给ws是为了后面可以在其它的函数中也能调用websocket方法,例如:ws.close(); 完成通信后关闭WebSocket连接
+  ws = new WebSocket(server);
+  //监听并处理error事件
+  ws.onerror = function (error) {
+    console.log("error", error);
+    reconnect(server);
+  };
+  //监听连接关闭事件
+  ws.onclose = () => {
+    //监听整个过程中websocket的状态
+    console.log("ws连接状态:" + ws.readyState);
+    reconnect(server);
+  };
+  //监听是否连接成功
+  ws.onopen = () => {
+    console.log("ws连接状态:" + ws.readyState);
+    heartCheck.reset().start(); // 心跳检测重置
+    // count = 0; // 重置重连次数
+    //连接成功则发送一个数据
+    // ws.send("连接成功");
+  };
+
+  //接听服务器发回的信息并处理展示
+  ws.onmessage = (evt) => {
+    console.log("接收到来自服务器的消息:");
+    // console.log(evt.data);
+    heartCheck.reset().start();// 拿到任何消息都说明当前连接是正常的
+    let eventData = undefined;
+    // try {
+      if(evt.data.indexOf('sn')>-1){
+        eventData = JSON.parse(evt.data);
+        console.log(eventData);
+        store.dispatch("user/getWebSocket", eventData);
+      }
+    // } catch (e) {
+    //   console.log("捕获异常: 当前返回的数据不能解析;");
+    //   console.log("内容:" + evt.data);
+    // }
+  };
+}
+// 心跳检测
+const heartCheck = {
+  timeout: 25000, // 设置心跳时间
+  timeoutObj: null,
+  serverTimeoutObj: null,
+  reset: function () {
+    clearTimeout(this.timeoutObj);
+    clearTimeout(this.serverTimeoutObj);
+    return this;
+  },
+  start: function () {
+    const self = this;
+    this.timeoutObj = setTimeout(function () {
+      // 这里发送一个心跳,后端收到后,返回一个心跳消息,onmessage拿到返回的心跳就说明连接正常
+      ws.send("ping--------------Ping");
+      self.serverTimeoutObj = setTimeout(function () {
+        // 如果超过一定时间还没重置,说明后端主动断开了
+        // 如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
+        ws.close();
+      }, self.timeout);
+    }, this.timeout);
+  },
+};

+ 2 - 1
src/utils/request.js

@@ -24,7 +24,8 @@ const service = axios.create({
   baseURL: baseURLStr, // url = base url + request url
   // baseURL:process.env.VUE_APP_BASE_API,
   // withCredentials: true, // send cookies when cross-domain requests
-  timeout: 200000 // request timeout
+  timeout:5* 60*60*60*1000 // request timeout
+  // timeout: 200000 // request timeout
 })
 
 // request interceptor

+ 41 - 26
src/views/QRCode/index.vue

@@ -6,11 +6,7 @@
           <div class="app-container">
             <div class="title">{{ qrcodeTitle }}-微信</div>
             <div class="flex-center">
-              <el-image
-                class="qrcode"
-                src="../../assets/buildingCode.png"
-                alt="加载失败"
-              />
+              <img class="qrcode" src="../../assets/buildingCode.png" alt="">
             </div>
           </div>
         </el-col>
@@ -18,11 +14,7 @@
           <div class="app-container">
             <div class="title">{{ qrcodeTitle }}-支付宝</div>
             <div class="flex-center">
-              <el-image
-                class="qrcode"
-                src="../../assets/zfbBuildingCode.jpg"
-                alt="加载失败"
-              />
+              <img class="qrcode" src="../../assets/zfbBuildingCode.jpg" alt="">
             </div>
           </div>
         </el-col>
@@ -30,7 +22,10 @@
     </div>
 
     <!-- 普通场景 -->
-    <div v-if="genericCode || regularCode || zfbGenericCode || zfbRegularCode" class="container">
+    <div
+      v-if="genericCode || regularCode || zfbGenericCode || zfbRegularCode"
+      class="container"
+    >
       <el-row :gutter="40">
         <el-col v-if="genericCode" :span="8">
           <div class="app-container">
@@ -87,9 +82,15 @@
         </el-col>
         <el-col :span="8">
           <div class="app-container">
-            <div class="title">{{ qrcodeTitlePinYin }} - Foreign guests code</div>
+            <div class="title">
+              {{ qrcodeTitlePinYin }} - Foreign guests code
+            </div>
             <div class="flex-center">
-              <el-image class="qrcode" :src="reservationEnCode" alt="加载失败" />
+              <el-image
+                class="qrcode"
+                :src="reservationEnCode"
+                alt="加载失败"
+              />
             </div>
           </div>
         </el-col>
@@ -126,7 +127,11 @@
           <div class="app-container">
             <div class="title">{{ qrcodeTitle }} - 微信员工码</div>
             <div class="flex-center">
-              <el-image class="qrcode" :src="buildingRegularCode" alt="加载失败" />
+              <el-image
+                class="qrcode"
+                :src="buildingRegularCode"
+                alt="加载失败"
+              />
             </div>
           </div>
         </el-col>
@@ -134,7 +139,11 @@
           <div class="app-container">
             <div class="title">{{ qrcodeTitle }} - 支付宝员工码</div>
             <div class="flex-center">
-              <el-image class="qrcode" :src="ZFBbuildingRegularCode" alt="加载失败" />
+              <el-image
+                class="qrcode"
+                :src="ZFBbuildingRegularCode"
+                alt="加载失败"
+              />
             </div>
           </div>
         </el-col>
@@ -174,7 +183,8 @@ export default {
       ZFBbuildingCode: "",
       buildingRegularCode: "",
       ZFBbuildingRegularCode: "",
-      schoolCode:"https://tx.hz-hanghui.com:8088/yx-fyzd/file/upload/imagesnew/20230912/417855998988910592.jpg"
+      schoolCode:
+        "https://tx.hz-hanghui.com:8088/yx-fyzd/file/upload/imagesnew/20230912/417855998988910592.jpg",
     };
   },
   created() {
@@ -200,9 +210,13 @@ export default {
         if (data.adminDetail.regularStatus) {
           this.regularCode = data.adminDetail.regularCode;
         }
-        this.zfbGenericCode = data.adminDetail ? data.adminDetail.zfbGenericCode : null
-        this.zfbRegularCode = data.adminDetail ? data.adminDetail.zfbRegularCode : null
-        this.zfbFkjCode = data.adminDetail ? data.adminDetail.zfbFkjCode : null
+        this.zfbGenericCode = data.adminDetail
+          ? data.adminDetail.zfbGenericCode
+          : null;
+        this.zfbRegularCode = data.adminDetail
+          ? data.adminDetail.zfbRegularCode
+          : null;
+        this.zfbFkjCode = data.adminDetail ? data.adminDetail.zfbFkjCode : null;
         if (data.adminDetail.reservationStatus) {
           this.reservationCode = data.adminDetail.reservationCode;
           this.reservationEnCode = data.adminDetail.reservationEnCode;
@@ -211,10 +225,10 @@ export default {
         //   this.$store.getters.role === 99 &&
         //   data.adminDetail.buildingStatus
         // ) {
-          this.buildingCode = data.adminDetail.buildingCode;
-          this.ZFBbuildingCode = data.adminDetail.zfbBuildingCode;
-          this.buildingRegularCode = data.adminDetail.buildingRegularCode;
-          this.ZFBbuildingRegularCode = data.adminDetail.zfbBuildingRegularCode;
+        this.buildingCode = data.adminDetail.buildingCode;
+        this.ZFBbuildingCode = data.adminDetail.zfbBuildingCode;
+        this.buildingRegularCode = data.adminDetail.buildingRegularCode;
+        this.ZFBbuildingRegularCode = data.adminDetail.zfbBuildingRegularCode;
         // }
       });
     },
@@ -228,14 +242,15 @@ export default {
   justify-content: center;
 }
 .bg {
-  height: calc(100vh - 50px);
+  min-height: calc(100vh - 50px);
+  height: 100%;
   background-image: url("../../assets/bg.png");
   background-size: 100% 100%;
   background-repeat: no-repeat;
 }
 .container {
   padding: 0 80px;
-  height: calc(100vh - 60px);
+  /* height: calc(100vh - 60px); */
 }
 .app-container {
   flex: none;
@@ -254,7 +269,7 @@ export default {
 .el-col {
   padding-top: 60px;
 }
-.el-col:nth-of-type(n+4){
+.el-col:nth-of-type(n + 4) {
   padding-top: 30px;
 }
 .title {

+ 16 - 15
src/views/basic_setup/index.vue

@@ -291,7 +291,7 @@
       <div class="title">
         <div class="line"></div>
         <span>支付宝小程序显示配置</span>
-        <el-button type="primary" style="margin-left:12px" @click="handleEdit">编辑梯控楼层关系表</el-button>
+        <el-button v-if="isOpenLadder" type="primary" style="margin-left:12px" @click="handleEdit">编辑梯控楼层关系表</el-button>
       </div>
       <div class="display-config-layout">
         <el-form-item
@@ -696,6 +696,7 @@ export default {
     return {
       isOpenExam: this.$store.getters.isOpenExam,
       isOpenInoutWarning: this.$store.getters.isOpenInoutWarning,
+      isOpenLadder: this.$store.getters.isOpenLadder,
       // 对话框参数
       user_form: {
         placeType: null, // 场所类型  0通用1预约2楼宇
@@ -778,20 +779,20 @@ export default {
             trigger: 'blur'
           }
         ],
-        zfbMiniEthTitle: [
-          {
-            required: true,
-            message: '请输入',
-            trigger: 'blur'
-          }
-        ],
-        zfbMiniVguangTitle: [
-          {
-            required: true,
-            message: '请输入',
-            trigger: 'blur'
-          }
-        ]
+        // zfbMiniEthTitle: [
+        //   {
+        //     required: true,
+        //     message: '请输入',
+        //     trigger: 'blur'
+        //   }
+        // ],
+        // zfbMiniVguangTitle: [
+        //   {
+        //     required: true,
+        //     message: '请输入',
+        //     trigger: 'blur'
+        //   }
+        // ]
       },
       user_basic: [
         {

+ 106 - 0
src/views/exam_list/index.vue

@@ -18,6 +18,16 @@
           ref="file"
           @change="upload($event)"
       /></a>
+      <el-button
+        type="primary"
+        class="margin-left"
+        @click="download"
+        v-if="isOut === 1"
+        >导出记录</el-button
+      >
+      <el-button type="danger" class="margin-left" @click="allDel"
+        >一键删除</el-button
+      >
     </span>
     <!--操作区-->
     <el-input
@@ -50,6 +60,7 @@
       placeholder="请输入报考类别"
       class="margin-left input"
     ></el-input>
+
     <el-select
       v-if="checkRole([1, 2, 3, 4])"
       v-model="page.data.username"
@@ -96,6 +107,11 @@
       >
       </el-option>
     </el-select>
+    <el-input
+      v-model="page.data.remark"
+      placeholder="请输入备注"
+      class="margin-left input"
+    ></el-input>
     <el-date-picker
       v-model="page.data.startTime"
       type="datetime"
@@ -135,6 +151,19 @@
           {{ indexMethod(scope.$index) }}
         </template>
       </el-table-column>
+      <el-table-column label="实名照片" align="center">
+        <template slot-scope="scope">
+          <el-image
+            style="width: 70px; height: 70px"
+            :src="scope.row.photo"
+            :preview-src-list="[scope.row.photo]"
+          >
+            <div slot="error" class="image-slot">
+              {{ scope.row.photo ? "加载失败" : "暂无照片" }}
+            </div>
+          </el-image>
+        </template>
+      </el-table-column>
       <el-table-column label="姓名" align="center">
         <template slot-scope="scope">
           {{ scope.row.name | matchNull }}
@@ -380,6 +409,8 @@ import {
   examUserWhitelistDel,
   examUserWhitelistInsert,
   uploadExcel,
+  excelOut,
+  examUserWhitelistDeleteAll,
 } from "@/api/exam";
 import { checkRole } from "@/utils/checkRole";
 import Pagination from "@/components/Pagination";
@@ -398,6 +429,7 @@ export default {
   },
   data() {
     return {
+      isOut: this.$store.getters.isOut, // 是否可以导出
       // 主表格&主表格加载状态
       list: null,
       listLoading: true,
@@ -556,6 +588,80 @@ export default {
       window.location.href =
         process.env.VUE_APP_BASE_API + "/excel/examUserWhitelistExcel.xlsx";
     },
+    // 导出记录
+    download() {
+      this.$prompt("请输入导出密码", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        closeOnClickModal: false,
+      })
+        .then(async ({ value }) => {
+          if (value == "Nqj##361") {
+            this.$message({
+              type: "success",
+              message: "密码正确,正在下载...",
+            });
+            this.listLoading = true;
+            await excelOut(this.page).then((res) => {
+              var eleLink = document.createElement("a");
+              eleLink.style.display = "none";
+              // 字符内容转变成blob地址
+              var blob = new Blob([res]);
+              eleLink.href = URL.createObjectURL(blob);
+              eleLink.setAttribute("download", "考试列表.xlsx");
+              // 自动触发点击
+              document.body.appendChild(eleLink);
+              eleLink.click();
+              // 然后移除
+              document.body.removeChild(eleLink);
+              this.listLoading = false;
+            });
+          } else {
+            this.$message({
+              type: "error",
+              message: "您输入的密码不正确",
+            });
+          }
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "取消导出",
+          });
+        });
+    },
+    // 一键删除
+    allDel() {
+      this.$prompt("请输入删除密码", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        closeOnClickModal: false,
+      })
+        .then(async ({ value }) => {
+          if (value == "Nqj##361") {
+            this.$message({
+              type: "success",
+              message: "密码正确,正在删除...",
+            });
+            this.listLoading = true;
+            await examUserWhitelistDeleteAll().then((res) => {
+              this.listLoading = false;
+              this.fetchData();
+            });
+          } else {
+            this.$message({
+              type: "error",
+              message: "您输入的密码不正确",
+            });
+          }
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "取消删除",
+          });
+        });
+    },
     // 获取账号列表数据_搜索
     getUserListSearch() {
       getUserListSearch().then((res) => {

+ 526 - 0
src/views/issue_list/detailPage.vue

@@ -0,0 +1,526 @@
+<template>
+  <div class="detail-box">
+    <div class="top flex" v-loading="downloadLoading">
+      <div class="left">
+        <div class="small-tit">设备</div>
+        <div class="second-line">
+          SN:{{ detailData.deviceSn }}
+          <el-tag type="success" v-if="detailData.online">在线</el-tag>
+          <el-tag type="info" v-else-if="!detailData.online">离线</el-tag>
+        </div>
+        <div class="third-line">
+          <span class="m-r">类型:{{ detailData.faceDeviceTypeName }}</span>
+          <span class="m-r">地点:{{ detailData.name }}</span>
+          <span class="m-r">所属账号:{{ detailData.adminUserName }}</span>
+        </div>
+      </div>
+      <div class="right">
+        <div class="small-tit">下发</div>
+        <div class="second-line flex">
+          <div class="m-r d-p">
+            <span>人员数量:{{ detailData.issueFaceCount }}条</span>
+            <el-button
+              v-if="detailData.issueFaceCount > 0"
+              type="primary"
+              size="mini"
+              @click="uploadList(1)"
+              >全部名单</el-button
+            >
+          </div>
+          <div class="m-r d-p">
+            <span class="blue"
+              >成功数量:{{ detailData.hadIssueFaceCount }}条</span
+            >
+            <el-button
+              v-if="detailData.hadIssueFaceCount > 0"
+              type="primary"
+              size="mini"
+              @click="uploadList(2)"
+              >成功名单</el-button
+            >
+          </div>
+          <div class="d-p">
+            <span class="red"
+              >失败数量:{{ detailData.unIssueFaceCount }}条</span
+            >
+            <el-button
+              v-if="detailData.unIssueFaceCount > 0"
+              type="primary"
+              size="mini"
+              @click="uploadList(3)"
+              >失败名单</el-button
+            >
+          </div>
+        </div>
+        <div class="third-line">
+          <span class="m-r"
+            >下发类型:
+            <el-tag type="success" v-if="detailData.issueType === 'all'"
+              >全量下发</el-tag
+            >
+            <el-tag v-else-if="detailData.issueType === 'increment'"
+              >增量下发</el-tag
+            >
+          </span>
+          <span class="m-r">
+            <span>下发状态:</span>
+            <el-tag type="info" v-if="detailData.issueStatus === 'cancel'"
+              >已取消</el-tag
+            >
+            <el-tag
+              type="success"
+              v-else-if="detailData.issueStatus === 'success'"
+              >成功</el-tag
+            >
+            <el-tag
+              type="warning"
+              v-else-if="detailData.issueStatus === 'interruption'"
+              >中断</el-tag
+            >
+            <el-tag
+              type="danger"
+              v-else-if="detailData.issueStatus === 'failed'"
+              >失败</el-tag
+            >
+            <el-tag
+              type="primary"
+              v-else-if="detailData.issueStatus === 'pending'"
+              >等待中</el-tag
+            >
+            <el-progress
+              v-if="detailData.issueStatus == 'processing'"
+              :percentage="issuePercent"
+              :show-text="false"
+            ></el-progress>
+            <span class="blue" v-if="detailData.issueStatus == 'processing'"
+              >{{ hadIssuedFaceCount }} / {{ detailData.issueFaceCount }}</span
+            >
+          </span>
+        </div>
+      </div>
+    </div>
+    <!--搜索区-->
+    <div>
+      <el-input
+        v-model="page.data.username"
+        placeholder="请输入姓名"
+        class="margin-left input"
+      ></el-input>
+      <el-input
+        v-model="page.data.phone"
+        placeholder="请输入手机号"
+        class="margin-left input"
+      ></el-input>
+      <el-input
+        v-model="page.data.idNumber"
+        placeholder="请输入身份证号"
+        class="margin-left input"
+      ></el-input>
+      <el-input
+        v-model="page.data.cardIdEx"
+        placeholder="请输入卡号"
+        class="margin-left input"
+      ></el-input>
+      <!-- <el-select
+        filterable
+        clearable
+        v-model="page.data.zoneIds"
+        placeholder="请选择所属区域"
+        class="margin-left input"
+      >
+        <el-option
+          v-for="item in area_list"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        >
+        </el-option>
+      </el-select> -->
+      <el-select
+        filterable
+        clearable
+        v-model="page.data.userType"
+        placeholder="请选择人员类型"
+        class="margin-left input"
+      >
+        <el-option
+          v-for="item in type_list"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        >
+        </el-option>
+      </el-select>
+      <el-select
+        filterable
+        clearable
+        v-model="page.data.issueStatus"
+        placeholder="请选择下发状态"
+        class="margin-left input"
+      >
+        <el-option
+          v-for="item in status_list"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        >
+        </el-option>
+      </el-select>
+      <el-date-picker
+        v-model="page.data.startTime"
+        type="datetime"
+        placeholder="请选择开始时间"
+        value-format="yyyy-MM-dd HH:mm:ss"
+        class="margin-left"
+      >
+      </el-date-picker>
+      <el-date-picker
+        v-model="page.data.endTime"
+        type="datetime"
+        placeholder="请选择结束时间"
+        value-format="yyyy-MM-dd HH:mm:ss"
+        class="margin-left"
+      >
+      </el-date-picker>
+      <el-button
+        type="primary"
+        icon="el-icon-search"
+        class="margin-left"
+        @click="fetchData"
+        >搜索</el-button
+      >
+    </div>
+    <!--主表格-->
+    <el-table
+      class="table"
+      ref="table_form"
+      v-loading="listLoading"
+      :data="list"
+      element-loading-text="Loading"
+      border
+      fit
+      highlight-current-row
+    >
+      <el-table-column label="序号" align="center" width="80px">
+        <template slot-scope="scope">
+          {{ indexMethod(scope.$index) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="实名照片" align="center">
+        <template slot-scope="scope">
+          <el-image
+            style="width: 70px; height: 70px"
+            :src="scope.row.photo"
+            :preview-src-list="[scope.row.photo]"
+          >
+            <div slot="error" class="image-slot">
+              {{ scope.row.photo ? "加载失败" : "暂无照片" }}
+            </div>
+          </el-image>
+        </template>
+      </el-table-column>
+      <el-table-column label="姓名" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.userName | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="手机号" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.phone | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="身份证号" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.idNumber | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="卡号" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.cardIdEx | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="人员类型" align="center">
+        <template slot-scope="scope">
+          <el-tag
+            effect="plain"
+            type="success"
+            v-if="scope.row.userType === 105"
+            >员工</el-tag
+          >
+          <el-tag
+            effect="plain"
+            type="primary"
+            v-else-if="scope.row.userType === 104"
+            >访客</el-tag
+          >
+          <el-tag
+            effect="plain"
+            type="info"
+            v-else-if="scope.row.userType === 101"
+            >黑名单</el-tag
+          >
+        </template>
+      </el-table-column>
+      <el-table-column label="有效期开始时间" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.startTime | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="有效期结束时间" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.endTime | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="下发时间" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.issueTime }}
+        </template>
+      </el-table-column>
+      <el-table-column label="下发状态" align="center">
+        <template slot-scope="scope">
+          <el-tag
+            effect="plain"
+            type="success"
+            v-if="scope.row.issueStatus === 'success'"
+            >成功</el-tag
+          >
+          <el-tag
+            effect="plain"
+            type="danger"
+            v-else-if="scope.row.issueStatus === 'failed'"
+            >失败</el-tag
+          >
+          <el-tag
+            effect="plain"
+            type="primary"
+            v-else-if="scope.row.issueStatus === 'processing'"
+            >下发中</el-tag
+          >
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.remarks }}
+        </template>
+      </el-table-column>
+    </el-table>
+    <!--分页栏-->
+    <pagination
+      :total="total"
+      :page.sync="page.pageNum"
+      :limit.sync="page.pageSize"
+      @pagination="fetchData"
+    />
+  </div>
+</template>
+
+<script>
+import { itemPage, deviceDetail, itemExport } from "@/api/user_manage";
+import { getAreaList } from "@/api/area";
+import Pagination from "@/components/Pagination";
+import detailPage from "./detailPage.vue";
+import { init } from "@/utils/getWebSocket";
+export default {
+  components: { Pagination, detailPage },
+  filters: {
+    matchNull(str) {
+      if (!str) {
+        return "-";
+      } else {
+        return str;
+      }
+    },
+  },
+  props: {
+    rowData: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      isDetail: true,
+      detailData: {},
+      // 主表格&主表格加载状态
+      list: null,
+      listLoading: true,
+      downloadLoading: false, //导出加载
+      // 分页参数
+      page: {
+        data: {
+          deviceSn: null,
+          userType: null,
+          issueStatus: null,
+          startTime: null,
+          endTime: null,
+          username: "",
+          phone: "",
+          idNumber: "",
+          cardIdEx: null,
+          zoneIds: null,
+        },
+        pageNum: 1,
+        pageSize: 10,
+      },
+      total: 0,
+      // 设备列表_搜索
+      area_list: [],
+      type_list: [
+        { id: 105, name: "员工" },
+        { id: 104, name: "访客" },
+      ],
+      status_list: [
+        { id: "processing", name: "下发中" },
+        { id: "success", name: "成功" },
+        { id: "failed", name: "失败" },
+      ],
+      issuePercent: 0,
+      hadIssuedFaceCount: 0,
+    };
+  },
+  created() {
+    // init();
+    this.getArea();
+    this.fetchData();
+  },
+  watch: {
+    WebSocketData(n) {
+      this.getLogs();
+    },
+  },
+  computed: {
+    WebSocketData: function () {
+      return this.$store.getters.WebSocketData;
+    },
+  },
+  methods: {
+    // 获取列表数据
+    async fetchData() {
+      this.listLoading = true;
+      this.page.data.issueDeviceId = this.rowData.id;
+      let res1 = await deviceDetail(this.rowData.id);
+      let res2 = await itemPage(this.page);
+      this.detailData = res1.data;
+      this.list = res2.data.list;
+      this.total = res2.data.total;
+      this.listLoading = false;
+    },
+    getLogs() {
+      let that = this;
+      let data = that.$store.getters.WebSocketData;
+      if (
+        data &&
+        data.op == "ISSUE_CALLBACK" &&
+        data.data.traceId == this.rowData.traceId
+      ) {
+        this.issuePercent = data.data.issuePercent;
+        this.hadIssuedFaceCount = data.data.hadIssuedFaceCount;
+      }
+    },
+    uploadList(type) {
+      let data = {
+        issueDeviceId: this.rowData.id,
+      };
+      switch (type) {
+        case 2:
+          data.issueStatus = "success";
+          break;
+        case 3:
+          data.issueStatus = "failed";
+          break;
+        default:
+          break;
+      }
+      this.downloadLoading = true;
+      itemExport(data).then((res) => {
+        window.location.href = res.data;
+        this.downloadLoading = false;
+      });
+    },
+    // 搜索
+    async getArea() {
+      let form = {
+        zoneId: this.$store.getters.adminId,
+        adminId: null,
+        sn: null,
+      };
+      try {
+        const result = await getAreaList(form);
+        this.area_list = result.data;
+      } catch (e) {
+        console.log(e);
+        this.area_list = [];
+      }
+    },
+    // 返回列表序号
+    indexMethod(index) {
+      return (this.page.pageNum - 1) * this.page.pageSize + index + 1;
+    },
+  },
+};
+</script>
+<style scoped>
+.table {
+  margin-top: 15px;
+}
+.flex {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+}
+.margin-left {
+  margin: 10px 0 0 10px;
+}
+.input {
+  width: 200px;
+}
+
+.top {
+  background-color: #f8faff;
+  border-radius: 5px;
+  padding: 12px 27px;
+  justify-content: space-between;
+  min-width: 1000px;
+  margin: 20px 0;
+}
+.small-tit {
+  color: rgba(0, 126, 255, 1);
+  font-size: 16px;
+  font-weight: 500;
+  background: rgba(98, 159, 249, 0.12);
+  padding: 5px 20px;
+  border-radius: 15px;
+  display: inline-block;
+}
+.second-line {
+  font-size: 16px;
+  font-weight: 500;
+  margin: 8px 0;
+}
+.el-progress {
+  width: 150px;
+  display: inline-block;
+  margin-right: 8px;
+}
+.d-p {
+  display: inline-block;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.d-p > .el-button {
+  margin-left: 10px;
+}
+.m-r {
+  margin-right: 32px;
+}
+.blue {
+  color: rgba(64, 158, 255, 1);
+  /* font-size: 14px; */
+}
+.red {
+  color: rgba(245, 100, 100, 1);
+}
+</style>

+ 428 - 0
src/views/issue_list/index.vue

@@ -0,0 +1,428 @@
+<template>
+  <div class="app-container">
+    <!--搜索区-->
+    <div v-if="!isDetail">
+      <el-select
+        filterable
+        clearable
+        v-model="page.data.deviceSn"
+        placeholder="请选择设备编号"
+        class="margin-left input"
+      >
+        <el-option
+          v-for="item in machine_list"
+          :key="item.sn"
+          :label="item.sn"
+          :value="item.sn"
+        >
+        </el-option>
+      </el-select>
+      <!-- <el-input
+        v-model="page.data.aaaaa"
+        placeholder="请输入设备地点"
+        class="margin-left input"
+      ></el-input> -->
+      <!-- <el-input
+        v-model="page.data.bbbbb"
+        placeholder="请输入设备类型"
+        class="margin-left input"
+      ></el-input> -->
+      <el-select
+        filterable
+        clearable
+        v-model="page.data.adminId"
+        placeholder="请选择所属账号"
+        class="margin-left input"
+      >
+        <el-option
+          v-for="item in account_list"
+          :key="item.adminId"
+          :label="item.username"
+          :value="item.adminId"
+        >
+        </el-option>
+      </el-select>
+      <el-select
+        filterable
+        clearable
+        v-model="page.data.issueType"
+        placeholder="请选择下发类型"
+        class="margin-left input"
+      >
+        <el-option
+          v-for="item in type_list"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        >
+        </el-option>
+      </el-select>
+      <el-select
+        filterable
+        clearable
+        v-model="page.data.issueStatus"
+        placeholder="请选择下发状态"
+        class="margin-left input"
+      >
+        <el-option
+          v-for="item in status_list"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        >
+        </el-option>
+      </el-select>
+      <el-button
+        type="primary"
+        icon="el-icon-search"
+        class="margin-left"
+        @click="fetchData"
+        >搜索</el-button
+      >
+      <!--主表格-->
+      <el-table
+        class="table"
+        ref="table_form"
+        v-loading="listLoading"
+        :data="list"
+        element-loading-text="Loading"
+        border
+        fit
+        highlight-current-row
+      >
+        <el-table-column label="序号" align="center" width="80px">
+          <template slot-scope="scope">
+            {{ indexMethod(scope.$index) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="设备sn" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.deviceSn | matchNull }}
+          </template>
+        </el-table-column>
+        <el-table-column label="在离线状态" align="center">
+          <template slot-scope="scope">
+            <el-tag type="success" v-if="scope.row.online">在线</el-tag>
+            <el-tag type="info" v-else-if="!scope.row.online">离线</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="设备地点" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.name | matchNull }}
+          </template>
+        </el-table-column>
+        <el-table-column label="设备类型" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.faceDeviceTypeName | matchNull }}
+          </template>
+        </el-table-column>
+        <el-table-column label="所属账号" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.adminUserName | matchNull }}
+          </template>
+        </el-table-column>
+        <el-table-column label="下发人员数量" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.issueFaceCount | matchNull }}
+          </template>
+        </el-table-column>
+        <el-table-column label="下发类型" align="center">
+          <template slot-scope="scope">
+            <el-tag
+              type="success"
+              effect="plain"
+              v-if="scope.row.issueType === 'all'"
+              >全量下发</el-tag
+            >
+            <el-tag
+              type="primary"
+              effect="plain"
+              v-else-if="scope.row.issueType === 'increment'"
+              >增量下发</el-tag
+            >
+             <el-tag
+              type="warning"
+              effect="plain"
+              v-else-if="scope.row.issueType === 'face_delete'"
+              >单个删除</el-tag
+            >
+             <el-tag
+              type="danger"
+              effect="plain"
+              v-else-if="scope.row.issueType === 'face_delete_all'"
+              >全量删除</el-tag
+            >
+          </template>
+        </el-table-column>
+        <el-table-column label="下发状态" align="center" :key="isUpdate">
+          <template slot-scope="scope">
+            <el-tag type="info" v-if="scope.row.issueStatus === 'cancel'"
+              >已取消</el-tag
+            >
+            <el-tag
+              type="success"
+              v-else-if="scope.row.issueStatus === 'success'"
+              >成功</el-tag
+            >
+            <el-tag
+              type="warning"
+              v-else-if="scope.row.issueStatus === 'interruption'"
+              >中断</el-tag
+            >
+            <el-tag type="danger" v-else-if="scope.row.issueStatus === 'failed'"
+              >失败</el-tag
+            >
+            <el-tag
+              type="primary"
+              v-else-if="scope.row.issueStatus === 'pending'"
+              >等待中</el-tag
+            >
+            <el-progress
+              :percentage="scope.row.issuePercent"
+              v-if="scope.row.issueStatus == 'processing'"
+            ></el-progress>
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.remarks }}
+          </template>
+        </el-table-column>
+        <el-table-column label="创建时间" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.createTime }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="" label="操作区" width="180">
+          <template slot-scope="scope">
+            <el-button
+              v-if="
+                scope.row.issueStatus === 'processing' ||
+                scope.row.issueStatus === 'pending'
+              "
+              type="warning"
+              size="small"
+              @click="retryOrCancel(scope.row.id, 1)"
+              >取消</el-button
+            >
+            <el-button
+              v-if="
+                scope.row.issueStatus === 'interruption' ||
+                scope.row.issueStatus === 'failed'
+              "
+              type="primary"
+              size="small"
+              plain
+              @click="retryOrCancel(scope.row.id, 2)"
+              >重试</el-button
+            >
+            <el-button type="primary" size="small" @click="detailFun(scope.row)"
+              >详情</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <!--分页栏-->
+      <pagination
+        :total="total"
+        :page.sync="page.pageNum"
+        :limit.sync="page.pageSize"
+        @pagination="fetchData"
+      />
+    </div>
+    <div v-if="isDetail">
+      <div class="detail-top">
+        <div class="detail-tit">下发详情</div>
+        <el-button type="primary" size="small" @click="isDetail = false"
+          >返回</el-button
+        >
+      </div>
+      <detailPage :rowData="rowData" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { getFaceDeviceList } from "@/api/old_api_pengwenbing";
+import {
+  getUserListSearch,
+  devicePage,
+  deviceCancel,
+  deviceRetry,
+} from "@/api/user_manage";
+import Pagination from "@/components/Pagination";
+import detailPage from "./detailPage.vue";
+import { init } from "@/utils/getWebSocket";
+
+export default {
+  components: { Pagination, detailPage },
+  filters: {
+    matchNull(str) {
+      if (!str) {
+        return "-";
+      } else {
+        return str;
+      }
+    },
+  },
+  data() {
+    return {
+      isDetail: false,
+      // 主表格&主表格加载状态
+      list: null,
+      listLoading: true,
+      // 分页参数
+      page: {
+        data: {
+          adminId: null,
+          deviceSn: null,
+          issueType: null,
+          issueStatus: null,
+        },
+        pageNum: 1,
+        pageSize: 10,
+      },
+      total: 0,
+      // 设备列表_搜索
+      machine_list: [],
+      account_list: [],
+      type_list: [
+        { id: "all", name: "全量下发" },
+        { id: "increment", name: "增量下发" },
+        { id: "face_delete", name: "单个删除" },
+        { id: "face_delete_all", name: "全量删除" },
+      ],
+      status_list: [
+        { id: "pending", name: "等待中" },
+        { id: "processing", name: "下发中" },
+        { id: "interruption", name: "中断" },
+        { id: "success", name: "成功" },
+        { id: "failed", name: "失败" },
+        { id: "cancel", name: "已取消" },
+      ],
+      rowData: {},
+      isUpdate: Math.random(),
+    };
+  },
+  created() {
+    init();
+    this.fetchData();
+    this.getFaceDeviceList();
+    this.getUserListSearch();
+  },
+  watch: {
+    WebSocketData(n) {
+      this.getLogs();
+    },
+  },
+  computed: {
+    WebSocketData: function () {
+      return this.$store.getters.WebSocketData;
+    },
+  },
+  methods: {
+    // 获取列表数据
+    async fetchData() {
+      this.listLoading = true;
+      await devicePage(this.page).then((res) => {
+        this.list = res.data.list;
+        this.total = res.data.total;
+        this.listLoading = false;
+      });
+    },
+    // 获取设备列表-搜索
+    getFaceDeviceList() {
+      getFaceDeviceList().then((res) => {
+        this.machine_list = res.data;
+      });
+    },
+    getUserListSearch() {
+      getUserListSearch().then((res) => {
+        this.account_list = res.data;
+      });
+    },
+    // 取消/重试
+    retryOrCancel(id, type) {
+      this.$confirm(`确定要${type == 1 ? "取消" : "重试"}吗?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+        center: true,
+      }).then(async () => {
+        try {
+          let res = {};
+          switch (type) {
+            case 1:
+              res = await deviceCancel(id);
+              break;
+            case 2:
+              res = await deviceRetry(id);
+              break;
+            default:
+              break;
+          }
+          this.fetchData();
+          this.$message({
+            type: "success",
+            message: "操作成功!",
+          });
+        } catch (error) {
+          console.log(error);
+        }
+      });
+    },
+    // 详情
+    detailFun(row) {
+      this.rowData = row;
+      this.isDetail = true;
+    },
+    async getLogs() {
+      let that = this;
+      let data = that.$store.getters.WebSocketData;
+      if (data && data.op == "ISSUE_CALLBACK") {
+        let index = that.list.findIndex(
+          (item) => item.traceId == data.data.traceId
+        );
+        if (index > -1) {
+          let itemData = that.list[index];
+          itemData.issuePercent = data.data.issuePercent;
+          itemData.issueStatus = data.data.issueStatus;
+          that.isUpdate = Math.random();
+          that.$set(that.list, index, itemData);
+        }
+      }
+    },
+    // 返回列表序号
+    indexMethod(index) {
+      return (this.page.pageNum - 1) * this.page.pageSize + index + 1;
+    },
+  },
+};
+</script>
+<style scoped>
+.table {
+  margin-top: 15px;
+}
+.flex {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+}
+.margin-left {
+  margin: 10px 0 0 10px;
+}
+.input {
+  width: 200px;
+}
+.detail-top {
+  display: flex;
+  justify-content: left;
+  align-items: center;
+}
+.detail-tit {
+  font-size: 18px;
+  font-weight: 500;
+  color: rgba(51, 51, 51, 1);
+  margin-right: 20px;
+}
+</style>

+ 98 - 37
src/views/machine_list/components/ysgz_machine_list.vue

@@ -1,8 +1,9 @@
 <template>
   <div class="app-container">
     <!--操作区-->
+    <!-- || (checkRole([5]) && placeType == 2) -->
     <el-button
-      v-if="checkRole([1, 2]) || (checkRole([5]) && placeType == 2)"
+      v-if="checkRole([1, 2]) "
       type="primary"
       icon="el-icon-plus"
       @click="create"
@@ -69,7 +70,7 @@
       filterable
       clearable
       v-model="page.data.faceDeviceTypeId"
-      placeholder="请选择设备类型"
+      placeholder="请选择应用类型"
       class="margin-left input"
       v-if="checkRole([1, 2])"
     >
@@ -212,11 +213,16 @@
           <span>{{ scope.row.name | matchNull }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="设备类型" align="center" v-if="checkRole([1, 2])">
+      <el-table-column label="应用类型" align="center" v-if="checkRole([1, 2])">
         <template slot-scope="scope">
           <span>{{ scope.row.faceDeviceTypeName | matchNull }}</span>
         </template>
       </el-table-column>
+      <el-table-column label="设备类型" align="center" v-if="checkRole([1, 2])">
+        <template slot-scope="scope">
+          <span>{{ scope.row.devType | matchNull }}</span>
+        </template>
+      </el-table-column>
       <el-table-column
         label="设备品牌名称"
         align="center"
@@ -289,13 +295,13 @@
       >
         <template slot-scope="scope">
           <el-tag type="success" v-if="scope.row.adminAreaType === 1"
-            >{{tenantEnterpriseName}}公有</el-tag
+            >{{ tenantEnterpriseName }}公有</el-tag
           >
           <el-tag type="primary" v-if="scope.row.adminAreaType === 2"
-            >{{enterpriseName}}公有</el-tag
+            >{{ enterpriseName }}公有</el-tag
           >
           <el-tag type="warning" v-if="scope.row.adminAreaType === 3"
-            >{{enterpriseName}}私有</el-tag
+            >{{ enterpriseName }}私有</el-tag
           >
         </template>
       </el-table-column>
@@ -338,6 +344,9 @@
           >
             {{ scope.row.auth === 1 ? "停用" : "授权" }}</el-button
           >
+          <!-- <el-button type="primary" size="small" @click="clickIssue(scope.row.deviceId)"
+            >下发</el-button
+          > -->
           <el-button
             v-if="checkRole([1, 2, 5])"
             :type="
@@ -348,7 +357,7 @@
             plain
             size="small"
             :disabled="!(scope.row.enable === 1 && scope.row.auth === 1)"
-            @click="openIssueAll(scope.row.deviceId)"
+            @click="clickIssue(scope.row.deviceId)"
           >
             全量下发
           </el-button>
@@ -392,6 +401,9 @@
             :disabled="scope.row.adminAreaType === 1"
             >编辑</el-button
           >
+          <!-- <el-button type="primary" size="small" @click="clickIssue(scope.row.deviceId)"
+            >下发</el-button
+          > -->
           <el-button
             :type="
               scope.row.enable === 1 && scope.row.auth === 1
@@ -401,7 +413,7 @@
             plain
             size="small"
             :disabled="!(scope.row.enable === 1 && scope.row.auth === 1)"
-            @click="openIssueAll(scope.row.deviceId)"
+            @click="clickIssue(scope.row.deviceId)"
           >
             全量下发
           </el-button>
@@ -459,8 +471,8 @@
             >
               <el-radio-group v-model="form.adminAreaType">
                 <!-- <el-radio :label="1" v-if="!checkRole([99])">楼宇公有</el-radio> -->
-                <el-radio :label="2">{{enterpriseName}}公有</el-radio>
-                <el-radio :label="3">{{enterpriseName}}私有</el-radio>
+                <el-radio :label="2">{{ enterpriseName }}公有</el-radio>
+                <el-radio :label="3">{{ enterpriseName }}私有</el-radio>
               </el-radio-group>
             </el-form-item>
             <el-form-item
@@ -512,7 +524,7 @@
           </el-form-item>
           <el-form-item
             style="flex: 0.5"
-            label="设备类型"
+            label="应用类型"
             prop="faceDeviceTypeId"
             v-if="checkRole([1, 2])"
           >
@@ -521,7 +533,7 @@
               filterable
               clearable
               v-model="form.faceDeviceTypeId"
-              placeholder="请选择设备类型"
+              placeholder="请选择应用类型"
             >
               <el-option
                 v-for="item in machine_type_list"
@@ -542,15 +554,23 @@
           >
             <el-input v-model.trim="form.sn" maxlength="50" show-word-limit />
           </el-form-item>
-          <el-form-item label="设备地点" prop="name" style="flex: 0.5">
+          <el-form-item label="设备类型" prop="devType" style="flex: 0.5">
             <el-input
-              v-model.trim="form.name"
+              v-model.trim="form.devType"
               maxlength="50"
               show-word-limit
               :disabled="checkRole([99])"
             />
           </el-form-item>
         </div>
+        <el-form-item label="设备地点" prop="name" style="flex: 0.5">
+            <el-input
+              v-model.trim="form.name"
+              maxlength="50"
+              show-word-limit
+              :disabled="checkRole([99])"
+            />
+          </el-form-item>
         <div class="flex">
           <el-form-item label="使用状态" prop="enable" style="flex: 0.5">
             <el-radio-group v-model="form.enable" :disabled="checkRole([99])">
@@ -623,9 +643,25 @@
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button @click="issueAllDialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="issueAll">确 定</el-button>
+        <el-button type="primary" @click="issueAllFun">确 定</el-button>
       </span>
     </el-dialog>
+    <!-- <el-dialog
+      title="下发选择"
+      :visible.sync="issueAllDialogVisible"
+      width="550px"
+    >
+      <div class="flex1">
+        <div class="issue-item">
+          <el-button type="primary" @click="issueAllFun('all')">全量下发</el-button>
+          <div class="issue-item-text">所有人员数据重新下发</div>
+        </div>
+        <div class="issue-item m-l">
+          <el-button type="primary" @click="issueAllFun('increment')">增量下发</el-button>
+          <div class="issue-item-text">下发新增的人员数据,设备上已有的人员数据还存在</div>
+        </div>
+      </div>
+    </el-dialog> -->
     <!-- 切换设备提示 -->
     <el-dialog
       title="温馨提示"
@@ -693,15 +729,15 @@ export default {
         this.getPrivateAreaList(this.form.adminId);
       }
     },
-    "issueAllForm.validityPeriodStatus"(n, o) {
-      if (n === 1) {
-        this.issueAllForm.startTime = this.defaultTime(0);
-        this.issueAllForm.endTime = this.defaultTime(1);
-      } else {
-        this.issueAllForm.startTime = null;
-        this.issueAllForm.endTime = null;
-      }
-    },
+    // "issueAllForm.validityPeriodStatus"(n, o) {
+    //   if (n === 1) {
+    //     this.issueAllForm.startTime = this.defaultTime(0);
+    //     this.issueAllForm.endTime = this.defaultTime(1);
+    //   } else {
+    //     this.issueAllForm.startTime = null;
+    //     this.issueAllForm.endTime = null;
+    //   }
+    // },
     "form.adminId"(n) {
       if (n != this.row.adminId && this.dialogType === "update") {
         let nextNoReminders = JSON.parse(
@@ -756,7 +792,7 @@ export default {
       area_list_search: [],
       // 设备品牌名称列表_搜索
       machine_company_list: [],
-      // 设备类型列表_搜索
+      // 应用类型列表_搜索
       machine_type_list: [],
       // 在线状态
       online_list: [
@@ -787,13 +823,14 @@ export default {
         faceDeviceTypeId: null,
         adminAreaType: 1, //所属区域类型
         privateAreaId: null, //选择私有区域
+        devType:null,
       },
       form_copy: {},
       // 验证规则
       rules: {
         adminId: [{ required: true, message: "请选择账号", trigger: "blur" }],
         faceDeviceTypeId: [
-          { required: true, message: "请选择设备类型", trigger: "blur" },
+          { required: true, message: "请选择应用类型", trigger: "blur" },
         ],
         thirdPartyId: [
           { required: true, message: "请选择设备品牌名称", trigger: "blur" },
@@ -808,6 +845,7 @@ export default {
           { required: true, message: "请选择私有区域", trigger: "blur" },
         ],
         adminAreaType: [{ required: true, message: "请选择", trigger: "blur" }],
+        devType: [{ required: true, message: "请选择", trigger: "blur" }],
       },
       showPrivateArea: false, //判断账号是否开启私有区域
       issueAllDialogVisible: false, //全量下发弹出框
@@ -927,7 +965,7 @@ export default {
         this.machine_company_list = res.data;
       });
     },
-    // 获取设备类型列表-搜索
+    // 获取应用类型列表-搜索
     getMachineTypeListSearch() {
       getMachineTypeListSearch().then((res) => {
         this.machine_type_list = res.data;
@@ -1029,7 +1067,7 @@ export default {
                 type: "success",
                 message: "授权成功!",
               });
-            }else{
+            } else {
               this.$message({
                 type: "error",
                 message: "授权失败!",
@@ -1060,7 +1098,7 @@ export default {
                 type: "success",
                 message: "停用成功!",
               });
-            }else{
+            } else {
               this.$message({
                 type: "error",
                 message: "停用失败!",
@@ -1075,22 +1113,25 @@ export default {
           });
         });
     },
-    // 打开全量下发对话框
-    openIssueAll(deviceId) {
+    //  打开全量下发对话框
+    clickIssue(deviceId) {
+      console.log(deviceId);
       this.issueAllDialogVisible = true;
       this.issueAllId = deviceId;
     },
     //全量下发
-    issueAll() {
-      let data = this.issueAllForm;
-      data.deviceId = this.issueAllId;
+    issueAllFun(type) {
+      let data ={
+        deviceId :this.issueAllId,
+        issueType:type,
+      };
       if (this.placeType == 1) {
         appointmentPersonIssueAll(data)
           .then((response) => {
             this.issueAllDialogVisible = false;
             this.$message({
               type: "success",
-              message: "下发完成!",
+              message: "操作成功!",
             });
           })
           .catch((err) => {
@@ -1102,7 +1143,7 @@ export default {
             this.issueAllDialogVisible = false;
             this.$message({
               type: "success",
-              message: "下发完成!",
+              message: "操作成功!",
             });
           })
           .catch(() => {});
@@ -1194,7 +1235,7 @@ export default {
         let arr = [
           { name: "设备编号", value: "sn" },
           { name: "设备地点", value: "name" },
-          { name: "设备类型", value: "faceDeviceTypeName" },
+          { name: "应用类型", value: "faceDeviceTypeName" },
           { name: "设备品牌名称", value: "thirdPartyName" },
           { name: "所属账号", value: "username" },
           { name: "省", value: "provinceName" },
@@ -1223,6 +1264,26 @@ export default {
   justify-content: flex-start;
   align-items: center;
 }
+.flex1 {
+  display: flex;
+  justify-content: center;
+  align-items: start;
+}
+.issue-item {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+.issue-item-text {
+  margin-top: 10px;
+  font-size: 14px;
+  color: rgba(155, 168, 193, 1);
+  width: 150px;
+}
+.m-l{
+  margin-left: 80px;
+}
 .margin-left {
   margin: 10px 0 0 10px;
 }

+ 1 - 1
src/views/make_appointment/appointment_list.vue

@@ -211,7 +211,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return "未填写";
+        return "-";
       } else {
         return str;
       }

+ 1 - 1
src/views/make_appointment/components/dialog.vue

@@ -66,7 +66,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return "未填写";
+        return "-";
       } else {
         return str;
       }

+ 1 - 1
src/views/merchants/index.vue

@@ -425,7 +425,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return "未填写";
+        return "-";
       } else {
         return str;
       }

+ 1 - 1
src/views/pass_records/components/ysgz_pass_records.vue

@@ -548,7 +548,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return "未记录";
+        return "-";
       } else {
         return str;
       }

+ 0 - 234
src/views/place_code_record/index.vue

@@ -1,234 +0,0 @@
-<template>
-  <div class="app-container">
-    <!--搜索区-->
-    <el-input
-      v-model="page.data.name"
-      placeholder="请输入姓名"
-      class="margin-left input"
-    ></el-input>
-    <!-- <el-input
-      v-model="page.data.phone"
-      placeholder="请输入手机号"
-      class="margin-left input"
-    ></el-input> -->
-    <el-input
-      v-model="page.data.idNumber"
-      placeholder="请输入身份证号"
-      class="margin-left input"
-    ></el-input>
-    <!-- <el-select
-      v-if="!checkRole([99])"
-      filterable
-      clearable
-      v-model="page.data.username"
-      placeholder="请选择账号"
-      class="margin-left input"
-    >
-      <el-option
-        v-for="item in user_list"
-        :key="item.id"
-        :label="item.username"
-        :value="item.username"
-      >
-      </el-option>
-    </el-select> -->
-    <el-button
-      type="primary"
-      icon="el-icon-search"
-      class="margin-left"
-      @click="fetchData"
-      >搜索</el-button
-    >
-    <!--主表格-->
-    <el-table
-      class="table"
-      ref="table_form"
-      v-loading="listLoading"
-      :data="list"
-      element-loading-text="Loading"
-      border
-      fit
-      highlight-current-row
-    >
-      <el-table-column label="序号" align="center" width="80px">
-        <template slot-scope="scope">
-          {{ indexMethod(scope.$index) }}
-        </template>
-      </el-table-column>
-      <el-table-column label="所属账号" align="center" v-if="checkRole([1, 2])">
-        <template slot-scope="scope">
-          <span>{{ scope.row.username | matchNull }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="用户姓名" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.name | matchNull }}
-        </template>
-      </el-table-column>
-      <!-- <el-table-column label="现场照片" align="center">
-        <template slot-scope="scope">
-          <el-image
-            style="width: 100px; height: 100px"
-            :src="scope.row.photo"
-            :preview-src-list="[scope.row.photo]"
-          >
-          </el-image>
-        </template>
-      </el-table-column> -->
-      <el-table-column label="身份证" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.idNumber }}
-        </template>
-      </el-table-column>
-      <el-table-column label="场所码Code" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.addressCode }}
-        </template>
-      </el-table-column>
-      <el-table-column label="场所码单位名称" align="center" width="150px">
-        <template slot-scope="scope">
-          {{ scope.row.unitName }}
-        </template>
-      </el-table-column>
-      <el-table-column label="场所码单位地址" align="center" width="150px">
-        <template slot-scope="scope">
-          {{ scope.row.unitAddress }}
-        </template>
-      </el-table-column>
-      <el-table-column label="详细地址" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.provinceName }} -{{ scope.row.cityName }} -{{
-            scope.row.areaName
-          }}
-          -{{ scope.row.streetName }} -{{ scope.row.address }}
-        </template>
-      </el-table-column>
-
-      <el-table-column label="用户健康码信息" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.healthCode }}
-        </template>
-      </el-table-column>
-      <el-table-column label="健康码状态" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.level }}
-        </template>
-      </el-table-column>
-      <el-table-column label="核酸检测结果" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.checkResult }}
-        </template>
-      </el-table-column>
-
-      <el-table-column label="创建时间" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.createTime }}
-        </template>
-      </el-table-column>
-    </el-table>
-    <!--分页栏-->
-    <pagination
-      :total="total"
-      :page.sync="page.pageNum"
-      :limit.sync="page.pageSize"
-      @pagination="fetchData"
-    />
-  </div>
-</template>
-
-<script>
-import detailsDialog from "@/components/DialogDetails/index.vue";
-
-import Pagination from "@/components/Pagination";
-import { checkRole } from "@/utils/checkRole";
-import {
-  getUserListSearch,
-  placeRecordList,
-} from "@/api/user_manage";
-import { parseTime } from "@/utils"; // secondary package based on el-pagination
-
-export default {
-  components: { Pagination, detailsDialog },
-  filters: {
-    matchNull(str) {
-      if (!str) {
-        return "未记录";
-      } else {
-        return str;
-      }
-    },
-    aAecimal(str) {
-      return (str = str.slice(0, 4));
-    },
-  },
-  data() {
-    return {
-      // 主表格&主表格加载状态
-      list: [],
-      listLoading: true,
-      // 分页参数
-      page: {
-        data: {
-          username: null,
-          name: null,
-          idNumber: null,
-          phone: null,
-          deviceSn: null,
-          provinceId: null,
-          cityId: null,
-          areaId: null,
-        },
-        pageNum: 1,
-        pageSize: 10,
-      },
-      total: 0,
-      // 账号列表_搜索
-      user_list: [],
-    };
-  },
-  created() {
-    this.page_copy = JSON.parse(JSON.stringify(this.page));
-    this.fetchData();
-  },
-  computed: {},
-  methods: {
-    // 查询权限
-    checkRole,
-    // 获取列表数据
-    fetchData() {
-      this.listLoading = true;
-      placeRecordList(this.page).then((res) => {
-        this.list = res.data.list;
-        this.total = res.data.total;
-        this.listLoading = false;
-      });
-    },
-    // 获取账号列表数据_搜索
-    getUserListSearch() {
-      getUserListSearch().then((res) => {
-        this.user_list = res.data;
-      });
-    },
-    // 返回列表序号
-    indexMethod(index) {
-      return (this.page.pageNum - 1) * this.page.pageSize + index + 1;
-    },
-  },
-};
-</script>
-<style scoped>
-.table {
-  margin-top: 15px;
-}
-.flex {
-  display: flex;
-  justify-content: flex-start;
-  align-items: center;
-}
-.margin-left {
-  margin: 10px 0 0 10px;
-}
-.input {
-  width: 150px;
-}
-</style>

+ 1 - 1
src/views/setting/components/machine_company.vue

@@ -127,7 +127,7 @@
     filters: {
       matchNull(str) {
         if (!str) {
-          return "暂无";
+          return "-";
         } else {
           return str;
         }

+ 1 - 1
src/views/setting/components/machine_type.vue

@@ -117,7 +117,7 @@
     filters: {
       matchNull(str) {
         if (!str) {
-          return "暂无";
+          return "-";
         } else {
           return str;
         }

+ 0 - 997
src/views/tree_month_record/index.vue

@@ -1,997 +0,0 @@
-<template>
-  <div class="app-container" v-loading="downloadLoading">
-    <!--搜索区-->
-    <el-input
-      v-model="page.data.name"
-      placeholder="请输入姓名"
-      class="margin-left input"
-    ></el-input>
-    <el-input
-      v-model="page.data.phone"
-      placeholder="请输入手机号"
-      class="margin-left input"
-    ></el-input>
-    <el-input
-      v-model="page.data.idNumber"
-      placeholder="请输入身份证号"
-      class="margin-left input"
-    ></el-input>
-    <el-select
-      v-if="!checkRole([99])"
-      filterable
-      clearable
-      v-model="page.data.username"
-      placeholder="请选择账号"
-      class="margin-left input"
-    >
-      <el-option
-        v-for="item in user_list"
-        :key="item.id"
-        :label="item.username"
-        :value="item.username"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.deviceSn"
-      placeholder="请选择设备编号"
-      class="margin-left input"
-    >
-      <el-option
-        v-for="item in machine_list"
-        :key="item.sn"
-        :label="item.sn"
-        :value="item.sn"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.deviceSn"
-      placeholder="请选择设备地点"
-      class="margin-left input"
-    >
-      <el-option
-        v-for="item in machine_list"
-        :key="item.sn"
-        :label="item.name"
-        :value="item.sn"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.faceDeviceTypeId"
-      placeholder="请选择设备类型"
-      class="margin-left input"
-      v-if="checkRole([1, 2])"
-    >
-      <el-option
-        v-for="item in machine_type_list"
-        :key="item.faceDeviceTypeId"
-        :label="item.name"
-        :value="item.faceDeviceTypeId"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.provinceId"
-      @change="chooseProvinceSearch"
-      placeholder="请选择省份"
-      class="margin-left input"
-      :disabled="checkRole([2, 3, 4, 5])"
-      v-if="!checkRole([99])"
-    >
-      <el-option
-        v-for="item in province_list_search"
-        :key="item.areaCodeId"
-        :label="item.name"
-        :value="item.areaCodeId"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.cityId"
-      @change="chooseCitySearch"
-      placeholder="请选择城市"
-      class="margin-left input"
-      :disabled="checkRole([4, 5])"
-      v-if="!checkRole([99])"
-    >
-      <el-option
-        v-for="item in city_list_search"
-        :key="item.areaCodeId"
-        :label="item.name"
-        :value="item.areaCodeId"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.areaId"
-      placeholder="请选择区域"
-      class="margin-left input"
-      :disabled="checkRole([5])"
-      v-if="!checkRole([99])"
-    >
-      <el-option
-        v-for="item in area_list_search"
-        :key="item.areaCodeId"
-        :label="item.name"
-        :value="item.areaCodeId"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.twStatus"
-      placeholder="请选择体温是否异常"
-      class="margin-left input"
-    >
-      <el-option
-        v-for="item in tw_list"
-        :key="item.id"
-        :label="item.name"
-        :value="item.id"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.pass"
-      placeholder="请选择进出门"
-      class="margin-left input"
-    >
-      <el-option
-        v-for="item in into_door_list"
-        :key="item.id"
-        :label="item.name"
-        :value="item.id"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.verifyType"
-      placeholder="请选择验证类型"
-      class="margin-left input"
-    >
-      <el-option
-        v-for="item in authentication_type_list"
-        :key="item.id"
-        :label="item.name"
-        :value="item.id"
-      >
-      </el-option>
-    </el-select>
-    <el-select
-      filterable
-      clearable
-      v-model="page.data.rightno"
-      placeholder="请选择人员类型"
-      class="margin-left input"
-    >
-      <el-option
-        v-for="item in Personnel_type_list"
-        :key="item.id"
-        :label="item.name"
-        :value="item.id"
-      >
-      </el-option>
-    </el-select>
-    <el-date-picker
-      v-model="page.data.startTime"
-      type="datetime"
-      placeholder="选择通行开始时间"
-      value-format="yyyy-MM-dd HH:mm:ss"
-      class="margin-left"
-    >
-    </el-date-picker>
-    <el-date-picker
-      v-model="page.data.endTime"
-      type="datetime"
-      placeholder="选择通行结束时间"
-      value-format="yyyy-MM-dd HH:mm:ss"
-      class="margin-left"
-    >
-    </el-date-picker>
-    <template v-if="checkRole([5])">
-      <span v-for="(item, index) in page.data.contents" :key="index">
-        <el-date-picker
-          v-if="item.customType === '日期'"
-          v-model="item.customNameVal"
-          type="datetime"
-          class="margin-left input"
-          :placeholder="item.prompt"
-          value-format="yyyy-MM-dd"
-          format="yyyy-MM-dd"
-        >
-        </el-date-picker>
-        <el-time-picker
-          class="margin-left input"
-          v-if="item.customType === '时间'"
-          v-model="item.customNameVal"
-          :picker-options="{
-            selectableRange: '00:00:00 - 23:59:59',
-          }"
-          :placeholder="item.prompt"
-          value-format="HH:mm"
-          format="HH:mm"
-        >
-        </el-time-picker>
-        <el-select
-          class="margin-left input"
-          v-if="item.customType === '下拉选择'"
-          filterable
-          clearable
-          v-model="item.customNameVal"
-          :placeholder="item.prompt"
-        >
-          <el-option
-            v-for="item in item.configurationOption"
-            :key="item.name"
-            :label="item.name"
-            :value="item.name"
-          >
-          </el-option>
-        </el-select>
-        <el-input
-          class="margin-left input"
-          v-if="item.customType === '文本'"
-          v-model="item.customNameVal"
-          :placeholder="item.prompt"
-        ></el-input>
-      </span>
-    </template>
-
-    <el-button
-      type="primary"
-      icon="el-icon-search"
-      class="margin-left"
-      @click="fetchData"
-      >搜索</el-button
-    >
-    <el-tooltip
-      class="item"
-      effect="dark"
-      content="最大支持导出50000条数据!"
-      placement="top-start"
-    >
-      <el-button
-        type="primary"
-        icon="el-icon-download"
-        class="margin-left"
-        @click="download"
-        v-if="isOut === 1"
-        >导出记录</el-button
-      >
-    </el-tooltip>
-
-    <el-tooltip
-      class="item"
-      effect="dark"
-      content="最大支持导出500条数据!"
-      placement="top-start"
-    >
-      <el-button
-        type="primary"
-        icon="el-icon-download"
-        class="margin-left"
-        @click="steakPhoto(500)"
-        v-if="isOut === 1"
-        >导出照片</el-button
-      >
-    </el-tooltip>
-
-    <el-button
-      type="primary"
-      :icon="!isUpdate ? 'el-icon-refresh-left' : 'el-icon-loading'"
-      class="margin-left"
-      @click="isUpdate ? stopUpdate() : autoUpdate()"
-      >{{ !isUpdate ? "打开自动刷新" : "关闭自动刷新" }}</el-button
-    >
-    <el-button
-      type="primary"
-      icon="el-icon-download"
-      class="margin-left"
-      v-if="isOut === 1"
-      @click="openUploadDoc"
-      >导出报表</el-button
-    >
-    <!--主表格-->
-    <el-table
-      class="table"
-      ref="table_form"
-      v-loading="listLoading"
-      :data="list"
-      element-loading-text="Loading"
-      border
-      fit
-      highlight-current-row
-    >
-      <el-table-column label="序号" align="center" width="80px">
-        <template slot-scope="scope">
-          {{ indexMethod(scope.$index) }}
-        </template>
-      </el-table-column>
-      <el-table-column label="设备编号" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.deviceSn | matchNull }}
-        </template>
-      </el-table-column>
-      <el-table-column label="所属账号" align="center" v-if="checkRole([1, 2])">
-        <template slot-scope="scope">
-          <span>{{ scope.row.username | matchNull }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="设备地点" align="center">
-        <template slot-scope="scope">
-          <span>{{ scope.row.deviceName | matchNull }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="设备类型" align="center">
-        <template slot-scope="scope">
-          <span>{{ scope.row.faceDeviceTypeName | matchNull }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column
-        label="设备品牌名称"
-        align="center"
-        v-if="checkRole([1, 2])"
-      >
-        <template slot-scope="scope">
-          <span>{{ scope.row.thirdPartyName | matchNull }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="用户姓名" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.name | matchNull }}
-        </template>
-      </el-table-column>
-      <el-table-column label="现场照片" align="center">
-        <template slot-scope="scope">
-          <el-image
-            style="width: 100px; height: 100px"
-            :src="scope.row.photo"
-            :preview-src-list="[scope.row.photo]"
-          >
-          </el-image>
-        </template>
-      </el-table-column>
-      <el-table-column label="证件号" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.cardid }}
-        </template>
-      </el-table-column>
-      <el-table-column label="卡号" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.cardidex }}
-        </template>
-      </el-table-column>
-      <el-table-column label="手机号码" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.phone }}
-        </template>
-      </el-table-column>
-      <el-table-column label="进/出" align="center">
-        <template slot-scope="scope">
-          <el-tag type="success" effect="light" v-if="scope.row.outType === 0"
-            >通用</el-tag
-          >
-          <el-tag
-            type="primary"
-            effect="plain"
-            v-else-if="scope.row.outType === 1"
-            >进门</el-tag
-          >
-          <el-tag
-            type="primary"
-            effect="dark"
-            v-else-if="scope.row.outType === 2"
-            >出门</el-tag
-          >
-          <el-tag v-else>其它</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="验证类型" align="center">
-        <template slot-scope="scope">
-          <el-tag type="primary" plain v-if="scope.row.verifyType === 0"
-            >人脸</el-tag
-          >
-          <el-tag type="primary" plain v-else-if="scope.row.verifyType === 1"
-            >IC卡</el-tag
-          >
-          <el-tag type="primary" plain v-else-if="scope.row.verifyType === 2"
-            >身份证</el-tag
-          >
-          <el-tag type="primary" plain v-else-if="scope.row.verifyType === 3"
-            >二维码</el-tag
-          >
-          <el-tag type="primary" plain v-else-if="scope.row.verifyType === 4"
-            >远程</el-tag
-          >
-          <el-tag type="primary" plain v-else-if="scope.row.verifyType === 6"
-            >IC卡+人脸</el-tag
-          >
-          <el-tag v-else>其它</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="人员类型" align="center">
-        <template slot-scope="scope">
-          <el-tag type="" effect="plain" v-if="scope.row.rightno === 104"
-            >访客</el-tag
-          >
-          <el-tag
-            type="success"
-            effect="plain"
-            v-else-if="scope.row.rightno === 105"
-            >员工</el-tag
-          >
-          <el-tag
-            type="info"
-            effect="plain"
-            v-else-if="scope.row.rightno === 101"
-            >黑名单</el-tag
-          >
-          <el-tag type="info" effect="plain" v-else>未知</el-tag>
-        </template>
-      </el-table-column>
-      <!-- <el-table-column label="认证类型" align="center">
-        <template slot-scope="scope">
-          <el-tag effect="plain" type="success" v-if="scope.row.pushType === 0"
-            >小程序</el-tag
-          >
-          <el-tag
-            effect="plain"
-            v-else-if="scope.row.pushType ===1"
-            >初次添加</el-tag
-          >
-          <el-tag
-            effect="plain"
-            type="primary"
-            v-else-if="scope.row.pushType ===2"
-            >人工录入</el-tag
-          >
-           <el-tag
-            effect="plain"
-            type="warning"
-            v-else-if="scope.row.pushType ===3"
-            >访客机</el-tag
-          >
-          <el-tag effect="plain" type="info" v-else>其他</el-tag>
-        </template>
-      </el-table-column> -->
-      <el-table-column label="通行时间" align="center">
-        <template slot-scope="scope">
-          {{ scope.row.faceTime }}
-        </template>
-      </el-table-column>
-      <!-- 自定义字段 -->
-      <template v-if="addCustomList.length > 0">
-        <el-table-column
-          align="center"
-          :label="item.customName"
-          v-for="(item, index) in addCustomList"
-          :key="index"
-        >
-          <template slot-scope="scope">
-            <el-image
-              v-if="item.customType === '图片'"
-              style="width: 70px; height: 70px"
-              :src="
-                scope.row.contents.length > 0
-                  ? scope.row.contents[index].customNameVal
-                  : ''
-              "
-              :preview-src-list="[
-                scope.row.contents.length > 0
-                  ? scope.row.contents[index].customNameVal
-                  : '',
-              ]"
-            >
-              <div slot="error" class="image-slot">暂无照片</div>
-            </el-image>
-            <span v-else>{{
-              scope.row.contents.length > 0
-                ? scope.row.contents[index].customNameVal
-                : ""
-            }}</span>
-          </template>
-        </el-table-column>
-      </template>
-
-      <el-table-column
-        label="操作区"
-        align="center"
-        fixed="right"
-        width="100px"
-      >
-        <template slot-scope="scope">
-          <!-- <el-button type="warning" size="small" @click="searchClose(scope.row)"
-            >密接</el-button
-          > -->
-          <el-button
-            type="primary"
-            size="small"
-            @click="searchDetails(scope.row)"
-            >详情</el-button
-          >
-        </template>
-      </el-table-column>
-    </el-table>
-    <!--分页栏-->
-    <pagination
-      :total="total"
-      :page.sync="page.pageNum"
-      :limit.sync="page.pageSize"
-      @pagination="fetchData"
-    />
-    <!-- 详情对话框 -->
-    <detailsDialog
-      :dialogTableVisible="dialogTableVisible"
-      @dialog="dialogTableVisible = false"
-      type="pass_records"
-      :visitToJetList="visitToJetList"
-      :row="row"
-    />
-    <!-- 导出报表 -->
-    <el-dialog
-      title="导出报表"
-      center
-      :visible.sync="uploadDocVisible"
-      destroy-on-close
-    >
-      <el-form
-        :model="uploadDoc_form"
-        ref="uploadDoc_form"
-        label-width="120px"
-        label-position="left"
-      >
-        <el-form-item label="报表类型" prop="adminAreaType">
-          <el-radio-group v-model="uploadDoc_form.type">
-            <el-radio :label="1">日报</el-radio>
-            <el-radio :label="2">周报</el-radio>
-            <el-radio :label="3">月报</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="选择时间" prop="adminAreaType">
-          <el-date-picker
-            v-model="uploadDoc_form.startTime"
-            type="date"
-            placeholder="选择开始时间"
-            value-format="yyyy-MM-dd"
-          >
-          </el-date-picker>
-          <el-date-picker
-            v-model="uploadDoc_form.endTime"
-            type="date"
-            placeholder="选择结束时间"
-            value-format="yyyy-MM-dd"
-            class="choose-time"
-          >
-          </el-date-picker>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="uploadDocFun"> 下载 </el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import detailsDialog from "@/components/DialogDetails/index.vue";
-
-import {
-  doGetFaceServerLog,
-  downloadFaceLog,
-  getFaceDeviceList,
-  getMachineCompanyListSearch,
-  getMachineTypeListSearch,
-} from "@/api/old_api_pengwenbing";
-import Pagination from "@/components/Pagination";
-import { checkRole } from "@/utils/checkRole";
-import {
-  getArea,
-  getCity,
-  getProvince,
-  getUserListSearch,
-  getContext,
-  getContextByFaceLog,
-  getUserListFrom,
-  getContextById,
-} from "@/api/user_manage";
-import { parseTime } from "@/utils";
-import { downloadPhotosPassRecords } from "@/utils/steakPhoto";
-import { monthRecords, todayRecords, weekedRecords } from "@/api/xiaosha";
-
-export default {
-  components: { Pagination, detailsDialog },
-  filters: {
-    matchNull(str) {
-      if (!str) {
-        return "未记录";
-      } else {
-        return str;
-      }
-    },
-    aAecimal(str) {
-      return (str = str.slice(0, 4));
-    },
-  },
-  data() {
-    return {
-      // 主表格&主表格加载状态
-      list: [],
-      listLoading: true,
-      downloadLoading: false, //导出加载
-      // 分页参数
-      page: {
-        data: {
-          username: null,
-          name: null,
-          idNumber: null,
-          phone: null,
-          deviceSn: null,
-          startTime: "",
-          endTime: "",
-          provinceId: null,
-          cityId: null,
-          areaId: null,
-          twStatus: null,
-          faceDeviceTypeId: null,
-          pass: null,
-          verifyType: null,
-          rightno: null,
-          shortTermFlag: true, //短期通行进出记录标识
-          contents: null, //自定义字段
-        },
-        pageNum: 1,
-        pageSize: 10,
-      },
-      total: 0,
-      // 账号列表_搜索
-      user_list: [],
-      // 设备列表_搜索
-      machine_list: [],
-      // 设备品牌列表_搜索
-      machine_company_list: [],
-      // 设备类型列表_搜索
-      machine_type_list: [],
-      // 体温结果列表_搜索
-      tw_list: [
-        { id: "1", name: "正常" },
-        { id: "2", name: "异常" },
-        { id: "3", name: "未知" },
-      ],
-      // 进出门_搜索
-      into_door_list: [
-        { id: 0, name: "不限" },
-        { id: 1, name: "进门" },
-        { id: 2, name: "出门" },
-      ],
-      // 验证类型
-      authentication_type_list: [
-        { id: 0, name: "人脸" },
-        // { id: "1", name: "IC卡" },
-        { id: 2, name: "身份证" },
-        { id: "3", name: "二维码" },
-      ],
-      // 人员类型
-      Personnel_type_list: [
-        { id: 104, name: "访客" },
-        { id: 105, name: "员工" },
-        { id: 301, name: "预约人员" },
-      ],
-      //省市县列表_搜索
-      province_list_search: [],
-      city_list_search: [],
-      area_list_search: [],
-      // 是否可以导出
-      isOut: this.$store.getters.isOut,
-      // 是否打开自动更新
-      isUpdate: "",
-      // 信息详情弹框
-      dialogVisible: false,
-      // 信息详情
-      dialogContent: "",
-      dialogTableVisible: false,
-      // 访客机数据
-      visitToJetList: {},
-      //自定义字段模板
-      addCustomList: [],
-      row: {},
-      // 报表导出
-      uploadDocVisible: false,
-      uploadDoc_form: {
-        type: 1,
-        startTime: null,
-        endTime: null,
-      },
-    };
-  },
-  created() {
-    this.page_copy = JSON.parse(JSON.stringify(this.page));
-    this.fetchData();
-    this.matchAutoUpdate();
-    this.getUserListSearch();
-    this.getFaceDeviceList();
-    this.getMachineTypeListSearch();
-    this.getAddressListSearch(1);
-    if (checkRole([2, 3])) {
-      this.getAddressListSearch(2, this.$store.getters.provinceId);
-      this.page.data.provinceId = this.$store.getters.provinceId;
-    } else if (checkRole([4])) {
-      this.getAddressListSearch(2, this.$store.getters.provinceId);
-      this.page.data.provinceId = this.$store.getters.provinceId;
-      this.getAddressListSearch(3, this.$store.getters.cityId);
-      this.page.data.cityId = this.$store.getters.cityId;
-    } else if (checkRole([5])) {
-      this.getAddressListSearch(2, this.$store.getters.provinceId);
-      this.page.data.provinceId = this.$store.getters.provinceId;
-      this.getAddressListSearch(3, this.$store.getters.cityId);
-      this.page.data.cityId = this.$store.getters.cityId;
-      this.page.data.areaId = this.$store.getters.areaId;
-      this.getContextById(this.$store.getters.adminId);
-    }
-  },
-  beforeDestroy() {
-    var isUpdate = localStorage.getItem("isUpdate");
-    if (isUpdate) {
-      clearInterval(isUpdate);
-    }
-  },
-  computed: {},
-  methods: {
-    // 查询权限
-    checkRole,
-    // 获取列表数据
-    fetchData(isUpdate = false) {
-      this.listLoading = true;
-      doGetFaceServerLog(this.page).then((res) => {
-        this.list = res.data.list;
-        this.total = res.data.total;
-        this.listLoading = false;
-      });
-    },
-    // 查询自定义字段详情
-    searchDetails(row) {
-      this.row = row;
-      let data = {
-        logId: row.logId,
-        type: row.rightno,
-      };
-      getUserListFrom(data).then((res) => {
-        this.visitToJetList = res.data;
-        this.dialogTableVisible = true;
-      });
-    },
-    // 获取自定义字段模板
-    getContextById(adminId) {
-      getContextById(adminId).then((res) => {
-        this.addCustomList = res.data;
-        this.page.data.contents = res.data;
-      });
-    },
-    // 获取设备列表-搜索
-    getFaceDeviceList() {
-      getFaceDeviceList().then((res) => {
-        this.machine_list = res.data;
-      });
-    },
-    // 设备品牌列表-搜索
-    getMachineCompanyListSearch() {
-      getMachineCompanyListSearch().then((res) => {
-        this.machine_company_list = res.data;
-      });
-    },
-    // 获取设备类型列表-搜索
-    getMachineTypeListSearch() {
-      getMachineTypeListSearch().then((res) => {
-        this.machine_type_list = res.data;
-      });
-    },
-    // 获取账号列表数据_搜索
-    getUserListSearch() {
-      getUserListSearch().then((res) => {
-        this.user_list = res.data;
-      });
-    },
-    // 获得省市县列表_搜索
-    getAddressListSearch(type, code) {
-      switch (type) {
-        case 1:
-          getProvince().then((res) => {
-            this.province_list_search = res.data;
-          });
-          break;
-        case 2:
-          getCity(code).then((res) => {
-            this.city_list_search = res.data;
-          });
-          break;
-        case 3:
-          getArea(code).then((res) => {
-            this.area_list_search = res.data;
-          });
-          break;
-        default:
-          break;
-      }
-    },
-    // 选择省份_搜索
-    chooseProvinceSearch(e) {
-      this.city_list_search = [];
-      this.page.data.cityId = "";
-      this.page.data.cityName = "";
-      this.area_list_search = [];
-      this.page.data.areaId = "";
-      this.page.data.areaName = "";
-      this.getAddressListSearch(2, e);
-      // this.getTagList(e);
-    },
-    // 选择市_搜索
-    chooseCitySearch(e) {
-      this.area_list = [];
-      this.page.data.areaId = "";
-      this.page.data.areaName = "";
-      this.getAddressListSearch(3, e);
-    },
-    // 导出记录
-    download() {
-      this.$prompt("请输入导出密码", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        closeOnClickModal: false,
-      })
-        .then(({ value }) => {
-          if (value == "Nqj##361") {
-            this.$message({
-              type: "success",
-              message: "密码正确,正在下载...",
-            });
-            this.downloadLoading = true;
-            downloadFaceLog(this.page.data).then((res) => {
-              window.location.href = res.data;
-              this.downloadLoading = false;
-            });
-          } else {
-            this.$message({
-              type: "error",
-              message: "您输入的密码不正确",
-            });
-          }
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "取消导出",
-          });
-        });
-    },
-    //批量导出图片-带参数导出入口-BETA $1 查询参数  $2多少条
-    steakPhoto(number) {
-      downloadPhotosPassRecords(this.page, number);
-    },
-    // 打开自动更新
-    autoUpdate() {
-      this.isUpdate = setInterval(() => {
-        this.fetchData(true);
-      }, 60000);
-      localStorage.setItem("isUpdate", this.isUpdate);
-    },
-    // 关闭自动更新
-    stopUpdate() {
-      clearInterval(this.isUpdate);
-      localStorage.setItem("isUpdate", "");
-      this.isUpdate = "";
-    },
-    // 检测上次自动更新状态
-    matchAutoUpdate() {
-      var isUpdate = localStorage.getItem("isUpdate");
-      if (isUpdate) {
-        clearInterval(isUpdate);
-        this.autoUpdate();
-      }
-    },
-    // 查询密切接触
-    searchClose(row) {
-      this.$prompt("请输入前后通行间隔时间(分钟)", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        inputPattern: /^[1-9]{1}[\d]*$/,
-        inputErrorMessage: "只能填写大于0的数字哦~",
-        closeOnClickModal: false,
-      })
-        .then(({ value }) => {
-          var time = Date.parse(new Date(row.faceTime));
-          var startTime = time - value * 60 * 1000;
-          var endTime = time + value * 60 * 1000;
-          startTime = parseTime(startTime, "{y}-{m}-{d} {h}:{i}:{s}");
-          endTime = parseTime(endTime, "{y}-{m}-{d} {h}:{i}:{s}");
-          this.page = JSON.parse(JSON.stringify(this.page_copy));
-          this.page.data.deviceSn = row.deviceSn;
-          this.page.data.startTime = startTime;
-          this.page.data.endTime = endTime;
-          this.fetchData();
-        })
-        .catch(() => {
-          this.$message({
-            type: "info",
-            message: "已取消查询",
-          });
-        });
-    },
-    //
-    openUploadDoc() {
-      this.uploadDocVisible = true;
-      this.uploadDoc_form.startTime = null;
-      this.uploadDoc_form.endTime = null;
-    },
-    // 导出报表
-    async uploadDocFun() {
-      let { startTime, endTime, type } = this.uploadDoc_form;
-      if (!endTime || !startTime) {
-        this.$message.error("请选择时间");
-        return;
-      }
-      let data = null;
-      let time = {
-        startTime: startTime + "  00:00:00",
-        endTime: endTime + " 23:59:59",
-      };
-      if (type === 1) {
-        data = await todayRecords(time);
-      } else if (type === 2) {
-        data = await weekedRecords(time);
-      } else if (type === 3) {
-        data = await monthRecords(time);
-      }
-      var eleLink = document.createElement("a");
-      eleLink.style.display = "none";
-      var blob = new Blob([data]);
-      eleLink.href = URL.createObjectURL(blob);
-      eleLink.setAttribute("download", "报表.doc");
-      document.body.appendChild(eleLink);
-      eleLink.click();
-      document.body.removeChild(eleLink);
-      this.uploadDocVisible = false;
-    },
-    // 返回列表序号
-    indexMethod(index) {
-      return (this.page.pageNum - 1) * this.page.pageSize + index + 1;
-    },
-  },
-};
-</script>
-<style scoped>
-.table {
-  margin-top: 15px;
-}
-.flex {
-  display: flex;
-  justify-content: flex-start;
-  align-items: center;
-}
-.margin-left {
-  margin: 10px 0 0 10px;
-}
-.input {
-  width: 150px;
-}
-.choose-time {
-  margin-left: 10px;
-}
-</style>

+ 124 - 15
src/views/user_manage/index.vue

@@ -89,7 +89,7 @@
       >
       </el-option>
     </el-select>
-    <el-select
+    <!-- <el-select
       filterable
       clearable
       v-model="page.data.areaId"
@@ -103,7 +103,7 @@
         :value="item.areaCodeId"
       >
       </el-option>
-    </el-select>
+    </el-select> -->
     <el-select
       filterable
       clearable
@@ -944,7 +944,8 @@
                 </el-radio-group>
               </el-form-item>
             </div>
-            <el-form-item
+            <div class="flex">
+              <el-form-item
                 label="是否开启进出预警"
                 prop="isOpenInoutWarning"
                 class="form-item-style item-margin-bottom"
@@ -954,6 +955,18 @@
                   <el-radio :label="true">是</el-radio>
                 </el-radio-group>
               </el-form-item>
+              <el-form-item
+                label="是否开启梯控功能"
+                prop="isOpenLadder"
+                class="form-item-style item-margin-bottom"
+              >
+                <el-radio-group v-model="user_form.isOpenLadder">
+                  <el-radio :label="false">否</el-radio>
+                  <el-radio :label="true">是</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </div>
+
             <div class="flex" v-if="user_form.placeType==2">
               <el-form-item
                 label="审核配置"
@@ -1425,6 +1438,63 @@
             </el-form-item>
           </div>
         </div>
+        <!-- 三方接入配置 -->
+        <div v-if="user_form.type === 5">
+          <div class="title">
+            <div class="line" />
+            <span>三方接入配置
+               <el-button
+                  class="el-icon-download form-item-style"
+                  type="text"
+                  @click="getAppKeyAndAppSecret3(1)"
+                >
+                  密钥
+                </el-button>
+              </span>
+          </div>
+          <div class="display-config-layout">
+            <el-form-item
+              label="员工管理接口"
+              prop="userManageSwitch"
+              class="form-item-style special"
+              label-width="120px"
+            >
+              <el-radio-group v-model="user_form.userManageSwitch">
+                <el-radio :label="false">停用</el-radio>
+                <el-radio :label="true">开启</el-radio>
+              </el-radio-group>
+              <span>
+                <el-button
+                  class="el-icon-download form-item-style"
+                  type="text"
+                  @click="getAppKeyAndAppSecret3(2)"
+                >
+                  文档
+                </el-button>
+              </span>
+            </el-form-item>
+            <el-form-item
+              label="区域管理接口"
+              prop="zoneManageSwitch"
+              class="form-item-style special"
+              label-width="120px"
+            >
+              <el-radio-group v-model="user_form.zoneManageSwitch">
+                <el-radio :label="false">停用</el-radio>
+                <el-radio :label="true">开启</el-radio>
+              </el-radio-group>
+              <span>
+                <el-button
+                  class="el-icon-download form-item-style"
+                  type="text"
+                  @click="getAppKeyAndAppSecret3(3)"
+                >
+                  文档
+                </el-button>
+              </span>
+            </el-form-item>
+          </div>
+          </div>
         <!-- 设备显示配置 -->
         <div v-if="user_form.type === 5">
           <div class="title">
@@ -1879,7 +1949,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return "未填写";
+        return "-";
       } else {
         return str;
       }
@@ -1914,7 +1984,10 @@ export default {
           let qrcode = "";
           switch (row.placeType) {
             case 0:
-              qrcode = row.zfbEmail || "";
+              qrcode =row.adminDetail? row.adminDetail.zfbRegularCode: "";
+              break;
+              case 2:
+              qrcode =row.adminDetail? row.adminDetail.zfbBuildingRegularCode: "";
               break;
             default:
               break;
@@ -1948,6 +2021,7 @@ export default {
                 break;
             }
           }
+          console.log(qrcode);
           return qrcode;
         }
       };
@@ -1963,6 +2037,11 @@ export default {
                   ? row.adminDetail.zfbRegularCode
                   : "";
                 break;
+                case 2:
+                qrcode = row.adminDetail.zfbBuildingRegularCode
+                  ? row.adminDetail.zfbBuildingRegularCode
+                  : "";
+                break;
               default:
                 break;
             }
@@ -2118,6 +2197,9 @@ export default {
         tenantEnterpriseName:'楼宇',//上级名称-显示使用
         enterpriseName:'企业',//下级名称-显示使用
         isOpenInoutWarning:false,
+        userManageSwitch:false,
+        zoneManageSwitch:false,
+        isOpenLadder:false,
       },
       user_form_copy: {},
       scene_list: [
@@ -2398,18 +2480,21 @@ export default {
         buildingCheckType: [
           { required: true, message: "请选择", trigger: "blur" },
         ],
-        zfbMiniEthTitle: [
-          { required: true, message: "请选择", trigger: "blur" },
-        ],
-        zfbMiniVguangTitle: [
-          { required: true, message: "请选择", trigger: "blur" },
-        ],
+        // zfbMiniEthTitle: [
+        //   { required: true, message: "请选择", trigger: "blur" },
+        // ],
+        // zfbMiniVguangTitle: [
+        //   { required: true, message: "请选择", trigger: "blur" },
+        // ],
         orgOutId: [
           { required: true, message: "请输入", trigger: "blur" },
         ],
         isOpenInoutWarning: [
           { required: true, message: "请选择", trigger: "blur" },
         ],
+        isOpenLadder: [
+          { required: true, message: "请选择", trigger: "blur" },
+        ],
       },
       // 批量导入结果返回
       resultVisible: false,
@@ -2828,14 +2913,15 @@ export default {
             this.user_form.advertise = null;
           }
           doEditAdmin(this.user_form).then((res) => {
-            this.submitLoading = false;
             this.dialogVisible = false;
             this.fetchData();
             this.$message({
               type: "success",
               message: "添加成功!",
             });
-          });
+          }).finally(() => {
+            this.submitLoading = false;
+          })
         }
       });
     },
@@ -3007,13 +3093,14 @@ export default {
           }
           doEditAdmin(this.user_form).then((res) => {
             this.dialogVisible = false;
-            this.submitLoading = false;
             this.fetchData();
             this.$message({
               type: "success",
               message: "编辑成功!",
             });
-          });
+          }).finally(() => {
+            this.submitLoading = false;
+          })
         }
       });
     },
@@ -3202,6 +3289,28 @@ export default {
           "https://tx.hz-hanghui.com:8088/yx-fyzd/static/浙江通用打卡进出记录推送文档国密SM4ECB模式加密.zip";
       }
     },
+
+    getAppKeyAndAppSecret3(type) {
+      console.log(type);
+      switch (type) {
+        case 1:
+          let str = `appId: ${this.row.userDistrictAdminAuthVO.appId}\r\nappKey: ${this.row.userDistrictAdminAuthVO.appKey}\r\nappSecret: ${this.row.userDistrictAdminAuthVO.appSecret}\r\nprivateKey: ${this.row.userDistrictAdminAuthVO.privateKey}`;
+          let strData = new Blob([str], { type: "text/plain;charset=utf-8" });
+          saveAs(strData, "密钥.txt");
+          break;
+        case 2:
+          window.location.href =
+            "https://tx.hz-hanghui.com:8088/yx-fyzd/file/upload/pdf/人员管理接口文档.pdf";
+          break;
+        case 3:
+          window.location.href =
+            "https://tx.hz-hanghui.com:8088/yx-fyzd/file/upload/pdf/区域管理接口文档.pdf";
+          break;
+        default:
+          break;
+      }
+    },
+
     handleCheckChange(val, type) {
       if (type == 1) {
         if (val) {

+ 1 - 1
src/views/visitee_list/index.vue

@@ -149,7 +149,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return '暂无'
+        return '-'
       } else {
         return str
       }

+ 38 - 33
src/views/visitee_list/modal/AddModal.vue

@@ -82,8 +82,7 @@
       <el-form-item label="楼层" prop="floor" required>
         <el-input
           v-model="form.floor"
-          placeholder="请输入楼层"
-          maxlength="10"
+          placeholder="请输入楼层,多个楼层请用英文逗号分隔"
         />
       </el-form-item>
       <el-form-item label="房间号" prop="room">
@@ -196,41 +195,46 @@ export default {
             },
           },
         ],
-        idNumber: [
+        // idNumber: [
+        //   {
+        //     required: false,
+        //     max: 18,
+        //     trigger: ["change", "blur"],
+        //     validator: (rule, value, callback) => {
+        //       if (!value || this.idNumberReadOnly) {
+        //         return callback();
+        //       }
+        //       if (value.length === 15) {
+        //         const idreg =
+        //           /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
+        //         if (!idreg.test(value)) {
+        //           return callback("身份证号格式错误!");
+        //         }
+        //       } else if (value.length === 18) {
+        //         const idreg =
+        //           /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;
+        //         if (!idreg.test(value)) {
+        //           return callback("身份证号格式错误!");
+        //         }
+        //       } else {
+        //         return callback("身份证号位数错误!");
+        //       }
+        //       return callback();
+        //     },
+        //   },
+        // ],
+        floor: [
           {
-            required: false,
-            max: 18,
+            required: true,
+            whitespace: true,
+            message: "不能为空!",
             trigger: ["change", "blur"],
-            validator: (rule, value, callback) => {
-              if (!value || this.idNumberReadOnly) {
-                return callback();
-              }
-              if (value.length === 15) {
-                const idreg =
-                  /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
-                if (!idreg.test(value)) {
-                  return callback("身份证号格式错误!");
-                }
-              } else if (value.length === 18) {
-                const idreg =
-                  /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;
-                if (!idreg.test(value)) {
-                  return callback("身份证号格式错误!");
-                }
-              } else {
-                return callback("身份证号位数错误!");
-              }
-              return callback();
-            },
           },
-        ],
-        floor: [
-          { required: true, whitespace: true, message: '不能为空!', trigger: ['change', 'blur'] },
           {
-            pattern: /^-?[1-9a-zA-Z]{1,}\d*$/,
-            message: '楼层只能为整数或英文字母组合!',
-            trigger: ['change', 'blur']
-          }
+            pattern: /^-?[-,1-9a-zA-Z]{1,}\d*$/,
+            message: "楼层只能为整数或英文字母组合,多个楼层请用英文逗号隔开!",
+            trigger: ["change", "blur"],
+          },
         ],
         showTitle: [
           {
@@ -254,6 +258,7 @@ export default {
   methods: {
     checkRole,
     areaChange(e) {
+      this.form = { ...this.form };
       this.$forceUpdate();
     },
     open(obj) {

+ 32 - 8
src/views/visitors_list/index.vue

@@ -39,6 +39,22 @@
       >
       </el-option>
     </el-select>
+    <el-date-picker
+      v-model="page.data.startTime"
+      type="datetime"
+      placeholder="有效期开始时间"
+      value-format="yyyy-MM-dd HH:mm:ss"
+      class="margin-left"
+    >
+    </el-date-picker>
+    <el-date-picker
+      v-model="page.data.endTime"
+      type="datetime"
+      placeholder="有效期结束时间"
+      value-format="yyyy-MM-dd HH:mm:ss"
+      class="margin-left"
+    >
+    </el-date-picker>
     <el-select
       filterable
       clearable
@@ -46,8 +62,7 @@
       @change="chooseProvinceSearch"
       placeholder="请选择省份"
       class="margin-left input"
-      :disabled="checkRole([2, 3, 4, 5])"
-      v-if="!checkRole([99])"
+      v-if="checkRole([2, 3, 4])"
     >
       <el-option
         v-for="item in province_list_search"
@@ -64,8 +79,7 @@
       @change="chooseCitySearch"
       placeholder="请选择城市"
       class="margin-left input"
-      :disabled="checkRole([4, 5])"
-      v-if="!checkRole([99])"
+      v-if="checkRole([2, 3, 4])"
     >
       <el-option
         v-for="item in city_list_search"
@@ -81,8 +95,7 @@
       v-model="page.data.areaId"
       placeholder="请选择区域"
       class="margin-left input"
-      :disabled="checkRole([5])"
-      v-if="!checkRole([99])"
+      v-if="checkRole([2, 3, 4])"
     >
       <el-option
         v-for="item in area_list_search"
@@ -279,7 +292,16 @@
           <el-tag effect="plain" type="info" v-else>其他</el-tag>
         </template>
       </el-table-column>
-
+<el-table-column label="有效期开始时间" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.startTime | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="有效期结束时间" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.endTime | matchNull }}
+        </template>
+      </el-table-column>
        <template v-if="checkRole([5])">
         <el-table-column
           align="center"
@@ -396,7 +418,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return "暂无";
+        return "-";
       } else {
         return str;
       }
@@ -421,6 +443,8 @@ export default {
           cityId: null,
           areaId: null,
           contents: null,
+          startTime:null,
+          endTime:null,
         },
         pageNum: 1,
         pageSize: 10,

+ 70 - 31
src/views/visitors_record/compoment/dialog.vue

@@ -9,12 +9,22 @@
       <el-descriptions :column="2" border :contentStyle="CS" :label-style="LS">
         <el-descriptions-item label="实名照片">
           <el-image
+          v-if="row.photo"
             style="width: 200px; height: 200px"
             :src="row.photo"
             :preview-src-list="[row.photo]"
           >
           </el-image>
         </el-descriptions-item>
+        <el-descriptions-item label="实名照片">
+          <el-image
+          v-if="row.xp"
+            style="width: 200px; height: 200px"
+            :src="row.xp"
+            :preview-src-list="[row.xp]"
+          >
+          </el-image>
+        </el-descriptions-item>
         <el-descriptions-item label="	姓名">{{ row.name }}</el-descriptions-item>
         <el-descriptions-item label="手机号">{{
           row.phone
@@ -26,10 +36,13 @@
         <el-descriptions-item label="单位">{{
           row.company
         }}</el-descriptions-item>
+        <el-descriptions-item label="楼层">{{
+          row.company
+        }}</el-descriptions-item>
         <el-descriptions-item label="车牌号">{{
           row.carno | noList
         }}</el-descriptions-item>
-        <el-descriptions-item label="	访问事由">{{
+        <el-descriptions-item label="拜访事由">{{
           row.reason
         }}</el-descriptions-item>
         <el-descriptions-item label="受访人姓名">{{
@@ -41,15 +54,47 @@
         <el-descriptions-item label="受访人单位">{{
           row.visiteeCompany
         }}</el-descriptions-item>
+        <el-descriptions-item label="是否签离">
+          <el-tag
+            effect="plain"
+            type="success"
+            v-if="row.isSignOut"
+            >是</el-tag
+          >
+           <el-tag
+            effect="plain"
+            type="primary"
+            v-if="!row.isSignOut"
+            >否</el-tag
+          >
+        </el-descriptions-item>
+
         <el-descriptions-item label="来访记录类型">
-          <el-tag type="success" effect="dark" v-if="row.visitingType === 0"
-            >申请记录</el-tag
+          <el-tag
+            effect="plain"
+            type="primary"
+            v-if="row.visitingType === 0"
+            >访客线上申请</el-tag
           >
           <el-tag
-            type="warning"
-            effect="dark"
-            v-else-if="row.visitingType === 1"
-            >邀请记录</el-tag
+            effect="plain"
+            type="success"
+            v-if="row.visitingType === 2"
+            >访客线下申请</el-tag
+          >
+          <el-tag
+            effect="plain"
+            type="danger"
+            v-if="row.visitingType === 1"
+            >常客线上{{
+              `${
+                row.invitationWay === 1
+                  ? "短信"
+                  : row.invitationWay == 0
+                  ? "微信"
+                  : ""
+              }邀请`
+            }}</el-tag
           >
         </el-descriptions-item>
         <el-descriptions-item label="审核状态">
@@ -80,38 +125,32 @@
             >亲属</el-tag
           >
         </el-descriptions-item>
-        <el-descriptions-item label="邀请方式 ">
-          <el-tag type="success" effect="dark" v-if="row.invitationWay === 0"
-            >微信</el-tag
-          >
-          <el-tag
-            type="warning"
-            effect="dark"
-            v-else-if="row.invitationWay === 1"
-            >短信</el-tag
-          >
-        </el-descriptions-item>
-        <!-- <el-descriptions-item label="现场照片">
-          <el-image
-            style="width: 200px; height: 200px"
-            :src="row.avatar"
-            :preview-src-list="[row.avatar]"
-          >
-          </el-image>
-        </el-descriptions-item> -->
-
-        <el-descriptions-item label="开始时间">{{
+        <el-descriptions-item label="登记开始时间">{{
           row.startTime
         }}</el-descriptions-item>
-        <el-descriptions-item label="结束时间">{{
+        <el-descriptions-item label="登记结束时间">{{
           row.endTime
         }}</el-descriptions-item>
+        <el-descriptions-item label="登记设备">{{
+          row.machineId
+        }}</el-descriptions-item>
+        <el-descriptions-item label="登记地点">{{
+          row.registerAddress
+        }}</el-descriptions-item>
+        <el-descriptions-item label="签离时间">{{
+          row.signOutTime
+        }}</el-descriptions-item>
+        <el-descriptions-item label="签离设备">{{
+          row.signOutSn
+        }}</el-descriptions-item>
+        <el-descriptions-item label="签离地点">{{
+          row.signOutAddress
+        }}</el-descriptions-item>
         <el-descriptions-item label="创建时间">{{
           row.createTime
         }}</el-descriptions-item>
       </el-descriptions>
-      <template v-if="visitToJetList.contentStatus == 1"
-        >
+      <template v-if="visitToJetList.contentStatus == 1 &&visitToJetList.contents.length>0">
         <h3>自定义字段内容</h3>
         <el-descriptions
           :column="2"

+ 220 - 29
src/views/visitors_record/index.vue

@@ -3,19 +3,137 @@
     <!--操作区-->
     <el-input
       v-model="page.data.name"
-      placeholder="请输入姓名"
+      placeholder="姓名"
       class="margin-left input"
     ></el-input>
     <el-input
       v-model="page.data.phone"
-      placeholder="请输入手机号"
+      placeholder="手机号"
       class="margin-left input"
     ></el-input>
     <el-input
       v-model="page.data.idNumber"
-      placeholder="请输入身份证号"
+      placeholder="身份证号"
       class="margin-left input"
     ></el-input>
+
+    <el-input
+      v-model="page.data.company"
+      placeholder="单位"
+      class="margin-left input"
+    ></el-input>
+    <!-- <el-input
+      v-model="page.data.floor"
+      placeholder="楼层"
+      class="margin-left input"
+    ></el-input> -->
+    <el-input
+      v-model="page.data.visiteeXm"
+      placeholder="受访人姓名"
+      class="margin-left input"
+    ></el-input>
+    <el-input
+      v-model="page.data.visiteePhone"
+      placeholder="受访人电话"
+      class="margin-left input"
+    ></el-input>
+    <el-input
+      v-model="page.data.visiteeCompany"
+      placeholder="受访人单位"
+      class="margin-left input"
+    ></el-input>
+    <el-select
+      v-model="page.data.reason"
+      clearable
+      filterable
+      placeholder="拜访事由"
+      class="margin-left input"
+    >
+      <el-option
+        v-for="item in causeMatterList"
+        :key="item"
+        :label="item"
+        :value="item"
+      >
+      </el-option>
+    </el-select>
+    <el-select
+      v-model="page.data.isSignOut"
+      clearable
+      filterable
+      placeholder="是否签离"
+      class="margin-left input"
+    >
+      <el-option
+        v-for="item in sign_off_list"
+        :key="item.id"
+        :label="item.name"
+        :value="item.id"
+      >
+      </el-option>
+    </el-select>
+    <el-select
+      v-model="page.data.visitingType"
+      clearable
+      filterable
+      placeholder="来访记录类型"
+      class="margin-left input"
+    >
+      <el-option
+        v-for="item in records_list"
+        :key="item.id"
+        :label="item.name"
+        :value="item.id"
+      >
+      </el-option>
+    </el-select>
+    <el-select
+      v-model="page.data.reviewStatus"
+      clearable
+      filterable
+      placeholder="审核状态"
+      class="margin-left input"
+    >
+      <el-option
+        v-for="item in check_list"
+        :key="item.id"
+        :label="item.name"
+        :value="item.id"
+      >
+      </el-option>
+    </el-select>
+    <el-date-picker
+      v-model="page.data.startStartTime"
+      type="datetime"
+      placeholder="登记开始时间"
+      value-format="yyyy-MM-dd HH:mm:ss"
+      class="margin-left input"
+    >
+    </el-date-picker>
+    <el-date-picker
+      v-model="page.data.startEndTime"
+      type="datetime"
+      placeholder="登记结束时间"
+      value-format="yyyy-MM-dd HH:mm:ss"
+      class="margin-left input"
+    >
+    </el-date-picker>
+    <el-date-picker
+      v-model="page.data.signOutStartTime"
+      type="datetime"
+      placeholder="签离开始时间"
+      value-format="yyyy-MM-dd HH:mm:ss"
+      class="margin-left input"
+    >
+    </el-date-picker>
+    <el-date-picker
+      v-model="page.data.signOutEndTime"
+      type="datetime"
+      placeholder="签离结束时间"
+      value-format="yyyy-MM-dd HH:mm:ss"
+      class="margin-left input"
+    >
+    </el-date-picker>
     <el-button
       type="primary"
       icon="el-icon-search"
@@ -57,6 +175,7 @@
       <el-table-column label="实名照片" align="center">
         <template slot-scope="scope">
           <el-image
+          v-if="scope.row.photo"
             style="width: 70px; height: 70px"
             :src="scope.row.photo"
             :preview-src-list="[scope.row.photo]"
@@ -65,6 +184,17 @@
           </el-image>
         </template>
       </el-table-column>
+      <el-table-column label="证件照片" align="center">
+        <template slot-scope="scope">
+          <el-image
+            v-if="scope.row.xp"
+            style="width: 70px; height: 70px"
+            :src="scope.row.xp"
+            :preview-src-list="[scope.row.xp]"
+          >
+          </el-image>
+        </template>
+      </el-table-column>
       <el-table-column label="姓名" align="center">
         <template slot-scope="scope">
           {{ scope.row.name | matchNull }}
@@ -85,6 +215,11 @@
           {{ scope.row.company | matchNull }}
         </template>
       </el-table-column>
+      <el-table-column label="楼层" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.floor | matchNull }}
+        </template>
+      </el-table-column>
       <el-table-column label="受访人姓名" align="center">
         <template slot-scope="scope">
           {{ scope.row.visiteeXm | matchNull }}
@@ -105,34 +240,75 @@
           {{ scope.row.reason | matchNull }}
         </template>
       </el-table-column>
-      <el-table-column label="开始时间" align="center">
+      <el-table-column label="登记开始时间" align="center">
         <template slot-scope="scope">
           {{ scope.row.startTime | matchNull }}
         </template>
       </el-table-column>
-      <el-table-column label="结束时间" align="center">
+      <el-table-column label="登记结束时间" align="center">
         <template slot-scope="scope">
           {{ scope.row.endTime | matchNull }}
         </template>
       </el-table-column>
+      <el-table-column label="登记设备" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.machineId | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="登记地点" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.registerAddress | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="签离时间" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.signOutTime | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="签离设备" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.signOutSn | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="签离地点" align="center">
+        <template slot-scope="scope">
+          {{ scope.row.signOutAddress | matchNull }}
+        </template>
+      </el-table-column>
+      <el-table-column label="是否签离" align="center">
+        <template slot-scope="scope">
+          <el-tag effect="plain" type="success" v-if="scope.row.isSignOut"
+            >是</el-tag
+          >
+          <el-tag effect="plain" type="primary" v-if="!scope.row.isSignOut"
+            >否</el-tag
+          >
+        </template>
+      </el-table-column>
       <el-table-column label="来访记录类型" align="center" width="150">
         <template slot-scope="scope">
           <el-tag
             effect="plain"
             type="primary"
             v-if="scope.row.visitingType === 0"
-            >访客申请</el-tag
+            >访客线上申请</el-tag
           >
           <el-tag
             effect="plain"
             type="success"
+            v-if="scope.row.visitingType === 2"
+            >访客线下申请</el-tag
+          >
+          <el-tag
+            effect="plain"
+            type="danger"
             v-if="scope.row.visitingType === 1"
-            >{{
+            >常客线上{{
               `${
                 scope.row.invitationWay === 1
-                  ? " - 短信"
+                  ? "短信"
                   : scope.row.invitationWay == 0
-                  ? " - 微信"
+                  ? "微信"
                   : ""
               }邀请`
             }}</el-tag
@@ -142,7 +318,6 @@
 
       <el-table-column label="审核状态" align="center">
         <template slot-scope="scope">
-          <!-- {{scope.row.personnelType | personnelType }} {{scope.row.personnelType | personnelType }} {{scope.row.personnelType | personnelType }}-->
           <el-tag
             effect="plain"
             type="primary"
@@ -219,7 +394,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return "暂无";
+        return "-";
       } else {
         return str;
       }
@@ -243,29 +418,42 @@ export default {
           name: "",
           phone: "",
           idNumber: "",
-          provinceId: null,
-          cityId: null,
-          areaId: null,
-          contents: null,
+          company: null,
+          floor: null,
+          visiteeXm: null,
+          visiteePhone: null,
+          visiteeCompany: null,
+          reason: null,
+          isSignOut: null,
+          startEndTime: null,
+          startStartTime: null,
+          signOutStartTime: null,
+          signOutEndTime: null,
+          visitingType:null,
+          reviewStatus:null,
         },
         pageNum: 1,
         pageSize: 10,
       },
       total: 0,
-      // 账号列表_搜索
-      user_list: [],
-      //省市县列表_搜索
-      province_list_search: [],
-      city_list_search: [],
-      area_list_search: [],
-      // 是否认证_搜索
-      status_list: [
-        { id: 1, name: "已认证" },
-        { id: 2, name: "未认证" },
-      ],
       dialogTableVisible: false,
       visitToJetList: {}, //详情
       row: null,
+      sign_off_list: [
+        { id: true, name: "已签离" },
+        { id: false, name: "未签离" },
+      ],
+      causeMatterList: ["业务拜访", "会议邀请", "施工单位", "其他事项"],
+      records_list: [
+        { id: 0, name: "访客线上申请" },
+        { id: 2, name: "访客线下申请" },
+        { id: 1, name: "常客线上邀请" },
+      ],
+      check_list: [
+        { id: 0, name: "待审核" },
+        { id: 1, name: "已拒绝" },
+        { id: 2, name: "已同意" },
+      ],
     };
   },
   created() {
@@ -275,13 +463,16 @@ export default {
     // 查询权限
     checkRole,
     // 获取列表数据
-    fetchData() {
+   async fetchData() {
       this.listLoading = true;
-      getDetailPageList(this.page).then((res) => {
+      try {
+        let res =await getDetailPageList(this.page)
         this.list = res.data.list;
         this.total = res.data.total;
         this.listLoading = false;
-      });
+      } catch (error) {
+         this.listLoading = false;
+      }
     },
     // 查询详细信息
     searchContent(row) {

+ 1 - 1
src/views/warning_record/index.vue

@@ -179,7 +179,7 @@ export default {
   filters: {
     matchNull(str) {
       if (!str) {
-        return "暂无数据";
+        return "-";
       } else {
         return str;
       }

File diff suppressed because it is too large
+ 485 - 260
src/views/white_list/index.vue


Some files were not shown because too many files changed in this diff