From 959edec9fe35807d6b1b794cce42e9665d50d3a8 Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期三, 15 五月 2024 09:01:29 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit

---
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                                            |   39 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java                         |   13 
 admin/src/components/business/OperaMemberImportWindow.vue                                                           |   82 +++
 admin/src/assets/style/style.scss                                                                                   |   30 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java                           |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java            |   95 ----
 admin/src/components/business/OperaMemberRoleWindow.vue                                                             |  218 +++++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java                          |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java                          |   18 
 admin/src/views/business/userAction.vue                                                                             |   24 
 admin/src/api/business/member.js                                                                                    |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java                 |  231 ++++++++-
 admin/src/components/business/OperaInternalCompanyWindow.vue                                                        |   12 
 admin/public/template/member.xlsx                                                                                   |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java             |    7 
 server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java                             |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java                               |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java                          |    5 
 admin/src/components/business/OperaMemberWindow.vue                                                                 |   13 
 admin/src/views/business/internalCompany.vue                                                                        |    4 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceRoleCloudController.java                     |    6 
 admin/src/views/business/relativeMember.vue                                                                         |  399 +++++++++++++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java             |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java                              |    3 
 admin/public/template/traintime.xlsx                                                                                |    0 
 server/system_service/src/main/java/com/doumee/dao/business/model/Company.java                                      |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java                |   40 +
 admin/src/api/business/device.js                                                                                    |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java                           |    2 
 admin/src/views/business/internalMember.vue                                                                         |   87 ++-
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java                           |    3 
 32 files changed, 1,154 insertions(+), 207 deletions(-)

diff --git a/admin/public/template/member.xlsx b/admin/public/template/member.xlsx
new file mode 100644
index 0000000..5516abc
--- /dev/null
+++ b/admin/public/template/member.xlsx
Binary files differ
diff --git a/admin/public/template/traintime.xlsx b/admin/public/template/traintime.xlsx
new file mode 100644
index 0000000..5516abc
--- /dev/null
+++ b/admin/public/template/traintime.xlsx
Binary files differ
diff --git a/admin/src/api/business/device.js b/admin/src/api/business/device.js
index 636da34..12662a9 100644
--- a/admin/src/api/business/device.js
+++ b/admin/src/api/business/device.js
@@ -16,6 +16,9 @@
 export function getList (data) {
   return request.post('/visitsAdmin/cloudService/business/device/getList', data)
 }
+export function getDeviceRoleList (data) {
+  return request.post('/visitsAdmin/cloudService/business/deviceRole/list', data)
+}
 
 // 淇敼
 export function updateById (data) {
diff --git a/admin/src/api/business/member.js b/admin/src/api/business/member.js
index 0c358ae..d100a64 100644
--- a/admin/src/api/business/member.js
+++ b/admin/src/api/business/member.js
@@ -45,6 +45,12 @@
 export function updateCanVisit (data) {
   return request.post('/visitsAdmin/cloudService/business/member/updateCanVisitById', data)
 }
+export function importExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/member/importExcel', data)
+}
+export function batchRoleAuth (data) {
+  return request.post('/visitsAdmin/cloudService/business/member/batchRoleAuth', data)
+}
 
 // 鎵归噺鎷夐粦
 export function batchBlock (ids) {
diff --git a/admin/src/assets/style/style.scss b/admin/src/assets/style/style.scss
index 44a053b..4718bce 100644
--- a/admin/src/assets/style/style.scss
+++ b/admin/src/assets/style/style.scss
@@ -93,4 +93,34 @@
 }
   .apply-status5,.change-status7,.settle-status7,.tax-status1,.du-status1,.settle-status4  {
   color: #00BA92  !important;
+
+}
+::v-deep  .el-dialog{
+    margin-top: 300px;
+  }
+.center-title .el-dialog__title {
+  text-align: center;
+  width: 100%;
+  font-size: 18px;
+  font-weight: bold;
+}
+
+.tip {
+  em {
+    font-style: normal;
+    color: $primary-color;
+    font-weight: bold;
+  }
+}
+.tip-warn {
+  margin: 4px 0 12px 0;
+  font-size: 12px;
+  color: #999;
+  i {
+    color: orange;
+    margin-right: 4px;
+    font-size: 14px;
+    position: relative;
+    top: 1px;
+  }
 }
diff --git a/admin/src/components/business/OperaInternalCompanyWindow.vue b/admin/src/components/business/OperaInternalCompanyWindow.vue
index 6445653..5b0d8e1 100644
--- a/admin/src/components/business/OperaInternalCompanyWindow.vue
+++ b/admin/src/components/business/OperaInternalCompanyWindow.vue
@@ -16,7 +16,7 @@
                 <el-input v-model="form.name" placeholder="璇疯緭鍏ョ粍缁囧悕绉�" v-trim/>
             </el-form-item>
           <el-form-item label="缁勭粐绫诲瀷" prop="type">
-            <el-radio-group v-model="form.type" >
+            <el-radio-group v-model="form.type" :disabled="form.parentType ==0">
               <el-radio :label="0">鐩稿叧鏂圭粍缁�</el-radio>
               <el-radio :label="1">鍐呴儴缁勭粐</el-radio>
             </el-radio-group>
@@ -78,11 +78,14 @@
         name: '',
         parentId: null,
         disable: false,
-        parentName: ''
+        parentName: '',
+        parentType:0
       }
       if (target != null) {
         this.form.parentId = target.id
-        this.form.parentName = target.companyPath
+        this.form.parentType = target.type
+        this.form.parentName = target.companyNamePath
+
       }
       // 鏂板缓缁勭粐
       if (row == null) {
@@ -98,6 +101,9 @@
         for (const key in this.form) {
           this.form[key] = row[key]
         }
+        if(target.type == 0){
+          this.form.type = 0
+        }
       })
     },
     // 纭鏂板缓/淇敼
