jiangping
2024-05-14 08fed15a5cf6f3972443311645dd8ee4ebb0ad69
最新版本
已添加2个文件
已修改24个文件
1204 ■■■■ 文件已修改
admin/src/api/business/device.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/member.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaInternalCompanyWindow.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaMemberRoleWindow.vue 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalCompany.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/relativeMember.vue 395 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/business/model/Company.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceRoleCloudController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/MemberRole.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/UserAction.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 231 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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) {
admin/src/api/business/member.js
@@ -45,6 +45,9 @@
export function updateCanVisit (data) {
  return request.post('/visitsAdmin/cloudService/business/member/updateCanVisitById', data)
}
export function batchRoleAuth (data) {
  return request.post('/visitsAdmin/cloudService/business/member/batchRoleAuth', data)
}
// æ‰¹é‡æ‹‰é»‘
export function batchBlock (ids) {
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
        }
      })
    },
    // ç¡®è®¤æ–°å»º/修改
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">正在为<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>
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>
admin/src/views/business/internalMember.vue
@@ -47,13 +47,13 @@
        </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,1)"  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 +109,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 +128,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 +182,7 @@
            <!--    æŸ¥çœ‹äººå‘˜å¼€å¡è®°å½•    -->
            <cardOpeningRecord ref="cardOpeningRecord" @success="handlePageChange" />
            <OperaMemberWindow ref="OperaMemberWindow" @success="handlePageChange" />
            <OperaMemberRoleWindow ref="OperaMemberRoleWindow" @success="handlePageChange" />
        </template>
    </TableLayout1>
</template>
@@ -187,12 +194,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 +213,7 @@
        canVisit: '',
        keyword: '',
        type: 2,
        companyType:1,
        erpOrgId: '',
        companyId: '',
        hasFace: ''
@@ -228,6 +237,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 +263,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 +292,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 +323,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 +354,7 @@
        })
        .catch(() => {})
    },
     changeCanvisit (e, row) {
    changeCanvisit (e, row) {
      this.canvisiting = true
      updateCanVisit({ id: row.id, canVisit: e })
        .then(res => {
@@ -342,6 +370,8 @@
        .catch(() => {})
    },
    callback (row) {
      alert(row.name)
      console.log(row)
      this.searchForm.erpOrgId = row.erpId
      this.searchForm.companyId = row.id
      this.search()
admin/src/views/business/relativeMember.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,395 @@
<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="正常" 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']">
<!--
                <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,0)"  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"
                :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">正常</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" />
            <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 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 },
  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>
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -595,21 +595,24 @@
     * å‘˜å·¥ä¿¡æ¯ç»´æŠ¤æ“ä½œåŽ†å²ç±»åž‹ 0解冻 1冻结 2拉黑 3恢复 4设为拜访人 5取消拜访人 6设为高级审批人 7取消高级审批人 8手动离场 9删除 10更新 11授权门禁权限 12离职 13恢复在职
     */
    public  enum UserActionType {
        CANCEL_FREEZE(0, "解冻","由【${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, "解冻","由【${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;
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;
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);
    }
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")
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){
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";//查询门禁点列表v2
        String cancelEventSub= "/api/eventService/v1/eventUnSubscriptionByEventTypes";//取消事件订阅
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
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
     */
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;
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 = "姓名/手机号/工号")
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 = "角色编码(关联door_role),多个英文逗号隔开")
    @ExcelColumn(name="角色编码(关联door_role)")
    private Integer roleId;
    @ApiModelProperty(value = "可使用门禁编码集合,多个英文逗号隔开")
    @TableField(exist = false)
    private String doorIds;
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)
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);
}
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);
        //更新的companyPath
        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);
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);
    }
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)
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);
    }
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;//未发现权限变化,直接返回
            }
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();