From 3f7aa1396eef8f046a9debb880285ce6b32acc53 Mon Sep 17 00:00:00 2001
From: lishuai <260038442@qq.com>
Date: 星期五, 22 十二月 2023 15:33:46 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 admin/src/components/business/OperaDeviceRoleFWindow.vue                                                   |   10 
 admin/src/views/business/laborSource.vue                                                                   |  101 +++-
 server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java             |   16 
 admin/src/views/business/deviceRole_f.vue                                                                  |   50 +
 server/dmvisit_admin/src/main/java/com/doumee/api/system/SystemUserController.java                         |    6 
 admin/vue.config.js                                                                                        |    2 
 server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java               |   14 
 server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java          |    1 
 server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java                                 |   10 
 server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java |    2 
 server/dmvisit_service/src/main/java/com/doumee/service/system/SystemUserService.java                      |    2 
 admin/src/api/system/common.js                                                                             |   20 +
 admin/src/components/business/OperaDeviceRoleWindow.vue                                                    |  140 ++++++
 server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java                            |    4 
 server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java                          |   39 -
 admin/src/api/business/deviceRole.js                                                                       |   10 
 server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java                           |   11 
 server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java                           |    2 
 admin/src/components/business/OperaProblemsWindow.vue                                                      |  171 +++++++-
 server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java                        |    5 
 admin/src/views/business/problems.vue                                                                      |   44 +
 server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java                     |    5 
 server/openapi/src/main/resources/application.yml                                                          |    2 
 server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java                                       |   11 
 admin/src/views/business/deviceRole.vue                                                                    |   44 +
 server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java                         |    3 
 server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java                            |    7 
 server/dmvisit_service/src/main/java/com/doumee/core/utils/HttpsUtil.java                                  |   50 ++
 server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java               |  148 ++++++
 admin/src/views/business/problemLog.vue                                                                    |   24 
 admin/src/views/business/visitorSources.vue                                                                |   83 +++-
 server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java                                  |    3 
 admin/src/views/business/device.vue                                                                        |   20 
 server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java                             |    4 
 admin/src/api/business/device.js                                                                           |    7 
 server/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java                                      |   73 ++
 36 files changed, 906 insertions(+), 238 deletions(-)

diff --git a/admin/src/api/business/device.js b/admin/src/api/business/device.js
index 221ac0f..16cb174 100644
--- a/admin/src/api/business/device.js
+++ b/admin/src/api/business/device.js
@@ -9,7 +9,12 @@
 
 // 鍚屾
 export function syncDevices (data) {
-  return request.post('/business/erpsync/syncDevices', data)
+  return request.post('/business/hksync/syncDevices', data)
+}
+
+// 鑾峰彇闂ㄧ闆嗗悎-鎻愪緵缁欓棬绂佺粍
+export function getList (data) {
+  return request.post('/business/device/getList', data)
 }
 
 // 淇敼
diff --git a/admin/src/api/business/deviceRole.js b/admin/src/api/business/deviceRole.js
index 420d6bc..5e5578d 100644
--- a/admin/src/api/business/deviceRole.js
+++ b/admin/src/api/business/deviceRole.js
@@ -17,6 +17,16 @@
   return request.post('/business/deviceRole/updateById', data)
 }
 
+// 鏍规嵁ID淇敼榛樿闂ㄧ缁勭姸鎬�
+export function updateStatusById (data) {
+  return request.post('/business/deviceRole/updateStatusById', data)
+}
+
+// 銆愭捣搴枫�戝叏閲忓悓姝ヨ瀹㈡潈闄愮粍鎺ュ彛
+export function syncPrivilege (data) {
+  return request.post('/business/hksync/syncPrivilege', data)
+}
+
 // 鍒犻櫎
 export function deleteById (id) {
   return request.get(`/business/deviceRole/delete/${id}`)
diff --git a/admin/src/api/system/common.js b/admin/src/api/system/common.js
index eed43bd..b116149 100644
--- a/admin/src/api/system/common.js
+++ b/admin/src/api/system/common.js
@@ -26,3 +26,23 @@
     autoLogin: false
   })
 }
+
+// 璁垮鏉ヨ閰嶇疆
+export function getVisitConfigDTO () {
+  return request.get('/system/dictData/getVisitConfigDTO')
+}
+
+// 鍔冲姟鏉ヨ閰嶇疆
+export function getLaborConfigDTO () {
+  return request.get('/system/dictData/getLaborConfigDTO')
+}
+
+// 淇敼璁垮鏉ヨ閰嶇疆
+export function updateVisitConfig (data) {
+  return request.post('/system/dictData/updateVisitConfig', data)
+}
+
+// 淇敼鍔冲姟鏉ヨ閰嶇疆
+export function updateLaborConfigDTO (data) {
+  return request.post('/system/dictData/updateLaborConfigDTO', data)
+}
diff --git a/admin/src/components/business/OperaDeviceRoleFWindow.vue b/admin/src/components/business/OperaDeviceRoleFWindow.vue
index 9b5e912..9474f55 100644
--- a/admin/src/components/business/OperaDeviceRoleFWindow.vue
+++ b/admin/src/components/business/OperaDeviceRoleFWindow.vue
@@ -9,10 +9,10 @@
             <el-form-item label="闂ㄧ缁勫悕绉�" prop="name">
                 <el-input v-model="form.name" placeholder="璇疯緭鍏ラ棬绂佺粍鍚嶇О" v-trim/>
             </el-form-item>
-            <el-form-item label="鎺堟潈闂ㄧ" prop="doorIds">
-                <el-radio-group v-model="form.doorIds">
-                    <el-radio :label="3">璁垮</el-radio>
-                    <el-radio :label="6">鍔冲姟浜哄憳</el-radio>
+            <el-form-item label="閫傜敤鐢ㄦ埛" prop="type">
+                <el-radio-group v-model="form.type">
+                    <el-radio label="0">鍔冲姟璁垮</el-radio>
+                    <el-radio label="1">鏅�氳瀹�</el-radio>
                 </el-radio-group>
             </el-form-item>
         </el-form>
@@ -32,7 +32,7 @@
       form: {
         id: null,
         name: '',
-        doorIds: ''
+        type: ''
       },
       // 楠岃瘉瑙勫垯
       rules: {
diff --git a/admin/src/components/business/OperaDeviceRoleWindow.vue b/admin/src/components/business/OperaDeviceRoleWindow.vue
index 76ddcfb..4910ac9 100644
--- a/admin/src/components/business/OperaDeviceRoleWindow.vue
+++ b/admin/src/components/business/OperaDeviceRoleWindow.vue
@@ -6,27 +6,25 @@
         @confirm="confirm"
     >
         <el-form :model="form" ref="form" :rules="rules">
-            <el-form-item label="鍚嶇О" prop="name">
+            <el-form-item label="闂ㄧ缁勫悕绉�" prop="name">
                 <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
             </el-form-item>
-            <el-form-item label="鏄惁榛樿" prop="isDefault">
+            <el-form-item label="榛樿闂ㄧ缁�" prop="isDefault">
                 <el-switch
                     v-model="form.isDefault"
                     active-color="#13ce66"
                     inactive-color="#ff4949"
-                    :active-value="1"
-                    :inactive-value="0">
+                    :active-value="0"
+                    :inactive-value="1">
                 </el-switch>
             </el-form-item>
             <el-form-item label="鎺堟潈闂ㄧ" prop="doorIds">
-                <el-radio-group v-model="form.doorIds">
-                    <el-radio :label="3">鍏ㄩ儴闂ㄧ</el-radio>
-                    <el-radio :label="6">閮ㄥ垎闂ㄧ</el-radio>
+                <el-radio-group v-model="form.radio" @input="changeRadio">
+                    <el-radio :label="0">鍏ㄩ儴闂ㄧ</el-radio>
+                    <el-radio :label="1">閮ㄥ垎闂ㄧ</el-radio>
                 </el-radio-group>
-                <el-checkbox-group v-model="form.doorIds">
-                    <el-checkbox label="闂ㄧA"></el-checkbox>
-                    <el-checkbox label="闂ㄧB"></el-checkbox>
-                    <el-checkbox label="闂ㄧC"></el-checkbox>
+                <el-checkbox-group v-model="form.doorIds" v-if="form.radio === 1">
+                    <el-checkbox :label="item.id" v-for="(item, index) in device" :key="index">{{item.name}}</el-checkbox>
                 </el-checkbox-group>
             </el-form-item>
         </el-form>
@@ -36,21 +34,39 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import { getList } from '@/api/business/device'
 export default {
   name: 'OperaDeviceRoleWindow',
   extends: BaseOpera,
   components: { GlobalWindow },
   data () {
+    var validatePass = (rule, value, callback) => {
+      if (this.form.radio === 1) {
+        if (value.length === 0) {
+          callback(new Error('璇烽�夋嫨闂ㄧ璁惧'))
+        }
+      }
+      callback()
+    }
     return {
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
         name: '',
-        isDefault: '',
-        doorIds: ''
+        isDefault: 1,
+        doorIds: [],
+        status: 1,
+        radio: 0
       },
+      device: [],
       // 楠岃瘉瑙勫垯
       rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ラ棬绂佺粍鍚嶇О' }
+        ],
+        doorIds: [
+          { validator: validatePass, trigger: 'blur' }
+        ]
       }
     }
   },
@@ -59,6 +75,104 @@
       api: '/business/deviceRole',
       'field.id': 'id'
     })