diff --git a/admin/src/components/business/OperaMemberImportWindow.vue b/admin/src/components/business/OperaMemberImportWindow.vue
new file mode 100644
index 0000000..d8ce699
--- /dev/null
+++ b/admin/src/components/business/OperaMemberImportWindow.vue
@@ -0,0 +1,82 @@
+<template>
+  <el-dialog
+      class="center-title"
+      :title="title"
+      width="500px"
+      top="30vh"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm"
+  >
+    <p class="tip-warn"><i class="el-icon-warning"></i>瀵煎叆璇存槑锛�<br>
+      1.璇峰厛涓嬭浇鏂囦欢妯℃澘锛屽苟鎸夌収妯℃澘瑕佸幓濉啓琛ㄦ牸鍐呭;<br>
+    </p>
+    <el-form class="demo-form-inline" >
+      <el-form-item label="浜哄憳鍚嶅崟" required>
+        <div style="width: 100%;display: flex;align-items: center;">
+          <el-button type="primary" @click="clickRef">鐐瑰嚮涓婁紶</el-button>
+          <el-button type="text" @click="exportTemplate">鐐瑰嚮涓嬭浇妯$増.EXCEL</el-button>
+        </div>
+        <div style="font-size: 14px; color: black;" v-if="fileName">{{fileName}}</div>
+      </el-form-item>
+    </el-form>
+    <input type="file" style="position: fixed; left: 0; top: -50px;" accept=".xlsx" ref="fileExcel" @change="result" />
+    <template   v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { importExcel } from '@/api/business/member'
+export default {
+  name: 'OperaMemberImportWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      fileName: '',
+      companyType: 0
+    }
+  },
+  methods: {
+    open (title, companyType) {
+      this.title = title
+      this.fileName = ''
+      this.visible = true
+      this.companyType = companyType
+    },
+    // 瀵煎嚭妯℃澘
+    exportTemplate () {
+      // 鎶曚繚鐢宠
+      window.open('/template/member.xlsx')
+    },
+    clickRef () {
+      this.$refs.fileExcel.click()
+    },
+    result (e) {
+      const data = new FormData()
+      data.append('file', e.target.files[0])
+      importExcel(data)
+        .then(res => {
+          this.$message.success('瀵煎叆鎴愬姛')
+          this.$emit('success')
+          this.visible = false
+        })
+        .catch(err => {
+          this.$message.error(err)
+          this.fileName = ''
+        })
+        .finally(() => {
+          this.$refs.fileExcel.value = null
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>
diff --git a/admin/src/components/business/OperaMemberRoleWindow.vue b/admin/src/components/business/OperaMemberRoleWindow.vue
new file mode 100644
index 0000000..a581c65
--- /dev/null
+++ b/admin/src/components/business/OperaMemberRoleWindow.vue
@@ -0,0 +1,218 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        width="900px"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+      <p class="tip-warn"><i class="el-icon-warning"></i>鎻愰啋锛�<br>
+        1.闂ㄧ鏉冮檺閰嶇疆鎴愬姛鍚庯紝鎺堟潈浠诲姟鍗宠繘鍏ユ潈闄愪笅鍙戦槦鍒楋紝鍙墠寰�銆愪汉鍛樻巿鏉冭褰曘�戞煡鐪嬩笅鍙戣繘搴�;<br>
+        2.濡傛灉闇�瑕佹竻绌哄綋鍓嶉�変腑浜哄憳涓嬪彂鏉冮檺锛屼互涓嬨�愬凡閫夐棬绂佺偣鍒嗙粍銆戜负绌烘彁浜ゅ嵆鍙��
+      </p>
+      <p class="tip" v-if="form.names != null">姝e湪涓�<em>銆恵{ form.names.map(item => `${item}`).join('锛�') }}銆�</em> 閰嶇疆闂ㄧ鏉冮檺</p>
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="闂ㄧ鏈夋晥鏈燂細" prop="timeType">
+                <el-radio-group v-model="form.timeType">
+                    <el-radio :label="0">闀挎湡鏈夋晥</el-radio>
+                    <el-radio :label="1">鑷畾涔夋椂闂�</el-radio>
+                    <el-radio :label="2" v-if="companyType=== 0">鍩硅鏈夋晥鏈�</el-radio>
+                </el-radio-group>
+                <div v-if="form.timeType ==1" style="margin-top: 10px" >
+                  <el-date-picker
+                      @change="seleTime"
+                      v-model="time"
+                      type="datetimerange"
+                      format="yyyy-MM-dd HH:mm:ss"
+                      value-format="yyyy-MM-dd HH:mm:ss"
+                      range-separator="鑷�"
+                      start-placeholder="寮�濮嬫棩鏈�"
+                      end-placeholder="缁撴潫鏃ユ湡">
+                  </el-date-picker>
+                </div>
+            </el-form-item>
+            <el-form-item label="闂ㄧ鐐瑰垎缁勶細" prop="roleIds">
+                <el-transfer
+                    style="margin-top: 15px;font-size: 12px"
+                    :titles="['鏈�夐棬绂佺偣鍒嗙粍', '宸查�夐棬绂佺偣鍒嗙粍']"
+                    filterable
+                    :filter-method="filterMethod"
+                    filter-placeholder="璇疯緭鍏ラ棬绂佺偣鍒嗙粍鍚嶇О"
+                    v-model="form.roleIds"
+                    :data="roles">
+                </el-transfer>
+            </el-form-item>
+
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import {getDeviceRoleList} from '@/api/business/device'
+export default {
+  name: 'OperaDeviceRoleWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    var validateTime = (rule, value, callback) => {
+      if(this.form.timeType == null  ){
+        callback(new Error('璇峰~鍐欐纭殑闂ㄧ鏈夋晥鏈熸椂闂�'))
+        return
+      }
+      if(this.form.timeType === 1 && (this.form.startTime ==null || this.form.endTime == null)){
+          callback(new Error('璇峰~鍐欐纭殑闂ㄧ鏈夋晥鏈熸椂闂�'))
+          return
+      }
+      callback()
+    };
+    return {
+      // 琛ㄥ崟鏁版嵁
+     time:null,
+      companyType:1,
+      form: {
+        ids: [],
+        names: [],
+        timeType: 0,
+        roleIds: [],
+        status: 1,
+        startTime:null,
+        endTime:null,
+        radio: 0
+      },
+      roles:[],
+      rules: {
+      // 楠岃瘉瑙勫垯
+        timeType: [
+          { required: true, validator: validateTime,message: '璇烽�変腑闂ㄧ鏈夋晥鏈�' }
+        ],
+        startTime: [
+          { validator: validateTime, trigger: 'blur' }
+        ],
+        endTime: [
+          { validator: validateTime, trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/member',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    filterMethod(query, item) {
+      if (!query) return item;
+      return item.label.indexOf(query) > -1 ;
+    },
+    seleTime (e) {
+      if(e && e.length >= 2){
+        this.form.startTime = e[0]
+        this.form.endTime = e[1]
+      }else{
+        this.form.startTime = null
+        this.form.endTime = null
+      }
+    },
+    confirm () {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        if (this.form.roleIds == null || this.form.roleIds.length == 0) {
+          this.$dialog.actionConfirm('鏉冮檺涓虹┖锛屾彁浜ゅ悗鍗虫竻闄ゆ墍閫変汉鍛樺凡鍒嗛厤鏉冮檺锛佽璋ㄦ厧鎿嶄綔', '鎮ㄧ‘璁よ繘琛岃鎿嶄綔鍚楋紵')
+              .then(() => {
+                this.confirmDo();
+              })
+              .catch(() => {})
+
+        } else {
+          this.confirmDo();
+        }
+      })
+    },
+    confirmDo(){
+        // 璋冪敤鏂板缓鎺ュ彛
+        this.isWorking = true
+        this.api.batchRoleAuth({
+          ids: this.form.ids,
+          timeType: this.form.timeType,
+          startTime: this.form.startTime,
+          endTime: this.form.endTime,
+          roleIds: this.form.roleIds
+        })
+            .then(() => {
+              this.visible = false
+              this.$tip.apiSuccess('鏂板缓鎴愬姛')
+              this.$emit('success')
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.isWorking = false
+            })
+      },
+    // 鑾峰彇璁惧
+    getLists (){
+      getDeviceRoleList({type:2})
+        .then(res => {
+          this.roles = res.map(item => {
+            return {
+              label: item.name,
+              area: item.name,
+              key: item.id
+            }
+          })
+        })
+    },
+    open (title, ids,names,companyType) {
+      this.roles = []
+      this.getLists()
+      this.title = title
+      this.visible = true
+      this.companyType = companyType
+      // 鏂板缓
+      this.$nextTick(() => {
+        this.$refs.form.resetFields()
+        this.form[this.configData['field.id']] = null
+        this.form.ids = ids;
+        this.form.names =names;
+
+        console.log(names)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/assets/style/variables.scss";
+// 瑙掕壊閰嶇疆
+.global-window {
+  .tip {
+    em {
+      font-style: normal;
+      color: $primary-color;
+      font-weight: bold;
+    }
+  }
+  .tip-warn {
+    margin: 4px 0 12px 0;
+    font-size: 12px;
+    color: #999;
+    i {
+      color: orange;
+      margin-right: 4px;
+      font-size: 14px;
+      position: relative;
+      top: 1px;
+    }
+  }
+}
+.el-transfer-panel {
+  width: 350px !important;
+}
+</style>
diff --git a/admin/src/components/business/OperaMemberWindow.vue b/admin/src/components/business/OperaMemberWindow.vue
index 19be014..c3eb8db 100644
--- a/admin/src/components/business/OperaMemberWindow.vue
+++ b/admin/src/components/business/OperaMemberWindow.vue
@@ -17,12 +17,16 @@
                   @change="handleChangeCompany"
                   :show-all-levels="false"
                   clearable
+                  filterable
                   :props="departprops"
               ></el-cascader>
+              <div style="font-size: 12px;color: #F56C6C"  >
+                娉細浠呮敮鎸侀�夋嫨 銆恵{companyType ===0?'鐩稿叧鏂圭粍缁�':'鍐呴儴缁勭粐'}}銆�
+              </div>
             </el-form-item>
             <el-form-item label="鎵嬫満鍙�" prop="phone">
                 <el-input v-model="form.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim/>
-              <div style="color: #F56C6C;font-size: 12px">锛堟敞锛氬憳宸ユ墜鏈哄彿灏嗕綔涓哄钩鍙扮櫥褰曡处鍙凤紝鍒濆瀵嗙爜涓虹郴缁熼粯璁ゅ瘑鐮侀厤缃」锛�</div>
+              <div style="color: #F56C6C;font-size: 12px">娉細鍛樺伐鎵嬫満鍙峰皢浣滀负骞冲彴鐧诲綍璐﹀彿锛屽垵濮嬪瘑鐮佷负绯荤粺榛樿瀵嗙爜閰嶇疆椤�</div>
             </el-form-item>
             <el-form-item label="韬唤璇佸彿" prop="idcardNo" v-if="form.id ==null">
                 <el-input v-model="form.idcardNo" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" v-trim/>
@@ -30,7 +34,7 @@
             <el-form-item label="淇敼韬唤璇佸彿" prop="idcardNoNew" v-if="form.id !=null">
                 <el-input v-model="form.idcardNoNew" placeholder="鍙慨鏀硅韩浠借瘉鍙�" v-trim/>
               <div style="font-size: 12px" v-if="form.id !=null">
-                锛堟敞锛氬綋鍓嶈韩浠借瘉鍙蜂负<span style="color: #F56C6C">銆恵{form.idcardDecode}}銆�</span>锛屽闇�淇敼锛岃鍦ㄨ緭鍏ユ爮濉啓鏂扮殑韬唤璇佸彿!锛�
+                娉細褰撳墠韬唤璇佸彿涓�<span style="color: #F56C6C">銆恵{form.idcardDecode}}銆�</span>锛屽闇�淇敼锛岃鍦ㄨ緭鍏ユ爮濉啓鏂扮殑韬唤璇佸彿!
               </div>
             </el-form-item>
             <el-form-item label="宸ュ彿" prop="code">
@@ -68,6 +72,7 @@
         value: 'id',
         checkStrictly: true
       },
+      companyType:0,
       department: [],
       // 琛ㄥ崟鏁版嵁
       form: {
@@ -113,10 +118,11 @@
      * @title 绐楀彛鏍囬
      * @target 缂栬緫鐨勫璞�
      */
-    open (title, target, depart) {
+    open (title, target, depart,companyType) {
       this.title = title
       this.department = depart
       this.visible = true
+      this.companyType = companyType
       // 鏂板缓
       if (target == null) {
         this.$nextTick(() => {
@@ -142,7 +148,6 @@
             }
           })
         }
-        console.log(that.form.company)
       })
     },
     // 涓婁紶鍥剧墖
diff --git a/admin/src/views/business/internalCompany.vue b/admin/src/views/business/internalCompany.vue
index 7057fc3..5a29df9 100644
--- a/admin/src/views/business/internalCompany.vue
+++ b/admin/src/views/business/internalCompany.vue
@@ -33,7 +33,7 @@
             >
                 <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 prop="name" label="缁勭粐绫诲瀷" min-width="80px">
                   <template scope="{row}">
                       <span v-if="row.type == 0">鐩稿叧鏂圭粍缁�</span>
                       <span v-if="row.type == 1">鍐呴儴缁勭粐</span>
@@ -48,7 +48,7 @@
                     fixed="right"
                 >
                     <template slot-scope="{row}">
-                        <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('缂栬緫浼佷笟淇℃伅',{  id: row.parentId,name:row.parentName,companyPath:row.parentCompanyPath}, row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
+                        <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('缂栬緫浼佷笟淇℃伅',{  id: row.parentId,name:row.parentName,type:row.parentType, companyPath:row.parentCompanyPath}, row)" icon="el-icon-edit" v-permissions="['business:company:update']">缂栬緫</el-button>
                         <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('鏂板缓瀛愮骇',  row,null)" icon="el-icon-plus">鏂板缓瀛愮骇</el-button>
                         <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">鍒犻櫎</el-button>
                     </template>
diff --git a/admin/src/views/business/internalMember.vue b/admin/src/views/business/internalMember.vue
index 0777433..45a0ace 100644
--- a/admin/src/views/business/internalMember.vue
+++ b/admin/src/views/business/internalMember.vue
@@ -47,13 +47,14 @@
         </template>
         <!-- 琛ㄦ牸鍜屽垎椤� -->
         <template v-slot:table-wrap>
-            <ul class="toolbar" v-permissions="['business:member:delete','business:member:create']">
-<!--                <li><el-button type="primary">闂ㄧ鎺堟潈</el-button></li>-->
+            <ul class="toolbar" v-permissions="['business:member:delete','business:member:create,business:empower:create']">
 <!--
                 <li><el-button type="primary" v-permissions="['business:member:sync']" :loading="loading" @click="synchronous()">鍚屾</el-button></li>
 -->
-                <li><el-button type="primary" @click="$refs.OperaMemberWindow.open('鏂板缓鍛樺伐',null,department)"  icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓鍛樺伐</el-button></li>
+                <li><el-button type="primary" @click="$refs.OperaMemberWindow.open('鏂板缓鍛樺伐',null,department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓鍛樺伐</el-button></li>
+                <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('浜哄憳瀵煎叆',department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">浜哄憳瀵煎叆</el-button></li>
                 <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鎵归噺鍒犻櫎</el-button></li>
+                <li><el-button type="primary" v-permissions="['business:empower:create']"  @click="startEmpowerBatch()"  icon="el-icon-plus">涓嬪彂鎺堟潈</el-button></li>
             </ul>
             <el-table
                 v-loading="isWorking.search"
@@ -109,12 +110,6 @@
                   </el-switch>
                 </template>
               </el-table-column>
-                <el-table-column label="鍙嫓璁�" min-width="100px">
-                    <template slot-scope="{row}">
-                        <span v-if="row.canVisit != 1">鍚�</span>
-                        <span v-if="row.canVisit == 1">鏄�</span>
-                    </template>
-                </el-table-column>
                 <el-table-column label="娴峰悍鍚屾鐘舵��" min-width="100px">
                  <template slot-scope="{row}">
                         <span v-if="row.hkStatus == 0" style="color: #435EBE">寰呭悓姝�</span>
@@ -134,6 +129,18 @@
                         <span>{{(row.roleNames && row.roleNames.length) ?row.roleNames.join(','): '-'}}</span>
                     </template>
                 </el-table-column>
+              <el-table-column label="闂ㄧ鏈夋晥鏈�" min-width="170px">
+                <template slot-scope="{row}">
+                  <div v-if="row.roleId !=null && row.roleId != ''">
+                    <div v-if="!row.startTime || !row.endTime">闀挎湡鏈夋晥</div>
+                    <div v-else>
+                      <span>璧凤細{{row.startTime}}</span><br />
+                      <span>姝細{{row.endTime}}</span>
+                    </div>
+                  </div>
+                  <div v-else >-</div>
+                </template>
+              </el-table-column>
               <el-table-column prop="code" label="宸ュ彿" min-width="100px"></el-table-column>
               <el-table-column label="鍗$墖" min-width="80px">
                 <template slot-scope="{row}">
@@ -176,6 +183,7 @@
             <!--    鏌ョ湅浜哄憳寮�鍗¤褰�    -->
             <cardOpeningRecord ref="cardOpeningRecord" @success="handlePageChange" />
             <OperaMemberWindow ref="OperaMemberWindow" @success="handlePageChange" />
+            <OperaMemberRoleWindow ref="OperaMemberRoleWindow" @success="handlePageChange" />
         </template>
     </TableLayout1>
 </template>
@@ -187,12 +195,13 @@
 import cardOpeningRecord from '@/components/business/cardOpeningRecord'
 import Tree from '@/components/common/Tree'
 import OperaMemberWindow from '@/components/business/OperaMemberWindow'
+import OperaMemberRoleWindow from '@/components/business/OperaMemberRoleWindow'
 import { fetchList } from '@/api/business/company'
 import { memberSync, roleAuth, updateCanVisit, updateHead, updateWorkStatus } from '@/api/business/member'
 export default {
   name: 'internalMember',
   extends: BaseTable,
-  components: { TableLayout1, Pagination, Tree, cardOpeningRecord, OperaMemberWindow },
+  components: { TableLayout1, Pagination, Tree, cardOpeningRecord, OperaMemberWindow, OperaMemberRoleWindow },
   data () {
     return {
       TreeList: [],
@@ -205,6 +214,7 @@
         canVisit: '',
         keyword: '',
         type: 2,
+        companyType:1,
         erpOrgId: '',
         companyId: '',
         hasFace: ''
@@ -228,6 +238,19 @@
     this.getfindCompanyTreePage()
   },
   methods: {
+    startEmpowerBatch () {
+      if (this.tableData.selectedRows.length === 0) {
+        this.$tip.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�')
+        return
+      }
+      var ids = []
+      var names = []
+      this.tableData.selectedRows.forEach(item => {
+        ids.push(item.id)
+        names.push(item.name)
+      })
+      this.$refs.OperaMemberRoleWindow.open('鍐呴儴鍛樺伐涓嬪彂鏉冮檺', ids, names,this.searchForm.companyType)
+    },
     empower (id) {
       var that = this
       this.$confirm('纭畾閲嶆柊鎺堟潈鍚�?', '鎻愮ず', {
@@ -241,12 +264,12 @@
             that.search()
           })
       }).catch(() => {
-        this.$tip.apiSuccess(  '鎿嶄綔澶辫触')
+        this.$tip.apiSuccess('鎿嶄綔澶辫触')
       })
     },
     // 鑾峰彇缁勭粐鏍�
     getfindCompanyTreePage () {
-      fetchList(1)
+      fetchList()
         .then(res => {
           if (res && res.length > 0) {
             res[0].fsStatus = 1
@@ -270,6 +293,12 @@
           this.$delete(newItem, 'children')
         } else {
           newItem.children = this.getDepartmentTree(newItem.children)
+        }
+
+        if(newItem.type === this.searchForm.companyType){
+          //newItem.disabled =false
+        }else{
+          newItem.disabled = true
         }
         return newItem
       })
@@ -295,21 +324,21 @@
     },
     async updateHead (row, type) {
       this.$dialog.actionConfirm('鎮ㄧ‘璁よ繘琛屽綋鍓嶆搷浣滃悧锛�', '閮ㄩ棬涓荤璁剧疆鎿嶄綔鎻愮ず')
-          .then(() => {
-        this.heading = true
-        updateHead({ id: row.id, headStatus: type })
-          .then(res => {
-            this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
-            this.search()
-          })
-          .catch(e => {
-            this.$tip.apiFailed(e)
-          })
-          .finally(() => {
-            this.heading = false
-          })
-          .catch(() => {})
-          })
+        .then(() => {
+          this.heading = true
+          updateHead({ id: row.id, headStatus: type })
+            .then(res => {
+              this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
+              this.search()
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.heading = false
+            })
+            .catch(() => {})
+        })
     },
     changeWorkStatus (e, row) {
       this.working = true
@@ -326,7 +355,7 @@
         })
         .catch(() => {})
     },
-     changeCanvisit (e, row) {
+    changeCanvisit (e, row) {
       this.canvisiting = true
       updateCanVisit({ id: row.id, canVisit: e })
         .then(res => {
@@ -342,6 +371,8 @@
         .catch(() => {})
     },
     callback (row) {
+      alert(row.name)
+      console.log(row)
       this.searchForm.erpOrgId = row.erpId
       this.searchForm.companyId = row.id
       this.search()
diff --git a/admin/src/views/business/relativeMember.vue b/admin/src/views/business/relativeMember.vue
new file mode 100644
index 0000000..7c1440f
--- /dev/null
+++ b/admin/src/views/business/relativeMember.vue
@@ -0,0 +1,399 @@
+<template>
+    <TableLayout1 :permissions="['business:member:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="" prop="keyword">
+                <el-input v-model="searchForm.keyword" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�/宸ュ彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="" prop="hasFace">
+                <el-select v-model="searchForm.hasFace" @keypress.enter.native="search" placeholder="鏄惁鏈変汉鑴�">
+                    <el-option label="鏃�" value="0"></el-option>
+                    <el-option label="鏈�" value="1"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="canVisit">
+                <el-select v-model="searchForm.canVisit" @keypress.enter.native="search" placeholder="鍙嫓璁�">
+                    <el-option label="鏄�" value="1"></el-option>
+                    <el-option label="鍚�" value="0"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="status">
+                <el-select v-model="searchForm.status" @keypress.enter.native="search" placeholder="鐘舵��">
+                    <el-option label="姝e父" 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="hkStatus">
+                <el-select v-model="searchForm.hkStatus" @keypress.enter.native="search" 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=""  >
+              <el-checkbox style="font-size: 12px"  label="1" v-model="searchForm.includeChild" key="1"  >鏄惁鍖呭惈涓嬬骇缁勭粐</el-checkbox>
+          </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <template v-slot:menu>
+            <div style="width: 100%; height: 50px; background: rgba(242, 242, 242, 1); line-height: 50px; text-align: center; font-size: 14px;">浼佷笟缁勭粐鏋舵瀯</div>
+            <div style="width: 100%; height: calc(100vh - 170px); overflow-y: scroll;">
+                <Tree :list="companyTree" :defaultProps="{name: 'name', status: 'fsStatus', children: 'childList', id: 'id'}" @callback="callback" />
+            </div>
+        </template>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:member:delete','business:member:create,business:empower:create','business:traintime:create']">
+<!--
+                <li><el-button type="primary" v-permissions="['business:member:sync']" :loading="loading" @click="synchronous()">鍚屾</el-button></li>
+-->
+              <li><el-button type="primary" @click="$refs.OperaMemberWindow.open('鏂板缓鍛樺伐',null,department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓鍛樺伐</el-button></li>
+              <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('浜哄憳瀵煎叆',department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">浜哄憳瀵煎叆</el-button></li>
+              <li><el-button type="primary" @click="$refs.OperaTrainTimeImportWindow.open('鍩硅鏈熷鍏�',department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:traintime:create']">鍩硅鏈熷鍏�</el-button></li>
+              <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鎵归噺鍒犻櫎</el-button></li>
+                <li><el-button type="primary" v-permissions="['business:empower:create']"  @click="startEmpowerBatch()"  icon="el-icon-plus">涓嬪彂鎺堟潈</el-button></li>
+            </ul>
+            <el-table
+                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="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+                <el-table-column prop="idcardDecode" label="韬唤璇佸彿" min-width="100px"></el-table-column>
+                <el-table-column label="鎬у埆" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.sex == 1">鐢�</span>
+                        <span v-if="row.sex == 2">濂�</span>
+                    </template>
+                </el-table-column>
+              <el-table-column prop="companyName" label="鎵�灞為儴闂�" min-width="100px"></el-table-column>
+                <el-table-column prop="status" label="鐘舵��" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span v-if="row.status == 0" style="color: green">姝e父</span>
+                        <span v-if="row.status == 1" style="color: red">绂佺敤</span>
+                        <span v-if="row.status == 2" style="color: red">鎷夐粦/鍐荤粨</span>
+                    </template>
+                </el-table-column>
+              <el-table-column label="閮ㄩ棬绫诲瀷" min-width="100px">
+                <template slot-scope="{row}">
+                  <span v-if="row.companyType == 0">鐩稿叧鏂圭粍缁�</span>
+                  <span v-if="row.companyType == 1">鍐呴儴缁勭粐</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鍦ㄨ亴鐘舵��">
+              <template slot-scope="{row}">
+                <el-switch
+                    @change="changeWorkStatus($event, row)"
+                    v-model="row.workStatus"
+                    active-color="#13ce66"
+                    inactive-color="#ff4949"
+                    :active-value="0"
+                    :inactive-value="1">
+                </el-switch>
+              </template>
+            </el-table-column>
+              <el-table-column label="鏄惁鍙嫓璁�">
+                <template slot-scope="{row}">
+                  <el-switch
+                      @change="changeCanvisit($event, row)"
+                      v-model="row.canVisit"
+                      active-color="#13ce66"
+                      inactive-color="#ff4949"
+                      :active-value="1"
+                      :inactive-value="0">
+                  </el-switch>
+                </template>
+              </el-table-column>
+                <el-table-column label="娴峰悍鍚屾鐘舵��" min-width="100px">
+                 <template slot-scope="{row}">
+                        <span v-if="row.hkStatus == 0" style="color: #435EBE">寰呭悓姝�</span>
+                        <span v-if="row.hkStatus == 1" style="color: green">鍚屾鎴愬姛</span>
+                        <span v-if="row.hkStatus == 2" style="color: red">鍚屾澶辫触</span>
+                        <span v-if="row.hkStatus == 3" style="color: red">涓嶇鍚堜笅鍙戞潯浠�</span>
+                </template>
+                </el-table-column>
+                <el-table-column label="鏄惁鎺堟潈" min-width="100px">
+                  <template slot-scope="{row}">
+                    <span v-if="row.authStatus == 1" style="color: green">鏄�</span>
+                    <span v-if="row.authStatus == 0" style="color: red">鍚�</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="闂ㄧ瑙掕壊" min-width="100px">
+                    <template slot-scope="{row}">
+                        <span>{{(row.roleNames && row.roleNames.length) ?row.roleNames.join(','): '-'}}</span>
+                    </template>
+                </el-table-column>
+              <el-table-column label="闂ㄧ鏈夋晥鏈�" min-width="170px">
+                <template slot-scope="{row}">
+                  <div v-if="row.roleId !=null && row.roleId != ''">
+                    <div v-if="!row.startTime || !row.endTime">闀挎湡鏈夋晥</div>
+                    <div v-else>
+                      <span>璧凤細{{row.startTime}}</span><br />
+                      <span>姝細{{row.endTime}}</span>
+                    </div>
+                  </div>
+                  <div v-else >-</div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="code" label="宸ュ彿" min-width="100px"></el-table-column>
+              <el-table-column label="鍗$墖" min-width="80px">
+                <template slot-scope="{row}">
+                  <el-button @click="$refs.cardOpeningRecord.open('寮�鍗¤褰�', row.id)" type="text">{{row.memberCardCount || '0'}}</el-button>
+                </template>
+              </el-table-column>
+              <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+              <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
+                <el-table-column fixed="right" label="浜鸿劯淇℃伅" min-width="100px">
+                    <template slot-scope="{row}">
+                        <el-image
+                            v-if="row.faceImgFull"
+                            style="width: 60px; height: 60px"
+                            :src="row.faceImgFull"
+                            :preview-src-list="[row.faceImgFull]">
+                        </el-image>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:member:update', 'business:member:delete','business:empower:create'])"
+                    label="鎿嶄綔"
+                    min-width="280"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" icon="el-icon-edit" @click="$refs.OperaMemberWindow.open('缂栬緫鍛樺伐淇℃伅',row,department)" v-permissions="['business:empower:update']">缂栬緫</el-button>
+                        <el-button type="text" :loading="heading" icon="el-icon-delete" @click="updateHead(row,0)" v-if="row.headStatus ==1 " v-permissions="['business:member:head']">鍙栨秷涓荤</el-button>
+                        <el-button type="text" :loading="heading"  icon="el-icon-edit" @click="updateHead(row,1)"  v-if="row.headStatus  == 0"  v-permissions="['business:member:head']">璁句负涓荤</el-button>
+                        <el-button type="text"  icon="el-icon-plus" @click="empower(row.id)" v-permissions="['business:empower:create']">閲嶆柊鎺堟潈</el-button>
+                        <el-button  type="text"  icon="el-icon-delete" @click="empower(row.id)" v-permissions="['business:empower:delete']">鍒犻櫎</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+            <!--    鏌ョ湅浜哄憳寮�鍗¤褰�    -->
+            <cardOpeningRecord ref="cardOpeningRecord" @success="handlePageChange" />
+            <OperaMemberWindow ref="OperaMemberWindow" @success="handlePageChange" />
+            <OperaMemberImportWindow ref="OperaMemberImportWindow" @success="handlePageChange" />
+            <OperaMemberRoleWindow ref="OperaMemberRoleWindow" @success="handlePageChange" />
+        </template>
+    </TableLayout1>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout1 from '@/layouts/TableLayout1'
+import Pagination from '@/components/common/Pagination'
+import cardOpeningRecord from '@/components/business/cardOpeningRecord'
+import Tree from '@/components/common/Tree'
+import OperaMemberWindow from '@/components/business/OperaMemberWindow'
+import OperaMemberImportWindow from '@/components/business/OperaMemberImportWindow'
+import OperaMemberRoleWindow from '@/components/business/OperaMemberRoleWindow'
+import { fetchList } from '@/api/business/company'
+import { memberSync, roleAuth, updateCanVisit, updateHead, updateWorkStatus } from '@/api/business/member'
+export default {
+  name: 'internalMember',
+  extends: BaseTable,
+  components: { TableLayout1, Pagination, Tree, cardOpeningRecord, OperaMemberWindow, OperaMemberRoleWindow ,OperaMemberImportWindow},
+  data () {
+    return {
+      TreeList: [],
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        status: '',
+        hkStatus: '',
+        includeChild: false,
+        canVisit: '',
+        keyword: '',
+        type: 2,
+        companyType:0,
+        erpOrgId: '',
+        companyId: '',
+        hasFace: ''
+      },
+      loading: false,
+      heading: false,
+      working: false,
+      canvisiting: false,
+      companyTree: [],
+      department: []
+    }
+  },
+  created () {
+    this.config({
+      module: '浜哄憳淇℃伅琛�',
+      api: '/business/member',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    // this.search()
+    this.getfindCompanyTreePage()
+  },
+  methods: {
+    startEmpowerBatch () {
+      if (this.tableData.selectedRows.length === 0) {
+        this.$tip.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�')
+        return
+      }
+      var ids = []
+      var names = []
+      this.tableData.selectedRows.forEach(item => {
+        ids.push(item.id)
+        names.push(item.name)
+      })
+      this.$refs.OperaMemberRoleWindow.open('鍐呴儴鍛樺伐涓嬪彂鏉冮檺', ids, names,this.searchForm.companyType)
+    },
+    empower (id) {
+      var that = this
+      this.$confirm('纭畾閲嶆柊鎺堟潈鍚�?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        roleAuth(id)
+          .then(res => {
+            this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
+            that.search()
+          })
+      }).catch(() => {
+        this.$tip.apiSuccess('鎿嶄綔澶辫触')
+      })
+    },
+    // 鑾峰彇缁勭粐鏍�
+    getfindCompanyTreePage () {
+      fetchList()
+        .then(res => {
+          if (res && res.length > 0) {
+            res[0].fsStatus = 1
+            this.companyTree = res
+            // this.searchForm.erpOrgId = res[0].erpId
+            this.search()
+            this.department = this.getDepartmentTree(res)
+          }
+        })
+    },
+    getDepartmentTree (tree) {
+      if (tree == null) {
+        return []
+      }
+      return tree.map(item => {
+        const newItem = { ...item }
+        if (newItem) {
+          newItem.children = newItem.childList
+        }
+        if (item.children && item.children.length == 0) {
+          this.$delete(newItem, 'children')
+        } else {
+          newItem.children = this.getDepartmentTree(newItem.children)
+        }
+        if(newItem.type === this.searchForm.companyType){
+          //newItem.disabled =false
+        }else{
+          newItem.disabled = true
+        }
+        return newItem
+      })
+    },
+    // 鍚屾淇℃伅
+    async synchronous () {
+      this.$dialog.actionConfirm('璇ユ搷浣滈檷瑙﹀彂鍏ㄥ憳淇℃伅鏇存柊鍜岄噸鏂颁笅鍙戯紒璇疯皑鎱庢搷浣�', '鎮ㄧ‘璁ゅ叏閲忓悓姝ュ唴閮ㄤ汉鍛樹俊鎭悧锛�')
+        .then(() => {
+          this.loading = true
+          memberSync({})
+            .then(res => {
+              this.$tip.apiSuccess(res || '鍚屾鎴愬姛')
+              this.search()
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.loading = false
+            })
+        })
+        .catch(() => {})
+    },
+    async updateHead (row, type) {
+      this.$dialog.actionConfirm('鎮ㄧ‘璁よ繘琛屽綋鍓嶆搷浣滃悧锛�', '閮ㄩ棬涓荤璁剧疆鎿嶄綔鎻愮ず')
+        .then(() => {
+          this.heading = true
+          updateHead({ id: row.id, headStatus: type })
+            .then(res => {
+              this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
+              this.search()
+            })
+            .catch(e => {
+              this.$tip.apiFailed(e)
+            })
+            .finally(() => {
+              this.heading = false
+            })
+            .catch(() => {})
+        })
+    },
+    changeWorkStatus (e, row) {
+      this.working = true
+      updateWorkStatus({ id: row.id, workStatus: e })
+        .then(res => {
+          this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
+          this.search()
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.working = false
+        })
+        .catch(() => {})
+    },
+    changeCanvisit (e, row) {
+      this.canvisiting = true
+      updateCanVisit({ id: row.id, canVisit: e })
+        .then(res => {
+          this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
+          this.search()
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+        .finally(() => {
+          this.canvisiting = false
+        })
+        .catch(() => {})
+    },
+    callback (row) {
+      this.searchForm.erpOrgId = row.erpId
+      this.searchForm.companyId = row.id
+      this.search()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .box {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        .box_menu {
+            width: 100px;
+            height: 100%;
+            flex-shrink: 0;
+        }
+        .box_tab {
+            flex: 1;
+            height: 100%;
+        }
+    }
+</style>
diff --git a/admin/src/views/business/userAction.vue b/admin/src/views/business/userAction.vue
index acdbbdd..7e6109a 100644
--- a/admin/src/views/business/userAction.vue
+++ b/admin/src/views/business/userAction.vue
@@ -21,7 +21,7 @@
             <el-form-item label="鎵嬫満鍙�" prop="mobile">
                 <el-input v-model="searchForm.mobile" placeholder="璇疯緭鍏ユ墜鏈哄彿" @keypress.enter.native="search"></el-input>
             </el-form-item>
-            <el-form-item label="鍘嗗彶璐﹀彿鐘舵��" prop="beforeStatus">
+<!--            <el-form-item label="鍘嗗彶璐﹀彿鐘舵��" prop="beforeStatus">
                 <el-select v-model="searchForm.beforeStatus" placeholder="璇烽�夋嫨">
                     <el-option label="瑙e喕" :value="0"></el-option>
                     <el-option label="鍐荤粨" :value="1"></el-option>
@@ -34,7 +34,7 @@
                     <el-option label="鎵嬪姩绂诲満" :value="8"></el-option>
                     <el-option label="鍒犻櫎" :value="9"></el-option>
                 </el-select>
-            </el-form-item>
+            </el-form-item>-->
             <el-form-item label="鎿嶄綔绫诲瀷" prop="type">
                 <el-select v-model="searchForm.type" placeholder="璇烽�夋嫨">
                     <el-option label="瑙e喕" :value="0"></el-option>
@@ -77,7 +77,7 @@
                     </template>
                 </el-table-column>
                 <el-table-column prop="mobile" label="鎵嬫満鍙�"></el-table-column>
-                <el-table-column label="鍘嗗彶鐘舵��">
+<!--                <el-table-column label="鍘嗗彶鐘舵��">
                     <template slot-scope="{row}">
                         <span v-if="row.beforeStatus === 0">瑙e喕</span>
                         <span v-else-if="row.beforeStatus === 1">鍐荤粨</span>
@@ -91,21 +91,9 @@
                         <span v-else-if="row.beforeStatus === 9">鍒犻櫎</span>
                         <span v-else>姝e父</span>
                     </template>
-                </el-table-column>
-                <el-table-column label="鎿嶄綔">
-                    <template slot-scope="{row}">
-                        <span v-if="row.type === 0">瑙e喕</span>
-                        <span v-if="row.type === 1">鍐荤粨</span>
-                        <span v-if="row.type === 2">鎷夐粦</span>
-                        <span v-if="row.type === 3">鎭㈠</span>
-                        <span v-if="row.type === 4">璁句负鎷滆浜�</span>
-                        <span v-if="row.type === 5">鍙栨秷鎷滆浜�</span>
-                        <span v-if="row.type === 6">璁句负楂樼骇瀹℃壒浜�</span>
-                        <span v-if="row.type === 7">鍙栨秷楂樼骇瀹℃壒浜�</span>
-                        <span v-if="row.type === 8">鎵嬪姩绂诲満</span>
-                        <span v-if="row.type === 9">鍒犻櫎</span>
-                    </template>
-                </el-table-column>
+                </el-table-column>-->
+              <el-table-column  prop="typeName" label="鎿嶄綔绫诲瀷" />
+              <el-table-column  prop="remark" label="鎿嶄綔鍐呭" width="350"/>
                 <el-table-column prop="createDate" label="鎿嶄綔鏃堕棿"></el-table-column>
             </el-table>
             <pagination
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
index ba0ee22..0c1c29e 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -595,21 +595,24 @@
      * 鍛樺伐淇℃伅缁存姢鎿嶄綔鍘嗗彶绫诲瀷 0瑙e喕 1鍐荤粨 2鎷夐粦 3鎭㈠ 4璁句负鎷滆浜� 5鍙栨秷鎷滆浜� 6璁句负楂樼骇瀹℃壒浜� 7鍙栨秷楂樼骇瀹℃壒浜� 8鎵嬪姩绂诲満 9鍒犻櫎 10鏇存柊 11鎺堟潈闂ㄧ鏉冮檺 12绂昏亴 13鎭㈠鍦ㄨ亴
      */
     public  enum UserActionType {
-        CANCEL_FREEZE(0, "瑙e喕","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愯В鍐汇��" ),
-        FREEZE(1, "鍐荤粨","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愬喕缁撱��" ),
-        BLACKLIST(2, "鎷夐粦","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愭媺榛戙��"),
-        CANCEL_BLACKLIST(3, "鎭㈠","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愮Щ鍑洪粦鍚嶅崟銆�" ),
-        CANVISIT(4, "璁句负鎷滆浜�","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愯涓烘嫓璁夸汉銆�" ),
-        CANCEL_VISIT(5, "鍙栨秷鎷滆浜�","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愬彇娑堟嫓璁夸汉銆�" ),
+        CANCEL_FREEZE(0, "瑙e喕","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愯В鍐汇��" ),
+        FREEZE(1, "鍐荤粨","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愬喕缁撱��" ),
+        BLACKLIST(2, "鎷夐粦","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愭媺榛戙��"),
+        CANCEL_BLACKLIST(3, "鎭㈠","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愮Щ鍑洪粦鍚嶅崟銆�" ),
+        CANVISIT(4, "璁句负鎷滆浜�","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愯涓烘嫓璁夸汉銆�" ),
+        CANCEL_VISIT(5, "鍙栨秷鎷滆浜�","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愬彇娑堟嫓璁夸汉銆�" ),
         //缁繚閫氱煡
-        HIGHCHECKOR(6, "璁句负楂樼骇瀹℃壒浜�","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愯涓洪珮绾у鎵逛汉銆�" ),
-        CANCEL_HIGHCHECKOR(7, "鍙栨秷楂樼骇瀹℃壒浜�","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愬彇娑堥珮绾у鎵逛汉銆�" ),
-        LEVEL(8, "鎵嬪姩绂诲満","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愭墜鍔ㄧ鍦恒��" ),
-        DELETE(9, "鍒犻櫎","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愬垹闄ゃ��" ),
-        EDIT(10, "鏇存柊","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愭洿鏂般��" ),
-        AUTH_ROLE(11, "鎺堟潈闂ㄧ鏉冮檺","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愭巿鏉冮棬绂佹潈闄愩��" ),
-        WORK_OFF(12, "绂昏亴","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愮鑱屻�戞搷浣�" ),
-        WORK_ON(13, "鍦ㄨ亴","鐢便��${param1}銆戜簬銆愭搷浣滄椂闂达細${param2}銆戯紝杩涜銆愬湪鑱屻�戞搷浣�" ),
+        HIGHCHECKOR(6, "璁句负楂樼骇瀹℃壒浜�","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愯涓洪珮绾у鎵逛汉銆�" ),
+        CANCEL_HIGHCHECKOR(7, "鍙栨秷楂樼骇瀹℃壒浜�","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愬彇娑堥珮绾у鎵逛汉銆�" ),
+        LEVEL(8, "鎵嬪姩绂诲満","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愭墜鍔ㄧ鍦恒��" ),
+        DELETE(9, "鍒犻櫎","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愬垹闄ゃ��" ),
+        EDIT(10, "鏇存柊","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愭洿鏂般��" ),
+        AUTH_ROLE(11, "鎺堟潈闂ㄧ鏉冮檺","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愭巿鏉冮棬绂佹潈闄愩��" ),
+        WORK_OFF(12, "绂昏亴","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愮鑱屻�戞搷浣�" ),
+        WORK_ON(13, "鍦ㄨ亴","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愬湪鑱屻�戞搷浣�" ),
+        IMPORT_TRAIMETIME(14, "瀵煎叆鍩硅鏈夋晥","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愬鍏ュ煿璁湁鏁堛�戞搷浣�" ),
+        BE_HEAD(15, "璁句负涓荤","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愯涓轰富绠°�戞搷浣�" ),
+        NOT_HEAD(16, "鍙栨秷涓荤","鐢便��${param1}銆戜簬銆�${param2}銆戯紝杩涜銆愬彇娑堜富绠°�戞搷浣�" ),
         ;
 
         // 鎴愬憳鍙橀噺
@@ -623,6 +626,14 @@
             this.info = info;
             this.name = name;
         }
+        public static String getName(int index) {
+            for (UserActionType c : UserActionType.values()) {
+                if (c.getKey() == index) {
+                    return c.name;
+                }
+            }
+            return null;
+        }
 
         public int getKey() {
             return key;
diff --git a/server/system_service/src/main/java/com/doumee/dao/business/model/Company.java b/server/system_service/src/main/java/com/doumee/dao/business/model/Company.java
index ccf1673..abecdd5 100644
--- a/server/system_service/src/main/java/com/doumee/dao/business/model/Company.java
+++ b/server/system_service/src/main/java/com/doumee/dao/business/model/Company.java
@@ -190,6 +190,9 @@
     @ApiModelProperty(value = "鐖剁骇閮ㄩ棬绾у埆璺緞", example = "1")
     @TableField(exist = false)
     private String parentCompanyPath;
+    @ApiModelProperty(value = "鐖剁骇閮ㄩ棬绾у埆绫诲瀷 0鐩稿叧鏂� 1鍐呴儴缁勭粐", example = "1")
+    @TableField(exist = false)
+    private String parentType;
     @ApiModelProperty(value = "erp閮ㄩ棬绾у埆璺緞", example = "1")
     @ExcelColumn(name="erp閮ㄩ棬绾у埆璺緞")
     private String erpCompanyPath;
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
index 7da2af5..edf9b7b 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -83,7 +83,7 @@
     @GetMapping("/roleAuth/{id}")
     @RequiresPermissions("business:empower:create")
     public ApiResponse roleAuthById(@PathVariable Integer id) {
-        memberService.roleAuthById(id);
+        memberService.roleAuthById(id,this.getLoginUser(null));
         return ApiResponse.success(null);
     }
 
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceRoleCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceRoleCloudController.java
index e287f9d..c9c5446 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceRoleCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceRoleCloudController.java
@@ -93,6 +93,12 @@
     public ApiResponse<PageData<DeviceRole>> findPage (@RequestBody PageWrap<DeviceRole> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
         return ApiResponse.success(deviceRoleService.findPage(pageWrap));
     }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @CloudRequiredPermission("business:devicerole:query")
+    public ApiResponse<List<DeviceRole>> findList (@RequestBody DeviceRole  pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(deviceRoleService.findList(pageWrap));
+    }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java
index 6d923d2..2550487 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java
@@ -12,6 +12,7 @@
 import com.doumee.dao.admin.request.LaborMemberDTO;
 import com.doumee.dao.admin.request.MemberQuery;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.MemberRole;
 import com.doumee.service.business.MemberService;
 import com.doumee.service.business.ext.ERPSyncService;
 import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromHKServiceImpl;
@@ -88,8 +89,8 @@
     @ApiOperation("鍛樺伐鏉冮檺涓嬪彂")
     @GetMapping("/roleAuth/{id}")
     @CloudRequiredPermission("business:empower:create")
-    public ApiResponse roleAuthById(@PathVariable Integer id) {
-        memberService.roleAuthById(id);
+    public ApiResponse roleAuthById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        memberService.roleAuthById(id,this.getLoginUser(token));
         return ApiResponse.success(null);
     }
 
@@ -97,9 +98,17 @@
     @ApiOperation("鍚屾浜鸿劯淇℃伅")
     @PostMapping("/updateFace")
     public ApiResponse updateFace(@RequestBody Member member,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        member.setLoginUserInfo(this.getLoginUser(token));
         memberService.updateFace(member);
         return ApiResponse.success(null);
     }
+    @ApiOperation("鍚屾浜鸿劯淇℃伅")
+    @PostMapping("/batchRoleAuth")
+    public ApiResponse batchRoleAuth(@RequestBody Member memberRole, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        memberRole.setLoginUserInfo(this.getLoginUser(token));
+        memberService.batchRoleAuth(memberRole);
+        return ApiResponse.success(null);
+    }
     @ApiOperation("寮哄埗鍒犻櫎瀹夐槻骞冲彴浜哄憳淇℃伅")
     @PostMapping("/delHkForce")
     public ApiResponse delHkForce(@RequestBody Member member,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
index 01dafc1..d84b7de 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -63,6 +63,7 @@
         String visitOut= "/api/visitor/v1/visitor/out";//绛剧璁垮棰勭害
         String facePicture= "/api/resource/v1/person/picture";//鎻愬彇鐢ㄦ埛浜鸿劯鐓х墖
         String privilegeGroup= "/api/visitor/v1/privilege/group";//鏌ヨ璁垮鏉冮檺缁�
+        String privilegIccmeGroup= "/api/iccm/v1/privilege/groups";//鏌ヨ璁垮鏉冮檺缁�
         String eventSub= "/api/eventService/v1/eventSubscriptionByEventTypes";//浜嬩欢璁㈤槄
         String doorSearch= "/api/resource/v2/door/search";//鏌ヨ闂ㄧ鐐瑰垪琛╲2
         String cancelEventSub= "/api/eventService/v1/eventUnSubscriptionByEventTypes";//鍙栨秷浜嬩欢璁㈤槄
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
index 659794a..298e6b2 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -377,6 +377,9 @@
 	public static String privilegeGroup(String body) {
 		return startDoPostStringArtemis(HKConstants.InterfacePath.privilegeGroup,body);
 	}
+	public static String privilegIccmeGroup(String body) {
+		return startDoPostStringArtemis(HKConstants.InterfacePath.privilegIccmeGroup,body);
+	}
 	/**
 	 *	浜嬩欢璁㈤槄
 	 * @param body
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
index 8e4f32a..438bab3 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -480,6 +480,24 @@
         return  null;
     }
     /**
+     *璁垮鏉冮檺缁勫垪琛ㄦ煡璇紙鍒嗛〉锛�
+     * @return
+     */
+    public  static  BaseResponse<PrivilegeGroupListResponse>   privilegIccmeGroup(PrivilegeGroupRequest param){
+        log.info("銆愭捣搴疯瀹㈡潈闄愮粍鍒楄〃鏌ヨ銆�================寮�濮�===="+JSONObject.toJSONString(param));
+        try {
+            String res = HKTools.privilegIccmeGroup(JSONObject.toJSONString(param));
+            TypeReference typeReference =
+                    new TypeReference< BaseResponse<PrivilegeGroupListResponse> >(){};
+            BaseResponse<PrivilegeGroupListResponse>   result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,"娴峰悍璁垮鏉冮檺缁勫垪琛ㄦ煡璇�");
+            return  result;
+        }catch (Exception e){
+            log.error("銆愭捣搴疯瀹㈡潈闄愮粍鍒楄〃鏌ヨ銆�================澶辫触====锛歕n"+ e.getMessage());
+        }
+        return  null;
+    }
+    /**
      *娴峰悍闂ㄧ鐐规煡璇紙鍒嗛〉锛�
      * @return
      */
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
index 07a55a1..8288b21 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
@@ -66,6 +66,8 @@
     private String erpOrgId;
     @ApiModelProperty(value = "鏈烘瀯涓婚敭 ")
     private Integer companyId;
+    @ApiModelProperty(value = "缁勭粐绫诲瀷 0鐩稿叧鏂� 1鍐呴儴缁勭粐 ")
+    private Integer companyType;
 
     @ApiModelProperty(value = "鏄惁鍖呭惈涓嬬骇缁勭粐鐢ㄦ埛")
     private Boolean includeChild;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
index 23ff05f..e559e1c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -247,6 +247,12 @@
     @ApiModelProperty(value = "鎺堟潈闂ㄧ缁勭紪鐮侀泦鍚�,銆愯瀹㈢銆戝敮涓�鏍囪瘑",hidden = true )
     @TableField(exist = false)
     private Integer[] roleIds;
+    @ApiModelProperty(value = "浜哄憳缂栫爜闆嗗悎,銆愯瀹㈢銆戝敮涓�鏍囪瘑",hidden = true )
+    @TableField(exist = false)
+    private List<Integer> ids;
+    @ApiModelProperty(value = "鏈夋晥鏈熺被鍨� 0闀挎湡鏈夋晥 1鑷畾涔�",hidden = true )
+    @TableField(exist = false)
+    private  Integer  timeType;
 
     //鏆傛棤浣跨敤
     @ApiModelProperty(value = "濮撳悕/鎵嬫満鍙�/宸ュ彿")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java
index ebedc9e..1338577 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -19,7 +20,7 @@
 @Data
 @ApiModel("浜哄憳瑙掕壊鍏宠仈淇℃伅")
 @TableName("`member_role`")
-public class MemberRole {
+public class MemberRole extends LoginUserModel {
 
     @TableId(type = IdType.AUTO)
     @ApiModelProperty(value = "涓婚敭", example = "1")
@@ -59,6 +60,7 @@
     @ApiModelProperty(value = "瑙掕壊缂栫爜锛堝叧鑱攄oor_role),澶氫釜鑻辨枃閫楀彿闅斿紑")
     @ExcelColumn(name="瑙掕壊缂栫爜锛堝叧鑱攄oor_role)")
     private Integer roleId;
+
     @ApiModelProperty(value = "鍙娇鐢ㄩ棬绂佺紪鐮侀泦鍚堬紝澶氫釜鑻辨枃閫楀彿闅斿紑")
     @TableField(exist = false)
     private String doorIds;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java
index 4de783f..dce756b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java
@@ -82,6 +82,9 @@
     @ApiModelProperty(value = "璁垮鍏徃鍚嶇О", example = "1")
     @TableField(exist = false)
     private String visitCompanyName;
+    @ApiModelProperty(value = "绫诲瀷鍚嶇О", example = "1")
+    @TableField(exist = false)
+    private String typeName;
 
     @ApiModelProperty(value = "鎵嬫満鍙�", example = "1")
     @TableField(exist = false)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
index a897572..8193db2 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -8,6 +8,7 @@
 import com.doumee.dao.admin.request.MemberQuery;
 import com.doumee.dao.admin.response.StagingDataVO;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.MemberRole;
 import com.doumee.dao.web.reqeust.AccountLoginDTO;
 import com.doumee.dao.web.reqeust.CheckVisitedDTO;
 import com.doumee.dao.web.reqeust.VisitMemberDTO;
@@ -46,7 +47,7 @@
      */
     void deleteById(Integer id,LoginUserInfo user);
 
-    void roleAuthById(Integer id);
+    void roleAuthById(Integer id,LoginUserInfo user);
 
     /**
      * 鍒犻櫎
@@ -200,4 +201,6 @@
     void updateHead(Member member);
 
     void updateWorkStatus(Member member);
+
+    void batchRoleAuth(Member memberRole);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
index 73aa6e2..f62d26d 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -36,6 +36,7 @@
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -87,6 +88,7 @@
         company.setCompanyPath(company.getId()+"/");//鍚嶇О璺緞
         company.setCompanyNamePath(company.getName());//鍚嶇О璺緞
         company.setHkParentId(rootOrgId);
+        String idPath = "";
         if(company.getParentId() !=null){
             Company parent = findById(company.getParentId());
             if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){
@@ -95,11 +97,17 @@
             if(StringUtils.isBlank(parent.getHkId())){
                 throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐖剁骇缁勭粐淇℃伅灏氭湭鍚屾涓嬪彂鎴愬姛~");
             }
-            company.setHkParentId(parent.getHkId());
+            if(Constants.equalsInteger(parent.getType(),Constants.ZERO)){
+                //濡傛灉鐖剁骇鏄浉鍏虫柟缁勭粐锛屼笅绾т笉鑳藉缓绔嬪唴閮ㄧ粍缁�
+                if(Constants.equalsInteger(company.getType(),Constants.ONE)){
+                    throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐩稿叧鏂圭粍缁囷紝涓嬬骇涓嶈兘寤虹珛鍐呴儴缁勭粐~");
+                }
+            }
+            idPath = parent.getCompanyPath();
             company.setCompanyPath(parent.getCompanyPath()+company.getId()+"/");
             company.setCompanyNamePath(parent.getCompanyNamePath()+"/"+company.getName());
         }
-        company.setHkCompanyPath(company.getCompanyPath());
+        company.setHkCompanyPath(company.getCompanyNamePath());
         company.setCreateDate(new Date());
         company.setCreator(user.getId());
         company.setIsdeleted(Constants.ZERO);
@@ -115,6 +123,10 @@
         if(!addHkOrg(company)){
             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝缁勭粐鍚屾涓嬪彂澶辫触锛岃绋嶅悗閲嶈瘯");
         }
+        Company com = new Company();
+        com.setId(company.getId());
+        com.setCompanyPath(idPath+company.getId()+"/");
+        companyMapper.updateById(com);
         return company.getId();
     }
 
@@ -275,8 +287,14 @@
         if(model == null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝缁勭粐淇℃伅涓嶅瓨鍦▇");
         }
-        if(StringUtils.isBlank(model.getHkId())){
-            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝缁勭粐淇℃伅灏氭湭鍚屾涓嬪彂鎴愬姛,鏆備笉鏀寔淇敼锛岃灏濊瘯鍒犻櫎鍚庨噸鏂版坊鍔爚");
+         if( Constants.equalsObject(Constants.ONE,model.getType())&& Constants.equalsObject(Constants.ZERO,company.getType())){
+        //濡傛灉鐢卞唴閮ㄧ粍缁囧垏鎹㈡垚鍐呴儴缁勭粐锛屾帓鏌ヤ笅绾х粍缁囨槸鍚︽湁鍐呴儴缁勭粐
+             if(companyJoinMapper.selectCount(new QueryWrapper<Company>().lambda()
+                     .eq(Company::getIsdeleted,Constants.ZERO )
+                     .eq(Company::getType,Constants.ONE )
+                     .likeRight(Company::getCompanyPath,company.getCompanyPath())) >0){
+                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝涓嬬骇閮ㄩ棬瀛樺湪鍐呴儴缁勭粐锛岃閮ㄩ棬涓嶆敮鎸佸垏鎹负鐩稿叧鏂圭粍缁囷紒~");
+             }
         }
         company.setEditDate(new Date());
         company.setEditor(user.getId());
@@ -285,14 +303,19 @@
         company.setHkId(StringUtils.defaultString(model.getHkId(),UUID.randomUUID().toString().replace("-","")));
         company.setParentId(null);//涓嶆敮鎸佷慨鏀圭埗绾�
         companyMapper.updateById(company);
+        //鏇存柊鐨刢ompanyPath
+        String newName = model.getCompanyNamePath().replace(model.getName(),company.getName());
+        companyMapper.update(null,new UpdateWrapper<Company>().lambda()
+                        .setSql("company_name_path=REPLACE(company_name_path,'"+ model.getCompanyNamePath()+"','"+newName+"')")
+                        .setSql("hk_company_path=REPLACE(hk_company_path,'"+ model.getCompanyNamePath()+"','"+newName+"')")
+                .likeRight(Company::getCompanyPath,model.getCompanyPath()));
         //涓嬪彂娴峰悍瀹夐槻骞冲彴
-        if(StringUtils.isNotBlank(model.getHkId())
-                && Constants.equalsObject(Constants.ONE,model.getHkStatus())){
-             if(editHkOrg(company)){
+        if(StringUtils.isNotBlank(model.getHkId())){
+             if(!editHkOrg(company)){
                  throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝缁勭粐鍚屾涓嬪彂澶辫触锛岃绋嶅悗閲嶈瘯");
              }
         }else{//濡傛灉娌℃湁涓嬪彂杩囷紝鐩存帴鏂板缓瀹夐槻骞冲彴缁勭粐
-            if(addHkOrg(company)){
+            if(!addHkOrg(company)){
                 throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝缁勭粐鍚屾涓嬪彂澶辫触锛岃绋嶅悗閲嶈瘯");
             }
         }
@@ -547,6 +570,7 @@
         queryWrapper.selectAs(Member::getPhone,Company::getHeadPhone);
         queryWrapper.select("t1.name",Company::getParentName);
         queryWrapper.select("t1.company_path",Company::getParentCompanyPath);
+        queryWrapper.select("t1.type",Company::getParentType);
         queryWrapper.leftJoin(Company.class,Company::getId,Company::getParentId);
         queryWrapper.leftJoin(Member.class,Member::getId,Company::getHeadId);
         queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Company::getEditor);
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java
index 980aa3e..2aac2f6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java
@@ -371,6 +371,7 @@
 
     @Override
     public List<DeviceRole> findList(DeviceRole deviceRole) {
+        deviceRole.setIsdeleted(Constants.ZERO);
         QueryWrapper<DeviceRole> wrapper = new QueryWrapper<>(deviceRole);
         return deviceRoleMapper.selectList(wrapper);
     }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index cba4c22..d6d06ff 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -128,18 +128,21 @@
         //鑴辨晱鎿嶄綔
         Member insert = initAddMemberModel(member,loginUserInfo);
         //娴峰悍浜哄憳鏂板涓氬姟
-        if(dealHkUserBiz(insert)){
-            try {
+        try {
+             if(dealHkUserBiz(insert)){
                 memberMapper.insert(insert);
                 //鍒涘缓绯荤粺鐧婚檰璐﹀彿锛堥粯璁ゆ棤浠讳綍瑙掕壊锛�
-                createSystemUser(insert);
-            }catch (Exception e){
-                //濡傛灉鍙戠敓寮傚父锛屽垹闄ゅ凡缁忓垱寤虹殑浜哄憳淇℃伅
-                deleteHkUserBiz(insert.getHkId());
-                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍛樺伐淇℃伅鏂板缓澶辫触锛岃绋嶅悗閲嶈瘯锛�");
+                if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
+                    //濡傛灉鏄唴閮ㄧ粍缁囦汉鍛橈紝鏂板绯荤粺鐧婚檰璐﹀彿
+                    createSystemUser(insert);
+                }
+            }else{
+                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍛樺伐淇℃伅鍚屾瀹夐槻骞冲彴澶辫触锛岃绋嶅悗閲嶈瘯锛�");
             }
-        }else{
-            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍛樺伐淇℃伅鍚屾瀹夐槻骞冲彴澶辫触锛岃绋嶅悗閲嶈瘯锛�");
+        }catch (Exception e){
+            //濡傛灉鍙戠敓寮傚父锛屽垹闄ゅ凡缁忓垱寤虹殑浜哄憳淇℃伅
+            deleteHkUserBiz(insert.getHkId());
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鍛樺伐淇℃伅鏂板缓澶辫触锛岃绋嶅悗閲嶈瘯锛�");
         }
         return insert;
     }
@@ -150,7 +153,6 @@
         // 鐢熸垚瀵嗙爜
         user.setPassword(Utils.Secure.encryptPassword(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.INITIAL_PASSWORD).getCode(), salt));
         user.setSalt(salt);
-
         // 鍒涘缓鐢ㄦ埛璁板綍
         user.setType(insert.getType());
         user.setUsername(insert.getPhone());
@@ -175,6 +177,7 @@
         insert.setCreateDate(new Date());
         insert.setEditor(loginUserInfo.getId());
         insert.setEditDate(new Date());
+        insert.setHkOrgId(member.getHkOrgId());
         insert.setIsdeleted(Constants.ZERO);
         insert.setCompanyId(member.getCompanyId());
         insert.setFaceImg(member.getFaceImg());
@@ -201,6 +204,9 @@
      * @param hkId
      */
     private void deleteHkUserBiz(String hkId) {
+        if(StringUtils.isBlank(hkId)){
+            return;
+        }
         UserDelRequest request = new UserDelRequest();
         request.setPersonIds(new String[]{hkId});
         BaseResponse<List<UserDelResponse>> result =  HKService.delBatchUser(request);
@@ -214,14 +220,6 @@
     private boolean dealHkUserBiz(Member insert) {
         String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                 +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
-        Company company = companyMapper.selectById(insert.getCompanyId());
-        if(company == null || Constants.equalsInteger(company.getIsdeleted(),Constants.ONE)){
-            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭凡琚垹闄わ紝璇峰埛鏂伴〉闈㈤噸璇曪紒");
-        }
-        if(StringUtils.isBlank(company.getHkId())){
-            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭湭鍚屾瀹夐槻骞冲彴锛岃鍏堝墠寰�銆愮粍缁囩鐞嗐�戣彍鍗曡繘琛岀淮鎶わ紒");
-        }
-        insert.setHkOrgId(company.getHkId());
         UserAddRequest hkAddRequest = HkSyncOrgUserToHKServiceImpl.getUserAddModel(insert,path,Constants.ZERO);
         if(hkAddRequest == null){
             throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝浜鸿劯鐓х墖鏈夎锛岃灏濊瘯閲嶆柊涓婁紶锛�");
@@ -305,6 +303,9 @@
     }
 
     private void isMemberParamValid(Member member) {
+        if(member.getCompanyId() == null){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
         if (StringUtils.isBlank(member.getPhone())||!PhoneUtil.isPhone(member.getPhone())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢佃瘽鍙风爜鏍煎紡鏈夎");
         }
@@ -317,22 +318,32 @@
             }
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"韬唤璇佸彿鏍煎紡鏈夎");
         }
-
-        SystemUser queryUserDto = new SystemUser();
-        queryUserDto.setUsername(member.getPhone());
-        queryUserDto.setDeleted(Boolean.FALSE);
-        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<>(queryUserDto).last("limit 1"));
-        if (user != null) {
-            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鎵嬫満鍙枫��"+queryUserDto.getUsername()+"銆戝凡琚娇鐢紝涓嶈兘閲嶅");
+        Company company = companyMapper.selectById(member.getCompanyId());
+        if(company == null || Constants.equalsInteger(company.getIsdeleted(),Constants.ONE)){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭凡琚垹闄わ紝璇峰埛鏂伴〉闈㈤噸璇曪紒");
         }
-        // 楠岃瘉宸ュ彿
-        if (StringUtils.isNotBlank(member.getCode())) {
-            queryUserDto = new SystemUser();
+        if(StringUtils.isBlank(company.getHkId())){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝璇ョ粍缁囦俊鎭湭鍚屾瀹夐槻骞冲彴锛岃鍏堝墠寰�銆愮粍缁囩鐞嗐�戣彍鍗曡繘琛岀淮鎶わ紒");
+        }
+        member.setHkOrgId(company.getHkId());
+        member.setCompanyType(company.getType());
+        if(Constants.equalsInteger(company.getType(),Constants.ONE)){
+            SystemUser queryUserDto = new SystemUser();
+            queryUserDto.setUsername(member.getPhone());
             queryUserDto.setDeleted(Boolean.FALSE);
-            queryUserDto.setEmpNo(member.getCode());
-            user = systemUserMapper.selectOne(new QueryWrapper<>(queryUserDto).last("limit 1"));
+            SystemUser user = systemUserMapper.selectOne(new QueryWrapper<>(queryUserDto).last("limit 1"));
             if (user != null) {
-                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "宸ュ彿銆�"+member.getCode()+"銆戝凡瀛樺湪");
+                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鎵嬫満鍙枫��"+queryUserDto.getUsername()+"銆戝凡琚娇鐢紝涓嶈兘閲嶅");
+            }
+            // 楠岃瘉宸ュ彿
+            if (StringUtils.isNotBlank(member.getCode())) {
+                queryUserDto = new SystemUser();
+                queryUserDto.setDeleted(Boolean.FALSE);
+                queryUserDto.setEmpNo(member.getCode());
+                user = systemUserMapper.selectOne(new QueryWrapper<>(queryUserDto).last("limit 1"));
+                if (user != null) {
+                    throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "宸ュ彿銆�"+member.getCode()+"銆戝凡瀛樺湪");
+                }
             }
         }
     }
@@ -487,7 +498,7 @@
 
 
     @Override
-    public void roleAuthById(Integer id) {
+    public void roleAuthById(Integer id,LoginUserInfo user) {
         Member member = memberMapper.selectById(id);
         if(member==null || member.getIsdeleted().equals(Constants.ONE)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鍛樺伐淇℃伅宸插垹闄�");
@@ -495,6 +506,157 @@
 //        List<MemberCard> cards = HkSyncOrgUserToHKServiceImpl.getNormalCardList(member,memberCardMapper);
         HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,member,deviceRoleMapper,empowerMapper,deviceMapper);
     }
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void batchRoleAuth(Member memberRole) {
+        if(memberRole.getIds() ==null
+                || memberRole.getIds().size() ==0 ){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(memberRole.getRoleIds() ==null || memberRole.getRoleIds().length ==0){
+            //濡傛灉鏄竻绌烘潈闄�
+        }else{
+            if( ! (Constants.equalsObject(memberRole.getTimeType(),Constants.ZERO)
+                    || (Constants.equalsObject(memberRole.getTimeType(),Constants.ONE)
+                    && memberRole.getStartTime() !=null && memberRole.getEndTime() != null ))){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+            if(Constants.equalsObject(memberRole.getTimeType(),Constants.ONE) && memberRole.getEndTime().getTime() < System.currentTimeMillis()){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏈夋晥鏈熸埅姝㈡棩鏈熶笉鑳藉皬浜庡綋鍓嶆椂闂达紒");
+            }
+            if(Constants.equalsObject(memberRole.getTimeType(),Constants.ONE) && memberRole.getEndTime().getTime() <= memberRole.getStartTime().getTime()){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏈夋晥鏈熸埅姝㈡棩鏈熶笉鑳藉皬浜庡紑濮嬫椂闂达紒");
+            }
+        }
+        if(Constants.equalsObject(memberRole.getTimeType(),Constants.ZERO) ){
+           memberRole.setStartTime(null);
+           memberRole.setEndTime(null);
+        }
+        for (Integer id : memberRole.getIds()){
+            Member member = memberMapper.selectById(id);
+            if(member==null || member.getIsdeleted().equals(Constants.ONE)){
+                //濡傛灉鍛樺伐淇℃伅涓嶅悎娉曠洿鎺ヨ烦杩�
+               continue;
+            }
+            member.setStartTime(memberRole.getStartTime());
+            member.setEndTime(memberRole.getEndTime());
+            Integer ischange = getRoleIdByParam(memberRole.getRoleIds(),member,memberRoleMapper,deviceRoleMapper);
+            if(ischange == 0){
+                return;//鏈彂鐜版潈闄愬彉鍖栵紝鐩存帴杩斿洖
+            }
+            if(memberRole.getRoleIds()!=null && memberRole.getRoleIds().length>0 && StringUtils.isBlank(member.getRoleId())){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鏈夋晥闂ㄧ缁勬暟鎹�");
+            }
+            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
+                    .eq(Member::getId,member.getId())
+                    .set(Member::getRoleId,member.getRoleId())
+                    .set(Member::getAuthStatus,Constants.ONE)
+                    .set(Member::getStartTime,memberRole.getStartTime())
+                    .set(Member::getEndTime,memberRole.getEndTime())
+                    .set(Member::getEditor,memberRole.getLoginUserInfo().getId())
+                    .set(Member::getEditDate,new Date()) );
+            saveUserActionBiz(member,memberRole.getLoginUserInfo(), Constants.UserActionType.AUTH_ROLE,userActionJoinMapper);
+            //閲嶆柊鎺堟潈
+            HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,member,deviceRoleMapper,empowerMapper,deviceMapper);
+         }
+    }
+
+    public static   Integer   getRoleIdByParam(Integer[] param, Member member,MemberRoleMapper memberRoleMapper,DeviceRoleMapper deviceRoleMapper) {
+        //娣诲姞浜哄憳瑙掕壊鍏宠仈鏁版嵁
+        member.setRoleId(null);
+        List<MemberRole> roleList = memberRoleMapper.selectList( new QueryWrapper<MemberRole>().lambda()
+                .eq(MemberRole::getIsdeleted,Constants.ZERO)
+                .eq(MemberRole::getMemberId,member.getId()));
+
+        member.setRoleId("");
+        if((param == null || param.length==0 ) &&( roleList==null || roleList.size()==0)){
+            //妫�鏌ョ敤鎴锋儏鍐垫潈闄愬師鏈氨鏄┖鐨勶紝 鍒欐棤闇�澶勭悊
+            return  0;
+        }
+         if((param == null || param.length==0 ) &&( roleList!=null && roleList.size()>0) ){
+            //濡傛灉娓呯┖鍘熸潵鏈夋潈闄愶紝鎺ュ彛杩涜鏉冮檺鍒犻櫎鍘熸湁鏉冮檺鍗冲彲
+            memberRoleMapper.delete(new QueryWrapper<MemberRole>().lambda().eq(MemberRole::getMemberId,member.getId()));
+            return 1;
+        }
+        if(!Objects.isNull(param)&&param.length>Constants.ZERO){
+          /*     if(roleList!=null && roleList.size()>0) {
+                //鍜屽師鏈夋潈闄愯繘琛屽姣旓紝鐪嬫槸鍚︽潈闄愬彂鐢熷彉鍖�
+                boolean ischange1=false;
+                for (MemberRole role : roleList) {
+                    ischange1=false;
+                    for (int j = 0; j < param.length; j++) {
+                        if(Constants.equalsInteger(role.getRoleId(),param[j])){
+                            ischange1=true;
+                            break;
+                        }
+                    }
+                    if(!ischange1){
+                        break;
+                    }
+                }
+
+                boolean ischange2 =false;
+                for (int j = 0; j < param.length; j++) {
+                    ischange2=false;
+                    for (MemberRole role : roleList) {
+                        if(Constants.equalsInteger(role.getRoleId(),param[j])){
+                            ischange2=true;
+                            break;
+                        }
+                    }
+                    if(!ischange2){
+                        break;
+                    }
+                }
+                if(ischange2 && ischange1){
+                    return 0;//鏉冮檺鏈彂鐢熸敼鍙�
+                }
+            }*/
+            //濡傛灉鍘熸潵鏈夋潈闄愶紝鎺ュ彛杩涜鏉冮檺鍒犻櫎
+            memberRoleMapper.delete(new QueryWrapper<MemberRole>().lambda().eq(MemberRole::getMemberId,member.getId()));
+            //鏌ヨ鏁版嵁搴撳瓨鍦ㄧ殑鏉冮檺
+            List<DeviceRole> deviceRoleList= deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
+                    .eq(DeviceRole::getType,Constants.TWO)
+                    .in(DeviceRole::getId,param));
+
+            String ids = "";
+            if(CollectionUtils.isNotEmpty(deviceRoleList)){
+                List<MemberRole> memberRoleList = new ArrayList<>();
+                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){
+                            //鑴忔暟鎹笉澶勭悊
+                        }
+                    }
+                    MemberRole memberRole = new MemberRole();
+                    memberRole.setCreateDate(new Date());
+                    memberRole.setMemberId(member.getId());
+                    memberRole.setIsdeleted(Constants.ZERO);
+                    memberRole.setRoleId(deviceRole.getId());
+                    memberRoleList.add(memberRole);
+                }
+                memberRoleMapper.insertBatchSomeColumn(memberRoleList);
+            }
+            member.setRoleId(ids);
+            return  1;
+        }
+
+        return  0;
+    }
+
     @Override
     public     void empowerByList(Member member) {
         if(member.getIdList()!=null && member.getIdList().size() >0){
@@ -655,6 +817,7 @@
         userAction.setIsdeleted(Constants.ZERO);
         userAction.setCreateDate(updateMember.getEditDate());
         userAction.setCreator(updateMember.getEditor());
+        userAction.setBeforeStatus(updateMember.getStatus());
         userAction.setType(type.getKey());
         String info = type.getInfo();
         userAction.setRemark(info.replace("${param1}",user!=null?user.getRealname():"").replace("${param2}", com.doumee.core.utils.DateUtil.getPlusTime2(updateMember.getEditDate())));
@@ -714,12 +877,15 @@
                companyMapper.update(null,new UpdateWrapper<Company>().lambda()
                        .eq(Company::getId,model.getCompanyId())
                        .set(Company::getHeadId,member.getId()));
+               //璁板綍鎿嶄綔鏃ュ織
+               saveUserActionBiz(member,member.getLoginUserInfo(), Constants.UserActionType.BE_HEAD,userActionJoinMapper);
            }else{
                //濡傛灉鏄涓轰富绠�
                companyMapper.update(null,new UpdateWrapper<Company>().lambda()
                        .eq(Company::getId,model.getCompanyId())
                        .set(Company::getHeadId,null)
                );
+               saveUserActionBiz(member,member.getLoginUserInfo(),Constants.UserActionType.NOT_HEAD,userActionJoinMapper);
            }
        }
     }
@@ -1050,6 +1216,7 @@
                 .eq(Objects.nonNull(pageWrap.getModel().getHkStatus()),Member::getHkStatus,pageWrap.getModel().getHkStatus())
                 .eq(Objects.isNull(pageWrap.getModel().getIsdeleted()),Member::getIsdeleted,Constants.ZERO)
                 .eq(Objects.nonNull(pageWrap.getModel().getIsdeleted()),Member::getIsdeleted,pageWrap.getModel().getIsdeleted())
+                .eq(Objects.nonNull(pageWrap.getModel().getCompanyType()),Company::getType,pageWrap.getModel().getCompanyType())
                 .like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName())
 //                .eq(Member::getStatus,Constants.Status.ENABLE.getValue())
 //                .eq(Member::getType,Constants.memberType.internal)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java
index bace142..0f6b7f3 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.UserActionMapper;
 import com.doumee.dao.business.join.UserActionJoinMapper;
@@ -15,6 +16,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.catalina.User;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -123,6 +125,11 @@
                 .orderByDesc(UserAction::getCreateDate)
         ;
         IPage<UserAction> result =  userActionJoinMapper.selectJoinPage(page,UserAction.class,queryWrapper);
+        if(result!=null &&result.getRecords()!=null){
+            for(UserAction model :result.getRecords()){
+                model.setTypeName(Constants.UserActionType.getName(model.getType()));
+            }
+        }
         return PageData.from(result);
     }
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
index dbef628..7db9c0d 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -37,6 +37,7 @@
 import com.doumee.dao.business.model.*;
 import com.doumee.service.business.ext.ERPSyncService;
 import com.doumee.service.business.InterfaceLogService;
+import com.doumee.service.business.impl.MemberServiceImpl;
 import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import lombok.Synchronized;
@@ -930,98 +931,6 @@
             }
         }
     }
-    private    Integer   getRoleIdByParam(Integer[] param, Member member) {
-        //娣诲姞浜哄憳瑙掕壊鍏宠仈鏁版嵁
-        member.setRoleId(null);
-        List<MemberRole> roleList = memberRoleMapper.selectList( new QueryWrapper<MemberRole>().lambda()
-               .eq(MemberRole::getIsdeleted,Constants.ZERO)
-               .eq(MemberRole::getMemberId,member.getId()));
-       if((param == null || param.length==0 ) &&( roleList==null || roleList.size()==0)){
-           //妫�鏌ョ敤鎴锋潈闄愭槸鍚﹀彂鐜板彉鍖�
-            return  0;
-       }
-        if((param == null || param.length==0 ) &&( roleList!=null && roleList.size()>0) ){
-            //濡傛灉鍘熸潵鏈夋潈闄愶紝鎺ュ彛杩涜鏉冮檺鍒犻櫎
-            memberRoleMapper.delete(new QueryWrapper<MemberRole>().lambda().eq(MemberRole::getMemberId,member.getId()));
-            return 1;
-        }
-        if(!Objects.isNull(param)&&param.length>Constants.ZERO){
-            if(roleList!=null && roleList.size()>0) {
-                //鍜屽師鏈夋潈闄愯繘琛屽姣旓紝鐪嬫槸鍚︽潈闄愬彂鐢熷彉鍖�
-                boolean ischange1=false;
-                for (MemberRole role : roleList) {
-                    ischange1=false;
-                    for (int j = 0; j < param.length; j++) {
-                        if(Constants.equalsInteger(role.getRoleId(),param[j])){
-                            ischange1=true;
-                           break;
-                        }
-                    }
-                    if(!ischange1){
-                        break;
-                    }
-                }
-
-                boolean ischange2 =false;
-                for (int j = 0; j < param.length; j++) {
-                    ischange2=false;
-                    for (MemberRole role : roleList) {
-                        if(Constants.equalsInteger(role.getRoleId(),param[j])){
-                            ischange2=true;
-                            break;
-                        }
-                    }
-                    if(!ischange2){
-                        break;
-                    }
-                }
-                if(ischange2 && ischange1){
-                    return 0;//鏉冮檺鏈彂鐢熸敼鍙�
-                }
-            }
-            //濡傛灉鍘熸潵鏈夋潈闄愶紝鎺ュ彛杩涜鏉冮檺鍒犻櫎
-            memberRoleMapper.delete(new QueryWrapper<MemberRole>().lambda().eq(MemberRole::getMemberId,member.getId()));
-            //鏌ヨ鏁版嵁搴撳瓨鍦ㄧ殑鏉冮檺
-            List<DeviceRole> deviceRoleList= deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
-                    .eq(DeviceRole::getType,Constants.TWO)
-                    .in(DeviceRole::getId,param));
-            if(CollectionUtils.isNotEmpty(deviceRoleList)){
-                List<MemberRole> memberRoleList = new ArrayList<>();
-                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){
-                            //鑴忔暟鎹笉澶勭悊
-                        }
-                    }
-                    MemberRole memberRole = new MemberRole();
-                    memberRole.setCreateDate(new Date());
-                    memberRole.setMemberId(member.getId());
-                    memberRole.setIsdeleted(Constants.ZERO);
-                    memberRole.setRoleId(deviceRole.getId());
-                    memberRoleList.add(memberRole);
-                }
-                member.setRoleId(ids);
-                memberRoleMapper.insertBatchSomeColumn(memberRoleList);
-                member.setRoleId(ids);
-            }
-            return  1;
-        }
-        return  0;
-    }
 
 
     @Override
@@ -1040,7 +949,7 @@
             if(Objects.isNull(member)){
                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝鐢ㄦ埛淇℃伅涓嶅瓨鍦紒");
             }
-            Integer ischange = getRoleIdByParam(param.getRoleIds(),member);
+            Integer ischange = MemberServiceImpl.getRoleIdByParam(param.getRoleIds(),member,memberRoleMapper,deviceRoleMapper);
             if(ischange == 0){
                 return;//鏈彂鐜版潈闄愬彉鍖栵紝鐩存帴杩斿洖
             }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java
index 60d05d1..6e23fda 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java
@@ -67,6 +67,10 @@
                 param.setPageSize(100);
                 BaseResponse<PrivilegeGroupListResponse> response = HKService.privilegeGroup(param);
                 if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+                    response = HKService.privilegIccmeGroup(param);//鎺ュ彛V1鐗堟湰涓嶅瓨鍦紝璋冪敤iccm鐗堟湰鎺ュ彛
+                }
+                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
+                    response = HKService.privilegIccmeGroup(param);
                     throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝娴峰悍鍚屾鏁版嵁澶辫触~");
                 }
                 PrivilegeGroupListResponse r = response.getData();

--
Gitblit v1.9.3