+  },
+  methods: {
+    confirm () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        // 璋冪敤鏂板缓鎺ュ彛
+        this.isWorking = true
+        if (this.form.id == null || this.form.id === '') {
+          const doorNames = []
+          this.form.doorIds.forEach(item => {
+            this.device.forEach(row => {
+              if (item === row.id) {
+                doorNames.push(row.name)
+              }
+            })
+          })
+          this.api.create({
+            name: this.form.name,
+            status: this.form.status,
+            doorNames: doorNames.join(','),
+            type: 2,
+            isDefault: this.form.isDefault,
+            doorIds: this.form.doorIds.join(',')
+          })
+            .then(() => {
+              this.visible = false
+              this.$tip.apiSuccess('鏂板缓鎴愬姛')
+              this.$emit('success')
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.isWorking = false
+            })
+        } else {
+          const doorNames = []
+          this.form.doorIds.forEach(item => {
+            this.device.forEach(row => {
+              if (item === row.id) {
+                doorNames.push(row.name)
+              }
+            })
+          })
+          this.api.updateById({
+            id: this.form.id,
+            name: this.form.name,
+            status: this.form.status,
+            isDefault: this.form.isDefault,
+            type: 2,
+            doorNames: doorNames.join(','),
+            doorIds: this.form.doorIds.join(',')
+          })
+            .then(() => {
+              this.visible = false
+              this.$tip.apiSuccess('淇敼鎴愬姛')
+              this.$emit('success')
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.isWorking = false
+            })
+        }
+      })
+    },
+    // 鑾峰彇璁惧
+    getLists () {
+      getList({})
+        .then(res => {
+          this.device = res
+        })
+    },
+    changeRadio (e) {
+      this.form.doorIds = []
+    },
+    open (title, target) {
+      this.getLists()
+      this.title = title
+      this.visible = true
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    }
   }
 }
 </script>
diff --git a/admin/src/components/business/OperaProblemsWindow.vue b/admin/src/components/business/OperaProblemsWindow.vue
index 5fb5b7c..abd0aae 100644
--- a/admin/src/components/business/OperaProblemsWindow.vue
+++ b/admin/src/components/business/OperaProblemsWindow.vue
@@ -1,50 +1,63 @@
 <template>
     <GlobalWindow
-            :title="title"
-            :visible.sync="visible"
-            :confirm-working="isWorking"
-            @confirm="confirm"
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
     >
         <el-form :model="form" ref="form" :rules="rules">
             <el-form-item label="棰樼洰" prop="title">
                 <el-input v-model="form.title" placeholder="璇疯緭鍏ラ鐩�" v-trim/>
             </el-form-item>
             <el-form-item label="棰樼洰绫诲瀷" prop="type">
-                <el-select v-model="form.type" placeholder="璇烽�夋嫨">
-                    <el-option label="鍒ゆ柇" value="0"></el-option>
-                    <el-option label="鍗曢��" value="1"></el-option>
-                    <el-option label="澶氶��" value="2"></el-option>
+                <el-select v-model="form.type" @change="changeType" placeholder="璇烽�夋嫨">
+                    <el-option label="鍒ゆ柇" :value="0"></el-option>
+                    <el-option label="鍗曢��" :value="1"></el-option>
+                    <el-option label="澶氶��" :value="2"></el-option>
                 </el-select>
             </el-form-item>
             <el-form-item label="閫傜敤鐢ㄦ埛" prop="useType">
                 <el-radio-group v-model="form.useType">
-                    <el-radio :label="0">鍔冲姟浜哄憳</el-radio>
-                    <el-radio :label="1">鏅�氳瀹�</el-radio>
+                    <el-radio :label="0">璁垮鍜屽姵鍔�</el-radio>
+                    <el-radio :label="1">浠呰瀹�</el-radio>
+                    <el-radio :label="2">浠呭姵鍔�</el-radio>
                 </el-radio-group>
             </el-form-item>
             <el-form-item label="棰樼洰椤哄簭(鍗囧簭)" prop="sortnu">
                 <el-input v-model="form.sortnu" placeholder="璇疯緭鍏�" v-trim/>
             </el-form-item>
-            <el-form-item label="閫夐」闆嗗悎" prop="options" v-if="form.type === '1' || form.type === '2'">
+            <el-form-item label="閫夐」闆嗗悎" prop="objectList" v-if="form.type === 1 || form.type === 2">
                 <el-button type="primary" style="width: 120px; margin-bottom: 15px;" @click="add" icon="el-icon-plus">娣诲姞閫夐」</el-button>
                 <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab">
                     <el-tab-pane
-                        v-for="item in problems"
-                        :key="item.name"
-                        :label="item.name"
+                        v-for="item in form.objectList"
+                        :key="item.code"
+                        :label="item.sort"
                         :name="item.id"
                     >
-                        <el-input v-model="item.val" placeholder="璇疯緭鍏�" v-trim/>
+                        <el-input v-model="item.value" placeholder="璇疯緭鍏�" v-trim/>
                     </el-tab-pane>
                 </el-tabs>
             </el-form-item>
             <el-form-item label="姝g‘绛旀" prop="answer">
-                <el-select v-model="form.answer" multiple placeholder="璇烽�夋嫨姝g‘绛旀">
+                <el-select v-model="form.answer" v-if="form.type === 0" placeholder="璇烽�夋嫨姝g‘绛旀">
+                    <el-option label="姝g‘" value="姝g‘"></el-option>
+                    <el-option label="閿欒" value="閿欒"></el-option>
+                </el-select>
+                <el-select v-model="form.answer" v-if="form.type === 1" placeholder="璇烽�夋嫨姝g‘绛旀">
                     <el-option
-                        v-for="item in problems"
+                        v-for="item in form.objectList"
                         :key="item.id"
-                        :label="item.name"
-                        :value="item.id">
+                        :label="item.sort"
+                        :value="item.code">
+                    </el-option>
+                </el-select>
+                <el-select v-model="form.answer" v-if="form.type === 2" multiple placeholder="璇烽�夋嫨姝g‘绛旀">
+                    <el-option
+                    v-for="item in form.objectList"
+                    :key="item.id"
+                    :label="item.sort"
+                    :value="item.code">
                     </el-option>
                 </el-select>
             </el-form-item>
@@ -65,19 +78,30 @@
       form: {
         id: null,
         title: '',
-        options: '',
+        objectList: [
+          { code: 'A', value: '', sort: '閫夐」A', id: '0' }
+        ],
         answer: '',
         sortnu: '',
-        type: '',
-        useType: ''
+        type: 0,
+        useType: 0
       },
       // 楠岃瘉瑙勫垯
       rules: {
+        title: [
+          { required: true, message: '璇疯緭鍏ラ鐩悕绉�' }
+        ],
+        type: [
+          { required: true, message: '璇烽�夋嫨棰樼洰绫诲瀷' }
+        ],
+        useType: [
+          { required: true, message: '璇烽�夋嫨閫傜敤鐢ㄦ埛' }
+        ],
+        answer: [
+          { required: true, message: '璇烽�夋嫨姝g‘绛旀' }
+        ]
       },
       editableTabsValue: '0',
-      problems: [
-        { name: '閫夋嫨A', val: '', id: '0' }
-      ],
       arr: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
     }
   },
@@ -88,19 +112,106 @@
     })
   },
   methods: {
+    open (title, target) {
+      this.title = title
+      this.editableTabsValue = '0'
+      this.visible = true
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    },
+    confirm () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        // 璋冪敤鏂板缓鎺ュ彛
+        this.isWorking = true
+        if (this.form.id == null || this.form.id === '') {
+          this.api.create({
+            // eslint-disable-next-line valid-typeof
+            answer: typeof this.form.answer === 'object' ? this.form.answer.join(',') : this.form.answer,
+            title: this.form.title,
+            sortnu: this.form.sortnu,
+            type: this.form.type,
+            useType: this.form.useType,
+            objectList: this.form.objectList
+          })
+            .then(() => {
+              this.visible = false
+              this.$tip.apiSuccess('鏂板缓鎴愬姛')
+              this.$emit('success')
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.isWorking = false
+            })
+        } else {
+          this.api.updateById({
+            id: this.form.id,
+            // eslint-disable-next-line valid-typeof
+            answer: typeof this.form.answer === 'object' ? this.form.answer.join(',') : this.form.answer,
+            title: this.form.title,
+            sortnu: this.form.sortnu,
+            type: this.form.type,
+            useType: this.form.useType,
+            objectList: this.form.objectList
+          })
+            .then(() => {
+              this.visible = false
+              this.$tip.apiSuccess('淇敼鎴愬姛')
+              this.$emit('success')
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.isWorking = false
+            })
+        }
+      })
+    },
+    changeType (e) {
+      this.editableTabsValue = '0'
+      this.form.objectList = [
+        { code: 'A', value: '', sort: '閫夐」A', id: '0' }
+      ]
+      this.$nextTick(() => {
+        if (e === '0' || e === '1') {
+          this.form.answer = ''
+        } else {
+          this.form.answer = []
+        }
+      })
+      this.$forceUpdate()
+    },
     removeTab (e) {
-      this.problems.splice(e, 1)
+      this.form.objectList.splice(e, 1)
       if (e === this.editableTabsValue) {
         this.editableTabsValue = '0'
       }
-      this.problems.forEach((item, index) => {
-        item.name = '閫夐」' + this.arr[index]
+      this.form.objectList.forEach((item, index) => {
+        item.code = this.arr[index]
+        item.sort = '閫夐」' + this.arr[index]
         item.id = index.toString()
       })
     },
     add () {
-      const name = '閫夐」' + this.arr[this.problems.length]
-      this.problems.push({ name, val: '', id: this.problems.length.toString() })
+      const sort = '閫夐」' + this.arr[this.form.objectList.length]
+      this.form.objectList.push({ sort, value: '', code: this.arr[this.form.objectList.length], id: this.form.objectList.length.toString() })
     }
   }
 }
diff --git a/admin/src/views/business/device.vue b/admin/src/views/business/device.vue
index dc6a3de..38dc143 100644
--- a/admin/src/views/business/device.vue
+++ b/admin/src/views/business/device.vue
@@ -37,16 +37,16 @@
                         <span v-if="row.status === 1">鍚敤</span>
                     </template>
                 </el-table-column>
-                <el-table-column
-                    v-if="containPermissions(['business:device:update'])"
-                    label="鎿嶄綔"
-                    min-width="120"
-                    fixed="right"
-                >
-                    <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.operaDeviceWindow.open('缂栬緫璁惧淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
-                    </template>
-                </el-table-column>
+<!--                <el-table-column-->
+<!--                    v-if="containPermissions(['business:device:update'])"-->
+<!--                    label="鎿嶄綔"-->
+<!--                    min-width="120"-->
+<!--                    fixed="right"-->
+<!--                >-->
+<!--                    <template slot-scope="{row}">-->
+<!--                        <el-button type="text" @click="$refs.operaDeviceWindow.open('缂栬緫璁惧淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>-->
+<!--                    </template>-->
+<!--                </el-table-column>-->
             </el-table>
             <pagination
                 @size-change="handleSizeChange"
diff --git a/admin/src/views/business/deviceRole.vue b/admin/src/views/business/deviceRole.vue
index 2b69060..221feb0 100644
--- a/admin/src/views/business/deviceRole.vue
+++ b/admin/src/views/business/deviceRole.vue
@@ -1,5 +1,5 @@
 <template>
-    <TableLayout :permissions="['business:company:query']">
+    <TableLayout :permissions="['business:devicerole:query']">
         <!-- 鎼滅储琛ㄥ崟 -->
         <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
             <el-form-item label="闂ㄧ缁勫悕绉�" prop="name">
@@ -12,9 +12,9 @@
         </el-form>
         <!-- 琛ㄦ牸鍜屽垎椤� -->
         <template v-slot:table-wrap>
-            <ul class="toolbar" v-permissions="['business:company:create', 'business:company:delete']">
-                <li><el-button type="primary" @click="$refs.operaDeviceRoleWindow.open('鏂板缓闂ㄧ瑙掕壊淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:company:create']">鏂板缓</el-button></li>
-                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button></li>
+            <ul class="toolbar" v-permissions="['business:devicerole:create', 'business:devicerole:delete']">
+                <li><el-button type="primary" @click="$refs.operaDeviceRoleWindow.open('鏂板缓闂ㄧ瑙掕壊')" icon="el-icon-plus" v-permissions="['business:devicerole:create']">鏂板缓</el-button></li>
+                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:devicerole:delete']">鍒犻櫎</el-button></li>
             </ul>
             <el-table
                 v-loading="isWorking.search"
@@ -24,27 +24,28 @@
             >
                 <el-table-column type="selection" width="55"></el-table-column>
                 <el-table-column prop="name" label="闂ㄧ缁勫悕绉�" min-width="100px"></el-table-column>
-                <el-table-column prop="name" label="浣跨敤浜烘暟" min-width="100px"></el-table-column>
+                <el-table-column prop="memberNum" label="浣跨敤浜烘暟" min-width="100px"></el-table-column>
                 <el-table-column prop="isDefault" label="鏄惁榛樿" min-width="100px">
                     <template slot-scope="{row}">
                         <el-switch
+                            @change="changeIsDefault"
                             v-model="row.isDefault"
                             active-color="#13ce66"
                             inactive-color="#ff4949"
-                            :active-value="1"
-                            :inactive-value="0">
+                            :active-value="0"
+                            :inactive-value="1">
                         </el-switch>
                     </template>
                 </el-table-column>
                 <el-table-column
-                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
+                    v-if="containPermissions(['business:devicerole:update', 'business:devicerole:delete'])"
                     label="鎿嶄綔"
                     min-width="120"
                     fixed="right"
                 >
                     <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.operaDeviceRoleWindow.open('缂栬緫闂ㄧ瑙掕壊淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
-                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>
+                        <el-button type="text" @click="edit(row)" icon="el-icon-edit" v-permissions="['business:devicerole:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:devicerole:delete']">鍒犻櫎</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -65,6 +66,7 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaDeviceRoleWindow from '@/components/business/OperaDeviceRoleWindow'
+import { updateStatusById } from '@/api/business/deviceRole'
 export default {
   name: 'DeviceRole',
   extends: BaseTable,
@@ -74,18 +76,38 @@
       // 鎼滅储
       searchForm: {
         name: '',
+        isdeleted: 0,
         type: '2'
       }
     }
   },
   created () {
     this.config({
-      module: '闂ㄧ瑙掕壊淇℃伅琛�',
+      module: '闂ㄧ瑙掕壊',
       api: '/business/deviceRole',
       'field.id': 'id',
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    changeIsDefault (r) {
+      updateStatusById({ isDefault: r, type: 2 })
+        .finally(() => {
+          this.search()
+        })
+    },
+    edit (row) {
+      if (row.doorIds) {
+        row.radio = 1
+        row.doorIds = row.doorIds.split(',')
+        row.doorIds = row.doorIds.map(item => Number(item))
+      } else {
+        row.radio = 0
+        row.doorIds = []
+      }
+      this.$refs.operaDeviceRoleWindow.open('缂栬緫闂ㄧ瑙掕壊', row)
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/deviceRole_f.vue b/admin/src/views/business/deviceRole_f.vue
index f1c14f0..97f58ab 100644
--- a/admin/src/views/business/deviceRole_f.vue
+++ b/admin/src/views/business/deviceRole_f.vue
@@ -1,5 +1,5 @@
 <template>
-    <TableLayout :permissions="['business:company:query']">
+    <TableLayout :permissions="['business:devicerole:query']">
         <!-- 鎼滅储琛ㄥ崟 -->
         <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
             <el-form-item label="闂ㄧ缁勫悕绉�" prop="name">
@@ -13,32 +13,38 @@
         <!-- 琛ㄦ牸鍜屽垎椤� -->
         <template v-slot:table-wrap>
             <ul class="toolbar">
-                <li><el-button type="primary">鍚屾</el-button></li>
+                <li><el-button type="primary" @click="synchronousData">鍚屾</el-button></li>
             </ul>
             <el-table
-                    v-loading="isWorking.search"
-                    :data="tableData.list"
-                    stripe
-                    @selection-change="handleSelectionChange"
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+                @selection-change="handleSelectionChange"
             >
                 <el-table-column type="selection" width="55"></el-table-column>
                 <el-table-column prop="name" label="闂ㄧ缁勫悕绉�" min-width="100px"></el-table-column>
-                <el-table-column prop="name" label="閫傜敤鐢ㄦ埛绫诲瀷" min-width="100px"></el-table-column>
-                <el-table-column prop="name" label="浣跨敤浜烘暟" min-width="100px"></el-table-column>
+                <el-table-column label="閫傜敤鐢ㄦ埛绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.type === '0'">鍔冲姟璁垮</span>
+                        <span v-if="row.type === '1'">鏅�氳瀹�</span>
+                        <span v-if="row.type === '2'">鍐呴儴浜哄憳</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="memberNum" label="浣跨敤浜烘暟" min-width="100px"></el-table-column>
                 <el-table-column prop="isDefault" label="鏄惁榛樿" min-width="100px">
                     <template slot-scope="{row}">
-                        <span v-if="row.isDefault === 1">鏄�</span>
-                        <span v-if="row.isDefault === 0">鍚�</span>
+                        <span v-if="row.isDefault === 0">鏄�</span>
+                        <span v-if="row.isDefault === 1">鍚�</span>
                     </template>
                 </el-table-column>
                 <el-table-column
-                    v-if="containPermissions(['business:company:update', 'business:company:delete'])"
+                    v-if="containPermissions(['business:devicerole:update'])"
                     label="鎿嶄綔"
                     min-width="120"
                     fixed="right"
                 >
                     <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.operaDeviceRoleWindow.open('缂栬緫闂ㄧ瑙掕壊淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="$refs.operaDeviceRoleWindow.open('缂栬緫闂ㄧ瑙掕壊淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:devicerole:update']">缂栬緫</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -59,6 +65,7 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaDeviceRoleWindow from '@/components/business/OperaDeviceRoleFWindow'
+import { syncPrivilege } from '@/api/business/deviceRole'
 export default {
   name: 'DeviceRole',
   extends: BaseTable,
@@ -68,7 +75,7 @@
       // 鎼滅储
       searchForm: {
         name: '',
-        type: '1'
+        type: '0,1'
       }
     }
   },
@@ -80,6 +87,23 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    synchronousData () {
+      this.$confirm('纭鍚屾鍚�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        syncPrivilege({})
+          .then(res => {
+            this.$message({ type: 'success', message: '鍚屾鎴愬姛' })
+            this.search()
+          })
+      }).catch(() => {
+
+      })
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/laborSource.vue b/admin/src/views/business/laborSource.vue
index d78362e..7575406 100644
--- a/admin/src/views/business/laborSource.vue
+++ b/admin/src/views/business/laborSource.vue
@@ -1,58 +1,99 @@
 <template>
     <div class="box">
         <el-form :model="form" ref="form" label-width="140px">
-            <el-form-item label="鏉ヨ棰勭害鏂瑰紡:" prop="doorIds">
-                <el-radio-group v-model="form.doorIds">
-                    <el-radio :label="3">棰勭害鍏嶇櫥璁�</el-radio>
-                    <el-radio :label="6">棰勭害鍚庣櫥璁�(闇�瑕侀厤澶囪瀹㈡満)</el-radio>
+            <el-form-item label="鏉ヨ棰勭害鏂瑰紡:" prop="reservationWay">
+                <el-radio-group v-model="form.reservationWay">
+                    <el-radio :label="0">棰勭害鍏嶇櫥璁�</el-radio>
+                    <el-radio :label="1">棰勭害鍚庣櫥璁�(闇�瑕侀厤澶囪瀹㈡満)</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="琚浜烘牎楠屾柟寮�:" prop="doorIds">
-                <el-radio-group v-model="form.doorIds">
-                    <el-radio :label="3">浠呮墜鏈哄彿</el-radio>
-                    <el-radio :label="6">鎵嬫満鍙�&濮撳悕</el-radio>
+            <el-form-item label="琚浜烘牎楠屾柟寮�:" prop="checkVisit">
+                <el-radio-group v-model="form.checkVisit">
+                    <el-radio :label="0">浠呮墜鏈哄彿</el-radio>
+                    <el-radio :label="1">鎵嬫満鍙�&濮撳悕</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="鍋ュ悍璇佹槸鍚﹀繀濉�:" prop="doorIds">
-                <el-radio-group v-model="form.doorIds">
-                    <el-radio :label="3">鍚�</el-radio>
-                    <el-radio :label="6">鏄�</el-radio>
+            <el-form-item label="鍋ュ悍璇佹槸鍚﹀繀濉�:" prop="healthCard">
+                <el-radio-group v-model="form.healthCard">
+                    <el-radio :label="0">鍚�</el-radio>
+                    <el-radio :label="1">鏄�</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="璁垮鏄惁绛旈:" prop="doorIds">
+            <el-form-item label="璁垮鏄惁绛旈:" prop="isAnswer">
                 <el-switch
-                        v-model="form.doorIds"
-                        active-color="#13ce66"
-                        inactive-color="#ff4949"
-                        :active-value="1"
-                        :inactive-value="0">
+                    v-model="form.isAnswer"
+                    active-color="#13ce66"
+                    inactive-color="#ff4949"
+                    :active-value="1"
+                    :inactive-value="0">
                 </el-switch>
             </el-form-item>
-            <el-form-item label="璁垮绛旈涓婚:" prop="doorIds">
-                <el-input style="width: 50%;" v-model="form.doorIds" placeholder="璇疯緭鍏ョ瓟棰樻爣棰�" v-trim/>
+            <el-form-item label="璁垮绛旈涓婚:" prop="theme">
+                <el-input style="width: 50%;" v-model="form.theme" placeholder="璇疯緭鍏ョ瓟棰樻爣棰�" v-trim/>
             </el-form-item>
-            <el-form-item label="璁垮绛旈璇存槑:" prop="doorIds">
-                <el-input style="width: 50%;" type="textarea" v-model="form.doorIds" placeholder="璇疯緭鍏�" v-trim/>
+            <el-form-item label="璁垮绛旈璇存槑:" prop="description">
+                <el-input style="width: 50%;" type="textarea" v-model="form.description" placeholder="璇疯緭鍏�" v-trim/>
             </el-form-item>
             <el-form-item>
-                <el-button type="primary">淇濆瓨閰嶇疆椤�</el-button>
+                <el-button type="primary" @click="submit">淇濆瓨閰嶇疆椤�</el-button>
             </el-form-item>
         </el-form>
     </div>
 </template>
 
 <script>
-  export default {
-    name: 'visitorSources',
+import { getLaborConfigDTO, updateLaborConfigDTO } from '@/api/system/common'
+export default {
+  name: 'visitorSources',
 
-    data() {
-      return {
-        form: {
-          doorIds: ''
-        }
+  data () {
+    return {
+      form: {
+        id: null,
+        checkVisit: 0,
+        reservationWay: 0,
+        healthCard: 0,
+        isAnswer: 0,
+        theme: '',
+        description: ''
       }
     }
+  },
+
+  created () {
+    this.getData()
+  },
+
+  methods: {
+    getData () {
+      getLaborConfigDTO({})
+        .then(res => {
+          this.form.id = res.id
+          this.form.checkVisit = res.LaborConfigParam.checkVisit
+          this.form.description = res.description
+          this.form.healthCard = res.LaborConfigParam.healthCard
+          this.form.isAnswer = res.LaborConfigParam.isAnswer
+          this.form.reservationWay = res.LaborConfigParam.reservationWay
+          this.form.theme = res.theme
+        })
+    },
+    submit () {
+      updateLaborConfigDTO({
+        LaborConfigParam: {
+          isAnswer: this.form.isAnswer,
+          healthCard: this.form.healthCard,
+          checkVisit: this.form.checkVisit,
+          reservationWay: this.form.reservationWay
+        },
+        description: this.form.description,
+        theme: this.form.theme
+      }).then(res => {
+        this.$message.success('淇濆瓨鎴愬姛')
+        this.getData()
+      })
+    }
   }
+}
 </script>
 
 <style lang="scss" scoped>
diff --git a/admin/src/views/business/problemLog.vue b/admin/src/views/business/problemLog.vue
index 546d7f4..0154749 100644
--- a/admin/src/views/business/problemLog.vue
+++ b/admin/src/views/business/problemLog.vue
@@ -8,14 +8,11 @@
             <el-form-item label="鍏徃鍚嶇О" prop="companyName">
                 <el-input v-model="searchForm.companyName" placeholder="璇疯緭鍏�" @keypress.enter.native="search"></el-input>
             </el-form-item>
-            <el-form-item label="浜哄憳绫诲瀷" prop="companyId">
-                <el-select v-model="searchForm.code" placeholder="璇烽�夋嫨">
-                    <el-option
-                        v-for="item in options"
-                        :key="item.value"
-                        :label="item.label"
-                        :value="item.value">
-                    </el-option>
+            <el-form-item label="浜哄憳绫诲瀷" prop="type">
+                <el-select v-model="searchForm.type" placeholder="璇烽�夋嫨">
+                    <el-option label="鍔冲姟璁垮" value="0"></el-option>
+                    <el-option label="鏅�氳瀹�" value="1"></el-option>
+                    <el-option label="鍐呴儴浜哄憳" value="2"></el-option>
                 </el-select>
             </el-form-item>
             <section>
@@ -36,7 +33,13 @@
                 <el-table-column prop="name" label="绛旈浜�" min-width="100px"></el-table-column>
                 <el-table-column prop="phone" label="鑱旂郴鐢佃瘽" min-width="100px"></el-table-column>
                 <el-table-column prop="companyName" label="鍏徃鍚嶇О" min-width="100px"></el-table-column>
-                <el-table-column prop="phone" label="鐢ㄦ埛绫诲瀷" min-width="100px"></el-table-column>
+                <el-table-column label="鐢ㄦ埛绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.type === 0">鍔冲姟璁垮</span>
+                        <span v-if="row.type === 1">鏅�氳瀹�</span>
+                        <span v-if="row.type === 2">鍐呴儴浜哄憳</span>
+                    </template>
+                </el-table-column>
                 <el-table-column prop="createDate" label="绛旈鏃堕棿" min-width="100px"></el-table-column>
             </el-table>
             <pagination
@@ -62,7 +65,8 @@
       // 鎼滅储
       searchForm: {
         name: '',
-        companyName: ''
+        companyName: '',
+        type: ''
       },
       options: []
     }
diff --git a/admin/src/views/business/problems.vue b/admin/src/views/business/problems.vue
index b701349..948c825 100644
--- a/admin/src/views/business/problems.vue
+++ b/admin/src/views/business/problems.vue
@@ -1,5 +1,5 @@
 <template>
-    <TableLayout :permissions="['business:company:query']">
+    <TableLayout :permissions="['business:problems:query']">
         <!-- 鎼滅储琛ㄥ崟 -->
         <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
             <el-form-item label="棰樼洰鍚嶇О" prop="title">
@@ -7,8 +7,9 @@
             </el-form-item>
             <el-form-item label="浜哄憳绫诲瀷" prop="useType">
                 <el-select v-model="searchForm.useType" placeholder="璇烽�夋嫨" @keypress.enter.native="search">
-                    <el-option label="鍔冲姟浜哄憳" value="0"></el-option>
-                    <el-option label="鏅�氳瀹�" value="1"></el-option>
+                    <el-option label="璁垮鍜屽姵鍔�" value="0"></el-option>
+                    <el-option label="浠呰瀹�" value="1"></el-option>
+                    <el-option label="浠呭姵鍔�" value="2"></el-option>
                 </el-select>
             </el-form-item>
             <section>
@@ -18,30 +19,32 @@
         </el-form>
         <!-- 琛ㄦ牸鍜屽垎椤� -->
         <template v-slot:table-wrap>
-            <ul class="toolbar" v-permissions="['business:company:create']">
-                <li><el-button type="primary" @click="$refs.operaProblemsWindow.open('鏂板缓璇曢淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:company:create']">鏂板缓</el-button></li>
+            <ul class="toolbar" v-permissions="['business:problems:create']">
+                <li><el-button type="primary" @click="$refs.operaProblemsWindow.open('鏂板缓璇曢淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:problems:create']">鏂板缓</el-button></li>
             </ul>
             <el-table
                 v-loading="isWorking.search"
                 :data="tableData.list"
                 stripe
             >
-                <el-table-column prop="title" label="棰樼洰鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column prop="title" label="棰樼洰鍚嶇О" min-width="150px"></el-table-column>
                 <el-table-column prop="useType" label="閫傜敤浜哄憳绫诲瀷" min-width="100px">
                     <template slot-scope="{row}">
-                        <span v-if="row.useType === 0">鍔冲姟浜哄憳</span>
-                        <span v-if="row.useType === 1">鏅�氳瀹�</span>
+                        <span v-if="row.useType === 0">璁垮鍜屽姵鍔�</span>
+                        <span v-if="row.useType === 1">浠呰瀹�</span>
+                        <span v-if="row.useType === 2">浠呭姵鍔�</span>
                     </template>
                 </el-table-column>
                 <el-table-column prop="type" label="棰樼洰绫诲瀷" min-width="100px">
                     <template slot-scope="{row}">
-                        <span v-if="row.useType === 0">鍗曢��</span>
-                        <span v-if="row.useType === 1">澶氶��</span>
+                        <span v-if="row.type === 0">鍒ゆ柇</span>
+                        <span v-if="row.type === 1">鍗曢��</span>
+                        <span v-if="row.type === 2">澶氶��</span>
                     </template>
                 </el-table-column>
                 <el-table-column prop="sortnu" label="棰樼洰椤哄簭(鍗囧簭)" min-width="100px"></el-table-column>
                 <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-                <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
+                <el-table-column prop="creatorName" label="鍒涘缓浜�" min-width="100px"></el-table-column>
                 <el-table-column
                     v-if="containPermissions(['business:company:update', 'business:company:delete'])"
                     label="鎿嶄綔"
@@ -49,7 +52,7 @@
                     fixed="right"
                 >
                     <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.operaProblemsWindow.open('缂栬緫璇曢淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="edit(row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
                         <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>
                     </template>
                 </el-table-column>
@@ -92,6 +95,23 @@
       'field.main': 'id'
     })
     this.search()
+  },
+  methods: {
+    edit (row) {
+      if (row.objectList && row.objectList.length > 0) {
+        row.objectList = row.objectList.map((item, index) => {
+          return {
+            code: item.code,
+            value: item.value,
+            sort: '閫夐」' + item.code,
+            id: index.toString()
+          }
+        })
+      } else {
+        row.objectList = []
+      }
+      this.$refs.operaProblemsWindow.open('缂栬緫璇曢淇℃伅', row)
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/visitorSources.vue b/admin/src/views/business/visitorSources.vue
index 129b678..6dfe77f 100644
--- a/admin/src/views/business/visitorSources.vue
+++ b/admin/src/views/business/visitorSources.vue
@@ -1,56 +1,97 @@
 <template>
     <div class="box">
         <el-form :model="form" ref="form" label-width="140px">
-            <el-form-item label="鏉ヨ棰勭害鏂瑰紡:" prop="doorIds">
-                <el-radio-group v-model="form.doorIds">
-                    <el-radio :label="3">棰勭害鍏嶇櫥璁�</el-radio>
-                    <el-radio :label="6">棰勭害鍚庣櫥璁�(闇�瑕侀厤澶囪瀹㈡満)</el-radio>
+            <el-form-item label="鏉ヨ棰勭害鏂瑰紡:" prop="reservationWay">
+                <el-radio-group v-model="form.reservationWay">
+                    <el-radio :label="0">棰勭害鍏嶇櫥璁�</el-radio>
+                    <el-radio :label="1">棰勭害鍚庣櫥璁�(闇�瑕侀厤澶囪瀹㈡満)</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="琚浜烘牎楠屾柟寮�:" prop="doorIds">
-                <el-radio-group v-model="form.doorIds">
-                    <el-radio :label="3">浠呮墜鏈哄彿</el-radio>
-                    <el-radio :label="6">鎵嬫満鍙�&濮撳悕</el-radio>
+            <el-form-item label="琚浜烘牎楠屾柟寮�:" prop="checkVisit">
+                <el-radio-group v-model="form.checkVisit">
+                    <el-radio :label="0">浠呮墜鏈哄彿</el-radio>
+                    <el-radio :label="1">鎵嬫満鍙�&濮撳悕</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="鍋ュ悍璇佹槸鍚﹀繀濉�:" prop="doorIds">
-                <el-radio-group v-model="form.doorIds">
-                    <el-radio :label="3">鍚�</el-radio>
-                    <el-radio :label="6">鏄�</el-radio>
+            <el-form-item label="鍋ュ悍璇佹槸鍚﹀繀濉�:" prop="healthCard">
+                <el-radio-group v-model="form.healthCard">
+                    <el-radio :label="0">鍚�</el-radio>
+                    <el-radio :label="1">鏄�</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="璁垮鏄惁绛旈:" prop="doorIds">
+            <el-form-item label="璁垮鏄惁绛旈:" prop="isAnswer">
                 <el-switch
-                    v-model="form.doorIds"
+                    v-model="form.isAnswer"
                     active-color="#13ce66"
                     inactive-color="#ff4949"
                     :active-value="1"
                     :inactive-value="0">
                 </el-switch>
             </el-form-item>
-            <el-form-item label="璁垮绛旈涓婚:" prop="doorIds">
-                <el-input style="width: 50%;" v-model="form.doorIds" placeholder="璇疯緭鍏ョ瓟棰樻爣棰�" v-trim/>
+            <el-form-item label="璁垮绛旈涓婚:" prop="theme">
+                <el-input style="width: 50%;" v-model="form.theme" placeholder="璇疯緭鍏ョ瓟棰樻爣棰�" v-trim/>
             </el-form-item>
-            <el-form-item label="璁垮绛旈璇存槑:" prop="doorIds">
-                <el-input style="width: 50%;" type="textarea" v-model="form.doorIds" placeholder="璇疯緭鍏�" v-trim/>
+            <el-form-item label="璁垮绛旈璇存槑:" prop="description">
+                <el-input style="width: 50%;" type="textarea" v-model="form.description" placeholder="璇疯緭鍏�" v-trim/>
             </el-form-item>
             <el-form-item>
-                <el-button type="primary">淇濆瓨閰嶇疆椤�</el-button>
+                <el-button type="primary" @click="submit">淇濆瓨閰嶇疆椤�</el-button>
             </el-form-item>
         </el-form>
     </div>
 </template>
 
 <script>
+import { getVisitConfigDTO, updateVisitConfig } from '@/api/system/common'
 export default {
   name: 'visitorSources',
 
-  data() {
+  data () {
     return {
       form: {
-        doorIds: ''
+        id: null,
+        checkVisit: 0,
+        reservationWay: 0,
+        healthCard: 0,
+        isAnswer: 0,
+        theme: '',
+        description: ''
       }
     }
+  },
+
+  created () {
+    this.getData()
+  },
+
+  methods: {
+    getData () {
+      getVisitConfigDTO({})
+        .then(res => {
+          this.form.id = res.id
+          this.form.checkVisit = res.VisitConfigParam.checkVisit
+          this.form.description = res.description
+          this.form.healthCard = res.VisitConfigParam.healthCard
+          this.form.isAnswer = res.VisitConfigParam.isAnswer
+          this.form.reservationWay = res.VisitConfigParam.reservationWay
+          this.form.theme = res.theme
+        })
+    },
+    submit () {
+      updateVisitConfig({
+        VisitConfigParam: {
+          isAnswer: this.form.isAnswer,
+          healthCard: this.form.healthCard,
+          checkVisit: this.form.checkVisit,
+          reservationWay: this.form.reservationWay
+        },
+        description: this.form.description,
+        theme: this.form.theme
+      }).then(res => {
+        this.$message.success('淇濆瓨鎴愬姛')
+        this.getData()
+      })
+    }
   }
 }
 </script>
diff --git a/admin/vue.config.js b/admin/vue.config.js
index 66f1a74..f1d1370 100644
--- a/admin/vue.config.js
+++ b/admin/vue.config.js
@@ -14,7 +14,7 @@
         // 192.168.0.110:10013  192.168.0.110:10013
         // http://192.168.0.101:10013
         // http://192.168.0.132:10013
-        target: 'http://192.168.0.108:10013',
+        target: 'http://192.168.0.132:10013',
         changeOrigin: true,
         pathRewrite: {
           [`^${[process.env.VUE_APP_API_PREFIX]}`]: ''
diff --git a/server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java b/server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java
index efcf4fc..c1e9dbf 100644
--- a/server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java
+++ b/server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java
@@ -2,9 +2,13 @@
 
 import com.doumee.api.BaseController;
 import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.erp.model.openapi.request.erp.OrgListRequest;
+import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest;
+import com.doumee.core.erp.model.openapi.request.erp.UserListRequest;
 import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
 import com.doumee.core.haikang.model.param.request.ParkListRequest;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.service.business.ERPSyncService;
 import com.doumee.service.business.impl.hksync.HkSyncDeviceServiceImpl;
 import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
 import com.doumee.service.business.impl.hksync.HkSyncPrivilegeServiceImpl;
@@ -25,36 +29,23 @@
 @RestController
 @RequestMapping("/business/erpsync")
 public class ERPSyncController extends BaseController {
-
     @Autowired
-    private HkSyncDeviceServiceImpl hkSyncDeviceService;
-    @Autowired
-    private HkSyncParkServiceImpl hkSyncParkService;
-    @Autowired
-    private HkSyncPrivilegeServiceImpl hkSyncPrivilegeService;
+    private ERPSyncService erpSyncService;
 
     @PreventRepeat
-    @ApiOperation("銆怑RP銆戝叏閲忓悓姝ラ棬绂佽澶囨帴鍙�")
-    @PostMapping("/syncDevices")
-    //@RequiresPermissions("business:erpsync:device")
-    public ApiResponse getDevices(@RequestBody AcsDeviceListRequest param) {
-        String result = hkSyncDeviceService.syncHkDevices(param);
+    @ApiOperation("銆怑RP銆戝叏閲忓悓姝RP缁勭粐鎺ュ彛")
+    @PostMapping("/getCompanies")
+    //@RequiresPermissions("business:erpsync:company")
+    public ApiResponse getCompanies(@RequestBody OrgListRequest param) {
+        String result = erpSyncService.syncCompany(param);
         return ApiResponse.success(result);
     }
     @PreventRepeat
-    @ApiOperation("銆愭捣搴枫�戝叏閲忓悓姝ュ仠杞﹀簱鎺ュ彛")
-    @PostMapping("/getParks")
-//    @RequiresPermissions("business:hksync:park")
-    public ApiResponse getParks(@RequestBody ParkListRequest param) {
-        String result = hkSyncParkService.syncHkParks(param);
-        return ApiResponse.success(result);
-    }
-    @PreventRepeat
-    @ApiOperation("銆愭捣搴枫�戝叏閲忓悓姝ュ仠杞﹀簱鎺ュ彛")
-    @PostMapping("/getPrivilege")
-//    @RequiresPermissions("business:hksync:privilege")
-    public ApiResponse getPrivilege(@RequestBody ParkListRequest param) {
-        String result = hkSyncPrivilegeService.syncHkParks(param);
+    @ApiOperation("銆怑RP銆戝叏閲忓悓姝RP浜哄憳鎺ュ彛")
+    @PostMapping("/getUsers")
+//    @RequiresPermissions("business:erpsync:users")
+    public ApiResponse getUsers(@RequestBody UserListRequest param) {
+        String result = erpSyncService.syncUsers(param);
         return ApiResponse.success(result);
     }
 }
diff --git a/server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java b/server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
index a88a33d..40cf28e 100644
--- a/server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
+++ b/server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -90,9 +90,14 @@
     @ApiOperation("浜哄憳绉婚櫎/瑙e喕")
     @PostMapping("/updateRemoveStatusById")
     @RequiresPermissions("business:member:update")
-    public ApiResponse updateRemoveStatusById(@RequestParam List<Member> list){
-        memberService.updateRemoveStatusById(list);
-        return ApiResponse.success(null);
+    public ApiResponse updateRemoveStatusById(@RequestBody List<Member> list){
+        if(list.size()>0){
+            memberService.updateRemoveStatusById(list);
+            return ApiResponse.success(null);
+        }else{
+            return ApiResponse.failed("鍙傛暟閿欒");
+        }
+
     }
 
     @ApiOperation("浜哄憳鎷夐粦/鍐荤粨")
diff --git a/server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java b/server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
index 01ff012..1250411 100644
--- a/server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
+++ b/server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
@@ -90,7 +90,7 @@
 
     @ApiOperation("婊炵暀浜哄憳")
     @PostMapping("/retentionPage")
-  //  @RequiresPermissions("business:visits:query")
+    @RequiresPermissions("business:visits:query")
     public ApiResponse<PageData<Visits>> retentionPage (@RequestBody PageWrap<Visits> pageWrap) {
         return ApiResponse.success(visitsService.retentionPage(pageWrap));
     }
diff --git a/server/dmvisit_admin/src/main/java/com/doumee/api/system/SystemUserController.java b/server/dmvisit_admin/src/main/java/com/doumee/api/system/SystemUserController.java
index 09e1246..986d45e 100644
--- a/server/dmvisit_admin/src/main/java/com/doumee/api/system/SystemUserController.java
+++ b/server/dmvisit_admin/src/main/java/com/doumee/api/system/SystemUserController.java
@@ -113,10 +113,12 @@
 
 
 
-    @ApiOperation("鍒嗛〉鏌ヨ绯荤粺鐢ㄦ埛")
+
+
+    @ApiOperation("鏌ヨ鎵�鏈夌郴缁熺敤鎴�")
     @PostMapping("/findAllList")
     @RequiresPermissions("system:user:query")
-    public ApiResponse<PageData<SystemUser>> findAllList (@RequestBody PageWrap<SystemUser> pageWrap) {
+    public ApiResponse<List<SystemUser>> findAllList (@RequestBody SystemUser pageWrap) {
         return ApiResponse.success(systemUserService.findAllList(pageWrap));
     }
 
diff --git a/server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java b/server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java
index 48b4bad..0ee8894 100644
--- a/server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java
+++ b/server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java
@@ -2,12 +2,14 @@
 
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.HKTools;
 import com.doumee.core.haikang.model.param.BaseResponse;
 import com.doumee.core.haikang.model.param.request.EventSubRequest;
 import com.doumee.core.haikang.model.param.respose.OrgListResponse;
 import com.doumee.core.haikang.service.HKService;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.service.business.InterfaceLogService;
 import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
 import com.hikvision.artemis.sdk.config.ArtemisConfig;
 import org.apache.commons.lang3.StringUtils;
@@ -27,6 +29,8 @@
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
+    @Autowired
+    private InterfaceLogService interfaceLogService;
 
     @PostConstruct
     public  int  initHkConfig(){
@@ -36,6 +40,7 @@
             ArtemisConfig.appSecret = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_APPSECRET).getCode();
             HKConstants.https = systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_HTTPS).getCode();
         }
+        HKTools.interfaceLogService=interfaceLogService;
         //鑾峰彇鏍圭粍缁囩紪鐮�
         getRootOrgCode();
         //寮�濮嬭闃呴棬绂佷簨浠躲�佽瀹簨浠躲�佸拰鍋滆溅鍦轰簨浠�
diff --git a/server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java b/server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
index 18d255d..326d4c9 100644
--- a/server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
+++ b/server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
@@ -1,6 +1,7 @@
 package com.doumee.task;
 
 
+import com.doumee.service.business.MemberService;
 import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
 import com.doumee.service.business.impl.hksync.HkSyncImgServiceImpl;
 import com.doumee.service.business.impl.hksync.HkSyncOrgUserServiceImpl;
@@ -29,6 +30,8 @@
     private HkSyncOrgUserServiceImpl hkSyncOrgUserService;
     @Autowired
     private HkSyncVisitServiceImpl hkSyncVisitService;
+    @Autowired
+    private MemberService memberService;
     /**
      * 鏄惁寮�鍙戣��
      */
@@ -102,4 +105,12 @@
     }
 
 
+    /**
+     * 瀹氭椂鍐荤粨鍐呴儴浜哄憳
+     */
+    @Scheduled(fixedDelay= 60*1000)
+    public void memberFreeze()  {
+        memberService.memberFreeze();
+    }
+
 }
diff --git a/server/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java b/server/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java
index c7a57ca..e4fa49f 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/core/erp/ErpTool.java
@@ -10,9 +10,14 @@
 import com.doumee.core.erp.model.openapi.response.erp.ERPApiResponse;
 import com.doumee.core.erp.model.openapi.response.erp.ErpOrgListResponse;
 import com.doumee.core.erp.model.openapi.response.erp.ErpUserListResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.HttpsUtil;
+import com.doumee.dao.business.model.Member;
+import com.github.pagehelper.PageInfo;
 import org.apache.commons.lang3.StringUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class ErpTool {
@@ -23,17 +28,32 @@
      * @return
      */
     public static List<ErpOrgListResponse> getErpOrgList(String url, OrgListRequest param){
-        String result = HttpsUtil.postJson(url, JSONObject.toJSONString(param));
-        if(StringUtils.isNotBlank(result)){
-            TypeReference typeReference =
-                    new TypeReference<ERPApiResponse<List<ErpOrgListResponse>>>(){};
-            ERPApiResponse<List<ErpOrgListResponse>> response = JSONObject.parseObject(result, typeReference.getType());
-            if(response!=null){
-                return response.getData();
-            }
-        }
-        return  null;
 
+        List<ErpOrgListResponse> list = new ArrayList<>();
+        int page =1;
+        int pageSize  = 100;
+        boolean hasLast = true;
+        while (hasLast){
+            hasLast = false;
+            PageWrap<OrgListRequest> pageWrap  = new PageWrap<>();
+            pageWrap.setModel(param);
+            pageWrap.setPage(page);
+            pageWrap.setCapacity(pageSize);
+            String result = HttpsUtil.postJson(url, JSONObject.toJSONString(pageWrap));
+            if(StringUtils.isNotBlank(result)){
+                TypeReference typeReference =
+                        new TypeReference<ERPApiResponse<PageData<ErpOrgListResponse>>>(){};
+                ERPApiResponse<PageData<ErpOrgListResponse>> response = JSONObject.parseObject(result, typeReference.getType());
+                if(response!=null && response.getData()!=null&& response.getData().getRecords()!=null){
+                    list.addAll(response.getData().getRecords());
+                        if(100*pageSize < response.getData().getTotal() ){
+                            hasLast =true;//杩樻湁涓嬩竴椤�
+                        }
+                        page++;
+                    }
+                }
+            }
+        return  list;
     }
 
     /**
@@ -43,16 +63,33 @@
      * @return
      */
     public static List<ErpUserListResponse> getErpUserList(String url, UserListRequest param){
-        String result = HttpsUtil.postJson(url, JSONObject.toJSONString(param));
-        if(StringUtils.isNotBlank(result)){
-            TypeReference typeReference =
-                    new TypeReference<ERPApiResponse<List<ErpUserListResponse>>>(){};
-            ERPApiResponse<List<ErpUserListResponse>> response = JSONObject.parseObject(result, typeReference.getType());
-            if(response!=null){
-                return response.getData();
+
+        List<ErpUserListResponse> list = new ArrayList<>();
+        int page =1;
+        int pageSize  = 100;
+        boolean hasLast = true;
+        while (hasLast){
+            hasLast = false;
+            PageWrap<UserListRequest> pageWrap  = new PageWrap<>();
+            pageWrap.setModel(param);
+            pageWrap.setPage(page);
+            pageWrap.setCapacity(pageSize);
+            String result = HttpsUtil.postJson(url, JSONObject.toJSONString(pageWrap));
+            if(StringUtils.isNotBlank(result)){
+                TypeReference typeReference =
+                        new TypeReference<ERPApiResponse<PageData<ErpUserListResponse>>>(){};
+                ERPApiResponse<PageData <ErpUserListResponse>> response = JSONObject.parseObject(result, typeReference.getType());
+                if(response!=null && response.getData()!=null && response.getData().getRecords()!=null){
+                    list.addAll(response.getData().getRecords());
+                    if(100*pageSize < response.getData().getTotal() ){
+                        hasLast =true;//杩樻湁涓嬩竴椤�
+                    }
+                    page++;
+                }
             }
         }
-        return  null;
+        return  list;
+
     }
 
     /**
diff --git a/server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java b/server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
index 11507ce..221f827 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -51,9 +51,10 @@
 		System.out.println(content.toString());
 
 	}
+	public static InterfaceLogService interfaceLogService = null;
 	private static void saveInterfaceLog(String s, String result,Map<String, String> path) {
-		InterfaceLogService bean = SpringContextUtil.getBean(InterfaceLogService.class);
-		if(bean !=null){
+//		InterfaceLogService bean = SpringContextUtil.getBean(InterfaceLogService.class);
+		if(interfaceLogService !=null){
 			InterfaceLog hkMonitoryLogDO=new InterfaceLog();
 			hkMonitoryLogDO.setType(0);
 			hkMonitoryLogDO.setCreateDate(new Date());
@@ -62,7 +63,7 @@
 			hkMonitoryLogDO.setRepose(result);
 			hkMonitoryLogDO.setName(path.get(HKConstants.https));
 			hkMonitoryLogDO.setUrl(HKConstants.https + ArtemisConfig.host+path.get(HKConstants.https));
-			bean.create(hkMonitoryLogDO);
+			interfaceLogService.create(hkMonitoryLogDO);
 		}
 	}
 
diff --git a/server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java b/server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
index e1ea0ee..069a63f 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -80,6 +80,9 @@
     // ERP ACCESS_SECRET
     public static final String ERP_ACCESS_SECRET = "ERP_ACCESS_SECRET";
 
+    // 鍐呴儴浜哄憳鍐荤粨閰嶇疆鏃堕棿
+    public static final String TIMEOUT_FREEZE = "TIMEOUT_FREEZE";
+
     // FTP鏂囦欢鏈嶅姟鍣ㄨ祫婧愯闂湴鍧�
 
     public static  Date  getBirthdyByCardNo(String idCard){
diff --git a/server/dmvisit_service/src/main/java/com/doumee/core/utils/HttpsUtil.java b/server/dmvisit_service/src/main/java/com/doumee/core/utils/HttpsUtil.java
index 6d6dc9c..c74af73 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/core/utils/HttpsUtil.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -4,6 +4,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.HttpURLConnection;
 import java.net.URL;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
@@ -21,7 +22,11 @@
         return connection(url, "POST", data, contentType, ignoreSSL);
     }
     public static String postJson(String url, String data) {
-        return connection(url, "POST", data, "application/json", false);
+        if(url.startsWith("https://")){
+            return connection(url, "POST", data, "application/json", true);
+        }else{
+            return connectionHttp(url, "POST", data, "application/json");
+        }
     }
 
     public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
@@ -82,6 +87,49 @@
         }
         return null;
     }
+    public static String connectionHttp(String url,String method,String data,String contentType ){
+        HttpURLConnection connection = null;
+        try {
+            URL _url = new URL(url);
+            connection = (HttpURLConnection) _url.openConnection();
+            connection.setRequestMethod(method);
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            if(contentType != null){
+                connection.setRequestProperty("Content-Type", contentType);
+            }
+
+            connection.connect();
+
+            if(data != null){
+                OutputStream outputStream = connection.getOutputStream();
+                outputStream.write(data.getBytes("utf-8"));
+                outputStream.close();
+            }
+
+            int responseCode = connection.getResponseCode();
+            if (responseCode == HttpsURLConnection.HTTP_OK) {
+                InputStream is = connection.getInputStream();
+                byte[] b = new byte[4096];
+                ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length);
+                int len;
+                while ((len = is.read(b)) != -1) {
+                    baos.write(b, 0, len);
+                }
+                is.close();
+                return baos.toString("utf-8");
+            }
+            return connection.getResponseMessage();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if(connection != null){
+                connection.disconnect();
+            }
+        }
+        return null;
+    }
 
 
     public static void main(String[] args) {
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java b/server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
index 5bd15cc..da6674b 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
@@ -49,4 +49,7 @@
     @ApiModelProperty(value = " 宸ュ彿鍛�")
     private Integer code;
 
+    @ApiModelProperty(value = "鎿嶄綔浜哄憳 ")
+    private Integer createrId;
+
 }
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java b/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java
index aeb6008..6b80601 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Empower.java
@@ -118,8 +118,8 @@
     @TableField(exist = false)
     private String createrName;
 
-    @ApiModelProperty(value = "涓嬪彂鐘舵�� 0寰呬笅鍙� 1宸蹭笅鍙� 2涓嬪彂鎴愬姛  3宸插彇娑� 4涓嬪彂澶辫触 ", example = "1")
-    @ExcelColumn(name="涓嬪彂鐘舵��",index= 8,valueMapping ="0=寰呬笅鍙�;1=宸蹭笅鍙�;2=涓嬪彂鎴愬姛;3=宸插彇娑�;4=涓嬪彂澶辫触" )
+    @ApiModelProperty(value = "涓�鍗¢�氭巿鏉冧笅鍙戠姸鎬� 0寰呬笅鍙� 1浠诲姟鎵ц 2涓嬪彂鎴愬姛 3宸插彇娑� 4涓嬪彂澶辫触 5浠诲姟涓嬭浇宸茬粨鏉� ", example = "1")
+    @ExcelColumn(name="涓嬪彂鐘舵��",index= 8,valueMapping ="0=寰呬笅鍙�;1=宸蹭笅鍙�;2=涓嬪彂鎴愬姛;3=宸插彇娑�;4=涓嬪彂澶辫触;5=浠诲姟涓嬭浇宸茬粨鏉�" )
     private Integer sendStatus;
 
     @ApiModelProperty(value = "涓嬪彂绫诲瀷 0瀹炴椂 1瀹氭椂 ", example = "1")
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java b/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
index 76b3346..fd67fb3 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -256,4 +256,8 @@
     @TableField(exist = false)
     private Integer timeOut;
 
+    @ApiModelProperty(value = "瓒呮椂鐘舵��0鏈秴鏃讹紝1宸茶秴鏃讹紝2鍗冲皢瓒呮椂", example = "1")
+    @TableField(exist = false)
+    private Integer outStatus;
+
 }
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
index 3e658f3..1db293e 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -159,7 +159,10 @@
 
     PageData<MemberInfoDTO> findUnusualPage(PageWrap<MemberQuery> pageWrap);
 
-
+    /**
+     * 瀹氭椂鍐荤粨鍐呴儴浜哄憳
+     */
+    void memberFreeze();
     /********************************************鍏紬鍙锋帴鍙�***********************************************************************/
 
 
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 86b5e37..f448df3 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -26,11 +26,11 @@
 import com.doumee.dao.admin.request.LaborMemberDTO;
 import com.doumee.dao.admin.request.MemberQuery;
 import com.doumee.dao.admin.response.MemberInfoDTO;
-import com.doumee.dao.business.MemberMapper;
-import com.doumee.dao.business.TrainTimeMapper;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.join.MemberJoinMapper;
 import com.doumee.dao.business.join.UserActionJoinMapper;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.dao.web.reqeust.CheckVisitedDTO;
 import com.doumee.dao.web.response.MemberVO;
@@ -45,15 +45,14 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateUtils;
 import org.apache.shiro.SecurityUtils;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 浜哄憳淇℃伅琛⊿ervice瀹炵幇
@@ -72,6 +71,17 @@
     @Autowired
     private TrainTimeMapper trainTimeMapper;
 
+    @Autowired
+    private MemberRoleMapper memberRoleMapper;
+
+    @Autowired
+    private DeviceRoleMapper deviceRoleMapper;
+
+    @Autowired
+    private EmpowerMapper empowerMapper;
+
+    @Autowired
+    private DeviceMapper deviceMapper;
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
@@ -222,7 +232,7 @@
         Member update = new Member();
         update.setEditDate(new Date());
         update.setEditor(loginUserInfo.getId());
-        update.setStatus(member.getStatus());
+        update.setStatus(Constants.Status.FREEZE.getValue());
         update.setId(member.getId());
         memberMapper.updateById(update);
 
@@ -232,9 +242,12 @@
         userAction.setCreator(loginUserInfo.getId());
         if(Constants.equalsInteger(result.getType(),Constants.TWO)){
             userAction.setType(Constants.ONE);
+            userAction.setRemark("鐢便��"+loginUserInfo.getUsername()+"銆戜簬銆愭搷浣滄椂闂�"+new Date()+"銆戯紝杩涜銆愬喕缁撱��");
         }
         if(Constants.equalsInteger(result.getType(),Constants.ZERO)){
             userAction.setType(Constants.TWO);
+            userAction.setRemark("鐢便��"+loginUserInfo.getUsername()+"銆戜簬銆愭搷浣滄椂闂�"+new Date()+"銆戯紝杩涜銆愭媺榛戙��");
+
         }
         userAction.setMemberId(result.getId()+"");
         userAction.setBeforeStatus(status);
@@ -253,9 +266,12 @@
             Member update = new Member();
             update.setEditDate(date);
             update.setEditor(loginUserInfo.getId());
-            update.setStatus(s.getStatus());
+            update.setStatus(Constants.Status.ENABLE.getValue());
             update.setId(s.getId());
             memberMapper.updateById(update);
+
+            //瑙e喕涓氬姟 澶勭悊鐢ㄦ埛鎺堟潈瀵煎叆璁板綍
+            this.thawMember(result);
 
             UserAction userAction=new UserAction();
             userAction.setIsdeleted(Constants.ZERO);
@@ -618,23 +634,24 @@
 
     @Override
     public PageData<MemberInfoDTO> findUnusualPage(PageWrap<MemberQuery> pageWrap) {
-
-
         IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
         queryWrapper.selectAll(Member.class)
                 .selectAs(Company::getName,MemberInfoDTO::getCompanyName)
                 .select(" (select ua.CREATE_DATE from user_action ua where ua.MEMBER_ID=t.id and ua.ISDELETED=0 and ua.type=1 order by ua.CREATE_DATE limit 1) as userActionType1")
+                .select(" (select su.remark from user_action uac  where uac.MEMBER_ID=t.id and uac.ISDELETED=0 and uac.type=1 order by uac.CREATE_DATE limit 1) as creatorName")
              /*   .select(" (select count(v.id) from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0) as visitsCount")*/
                 .select(" (select STARTTIME from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0 order by CREATE_DATE limit 1) as visitsLastDate");
 
+                queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getCreaterId()),Member::getEditor,pageWrap.getModel().getCreaterId());
         queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Member::getType,pageWrap.getModel().getType());
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Member::getName,pageWrap.getModel().getName())
-                .like(StringUtils.isNotBlank(pageWrap.getModel().getPhone()),Member::getPhone,pageWrap.getModel().getPhone())
+                .and(StringUtils.isNotBlank(pageWrap.getModel().getKeyWords()),ms->ms.like(Member::getPhone,pageWrap.getModel().getName())
+                        .or().like(Member::getName,pageWrap.getModel().getName()))
                 .like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName())
                 .like(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,pageWrap.getModel().getIdcardNo())
-                .eq(Member::getStatus,Constants.Status.ENABLE)
+                .eq(Member::getStatus,Constants.Status.FREEZE.getValue())
                 .eq(Objects.nonNull(pageWrap.getModel().getCode()),Member::getCode,pageWrap.getModel().getCode())
                 .orderByDesc(Member::getCreateDate);
 
@@ -644,6 +661,113 @@
 
     }
 
+
+    /**
+     * 鐢ㄦ埛瑙e喕 娣诲姞鎺堟潈瀵煎叆璁板綍
+     * @param member
+     */
+    public void thawMember(Member member){
+        //鐢ㄦ埛瑙掕壊缁�
+        List<MemberRole> memberRoleList =  memberRoleMapper.selectList(new QueryWrapper<MemberRole>().lambda().eq(MemberRole::getMemberId,member.getId()));
+        if(CollectionUtils.isNotEmpty(memberRoleList)){
+            List<Integer> roleIds = memberRoleList.stream().map(m->m.getId()).collect(Collectors.toList());
+            //瑙掕壊缁勮澶囨潈闄�
+            List<DeviceRole> deviceRoleList= deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
+                    .eq(DeviceRole::getType,Constants.TWO)
+                    .in(DeviceRole::getId,roleIds));
+
+            if(CollectionUtils.isNotEmpty(deviceRoleList)){
+                String ids = "";
+                List<Integer> r = new ArrayList<>();
+                for (int i = 0; i < deviceRoleList.size(); i++) {
+                    DeviceRole deviceRole =deviceRoleList.get(i);
+                    if(i>0){
+                        ids += ",";
+                    }
+                    Integer id =deviceRole.getId();
+                    ids += "["+id+"]";
+                    String doorids =deviceRole.getDoorIds();
+                    if(StringUtils.isNotBlank(doorids)){
+                        String[] ss = doorids.split(",");
+                        try {
+                            for(String s :ss){
+                                r.add(Integer.parseInt(s));
+                            }
+                        }catch (Exception e){
+                            //鑴忔暟鎹笉澶勭悊
+                        }
+                    }
+                }
+
+                if(CollectionUtils.isNotEmpty(r)){
+                    List<Empower> list = new ArrayList<>();
+                    List<Device> deviceList = deviceMapper.selectList(new QueryWrapper<Device>().lambda().in(Device::getId,r));
+                    if(deviceList == null || deviceList.size() == 0){
+                        return;
+                    }
+                    for (Device deviceRole:deviceList) {
+                        Empower model = new Empower();
+                        model.setCreateDate(new Date());
+                        model.setMemberId(member.getId());
+                        model.setIsdeleted(Constants.ZERO);
+                        model.setDeviceId(deviceRole.getId());
+                        model.setSendStatus(Constants.ZERO);
+                        model.setSendType(Constants.ZERO);
+                        list.add(model);
+                    }
+                    //瀵煎叆鏂板鐨勬巿鏉冧俊鎭�
+                    empowerMapper.insertBatchSomeColumn(list);
+                }
+            }
+        }
+    }
+
+
+
+    /**
+     * 瀹氭椂鍐荤粨鍐呴儴浜哄憳
+     */
+    @Override
+    public void memberFreeze(){
+        SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.TIMEOUT_FREEZE);
+        if(Objects.isNull(systemDictData)||
+                StringUtils.isBlank(systemDictData.getCode())
+        ){
+            return;
+        }
+        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>()
+                .lambda().eq(Member::getIsdeleted,Constants.ZERO)
+                .eq(Member::getType,Constants.memberType.internal)
+                .isNotNull(Member::getHkId)
+                .notExists(" SELECT 1 FROM device_event b WHERE b.ext_event_person_no =  HK_ID AND TO_DAYS( NOW()) - TO_DAYS( b.CREATE_DATE ) > "+systemDictData.getCode()+"  ")
+        );
+        if(CollectionUtils.isEmpty(memberList)){
+           return;
+        }
+        List<Integer> memberIds = memberList.stream().map(m->m.getId()).collect(Collectors.toList());
+
+        //鍐荤粨鐘舵��
+        memberMapper.update(null,new UpdateWrapper<Member>()
+                .lambda().set(Member::getStatus,Constants.TWO)
+                .in(Member::getId,memberIds)
+        );
+        //澶勭悊涓嬪彂鏁版嵁
+        empowerMapper.update(null,new UpdateWrapper<Empower>()
+                .lambda()
+                .set(Empower::getIsdeleted,Constants.ONE)
+                .set(Empower::getSendStatus,Constants.ZERO)
+                .set(Empower::getEditDate,new Date())
+                .in(Empower::getMemberId,memberIds)
+        );
+    }
+
+
+
+
+
+
+
+
     /********************************************鍏紬鍙锋帴鍙�***********************************************************************/
 
 
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
index 72e79ad..b6e3f46 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -596,6 +596,7 @@
         queryWrapper.leftJoin(Member.class,Member::getId,Visits::getReceptMemberId);
         queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
 
+        queryWrapper.ne(Member::getType,Constants.TWO);
         queryWrapper.eq(Visits::getIsdeleted,Constants.ZERO);
         queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Visits::getType,pageWrap.getModel().getType());
         queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getName()),ms->ms.like(Visits::getPhone,pageWrap.getModel().getName())
@@ -605,7 +606,20 @@
                 .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Visits::getStatus,pageWrap.getModel().getStatus());
         queryWrapper.isNull(Visits::getOutDate);
         queryWrapper.orderByDesc(Visits::getEditDate);
+       String code= systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.TIMEOUT_FREEZE).getCode();
         IPage<Visits> result = visitsJoinMapper.selectJoinPage(page, Visits.class,queryWrapper);
+        if(result!=null&&result.getRecords()!=null){
+            result.getRecords().stream().forEach(s ->{
+                if(s.getTimeOut()>=Constants.ZERO){
+                    s.setOutStatus(Constants.ONE);
+                }else if(s.getTimeOut()<=Integer.valueOf(code)&&s.getTimeOut()>0){
+                    s.setOutStatus(Constants.TWO);
+                }else{
+                    s.setOutStatus(Constants.ZERO);
+                }
+
+            });
+        }
 
         return PageData.from(result);
     }
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
index 4d8d692..8f6c7b0 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -221,6 +221,7 @@
         company.setName(respone.getName());
         company.setErpId(respone.getId());
         company.setCreateDate(date);
+        company.setType(Constants.ONE);
         company.setCode(respone.getCode());
         company.setErpParentId(respone.getParentOrgId());
         company.setErpDate(date);
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java
index 8635604..03fafb7 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncOrgUserServiceImpl.java
@@ -186,7 +186,7 @@
         OrgDelRequest request = new OrgDelRequest();
         request.setIndexCodes( delHkIds.toArray(new String[]{}));
         BaseResponse<List<OrgUpdateFailureResponse>> result =  HKService.delBatchOrg(request);
-        if(StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
+        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
             List<String> fIds = new ArrayList<>();
             if(result.getData()!=null){
                 for(OrgUpdateFailureResponse r : result.getData()){
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/system/SystemUserService.java b/server/dmvisit_service/src/main/java/com/doumee/service/system/SystemUserService.java
index d4fc099..7f4f04e 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/system/SystemUserService.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/system/SystemUserService.java
@@ -78,7 +78,7 @@
      */
     PageData<SystemUserListVO> findPage(PageWrap<QuerySystemUserDTO> pageWrap);
 
-    PageData<SystemUser> findAllList(PageWrap<SystemUser> pageWrap);
+    List<SystemUser> findAllList(SystemUser pageWrap);
 
     /**
      * 鏉′欢缁熻
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java b/server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
index f4af23d..fcdcb57 100644
--- a/server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/system/impl/SystemUserServiceImpl.java
@@ -206,24 +206,24 @@
 
 
     @Override
-    public PageData<SystemUser> findAllList(PageWrap<SystemUser> pageWrap) {
+    public List<SystemUser> findAllList(SystemUser pageWrap) {
 
-        IPage<SystemUser> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+
         MPJLambdaWrapper<SystemUser> queryWrapper = new MPJLambdaWrapper<>();
-        Utils.MP.blankToNull(pageWrap.getModel());
+        Utils.MP.blankToNull(pageWrap);
         queryWrapper.selectAll(SystemUser.class);
         queryWrapper.eq(SystemUser::getDeleted, Constants.ZERO);
-        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getUsername()),ms->ms.like(SystemUser::getUsername,pageWrap.getModel().getUsername())
-        .or().like(SystemUser::getMobile,pageWrap.getModel().getUsername())
-                .or().like(SystemUser::getRealname,pageWrap.getModel().getUsername())
+        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getUsername()),ms->ms.like(SystemUser::getUsername,pageWrap.getUsername())
+        .or().like(SystemUser::getMobile,pageWrap.getUsername())
+                .or().like(SystemUser::getRealname,pageWrap.getUsername())
         );
         queryWrapper.orderByDesc(SystemUser::getCreateTime);
 
 
 
-        IPage<SystemUser> result = systemUserJoinMapper.selectJoinPage(page, SystemUser.class, queryWrapper);
+        List<SystemUser> result = systemUserJoinMapper.selectJoinList( SystemUser.class, queryWrapper);
 
-        return PageData.from(result);
+        return result;
     }
 
 
diff --git a/server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java b/server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java
index 14ea118..cc8cb5e 100644
--- a/server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java
+++ b/server/openapi/src/main/java/com/doumee/api/web/ErpResourceController.java
@@ -43,16 +43,18 @@
         List<ErpOrgListResponse> list = new ArrayList<>();
         String[] ids = new String[]{"","001","002","003"};
         String[] names = new String[]{"","缁勭粐1","缁勭粐2","缁勭粐3"};
-        for(int i=1;i<=4;i++){
+        for(int i=1;i<4;i++){
             ErpOrgListResponse r = new ErpOrgListResponse();
             r.setParentOrgId(ids[i-1]);
+            r.setId(ids[i]);
             r.setCreateDate(new Date());
-            r.setCode(UUID.randomUUID().toString());
+            r.setCode(ids[i]);
             r.setStatus(Constants.ZERO);
             r.setName(names[i]);
             list.add(r);
         }
         IPage<ErpOrgListResponse> pageInfo = new Page<>(1,10,3);
+        pageInfo.setTotal(3);
         pageInfo.setRecords(list);
         PageData<ErpOrgListResponse> r = PageData.from( pageInfo);
         return ERPApiResponse.success(r);
@@ -64,18 +66,20 @@
         String[] ids = new String[]{"","1001","1002","1003"};
         String[] names = new String[]{"","浜哄憳1","浜哄憳2","浜哄憳3"};
         String[] orgs = new String[]{"","001","002","003"};
-        for(int i=1;i<=4;i++){
+        for(int i=1;i<4;i++){
             ErpUserListResponse r = new ErpUserListResponse();
             r.setOrgId(orgs[i]);
             r.setId(ids[i]);
             r.setName(names[i-1]);
             r.setCode( ids[i]);
+            r.setIsdeleted(Constants.ONE);
             r.setName(names[i]);
             r.setFaceImg("/20223402/"+r.getId()+".png");
             list.add(r);
         }
         IPage<ErpUserListResponse> pageInfo = new Page<>(1,10,3);
         pageInfo.setRecords(list);
+        pageInfo.setTotal(3);
         PageData<ErpUserListResponse> r = PageData.from( pageInfo);
         return ERPApiResponse.success(r);
     }
diff --git a/server/openapi/src/main/resources/application.yml b/server/openapi/src/main/resources/application.yml
index aed8465..a81464d 100644
--- a/server/openapi/src/main/resources/application.yml
+++ b/server/openapi/src/main/resources/application.yml
@@ -10,7 +10,7 @@
   #  application:
   #    name: doumeemes
   profiles:
-    active: test
+    active: dev
 
   # JSON杩斿洖閰嶇疆
   jackson:

--
Gitblit v1.9.3