doum
2025-12-30 46e8af542c02d801bea9fa8cf8f55974dcfa8554
更改头部
已添加43个文件
已修改43个文件
4597 ■■■■ 文件已修改
admin/src/api/business/company.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDeviceDataListWindow.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaDeviceDuanluqiWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaInternalCompanyWindow.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceDuanluqi.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalCompany.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/base_serivce/pom.xml 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/base_serivce/src/main/java/com/doumee/Main.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/pom.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/Main.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/CorpCoopApiClient.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/DeptApiClient.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/MemberApiClient.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/RoleApiClient.java 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/RoleGroupApiClient.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/jdy/AppApiClient.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/jdy/FileApiClient.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/jdy/FormApiClient.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/jdy/FormDataApiClient.java 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/constants/HttpConstant.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/base/PageBaseParam.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/dept/DeptCreateParam.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/dept/DeptEntityModel.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/file/UploadTokenParam.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataBatchCreateParam.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataBatchRemoveParam.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataBatchUpdateParam.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataCreateParam.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataDeleteParam.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataQueryParam.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataUpdateParam.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormQueryParam.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/http/ApiClient.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/http/HttpRequestParam.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/BasePushRequest.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/DepartmentPushData.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/FilePushData.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/MemberPushData.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/MemberStatusSubmitData.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/UserPushData.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/role/RoleGroupListQueryParam.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/role/RoleListQueryParam.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/role/RoleMemberQueryParam.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/role/RoleUpdateParam.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/user/UserCreateParam.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/user/UserEntityModel.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/user/UserUpdateParam.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/util/LimitUtil.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/pom.xml 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/config/DataSyncConfig.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/constants/ResponseStatus.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/business/model/Member.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/business/third/model/ApiResponse.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/application-self.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/application-test.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/pom.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/DingTalkTokenTimerController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/HkUsersTimerController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JiandaoyunCloudController.java 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/config/swagger/SwaggerConfig.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CompanyService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 313 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 734 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromSelfServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-devYL.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-pro.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-proHS.yml.bck 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-self.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-test.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-testHS.yml.bck 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/resources/application-testYL.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/company.js
@@ -34,6 +34,9 @@
}
// éƒ¨é—¨ä¿¡æ¯åŒæ­¥
export function getSysConfig (data) {
  return request.get('/visitsAdmin/cloudService/business/company/getSysConfig')
}
export function companySync (data) {
  return request.post('/visitsAdmin/cloudService/business/company/syncAll', data)
}
admin/src/components/business/OperaDeviceDataListWindow.vue
@@ -1,7 +1,7 @@
<template>
  <GlobalWindow
      :title="title"
      width="85%"
      width="100%"
      :visible.sync="visible"
  >
    <TableLayout >
@@ -19,20 +19,30 @@
          <div style="display: flex;margin-top: 20px;">
            <div style="flex: 1"><span  class="label">MQTT IP:</span>{{model.doorNameObj.mqttIp ||''}}</div>
            <div style="flex: 1"><span  class="label">MQTT端口:</span>{{model.doorNameObj.mqttPort||''}}</div>
            <div style="flex: 3"> <span class="label">最近控制操作:</span>{{model.remark||''}}</div>
            <div style="flex: 3">
              <span class="label">最近控制操作:</span>
              <span class="orange" >{{model.remark||''}}</span>
            </div>
          </div>
        </div>
        <el-form-item label="开关序号" prop="val1">
        <div class="platgroup_tabs">
          <div class="tab" :class="{ active: activeGroup === item.id }" @click="groupClick(item)"
               v-for="(item, i) in groupList" :key="i">
            {{ item.name }}
          </div>
        </div>
        <el-form-item label="开关序号" v-if="activeGroup==0" prop="val1">
          <el-input v-model="searchForm.val1" placeholder="请输入开关序号" @keypress.enter.native="search"></el-input>
        </el-form-item>
        <section>
        <section v-if="activeGroup==0">
          <el-button type="primary" @click="search">搜索</el-button>
          <el-button @click="reset">重置</el-button>
        </section>
      </el-form>
      <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
      <template v-slot:table-wrap>
      <template  v-slot:table-wrap>
        <el-table
            v-if="activeGroup===0"
            :height="tableHeightNew"
            v-loading="isWorking.search"
            :data="tableData.list"
@@ -50,6 +60,24 @@
          <el-table-column prop="val3" label="电圧(V)" min-width="120px"></el-table-column>
          <el-table-column prop="val4" label="温度(℃)" min-width="180px" ></el-table-column>
          <el-table-column prop="val5" label="有功功率值(kW)" min-width="120px"></el-table-column>
        </el-table>
        <el-table
            v-if="activeGroup===1"
            :height="tableHeightNew"
            v-loading="isWorking.search"
            :data="tableData.list"
            stripe>
          <el-table-column prop="createDate" label="操作时间" min-width="150px"></el-table-column>
          <el-table-column prop="val4" label="操作人" min-width="100px" ></el-table-column>
          <el-table-column prop="val3" label="操作内容" min-width="100px">
            <template slot-scope="{row}">
                <span v-if=" row.val3 === '【合闸】'" class="green">{{row.val3||''}}</span>
                <span  v-else-if=" row.val3 === '【分闸】'" class="red">{{row.val3||''}}</span>
                <span v-else>{{row.val3||''}}</span>
            </template>
          </el-table-column>
          <el-table-column prop="val5" label="开关序号" min-width="120px"></el-table-column>
          <el-table-column prop="val2" label="内容" min-width="300px" show-overflow-tooltip></el-table-column>
        </el-table>
        <pagination
            @size-change="handleSizeChange"
@@ -79,10 +107,13 @@
      // è¡¨å•数据
      visible: false,
      title: '',
      activeGroup:0,
      model:{},
      groupList: [{ id: 0, name: '数据上报记录', type: 0 }, { id: 1, name: '远程控制记录', type: 1 }],
      searchForm: {
        deviceId:  null,
        val1:''
        val1: '',
        dataType:0
      }
    }
  },
@@ -96,6 +127,12 @@
    this.search()
  },
  methods: {
    groupClick (item) {
      this.activeGroup = item.id
      this.searchForm.val1 = ''
      this.searchForm.dataType = item.type
      this.search()
    },
    open (title, row) {
      this.title = title +' ã€'+ (row.name)+'】'
      this.searchForm.deviceId = row.id
@@ -118,12 +155,33 @@
          total: 0
        }
      }
      this.search()
      this.groupClick(this.groupList[0])
    }
  }
}
</script>
<style>
.platgroup_tabs {
  flex: 1;
  display: flex;
  border-bottom: 1px solid #dfe2e8;
  margin-bottom:30px;
  .tab {
    color: #666666;
    margin-right: 40px;
    cursor: pointer;
    padding-bottom: 18px;
    border-bottom: 2px solid #fff;
  }
  .active {
    font-weight: 500;
    font-size: 15px;
    color: #2080f7;
    border-bottom: 2px solid $primary-color;
  }
}
.label{
/*  width: 80px;
  text-align: right;*/
admin/src/components/business/OperaDeviceDuanluqiWindow.vue
@@ -34,7 +34,7 @@
            1.全部开关序号:参考设备实际配置,多个用英文逗号隔开,如 1,2,3;<br>
            2.控制开关序号:系统根据配置规则,判断开关当前空闲中进行【自动分闸】,多个用英文逗号隔开,如 1,2;<br>
            3.自动分闸规则:针对控制开关序号的配置,定时检测【空闲时长】内满足开关电流值都在【空闲电流阈值】范围内,则进行自动分闸控制;<br>
            4.空闲时长: è¯·è®¾ç½®è‡³å°‘空闲时长大于等于300秒(5分钟)。
            4.空闲时长: è¯·è®¾ç½®è‡³å°‘空闲时长大于等于300秒(5分钟)。<br>
            5.如需远程控制开关,请正确填写下述全部参数信息。
          </p>
          <div style="display: flex">
@@ -118,7 +118,7 @@
        name: [
          { required: true, message: '请输入设备名称' }
        ],
      /*  max: [
        /*max: [
          { required: true, message: '请输入设备空闲电流阈值' }
        ],*/
        doorId: [
admin/src/components/business/OperaInternalCompanyWindow.vue
@@ -22,7 +22,7 @@
<!--              :disabled="(editType === 'edit') || (!!(editType === 'add' && parentId))"-->
            <el-radio-group v-model="form.type">
              <el-radio :label="0">相关方组织</el-radio>
              <el-radio :label="1">内部组织</el-radio>
              <el-radio :label="1"  v-if="sysConfig() && sysConfig().orgUserDataOrigin!=3">内部组织</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-form>
@@ -68,6 +68,7 @@
      type: Array
    }
  },
  inject: ['sysConfig'],
  created () {
    this.config({
      api: '/business/company.js',
@@ -75,7 +76,7 @@
    })
  },
  methods: {
    open(title, target, row, editType){
    open (title, target, row, editType) {
      this.title = title
      this.editType = editType
      if (editType === 'edit') {
@@ -96,7 +97,7 @@
      }
      if (target != null) {
        this.form.parentId = target.id
        this.form.parentType = target.type
        this.form.parentType = target.type >= 0 ? target.type : 0
        this.form.parentName = target.companyNamePath
      }
      // æ–°å»ºç»„织
@@ -104,7 +105,7 @@
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
          this.form.type = target.type
          this.form.type = 0
        })
        return
      }
@@ -114,7 +115,7 @@
        for (const key in this.form) {
          this.form[key] = row[key]
        }
        if(target.type == 0){
        if (target.type == 0) {
          this.form.type = 0
        }
      })
@@ -140,7 +141,7 @@
              this.$emit('success')
            })
            .catch(e => {
             //  this.$tip.apiFailed(e)
              //  this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking = false
admin/src/views/business/deviceDuanluqi.vue
@@ -133,10 +133,9 @@
    return {
      // æœç´¢
      searchForm: {
        doorName: '',
        doorNo: '',
        no: '',
        regionPathName: '',
        name: '',
        type: 5
      },
      isWorkSending: false,
admin/src/views/business/internalCompany.vue
@@ -23,36 +23,44 @@
            v-permissions="['business:company:sort']">上移</el-button></li>
        <li><el-button @click="sort('bottom')" :loading="sorting" icon="el-icon-sort-down"
            v-permissions="['business:company:sort']">下移</el-button></li>
        <li><el-button type="primary" v-permissions="['business:company:sync']" :loading="loading"
            @click="synchronous()">同步</el-button></li>
<!--        <li><el-button type="primary" v-permissions="['business:company:sync']" :loading="loading"
            @click="synchronous()">同步</el-button></li>-->
        <li><el-button type="primary" v-permissions="['business:company:create']" :loading="loading"
            @click="synchronousDingding()">同步钉钉</el-button></li>
            @click="synchronous()">同步</el-button></li>
      </ul>
      <el-table :max-height="tableHeight" v-loading="isWorking.search" :data="list" stripe
        :tree-props="{ children: 'childList', hasChildren: 'hasChildren' }" row-key="id"
        @selection-change="handleSelectionChange" default-expand-all>
        <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="200px"></el-table-column>
        <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>
          </template>
        </el-table-column>
        <el-table-column prop="companyNamePath" label="组织路径" min-width="100px"></el-table-column>
        <el-table-column label="海康同步状态" min-width="100px" align="center">
          <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 prop="sortnum" align="center" label="排序码" min-width="80px"></el-table-column>
        <el-table-column prop="companyNamePath" label="组织路径" min-width="200px"></el-table-column>
        <el-table-column prop="editorName" label="操作人" width="100px"></el-table-column>
        <el-table-column prop="editDate" label="最后更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="最后更新时间" min-width="150px"></el-table-column>
        <el-table-column label="操作" width="230" fixed="right">
          <template slot-scope="{row}">
<!--            v-if="row.type ==0"-->
            <el-button type="text"
              @click="$refs.OperaInternalCompanyWindow.open('编辑企业信息', { id: row.parentId, name: row.parentName, type: row.parentType, companyPath: row.parentCompanyPath }, row, 'edit')"
              icon="el-icon-edit" v-permissions="['business:company:update']">编辑</el-button>
              icon="el-icon-edit" v-permissions="['business:company:update']" v-if="sysConfig && sysConfig.orgUserDataOrigin ==3 && row.type !=1 ">编辑</el-button>
            <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('新建子级', row, null, 'add')"
              icon="el-icon-plus">新建子级</el-button>
            <el-button type="text" @click="deleteById(row)" style="color: red" icon="el-icon-delete"
              v-permissions="['business:company:delete']" v-if="row.type !== -1">删除</el-button>
              v-permissions="['business:company:delete']" v-if="sysConfig && sysConfig.orgUserDataOrigin ==3 && row.type ==0 ">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -65,17 +73,18 @@
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import { companySync,companySyncDingding, sort } from '@/api/business/company'
import { companySync, companySyncDingding, sort } from '@/api/business/company'
import OperaInternalCompanyWindow from '@/components/business/OperaInternalCompanyWindow'
export default {
  name: 'internalCompany',
  extends: BaseTable,
  components: { TableLayout, OperaInternalCompanyWindow },
  data() {
  data () {
    return {
      // æœç´¢
      loading: false,
      sorting: false,
      sysConfig: null,
      searchForm: {
        // type: 1
      },
@@ -83,7 +92,12 @@
      total: 0
    }
  },
  created() {
  provide() {
    return {
      sysConfig: () => this.sysConfig
    }
  },
  created () {
    this.config({
      module: '企业信息表',
      api: '/business/company',
@@ -91,15 +105,19 @@
      'field.main': 'id'
    })
    this.search()
    this.api.getSysConfig()
      .then(res => {
        this.sysConfig = res
      })
  },
  mounted() {
  mounted () {
    this.$nextTick(() => {
      this.tableHeight = document.body.scrollHeight - 220
    })
  },
  methods: {
    // é¡µç å˜æ›´å¤„理
    handlePageChange(pageIndex) {
    handlePageChange (pageIndex) {
      this.__checkApi()
      this.isWorking.search = true
      this.api.fetchList(this.searchForm.type)
@@ -114,7 +132,7 @@
        })
    },
    // åŒæ­¥ä¿¡æ¯
    async synchronous() {
    async synchronous () {
      this.$dialog.actionConfirm('该操作将系统清空已有组织信息,您确认同步全部信息吗?', '操作确认提醒')
        .then(() => {
          this.loading = true
@@ -132,7 +150,7 @@
        })
        .catch(() => { })
    },
    async synchronousDingding() {
    async synchronousDingding () {
      this.$dialog.actionConfirm('该操作将系统清空已有内部组织信息,您确认同步全部信息吗?', '操作确认提醒')
        .then(() => {
          this.loading = true
@@ -151,7 +169,7 @@
        .catch(() => { })
    },
    // æŽ’序
    sort(direction) {
    sort (direction) {
      if (this.sorting) {
        return
      }
@@ -195,7 +213,7 @@
             menuPool.splice(menuIndex, 0, menuPool.splice(menuIndex - 1, 1)[0])
           } else {
             menuPool.splice(menuIndex, 0, menuPool.splice(menuIndex + 1, 1)[0])
           }*/
           } */
          this.search()
        })
        .catch(e => {
@@ -206,7 +224,7 @@
        })
    },
    // æŸ¥è¯¢çˆ¶èŠ‚ç‚¹
    __findParent(id, parent) {
    __findParent (id, parent) {
      if (parent.childList === 0) {
        return
      }
admin/src/views/business/internalMember.vue
@@ -64,16 +64,14 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <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"
        <li v-if="sysConfig && sysConfig.orgUserDataOrigin != 3"><el-button type="primary" v-permissions="['business:member:create']" :loading="loading"
            @click="synchronous()">同步</el-button></li>
        <li><el-button type="primary" v-permissions="['business:member:create']" :loading="loading"
            @click="synchronousDingding()">同步钉钉</el-button></li>
        <li><el-button type="primary"
        <li  v-if="sysConfig && sysConfig.orgUserDataOrigin != 3"><el-button type="primary"
            @click="add" icon="el-icon-plus"
            v-permissions="['business:member:create']">新建员工</el-button></li>
        <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('人员导入', searchForm.companyType)"
        <li v-if="sysConfig && sysConfig.orgUserDataOrigin != 3"><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('人员导入', 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"
        <li  v-if="sysConfig && sysConfig.orgUserDataOrigin != 3"><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()">下发授权</el-button></li>
@@ -84,7 +82,7 @@
      </ul>
      <el-table :height="tableHeightNew" v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column fixed="left" prop="name" label="姓名" min-width="80px">
        <el-table-column fixed="left" prop="name" label="姓名" min-width="100px">
          <template slot-scope="{row}">
            <span>{{ row.name }}</span>
            <span class="zhuguan" v-if="row.headStatus == 1">主管</span>
@@ -98,7 +96,6 @@
          </template>
        </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>
@@ -129,18 +126,21 @@
        </el-table-column>
        <el-table-column label="在职状态">
          <template slot-scope="{row}">
            <el-switch @change="changeWorkStatus($event, row)" v-model="row.workStatus" active-color="#13ce66"
            <el-switch  v-if="sysConfig && sysConfig.orgUserDataOrigin != 3"  @change="changeWorkStatus($event, row)" v-model="row.workStatus" active-color="#13ce66"
              inactive-color="#ff4949" :active-value="0" :inactive-value="1">
            </el-switch>
            <span v-else>{{row.workStatus == 1?"离职":"在职"}}</span>
          </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"
            <el-switch  v-if="sysConfig && sysConfig.orgUserDataOrigin != 3" @change="changeCanvisit($event, row)" v-model="row.canVisit" active-color="#13ce66"
              inactive-color="#ff4949" :active-value="1" :inactive-value="0">
            </el-switch>
            <span v-else>{{row.canVisit == 1?"是":"否"}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="idcardDecode" label="身份证号" min-width="150px" show-overflow-tooltip></el-table-column>
        <el-table-column label="海康同步状态" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.hkStatus == 0" style="color: #435EBE">待同步</span>
@@ -185,7 +185,7 @@
          v-if="containPermissions(['business:member:update', 'business:member:delete', 'business:empower:create'])"
          label="操作" min-width="280">
          <template slot-scope="{row}">
           <el-button type="text" icon="el-icon-edit" @click="edit(row)"  v-permissions="['business:member:update']">编辑</el-button>
           <el-button  v-if="sysConfig && sysConfig.orgUserDataOrigin != 3" type="text" icon="el-icon-edit" @click="edit(row)"  v-permissions="['business:member:update']" >编辑</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" :loading="heading" style="color: red" icon="el-icon-delete"
@@ -193,7 +193,7 @@
              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-delete" @click="deleteById(row)" style="color: red"
            <el-button  v-if="sysConfig && sysConfig.orgUserDataOrigin != 3" type="text" icon="el-icon-delete" @click="deleteById(row)" style="color: red"
              v-permissions="['business:member:delete']">删除</el-button>
          </template>
        </el-table-column>
@@ -218,7 +218,7 @@
import OperaMemberWindow from '@/components/business/OperaMemberWindow'
import OperaMemberRoleWindow from '@/components/business/OperaMemberRoleWindow'
import OperaMemberImportWindow from '@/components/business/OperaMemberImportWindow'
import { fetchList } from '@/api/business/company'
import { fetchList,getSysConfig } from '@/api/business/company'
import { allList } from '@/api/business/position'
import { memberSync,memberSyncDingding, roleAuth, updateCanVisit, updateHead, updateWorkStatus } from '@/api/business/member'
export default {
@@ -246,6 +246,7 @@
        authStatus: '',
        idcardNo: ''
      },
      sysConfig: null,
      loading: false,
      heading: false,
      working: false,
@@ -265,6 +266,7 @@
    // this.search()
    this.getfindCompanyTreePage()
    this.getPositionList()
    this.getSysConfig()
  },
  mounted() {
    // this.$nextTick(() => {
@@ -299,6 +301,12 @@
          this.positionList = res
        })
    },
    getSysConfig() {
      getSysConfig({})
        .then(res => {
          this.sysConfig = res
        })
    },
    empower(id) {
      var that = this
      this.$confirm('确定重新授权吗?', '提示', {
server/base_serivce/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.doumee</groupId>
        <artifactId>dmvisit</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>base_serivce</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <poi.version>5.0.0</poi.version>
        <oshi.version>5.7.0</oshi.version>
        <fastjson.version>1.2.70</fastjson.version>
        <!-- é˜¿é‡Œäº‘OSS存储 -->
        <aliyun-oss.version>3.8.0</aliyun-oss.version>
        <!-- å¾®ä¿¡å°ç¨‹åº -->
        <weixin-java-miniapp.version>4.1.0</weixin-java-miniapp.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>io.swagger.core.v3</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>2.1.5</version>
        </dependency>
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>${weixin-java-miniapp.version}</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- å·¥å…·åŒ… -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <!-- Excel导入/导出依赖包 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <!-- swagger -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!--  é˜¿é‡Œäº‘OSS-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>${aliyun-oss.version}</version>
        </dependency>
        <!-- aliyun sms SDK -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
        </dependency>
        <!-- èŽ·å–ç³»ç»Ÿä¿¡æ¯ä¾èµ–åŒ… -->
        <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
            <version>${oshi.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>jna-platform</artifactId>
                    <groupId>net.java.dev.jna</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jna</artifactId>
                    <groupId>net.java.dev.jna</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>
server/base_serivce/src/main/java/com/doumee/Main.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.doumee;
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}
server/jiandaoyun_service/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.doumee</groupId>
        <artifactId>dmvisit</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>jiandaoyun_service</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.doumee</groupId>
            <artifactId>base_serivce</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
server/jiandaoyun_service/src/main/java/com/doumee/Main.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.doumee;
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/CorpCoopApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.doumee.core.jiandaoyun.api.arch;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.CORP_COOP_BASE_PATH;
/**
 * ä¼ä¸šäº’联相关接口
 */
public class CorpCoopApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Collections.singletonList("v5");
    public CorpCoopApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + CORP_COOP_BASE_PATH + path;
    }
    /**
     * åˆ—出我连接的企业
     *
     * @param deptNo - éƒ¨é—¨ç¼–号 å¯ä¸ºnull
     * @return æˆ‘连接的企业
     */
    public Map<String, Object> corpCoopDepartList(Integer deptNo, String version) throws Exception {
        String path = this.generatePath(version, "department/list");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("dept_no", deptNo);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ—出我连接的企业对接人
     *
     * @param deptNo - éƒ¨é—¨ç¼–号 å¯ä¸ºnull
     * @return æˆ‘连接的企业对接人
     */
    public Map<String, Object> corpCoopMemberList(Integer deptNo, String version) throws Exception {
        String path = this.generatePath(version, "user/list");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("dept_no", deptNo);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ—出我连接的企业对接人详细信息
     *
     * @param userName - ç”¨æˆ·å
     */
    public Map<String, Object> corpCoopUserInfo(String userName, String version) throws Exception {
        if (StringUtils.isBlank(userName)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "user/get");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("username", userName);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/DeptApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,168 @@
package com.doumee.core.jiandaoyun.api.arch;
import com.doumee.core.jiandaoyun.model.dept.DeptCreateParam;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.DEPT_BASE_PATH;
/**
 * éƒ¨é—¨ç›¸å…³æŽ¥å£
 */
public class DeptApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Collections.singletonList("v5");
    public DeptApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + DEPT_BASE_PATH + path;
    }
    /**
     * èŽ·å–éƒ¨é—¨ç¼–å·å¯¹åº”éƒ¨é—¨åˆ—è¡¨ ï¼ˆé€’归)
     *
     * @param deptNo - éƒ¨é—¨ç¼–号
     * @return éƒ¨é—¨ä¿¡æ¯
     */
    public Map<String, Object> deptList(Integer deptNo, Boolean hasChild, String version) throws Exception {
        if (deptNo == null) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "list");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("has_child", hasChild);
        data.put("dept_no", deptNo);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ›å»ºéƒ¨é—¨
     *
     * @param param - éƒ¨é—¨åç§°
     * @return éƒ¨é—¨ä¿¡æ¯
     */
    public Map<String, Object> deptCreate(DeptCreateParam param, String version) throws Exception {
        if (param == null || !param.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "create");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("name", param.getName());
        data.put("dept_no", param.getDept_no());
        data.put("parent_no", param.getParent_no());
        HttpRequestParam httpRequestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(httpRequestParam);
    }
    /**
     * æ ¹æ®éƒ¨é—¨ç¼–号 æ›´æ–°éƒ¨é—¨åç§°
     *
     * @param deptNo - éƒ¨é—¨ç¼–号
     * @param name   - åç§°
     * @return æ›´æ–°åŽçš„部门信息
     */
    public Map<String, Object> deptUpdate(Integer deptNo, String name, String version) throws Exception {
        if (deptNo == null || StringUtils.isBlank(name)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "update");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("name", name);
        data.put("dept_no", deptNo);
        HttpRequestParam httpRequestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(httpRequestParam);
    }
    /**
     * æ ¹æ®éƒ¨é—¨ç¼–号 åˆ é™¤éƒ¨é—¨
     *
     * @param deptNo - éƒ¨é—¨ç¼–号
     * @return status
     */
    public Map<String, Object> deptDelete(Integer deptNo, String version) throws Exception {
        if (deptNo == null) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "delete");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("dept_no", deptNo);
        HttpRequestParam httpRequestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(httpRequestParam);
    }
    /**
     * æ ¹æ®é›†æˆæ¨¡å¼é€šè®¯å½•的部门ID获取部门编号
     *
     * @param integrateId - ç¬¬ä¸‰æ–¹å¹³å°çš„通讯录部门的ID
     * @return éƒ¨é—¨ç¼–号
     */
    public Map<String, Object> deptByIntegrateId(String integrateId, String version) throws Exception {
        if (StringUtils.isBlank(integrateId)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "dept_no/get");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("integrate_id", integrateId);
        HttpRequestParam httpRequestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(httpRequestParam);
    }
    /**
     * æ‰¹é‡åˆ›å»ºéƒ¨é—¨
     *
     * @param paramList - éƒ¨é—¨å‚数列表
     * @return status
     */
    public Map<String, Object> departmentImport(List<DeptCreateParam> paramList, String version) throws Exception {
        if (CollectionUtils.isEmpty(paramList)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "import");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("departments", paramList);
        HttpRequestParam httpRequestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(httpRequestParam);
    }
    /**
     * èŽ·å–éƒ¨é—¨æˆå‘˜ï¼ˆé€’å½’ï¼‰
     *
     * @param deptNo   - éƒ¨é—¨ç¼–号
     * @param hasChild - æ˜¯å¦æŸ¥å­éƒ¨é—¨
     * @return éƒ¨é—¨æˆå‘˜ä¿¡æ¯
     */
    public Map<String, Object> deptMemberList(Integer deptNo, Boolean hasChild, String version) throws Exception {
        if (deptNo == null || hasChild == null) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "user/list");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("has_child", hasChild);
        data.put("dept_no", deptNo);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/MemberApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,147 @@
package com.doumee.core.jiandaoyun.api.arch;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import com.doumee.core.jiandaoyun.model.user.UserCreateParam;
import com.doumee.core.jiandaoyun.model.user.UserUpdateParam;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.MEMBER_BASE_PATH;
/**
 * æˆå‘˜ç›¸å…³æŽ¥å£
 */
public class MemberApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Arrays.asList("v5");
    public MemberApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + MEMBER_BASE_PATH + path;
    }
    /**
     * åˆ›å»ºæˆå‘˜
     *
     * @param param - æˆå‘˜ä¿¡æ¯
     * @return æˆå‘˜ä¿¡æ¯
     */
    public Map<String, Object> userCreate(UserCreateParam param, String version) throws Exception {
        if (param == null || !param.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "create");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("name", param.getName());
        data.put("username", param.getUsername());
        data.put("departments", param.getDepartments());
        HttpRequestParam requestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(requestParam);
    }
    /**
     * æ ¹æ®æˆå‘˜åç§° èŽ·å–æˆå‘˜
     *
     * @param userName - æˆå‘˜åç§°
     * @return æˆå‘˜ä¿¡æ¯
     */
    public Map<String, Object> userInfo(String userName, String version) throws Exception {
        if (StringUtils.isBlank(userName)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "get");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("username", userName);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * æ›´æ–°æˆå‘˜
     *
     * @param updateParam - æ›´æ–°çš„æˆå‘˜ä¿¡æ¯
     * @return æ›´æ–°åŽçš„æˆå‘˜ä¿¡æ¯
     */
    public Map<String, Object> userUpdate(UserUpdateParam updateParam, String version) throws Exception {
        if (updateParam == null || !updateParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "update");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("name", updateParam.getName());
        data.put("username", updateParam.getUserName());
        data.put("departments", updateParam.getDepartmentList());
        HttpRequestParam requestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(requestParam);
    }
    /**
     * æˆå‘˜åˆ é™¤
     *
     * @param userName - æˆå‘˜åç§°
     * @return status
     */
    public Map<String, Object> userDelete(String userName, String version) throws Exception {
        if (StringUtils.isBlank(userName)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "delete");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("username", userName);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * æ‰¹é‡åˆ é™¤æˆå‘˜
     *
     * @param userNameList - å¾…删除的用户名称列表
     * @return status
     */
    public Map<String, Object> userBatchDelete(List<String> userNameList, String version) throws Exception {
        if (CollectionUtils.isEmpty(userNameList)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "batch_delete");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("usernames", userNameList);
        HttpRequestParam requestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(requestParam);
    }
    /**
     * æ‰¹é‡å¯¼å…¥æˆå‘˜
     *
     * @param userNameList - å¯¼å…¥çš„æˆå‘˜åˆ—表
     * @return status
     */
    public Map<String, Object> userImport(List<UserCreateParam> userNameList, String version) throws Exception {
        if (CollectionUtils.isEmpty(userNameList)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "import");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("users", userNameList);
        HttpRequestParam requestParam = new HttpRequestParam(path, data);
        return this.sendPostRequest(requestParam);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/RoleApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
package com.doumee.core.jiandaoyun.api.arch;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import com.doumee.core.jiandaoyun.model.role.RoleListQueryParam;
import com.doumee.core.jiandaoyun.model.role.RoleMemberQueryParam;
import com.doumee.core.jiandaoyun.model.role.RoleUpdateParam;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.ROLE_BASE_PATH;
/**
 * è§’色相关接口
 */
public class RoleApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Collections.singletonList("v5");
    public RoleApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + ROLE_BASE_PATH + path;
    }
    /**
     * åˆ—出角色
     *
     * @param queryParam - æŸ¥è¯¢å‚æ•°
     * @return è§’色信息
     */
    public Map<String, Object> roleList(RoleListQueryParam queryParam, String version) throws Exception {
        if (queryParam == null || !queryParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "list");
        // è¯·æ±‚参数 å°† queryParam é‡Œé¢çš„属性转换成map
        Map<String, Object> data =
                new ObjectMapper().convertValue(queryParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ›å»ºè§’色
     *
     * @param name    - è§’色名称
     * @param groupNo - è§’色组编号
     * @return è§’色信息
     */
    public Map<String, Object> roleCreate(String name, Integer groupNo, String version) throws Exception {
        if (StringUtils.isBlank(name) || groupNo == null) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"create");
        Map<String, Object> data = new HashMap<>();
        data.put("group_no", groupNo);
        data.put("name", name);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * æ›´æ–°è§’色
     *
     * @param updateParam - è§’色更新信息
     * @return æ›´æ–°åŽçš„角色信息
     */
    public Map<String, Object> roleUpdate(RoleUpdateParam updateParam, String version) throws Exception {
        if (updateParam == null || !updateParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"update");
        // è¯·æ±‚参数 å°† queryParam é‡Œé¢çš„属性转换成map
        Map<String, Object> data =
                new ObjectMapper().convertValue(updateParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ é™¤è§’色
     *
     * @param roleNo - è§’色编号
     * @return æ— 
     */
    public Map<String, Object> roleDelete(Integer roleNo, String version) throws Exception {
        if (roleNo == null) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"delete");
        Map<String, Object> data = new HashMap<>();
        data.put("role_no", roleNo);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ—出角色下的所有成员
     *
     * @param queryParam - äº§çº¿å‚æ•°
     * @return æˆå‘˜ä¿¡æ¯
     */
    public Map<String, Object> roleMemberList(RoleMemberQueryParam queryParam, String version) throws Exception {
        if (queryParam == null || !queryParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"user/list");
        // è¯·æ±‚参数 å°† queryParam é‡Œé¢çš„属性转换成map
        Map<String, Object> data =
                new ObjectMapper().convertValue(queryParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * æ‰¹é‡ç»™å·²æœ‰çš„æˆå‘˜è®¾ç½®è‡ªå»ºè§’色
     *
     * @param roleNo       - è§’色编号
     * @param userNameList - æˆå‘˜åç§°åˆ—表
     * @return success
     */
    public Map<String, Object> roleAddMembers(Integer roleNo, List<String> userNameList, String version)
            throws Exception {
        if (roleNo == null || CollectionUtils.isEmpty(userNameList)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"add_members");
        Map<String, Object> data = new HashMap<>();
        data.put("role_no", roleNo);
        data.put("usernames", userNameList);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * ä¸ºè‡ªå»ºè§’色批量移除成员
     *
     * @param roleNo       - è§’色编号
     * @param userNameList - ç”¨æˆ·åç§°åˆ—表
     * @return status
     */
    public Map<String, Object> roleRemoveMembers(Integer roleNo, List<String> userNameList, String version)
            throws Exception {
        if (roleNo == null || CollectionUtils.isEmpty(userNameList)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"remove_members");
        Map<String, Object> data = new HashMap<>();
        data.put("role_no", roleNo);
        data.put("usernames", userNameList);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/arch/RoleGroupApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
package com.doumee.core.jiandaoyun.api.arch;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import com.doumee.core.jiandaoyun.model.role.RoleGroupListQueryParam;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.ROLE_GROUP_BASE_PATH;
/**
 * è§’色组相关接口
 */
public class RoleGroupApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Collections.singletonList("v5");
    public RoleGroupApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + ROLE_GROUP_BASE_PATH + path;
    }
    /**
     * åˆ—出角色组
     *
     * @param queryParam - æŸ¥è¯¢å‚æ•°
     * @return è§’色组信息
     */
    public Map<String, Object> roleGroupList(RoleGroupListQueryParam queryParam, String version) throws Exception {
        if (queryParam == null || !queryParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"list");
        // è¯·æ±‚参数 å°† queryParam é‡Œé¢çš„属性转换成map
        Map<String, Object> data =
                new ObjectMapper().convertValue(queryParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ›å»ºè§’色组
     *
     * @param name - è§’色组名称
     * @return è§’色组信息
     */
    public Map<String, Object> roleGroupCreate(String name, String version) throws Exception {
        if (StringUtils.isBlank(name)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"create");
        Map<String, Object> data = new HashMap<>();
        data.put("name", name);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * æ›´æ–°è§’色组
     *
     * @param name        - è§’色组名称
     * @param roleGroupNo - è§’色组编号
     * @return æ›´æ–°åŽçš„角色组信息
     */
    public Map<String, Object> roleGroupUpdate(String name, Integer roleGroupNo, String version) throws Exception {
        if (StringUtils.isBlank(name) || roleGroupNo == null) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version,"update");
        Map<String, Object> data = new HashMap<>();
        data.put("name", name);
        data.put("role_group_no", roleGroupNo);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ é™¤è§’色组
     *
     * @param roleGroupNo - è§’色组编号
     * @return status
     */
    public Map<String, Object> roleGroupDelete(Integer roleGroupNo, String version) throws Exception {
        if (roleGroupNo == null) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "delete");
        Map<String, Object> data = new HashMap<>();
        data.put("role_group_no", roleGroupNo);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/jdy/AppApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.doumee.core.jiandaoyun.api.jdy;
import com.doumee.core.jiandaoyun.model.base.PageBaseParam;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.APP_BASE_PATH;
/**
 * åº”用相关接口
 */
public class AppApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Collections.singletonList("v5");
    public AppApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + APP_BASE_PATH + path;
    }
    /**
     * åº”用分页列表
     *
     * @param queryParam - æŸ¥è¯¢å‚æ•°
     * @return åº”用信息
     */
    public Map<String, Object> appList(PageBaseParam queryParam, String version) throws Exception {
        if (queryParam == null || !queryParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "list");
        // è¯·æ±‚参数 å°† queryParam é‡Œé¢çš„属性转换成map
        Map<String, Object> data =
                new ObjectMapper().convertValue(queryParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/jdy/FileApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.doumee.core.jiandaoyun.api.jdy;
import com.doumee.core.jiandaoyun.model.file.UploadTokenParam;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.FORM_BASE_PATH;
/**
 * æ–‡ä»¶ç›¸å…³æŽ¥å£
 */
public class FileApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Collections.singletonList("v5");
    public FileApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + FORM_BASE_PATH + path;
    }
    /**
     * èŽ·å–æ–‡ä»¶ä¸Šä¼ å‡­è¯å’Œä¸Šä¼ åœ°å€æŽ¥å£
     *
     * @param uploadTokenParam - æ–‡ä»¶å¯¹åº”的信息
     * @return token和url信息
     */
    public Map<String, Object> uploadToken(UploadTokenParam uploadTokenParam, String version) throws Exception {
        if (uploadTokenParam == null || !uploadTokenParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "file/get_upload_token");
        // è¯·æ±‚参数
        Map<String, Object> data = new HashMap<>();
        data.put("transaction_id", uploadTokenParam.getTransactionId());
        data.put("app_id", uploadTokenParam.getAppId());
        data.put("entry_id", uploadTokenParam.getEntryId());
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    public Map<String, Object> uploadFile(String url, String token, File file) throws Exception {
        if (StringUtils.isBlank(url) || StringUtils.isBlank(token) || file == null) {
            throw new RuntimeException("param lack!");
        }
        return this.httpPostFile(url, token, file);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/jdy/FormApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package com.doumee.core.jiandaoyun.api.jdy;
import com.doumee.core.jiandaoyun.model.form.FormQueryParam;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.FORM_BASE_PATH;
/**
 * è¡¨å•相关接口
 */
public class FormApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Arrays.asList("v5");
    public FormApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + FORM_BASE_PATH + path;
    }
    /**
     * è¡¨å•字段查询接口
     *
     * @param appId   - åº”用 Id
     * @param entryId - è¡¨å• Id
     */
    public Map<String, Object> formWidgets(String appId, String entryId, String version) throws Exception {
        if (StringUtils.isBlank(appId) || StringUtils.isBlank(entryId)) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "widget/list");
        Map<String, Object> data = new HashMap<>();
        data.put("app_id", appId);
        data.put("entry_id", entryId);
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * è¡¨å•查询接口 åˆ†é¡µ
     *
     * @param queryParam - æŸ¥è¯¢å‚æ•°
     * @return è¡¨å•信息
     */
    public Map<String, Object> entryList(FormQueryParam queryParam, String version) throws Exception {
        if (queryParam == null || !queryParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "list");
        // è¯·æ±‚参数 å°† queryParam é‡Œé¢çš„属性转换成map
        Map<String, Object> data =
                new ObjectMapper().convertValue(queryParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/api/jdy/FormDataApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,190 @@
package com.doumee.core.jiandaoyun.api.jdy;
import com.doumee.core.jiandaoyun.model.form.*;
import com.doumee.core.jiandaoyun.model.http.ApiClient;
import com.doumee.core.jiandaoyun.model.http.HttpRequestParam;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.doumee.core.jiandaoyun.constants.HttpConstant.FORM_DATA_BASE_PATH;
/**
 * è¡¨å•数据相关接口
 */
public class FormDataApiClient extends ApiClient {
    private static final String DEFAULT_VERSION = "v5";
    private static final List<String> VALID_VERSION_LIST = Collections.singletonList("v5");
    public FormDataApiClient(String apiKey, String host) {
        super(apiKey, host);
        this.setDefaultVersion(DEFAULT_VERSION);
        this.setValidVersionList(VALID_VERSION_LIST);
    }
    @Override
    public String generatePath(String version, String path) {
        return super.getValidVersion(version) + FORM_DATA_BASE_PATH + path;
    }
    /**
     * æ–°å»ºå•条数据接口
     *
     * @param createParam - è¡¨å•数据信息
     * @return æ–°å¢žçš„æ•°æ®ä¿¡æ¯
     */
    public Map<String, Object> singleDataCreate(FormDataCreateParam createParam, String version) throws Exception {
        if (createParam == null || !createParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "create");
        // è¯·æ±‚参数 å°† queryParam é‡Œé¢çš„属性转换成map
        Map<String, Object> data =
                new ObjectMapper().convertValue(createParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * æŸ¥è¯¢å•条数据接口
     *
     * @param queryParam - æŸ¥è¯¢å‚æ•°
     * @return æ•°æ®ä¿¡æ¯
     */
    public Map<String, Object> singleDataQuery(FormDataQueryParam queryParam, String version) throws Exception {
        if (queryParam == null || !queryParam.isSingleQueryValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "get");
        Map<String, Object> data = new HashMap<>();
        data.put("data_id", queryParam.getData_id());
        data.put("app_id", queryParam.getApp_id());
        data.put("entry_id", queryParam.getEntry_id());
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * ä¿®æ”¹å•条数据接口
     *
     * @param updateParam - æ›´æ–°æ•°æ®ä¿¡æ¯
     * @return æ›´æ–°åŽçš„æ•°æ®ä¿¡æ¯
     */
    public Map<String, Object> singleDataUpdate(FormDataUpdateParam updateParam, String version) throws Exception {
        if (updateParam == null || !updateParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "update");
        // è¯·æ±‚参数 å°† queryParam é‡Œé¢çš„属性转换成map
        Map<String, Object> data =
                new ObjectMapper().convertValue(updateParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆªé™¤å•条数据接口
     *
     * @param deleteParam - åˆ é™¤çš„æ•°æ®ä¿¡æ¯
     * @param version     - ç‰ˆæœ¬
     * @return status
     */
    public Map<String, Object> singleDataRemove(FormDataDeleteParam deleteParam, String version) throws Exception {
        if (deleteParam == null || !deleteParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "delete");
        Map<String, Object> data =
                new ObjectMapper().convertValue(deleteParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * æ–°å»ºå¤šæ¡æ•°æ®æŽ¥å£
     *
     * @param createParam - æ–°å»ºçš„æ•°æ®ä¿¡æ¯
     * @param version     - ç‰ˆæœ¬
     * @return success_count
     */
    public Map<String, Object> batchDataCreate(FormDataBatchCreateParam createParam, String version) throws Exception {
        if (createParam == null || !createParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "batch_create");
        Map<String, Object> data =
                new ObjectMapper().convertValue(createParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * æŸ¥è¯¢å¤šæ¡æ•°æ®æŽ¥å£
     *
     * @param queryParam - æŸ¥è¯¢å‚æ•°
     * @param version    - ç‰ˆæœ¬
     * @return æ•°æ®ä¿¡æ¯
     */
    public Map<String, Object> batchDataQuery(FormDataQueryParam queryParam, String version) throws Exception {
        if (queryParam == null || !queryParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "list");
        Map<String, Object> data =
                new ObjectMapper().convertValue(queryParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * åˆ é™¤å¤šæ¡æ•°æ®æŽ¥å£
     *
     * @param removeParam - åˆ é™¤å‚æ•°
     * @param version     - ç‰ˆæœ¬
     * @return status å’Œ success_count
     */
    public Map<String, Object> batchDataRemove(FormDataBatchRemoveParam removeParam, String version) throws Exception {
        if (removeParam == null || !removeParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "batch_delete");
        Map<String, Object> data =
                new ObjectMapper().convertValue(removeParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
    /**
     * ä¿®æ”¹å¤šæ¡æ•°æ®æŽ¥å£
     *
     * @param updateParam - æ›´æ–°æ•°æ®çš„信息
     * @param version     - ç‰ˆæœ¬
     * @return status å’Œ success_count
     */
    public Map<String, Object> batchDataUpdate(FormDataBatchUpdateParam updateParam, String version) throws Exception {
        if (updateParam == null || !updateParam.isValid()) {
            throw new RuntimeException("param lack!");
        }
        String path = this.generatePath(version, "batch_update");
        Map<String, Object> data =
                new ObjectMapper().convertValue(updateParam, new TypeReference<Map<String, Object>>() {
                });
        HttpRequestParam param = new HttpRequestParam(path, data);
        return this.sendPostRequest(param);
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/constants/HttpConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.doumee.core.jiandaoyun.constants;
/**
 * http ç›¸å…³çš„常量
 */
public class HttpConstant {
    public static final String HOST = "https://api.jiandaoyun.com/api/";
    /**
     * éƒ¨é—¨ç›¸å…³çš„æŽ¥å£å‰ç¼€
     */
    public static final String DEPT_BASE_PATH = "/corp/department/";
    /**
     * æˆå‘˜ç›¸å…³çš„æŽ¥å£å‰ç¼€
     */
    public static final String MEMBER_BASE_PATH = "/corp/user/";
    /**
     * åº”用相关的接口前缀
     */
    public static final String APP_BASE_PATH = "/app/";
    /**
     * ä¼ä¸šäº’联的接口前缀
     */
    public static final String CORP_COOP_BASE_PATH = "/corp/guest/";
    /**
     * è§’色相关的接口前缀
     */
    public static final String ROLE_BASE_PATH = "/corp/role/";
    /**
     * è§’色组相关的接口前缀
     */
    public static final String ROLE_GROUP_BASE_PATH = "/corp/role_group/";
    /**
     * è¡¨å•相关的接口前缀
     */
    public static final String FORM_BASE_PATH = "/app/entry/";
    /**
     * è¡¨å•相关的接口前缀
     */
    public static final String FORM_DATA_BASE_PATH = "/app/entry/data/";
    /**
     * API_KEY
     */
    public static final String API_KEY = "JsmYomhn3dissp9ZJ6QeTpnH2xKoKZgw";
    public static final String APP_ID = "APP_ID";
    public static final String ENTRY_ID = "ENTRY_ID";
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/base/PageBaseParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.doumee.core.jiandaoyun.model.base;
/**
 * åˆ†é¡µæŸ¥è¯¢åŸºå‚
 */
public class PageBaseParam {
    /**
     * è·³è¿‡æ•°é‡
     */
    private Integer skip;
    /**
     * æŸ¥è¯¢æ•°é‡
     */
    private Integer limit;
    public Integer getSkip() {
        return skip;
    }
    public void setSkip(Integer skip) {
        this.skip = skip;
    }
    public Integer getLimit() {
        return limit;
    }
    public void setLimit(Integer limit) {
        this.limit = limit;
    }
    public boolean isValid() {
        return this.getLimit() != null && this.getSkip() != null;
    }
    @Override
    public String toString() {
        return "PageBaseParam{" +
                "skip=" + skip +
                ", limit=" + limit +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/dept/DeptCreateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.doumee.core.jiandaoyun.model.dept;
import org.apache.commons.lang3.StringUtils;
/**
 * åˆ›å»ºéƒ¨é—¨çš„参数
 */
public class DeptCreateParam {
    /**
     * éƒ¨é—¨åç§° å¿…å¡«
     */
    private String name;
    /**
     * çˆ¶çº§éƒ¨é—¨ç¼–号 é€‰å¡«
     */
    private Integer parent_no;
    /**
     * éƒ¨é—¨ç¼–号 é€‰å¡«
     */
    private Integer dept_no;
    public DeptCreateParam(String name) {
        this.name = name;
    }
    public DeptCreateParam() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getParent_no() {
        return parent_no;
    }
    public void setParent_no(Integer parent_no) {
        this.parent_no = parent_no;
    }
    public Integer getDept_no() {
        return dept_no;
    }
    public void setDept_no(Integer dept_no) {
        this.dept_no = dept_no;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getName());
    }
    @Override
    public String toString() {
        return "DeptCreateParam{" +
                "name='" + name + '\'' +
                ", parent_no=" + parent_no +
                ", dept_no=" + dept_no +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/dept/DeptEntityModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.doumee.core.jiandaoyun.model.dept;
import lombok.Data;
/**
 * éƒ¨é—¨å®žä½“参数
 */
@Data
public class DeptEntityModel {
  private Integer  dept_no;// Number  éƒ¨é—¨ç¼–号,企业内唯一 ä¸åŒä¼ä¸šä¹‹é—´å¯èƒ½å­˜åœ¨é‡å¤
    private String   name  ;//String  éƒ¨é—¨åç§°
    private Integer  parent_no;//   Number çˆ¶éƒ¨é—¨ç¼–号   åœ¨ä¼ä¸šäº’联接口中(外部部门)不存在
    private Integer   type ;//Number  éƒ¨é—¨ç±»åž‹ 0: å¸¸è§„部 2: ä¼ä¸šäº’联外部部门
    private Integer  status;// Number éƒ¨é—¨çŠ¶æ€ 1: ä½¿ç”¨ä¸­çš„部门 -1: é›†æˆæ¨¡å¼ä¸‹åŒæ­¥åŽåˆ é™¤çš„部门
    private String  integrate_id;//  String  é›†æˆæ¨¡å¼åŒæ­¥éƒ¨é—¨å…³è” ID  ä»…在集成模式下返回,且在企业互联接口(外部部门)不返回
    private Integer    seq ;//number éƒ¨é—¨æŽ’序  éƒ¨é—¨åœ¨çˆ¶éƒ¨é—¨å†…的序号,从小到大排列
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/file/UploadTokenParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.doumee.core.jiandaoyun.model.file;
import org.apache.commons.lang3.StringUtils;
public class UploadTokenParam {
    private String appId;
    private String entryId;
    private String transactionId;
    public String getAppId() {
        return appId;
    }
    public void setAppId(String appId) {
        this.appId = appId;
    }
    public String getEntryId() {
        return entryId;
    }
    public void setEntryId(String entryId) {
        this.entryId = entryId;
    }
    public String getTransactionId() {
        return transactionId;
    }
    public void setTransactionId(String transactionId) {
        this.transactionId = transactionId;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getAppId()) && StringUtils.isNotBlank(this.getEntryId())
                && StringUtils.isNotBlank(this.getTransactionId());
    }
    @Override
    public String toString() {
        return "UploadTokenParam{" +
                "appId='" + appId + '\'' +
                ", entryId='" + entryId + '\'' +
                ", transactionId='" + transactionId + '\'' +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataBatchCreateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
package com.doumee.core.jiandaoyun.model.form;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
public class FormDataBatchCreateParam {
    /**
     * åº”用id
     */
    private String app_id;
    /**
     * è¡¨å•id
     */
    private String entry_id;
    /**
     * æ•°æ®
     */
    private List<Map<String, Object>> data_list;
    private Boolean is_start_workflow;
    private String transaction_id;
    public FormDataBatchCreateParam() {
    }
    public FormDataBatchCreateParam(String app_id, String entry_id, List<Map<String, Object>> data_list) {
        this.app_id = app_id;
        this.entry_id = entry_id;
        this.data_list = data_list;
    }
    public String getApp_id() {
        return app_id;
    }
    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }
    public String getEntry_id() {
        return entry_id;
    }
    public void setEntry_id(String entry_id) {
        this.entry_id = entry_id;
    }
    public List<Map<String, Object>> getData_list() {
        return data_list;
    }
    public void setData_list(List<Map<String, Object>> data_list) {
        this.data_list = data_list;
    }
    public Boolean getIs_start_workflow() {
        return is_start_workflow;
    }
    public void setIs_start_workflow(Boolean is_start_workflow) {
        this.is_start_workflow = is_start_workflow;
    }
    public String getTransaction_id() {
        return transaction_id;
    }
    public void setTransaction_id(String transaction_id) {
        this.transaction_id = transaction_id;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getApp_id()) && StringUtils.isNotBlank(this.getEntry_id());
    }
    @Override
    public String toString() {
        return "FormDataBatchCreateParam{" +
                "app_id='" + app_id + '\'' +
                ", entry_id='" + entry_id + '\'' +
                ", data_list=" + data_list +
                ", is_start_workflow=" + is_start_workflow +
                ", transaction_id='" + transaction_id + '\'' +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataBatchRemoveParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.doumee.core.jiandaoyun.model.form;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
public class FormDataBatchRemoveParam {
    private List<String> data_ids;
    private String app_id;
    private String entry_id;
    public FormDataBatchRemoveParam(String app_id, String entry_id, List<String> data_ids) {
        this.data_ids = data_ids;
        this.app_id = app_id;
        this.entry_id = entry_id;
    }
    public List<String> getData_ids() {
        return data_ids;
    }
    public void setData_ids(List<String> data_ids) {
        this.data_ids = data_ids;
    }
    public String getApp_id() {
        return app_id;
    }
    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }
    public String getEntry_id() {
        return entry_id;
    }
    public void setEntry_id(String entry_id) {
        this.entry_id = entry_id;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getApp_id()) && StringUtils.isNotBlank(this.getEntry_id()) && CollectionUtils.isNotEmpty(data_ids);
    }
    @Override
    public String toString() {
        return "FormDataBatchRemoveParam{" +
                "data_ids=" + data_ids +
                ", app_id='" + app_id + '\'' +
                ", entry_id='" + entry_id + '\'' +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataBatchUpdateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,95 @@
package com.doumee.core.jiandaoyun.model.form;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
public class FormDataBatchUpdateParam {
    /**
     * åº”用id
     */
    private String app_id;
    /**
     * è¡¨å•id
     */
    private String entry_id;
    private List<String> data_ids;
    /**
     * æ•°æ®
     */
    private Map<String, Object> data;
    private String transaction_id;
    public FormDataBatchUpdateParam() {
    }
    public FormDataBatchUpdateParam(String app_id, String entry_id) {
        this.app_id = app_id;
        this.entry_id = entry_id;
    }
    public String getTransaction_id() {
        return transaction_id;
    }
    public void setTransaction_id(String transaction_id) {
        this.transaction_id = transaction_id;
    }
    public String getApp_id() {
        return app_id;
    }
    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }
    public String getEntry_id() {
        return entry_id;
    }
    public void setEntry_id(String entry_id) {
        this.entry_id = entry_id;
    }
    public List<String> getData_ids() {
        return data_ids;
    }
    public void setData_ids(List<String> data_ids) {
        this.data_ids = data_ids;
    }
    public Map<String, Object> getData() {
        return data;
    }
    public void setData(Map<String, Object> data) {
        this.data = data;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getApp_id()) && StringUtils.isNotBlank(this.getEntry_id())
                && CollectionUtils.isNotEmpty(this.getData_ids());
    }
    @Override
    public String toString() {
        return "FormDataBatchUpdateParam{" +
                "app_id='" + app_id + '\'' +
                ", entry_id='" + entry_id + '\'' +
                ", data_ids=" + data_ids +
                ", data=" + data +
                ", transaction_id='" + transaction_id + '\'' +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataCreateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
package com.doumee.core.jiandaoyun.model.form;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
public class FormDataCreateParam {
    /**
     * åº”用id
     */
    private String app_id;
    /**
     * è¡¨å•id
     */
    private String entry_id;
    /**
     * æ•°æ®
     */
    private Map<String, Object> data;
    private Boolean is_start_workflow;
    private Boolean is_start_trigger;
    private String transaction_id;
    public FormDataCreateParam() {
    }
    public FormDataCreateParam(String app_id, String entry_id, Map<String, Object> data) {
        this.app_id = app_id;
        this.entry_id = entry_id;
        this.data = data;
    }
    public String getApp_id() {
        return app_id;
    }
    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }
    public String getEntry_id() {
        return entry_id;
    }
    public void setEntry_id(String entry_id) {
        this.entry_id = entry_id;
    }
    public Map<String, Object> getData() {
        return data;
    }
    public void setData(Map<String, Object> data) {
        this.data = data;
    }
    public Boolean getIs_start_workflow() {
        return is_start_workflow;
    }
    public void setIs_start_workflow(Boolean is_start_workflow) {
        this.is_start_workflow = is_start_workflow;
    }
    public Boolean getIs_start_trigger() {
        return is_start_trigger;
    }
    public void setIs_start_trigger(Boolean is_start_trigger) {
        this.is_start_trigger = is_start_trigger;
    }
    public String getTransaction_id() {
        return transaction_id;
    }
    public void setTransaction_id(String transaction_id) {
        this.transaction_id = transaction_id;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getApp_id()) && StringUtils.isNotBlank(this.getEntry_id());
    }
    @Override
    public String toString() {
        return "FormDataCreateParam{" +
                "app_id='" + app_id + '\'' +
                ", entry_id='" + entry_id + '\'' +
                ", data=" + data +
                ", is_start_workflow=" + is_start_workflow +
                ", is_start_trigger=" + is_start_trigger +
                ", transaction_id='" + transaction_id + '\'' +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataDeleteParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.doumee.core.jiandaoyun.model.form;
import org.apache.commons.lang3.StringUtils;
public class FormDataDeleteParam {
    /**
     * åº”用id
     */
    private String app_id;
    /**
     * è¡¨å•id
     */
    private String entry_id;
    private String data_id;
    private Boolean is_start_trigger;
    public FormDataDeleteParam() {
    }
    public FormDataDeleteParam(String app_id, String entry_id, String data_id) {
        this.app_id = app_id;
        this.entry_id = entry_id;
        this.data_id = data_id;
    }
    public String getApp_id() {
        return app_id;
    }
    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }
    public String getEntry_id() {
        return entry_id;
    }
    public void setEntry_id(String entry_id) {
        this.entry_id = entry_id;
    }
    public String getData_id() {
        return data_id;
    }
    public void setData_id(String data_id) {
        this.data_id = data_id;
    }
    public Boolean getIs_start_trigger() {
        return is_start_trigger;
    }
    public void setIs_start_trigger(Boolean is_start_trigger) {
        this.is_start_trigger = is_start_trigger;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getApp_id()) && StringUtils.isNotBlank(this.getEntry_id())
                && StringUtils.isNotBlank(this.getData_id());
    }
    @Override
    public String toString() {
        return "FormDataDeleteParam{" +
                "app_id='" + app_id + '\'' +
                ", entry_id='" + entry_id + '\'' +
                ", data_id='" + data_id + '\'' +
                ", is_start_trigger=" + is_start_trigger +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataQueryParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
package com.doumee.core.jiandaoyun.model.form;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Map;
public class FormDataQueryParam {
    /**
     * åº”用id
     */
    private String app_id;
    /**
     * è¡¨å•id
     */
    private String entry_id;
    /**
     * æ•°æ®ID
     */
    private String data_id;
    /**
     * ä»Ž æ•°æ®ID å¼€å§‹è¿”回 limit æ¡æ•°æ®
     */
    private Integer limit;
    /**
     * æŸ¥è¯¢çš„字段
     */
    private List<String> fields;
    /**
     * è¿‡æ»¤æ¡ä»¶
     */
    private Map<String, Object> filter;
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getApp_id()) && StringUtils.isNotBlank(this.getEntry_id());
    }
    public boolean isSingleQueryValid() {
        return this.isValid() && StringUtils.isNotBlank(this.getData_id());
    }
    public FormDataQueryParam() {
    }
    public FormDataQueryParam(String app_id, String entry_id) {
        this.app_id = app_id;
        this.entry_id = entry_id;
    }
    public String getApp_id() {
        return app_id;
    }
    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }
    public String getEntry_id() {
        return entry_id;
    }
    public void setEntry_id(String entry_id) {
        this.entry_id = entry_id;
    }
    public String getData_id() {
        return data_id;
    }
    public void setData_id(String data_id) {
        this.data_id = data_id;
    }
    public Integer getLimit() {
        return limit;
    }
    public void setLimit(Integer limit) {
        this.limit = limit;
    }
    public List<String> getFields() {
        return fields;
    }
    public void setFields(List<String> fields) {
        this.fields = fields;
    }
    public Map<String, Object> getFilter() {
        return filter;
    }
    public void setFilter(Map<String, Object> filter) {
        this.filter = filter;
    }
    @Override
    public String toString() {
        return "FormDataQueryParam{" +
                "app_id='" + app_id + '\'' +
                ", entry_id='" + entry_id + '\'' +
                ", data_id='" + data_id + '\'' +
                ", limit=" + limit +
                ", fields=" + fields +
                ", filter=" + filter +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormDataUpdateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.doumee.core.jiandaoyun.model.form;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
public class FormDataUpdateParam {
    /**
     * åº”用id
     */
    private String app_id;
    /**
     * è¡¨å•id
     */
    private String entry_id;
    private String data_id;
    /**
     * æ•°æ®
     */
    private Map<String, Object> data;
    private Boolean is_start_trigger;
    private String transaction_id;
    public FormDataUpdateParam() {
    }
    public FormDataUpdateParam(String app_id, String entry_id, Map<String, Object> data) {
        this.app_id = app_id;
        this.entry_id = entry_id;
        this.data = data;
    }
    public Map<String, Object> getData() {
        return data;
    }
    public void setData(Map<String, Object> data) {
        this.data = data;
    }
    public Boolean getIs_start_trigger() {
        return is_start_trigger;
    }
    public void setIs_start_trigger(Boolean is_start_trigger) {
        this.is_start_trigger = is_start_trigger;
    }
    public String getTransaction_id() {
        return transaction_id;
    }
    public void setTransaction_id(String transaction_id) {
        this.transaction_id = transaction_id;
    }
    public String getApp_id() {
        return app_id;
    }
    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }
    public String getEntry_id() {
        return entry_id;
    }
    public void setEntry_id(String entry_id) {
        this.entry_id = entry_id;
    }
    public String getData_id() {
        return data_id;
    }
    public void setData_id(String data_id) {
        this.data_id = data_id;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getApp_id()) && StringUtils.isNotBlank(this.getEntry_id())
                && StringUtils.isNotBlank(this.getData_id());
    }
    @Override
    public String toString() {
        return "FormDataUpdateParam{" +
                "app_id='" + app_id + '\'' +
                ", entry_id='" + entry_id + '\'' +
                ", data_id='" + data_id + '\'' +
                ", data=" + data +
                ", is_start_trigger=" + is_start_trigger +
                ", transaction_id='" + transaction_id + '\'' +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/form/FormQueryParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.core.jiandaoyun.model.form;
import com.doumee.core.jiandaoyun.model.base.PageBaseParam;
import org.apache.commons.lang3.StringUtils;
public class FormQueryParam extends PageBaseParam {
    private String app_id;
    public String getApp_id() {
        return app_id;
    }
    public void setApp_id(String app_id) {
        this.app_id = app_id;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getApp_id()) && super.isValid();
    }
    @Override
    public String toString() {
        return "FormQueryParam{" +
                "skip=" + super.getSkip() +
                ", limit=" + super.getLimit() +
                ", app_id=" + app_id +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/http/ApiClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
package com.doumee.core.jiandaoyun.model.http;
import com.doumee.core.jiandaoyun.util.LimitUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.Charsets;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.io.EmptyInputStream;
import org.apache.http.message.BasicHeader;
import org.apache.http.ssl.SSLContextBuilder;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public abstract class ApiClient {
    /**
     * apiKey
     */
    private String apiKey;
    /**
     * åœ°å€
     */
    private String host;
    /**
     * é»˜è®¤ç‰ˆæœ¬
     */
    private String defaultVersion;
    /**
     * åˆæ³•版本
     */
    private List<String> validVersionList;
    public ApiClient(String apiKey, String host) {
        this.apiKey = apiKey;
        this.host = host;
    }
    public String getApiKey() {
        return apiKey;
    }
    public void setApiKey(String apiKey) {
        this.apiKey = apiKey;
    }
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    public String getDefaultVersion() {
        return defaultVersion;
    }
    public void setDefaultVersion(String defaultVersion) {
        this.defaultVersion = defaultVersion;
    }
    public List<String> getValidVersionList() {
        return validVersionList;
    }
    public void setValidVersionList(List<String> validVersionList) {
        this.validVersionList = validVersionList;
    }
    /**
     * ç”Ÿæˆ path
     *
     * @param version - ç‰ˆæœ¬å·
     * @param path    - è·¯å¾„
     * @return æŽ¥å£çš„路径
     */
    public abstract String generatePath(String version, String path);
    /**
     * èŽ·å¾—åˆæ³•çš„ç‰ˆæœ¬å·
     *
     * @param version - ç‰ˆæœ¬å·
     * @return åˆæ³•的版本号
     */
    public String getValidVersion(String version) {
        if (this.getValidVersionList() != null && this.getValidVersionList().contains(version)) {
            return version;
        }
        return this.getDefaultVersion();
    }
    /**
     * å‘送POST请求
     *
     * @param param - è¯·æ±‚参数
     * @return æŽ¥å£è¿”回参数
     */
    public Map<String, Object> sendPostRequest(HttpRequestParam param) throws Exception {
        if (param == null || StringUtils.isBlank(param.getPath())) {
            throw new RuntimeException("缺失参数!");
        }
        HttpClient client = getSSLHttpClient();
        Header[] headers = getHttpHeaders(this.getApiKey());
        String url = this.host + param.getPath();
        HttpRequestBase request = new HttpPost(url);
        // è¯·æ±‚参数
        if (param.getData() != null) {
            ObjectMapper queryMap = new ObjectMapper();
            HttpEntity entity = new StringEntity(queryMap.writeValueAsString(param.getData()), Charsets.UTF_8);
            ((HttpPost) request).setEntity(entity);
        }
        // è®¾ç½®è¯·æ±‚头
        request.setHeaders(headers);
        // é™æµé˜»å¡ž
        LimitUtil.tryBeforeRun();
        // å‘送请求并获取返回结果
        HttpResponse response = client.execute(request);
        // è¿”回状态码
        int statusCode = response.getStatusLine().getStatusCode();
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> result = new HashMap<>();
        // æœ‰éƒ¨åˆ†æŽ¥å£ç›´æŽ¥è¿”回 æ²¡æœ‰æ•°æ®
        // fix:不能用content-length大于0判断,response header为gzip编码方式的情况下为-1
        if (!(response.getEntity().getContent() instanceof EmptyInputStream)) {
            result = (Map<String, Object>) mapper.readValue(response.getEntity().getContent(), Object.class);
        }
        if (statusCode >= 400) {
            throw new RuntimeException("请求错误,statusCode:" + statusCode + ",Error Code: " + result.get("code") + ", Error Msg: " + result.get("msg"));
        } else {
            // å¤„理返回结果
            return result;
        }
    }
    private static HttpClient getSSLHttpClient() throws Exception {
        //信任所有
        SSLContext sslContext =
                new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
        return HttpClients.custom().setSSLSocketFactory(sslsf).build();
    }
    /**
     * èŽ·å–è¯·æ±‚å¤´ä¿¡æ¯
     *
     * @return è¯·æ±‚头信息
     */
    private Header[] getHttpHeaders(String apiKey) {
        List<Header> headerList = new ArrayList<>();
        headerList.add(new BasicHeader("Authorization", "Bearer " + apiKey));
        headerList.add(new BasicHeader("Content-Type", "application/json;charset=utf-8"));
        return headerList.toArray(new Header[headerList.size()]);
    }
    public Map<String, Object> httpPostFile(String url, String token, File file) throws Exception {
        HttpClient client = getSSLHttpClient();
        HttpPost httpPost = new HttpPost(url);
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        httpPost.addHeader("token", token);
        builder.addBinaryBody("file", file, ContentType.MULTIPART_FORM_DATA, file.getName());
        // ä¼ é€’ token
        builder.addTextBody("token", token);
        StringBody tokenBody = new StringBody(token, ContentType.MULTIPART_FORM_DATA);
        builder.addPart("token", tokenBody);
        HttpEntity entity = builder.build();
        httpPost.setEntity(entity);
        // é™æµé˜»å¡ž
        LimitUtil.tryBeforeRun();
        // å‘送请求并获取返回结果
        HttpResponse response = client.execute(httpPost);
        // è¿”回状态码
        int statusCode = response.getStatusLine().getStatusCode();
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> result = new HashMap<>();
        // æœ‰éƒ¨åˆ†æŽ¥å£ç›´æŽ¥è¿”回 æ²¡æœ‰æ•°æ®
        // fix:不能用content-length大于0判断,response header为gzip编码方式的情况下为-1
        if (!(response.getEntity().getContent() instanceof EmptyInputStream)) {
            result = (Map<String, Object>) mapper.readValue(response.getEntity().getContent(), Object.class);
        }
        if (statusCode >= 400) {
            throw new RuntimeException("请求错误,statusCode:" + statusCode + ",Error Code: " + result.get("code") + ", Error Msg: " + result.get("msg"));
        } else {
            // å¤„理返回结果
            return result;
        }
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/http/HttpRequestParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.doumee.core.jiandaoyun.model.http;
import java.util.Map;
public class HttpRequestParam {
    /**
     * è¯·æ±‚路径
     */
    private String path;
    /**
     * è¯·æ±‚参数
     */
    private Map<String, Object> data;
    public HttpRequestParam() {
    }
    public HttpRequestParam(String path, Map<String, Object> data) {
        this.path = path;
        this.data = data;
    }
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
    public Map<String, Object> getData() {
        return data;
    }
    public void setData(Map<String, Object> data) {
        this.data = data;
    }
    @Override
    public String toString() {
        return "HttpRequestParam{" +
                "path='" + path + '\'' +
                ", data=" + data +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/BasePushRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.doumee.core.jiandaoyun.model.request;
import lombok.Data;
@Data
public class BasePushRequest<T> {
    private T data;
    private String op;//"操作类型 data_update"
    private Long opTime;//时间戳1766975613395
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/DepartmentPushData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.core.jiandaoyun.model.request;
import lombok.Data;
@Data
public class DepartmentPushData {
    private String _id;
    private String name;
    private Integer type;
    private String dept_no;
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/FilePushData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.doumee.core.jiandaoyun.model.request;
import lombok.Data;
@Data
public class FilePushData {
    /**
     * {
     *    "mime": "image/jpeg",
     *    "name": "微信图片_20240909171527.jpg",
     *    "size": 66851,
     *    "url": "https://files.jiandaoyun.com/b3353092-0961-4766-b0f0-c0fd46d21a00?attname=%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20240909171527.jpg&e=1768273199&token=IAM-0WcXoIsrkVmXepo5BSXTXDcIPX-DF4zkUslHbLwm:1Hb-HdLvmhbEYzNaAf6_7OrpyA4="
     *    }
     */
    private String mime;
    private String name;
    private Integer size;
    private String url;
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/MemberPushData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.doumee.core.jiandaoyun.model.request;
import lombok.Data;
import java.util.List;
@Data
public class MemberPushData{
    private String _id;
    private String appId;
    private String code;
    private String createTime;// "2025-12-26T03:08:39.123Z",
    private String updateTime;
    private String username;
    private String entryId;
    private String sex;
    private String job_date;
    private String can_visit;//可拜访 ä¸å¯æ‹œè®¿
    private String phone;
    private String name;
    private String idcardno;
    private String formName;
    private String deleteTime;
    private Object flowState;
    private List<FilePushData> imgurl;
    private String position;//岗位名称
    private String status;//"在职;离职"
    private UserPushData creator;
    private DepartmentPushData department;
    private UserPushData updater;
    private UserPushData deleter;
    private UserPushData user;//关联内部人员
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/MemberStatusSubmitData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.doumee.core.jiandaoyun.model.request;
import lombok.Data;
@Data
public class MemberStatusSubmitData {
    private String info;
    private int status;
    private String username ;
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/request/UserPushData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.core.jiandaoyun.model.request;
import lombok.Data;
@Data
public class UserPushData {
    private String _id;
    private String name;
    private Integer status;
    private Integer type;
    private String username;
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/role/RoleGroupListQueryParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.doumee.core.jiandaoyun.model.role;
import com.doumee.core.jiandaoyun.model.base.PageBaseParam;
public class RoleGroupListQueryParam extends PageBaseParam {
    private boolean has_internal;
    private boolean has_sync;
    public boolean isHas_internal() {
        return has_internal;
    }
    public void setHas_internal(boolean has_internal) {
        this.has_internal = has_internal;
    }
    public boolean isHas_sync() {
        return has_sync;
    }
    public void setHas_sync(boolean has_sync) {
        this.has_sync = has_sync;
    }
    @Override
    public String toString() {
        return "RoleGroupListQueryParam{" +
                "skip=" + super.getSkip() +
                ", limit=" + super.getLimit() +
                ", has_internal=" + has_internal +
                ", has_sync=" + has_sync +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/role/RoleListQueryParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.doumee.core.jiandaoyun.model.role;
import com.doumee.core.jiandaoyun.model.base.PageBaseParam;
public class RoleListQueryParam extends PageBaseParam {
    private boolean has_internal;
    private boolean has_sync;
    public boolean isHas_internal() {
        return has_internal;
    }
    public void setHas_internal(boolean has_internal) {
        this.has_internal = has_internal;
    }
    public boolean isHas_sync() {
        return has_sync;
    }
    public void setHas_sync(boolean has_sync) {
        this.has_sync = has_sync;
    }
    public boolean isValid() {
        return super.isValid();
    }
    @Override
    public String toString() {
        return "RoleListQueryParam{" +
                "skip=" + super.getSkip() +
                ", limit=" + super.getLimit() +
                ", has_internal=" + has_internal +
                ", has_sync=" + has_sync +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/role/RoleMemberQueryParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.core.jiandaoyun.model.role;
import com.doumee.core.jiandaoyun.model.base.PageBaseParam;
public class RoleMemberQueryParam extends PageBaseParam {
    private Integer role_no;
    public Integer getRole_no() {
        return role_no;
    }
    public void setRole_no(Integer role_no) {
        this.role_no = role_no;
    }
    public boolean isValid() {
        return this.getRole_no() != null && super.isValid();
    }
    @Override
    public String toString() {
        return "RoleMemberQueryParam{" +
                "skip=" + super.getSkip() +
                ", limit=" + super.getLimit() +
                ", role_no=" + role_no +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/role/RoleUpdateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.doumee.core.jiandaoyun.model.role;
import org.apache.commons.lang3.StringUtils;
public class RoleUpdateParam {
    private String name;
    private Integer group_no;
    private Integer role_no;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getGroup_no() {
        return group_no;
    }
    public void setGroup_no(Integer group_no) {
        this.group_no = group_no;
    }
    public Integer getRole_no() {
        return role_no;
    }
    public void setRole_no(Integer role_no) {
        this.role_no = role_no;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getName()) && this.getRole_no() != null && this.getGroup_no() != null;
    }
    @Override
    public String toString() {
        return "RoleUpdateParam{" +
                "name='" + name + '\'' +
                ", group_no=" + group_no +
                ", role_no=" + role_no +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/user/UserCreateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.doumee.core.jiandaoyun.model.user;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
public class UserCreateParam {
    private String name;
    /**
     * ç”¨æˆ·å ç”±æ•°å­—字母和下划线组成
     */
    private String username;
    /**
     * éžå¿…å¡«
     */
    private List<Integer> departments;
    public UserCreateParam() {
    }
    public UserCreateParam(String name, String userName) {
        this.name = name;
        this.username = userName;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public List<Integer> getDepartments() {
        return departments;
    }
    public void setDepartments(List<Integer> departments) {
        this.departments = departments;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getName()) && StringUtils.isNotBlank(this.getUsername());
    }
    @Override
    public String toString() {
        return "UserCreateParam{" +
                "name='" + name + '\'' +
                ", username='" + username + '\'' +
                ", departments=" + departments +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/user/UserEntityModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.core.jiandaoyun.model.user;
import lombok.Data;
import java.util.List;
/**
 * äººå‘˜å®žä½“参数
 */
@Data
public class UserEntityModel {
  private Integer  dept_no;// Number  éƒ¨é—¨ç¼–号,企业内唯一 ä¸åŒä¼ä¸šä¹‹é—´å¯èƒ½å­˜åœ¨é‡å¤
  private String  username;// String  æˆå‘˜çš„编号,企业内唯一  ä¸åŒä¼ä¸šä¹‹é—´å¯èƒ½å­˜åœ¨é‡å¤
  private String  name;//  String æ˜µç§°
  private List<Long> departments;//Number[]    æˆå‘˜æ‰€åœ¨éƒ¨é—¨ç¼–号列表
  private Integer type;//Number成员类 0: å¸¸è§„成员2: ä¼ä¸šäº’联外部对接人
  private Integer   status;//  Number æˆå‘˜çŠ¶æ€ 0: æœªç¡®è®¤çš„æˆå‘˜ 1: å·²åŠ å…¥
  private String   integrate_id;//  String  é›†æˆæ¨¡å¼åŒæ­¥æˆå‘˜å…³è” ID   ä»…在集成模式下返回,且在企业互联接口(外部对接人)不返回
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/model/user/UserUpdateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.doumee.core.jiandaoyun.model.user;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
public class UserUpdateParam {
    private String name;
    private String userName;
    /**
     * éžå¿…å¡«
     */
    private List<Integer> departmentList;
    public UserUpdateParam() {
    }
    public UserUpdateParam(String name, String userName) {
        this.name = name;
        this.userName = userName;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public List<Integer> getDepartmentList() {
        return departmentList;
    }
    public void setDepartmentList(List<Integer> departmentList) {
        this.departmentList = departmentList;
    }
    public boolean isValid() {
        return StringUtils.isNotBlank(this.getName()) && StringUtils.isNotBlank(this.getUserName());
    }
    @Override
    public String toString() {
        return "UserCreateParam{" +
                "name='" + name + '\'' +
                ", userName='" + userName + '\'' +
                ", departmentList=" + departmentList +
                '}';
    }
}
server/jiandaoyun_service/src/main/java/com/doumee/core/jiandaoyun/util/LimitUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.doumee.core.jiandaoyun.util;
import java.util.Arrays;
import java.util.List;
public class LimitUtil {
    private static volatile int seq = 0;
    private static final int bucket = 1000;
    private static volatile List<Long> requestTimeList = Arrays.asList(0L, 0L, 0L, 0L, 0L);
    private LimitUtil() {
    }
    /**
     * é™æµå®žçް ç”¨ static synchronized ä¿®é¥° è¡¨ç¤º å¯¹ç±»ä¸Šé”
     *
     * @throws InterruptedException
     */
    public static synchronized void tryBeforeRun() throws InterruptedException {
        long now = System.currentTimeMillis();
        // å½“前时间 ä¸Ž å‰limit个请求的时间 ä½œæ¯”较
        long interval = now - requestTimeList.get(seq);
        if (interval < 0) {
            // æ‰§è¡Œæ—¶é—´: t[seq]+bucket=now-interval+bucket
            // ç­‰å¾…æ—¶é—´: bucket-interval
            Thread.sleep(bucket - interval);
            // é‡æ–°ç­‰å¾…
            tryBeforeRun();
        }
        if (interval < bucket) {
            requestTimeList.set(seq, requestTimeList.get(seq) + bucket);
            Thread.sleep(bucket - interval);
        } else {
            requestTimeList.set(seq, now);
        }
        seq = (seq + 1) % requestTimeList.size();
    }
}
server/pom.xml
@@ -18,6 +18,8 @@
      <module>system_gateway</module>
      <module>emaysms</module>
    <module>visits/device_service</module>
      <module>jiandaoyun_service</module>
      <module>base_serivce</module>
  </modules>
  <parent>
    <groupId>org.springframework.boot</groupId>
server/system_service/pom.xml
@@ -16,27 +16,25 @@
        <java.version>1.8</java.version>
        <swagger.version>2.9.2</swagger.version>
        <swagger.bootstrap-ui.version>1.9.6</swagger.bootstrap-ui.version>
        <fastjson.version>1.2.70</fastjson.version>
        <druid.version>1.2.0</druid.version>
        <mybatis.plus.version>3.5.7</mybatis.plus.version>
        <apache.shiro.version>1.7.0</apache.shiro.version>
        <oshi.version>5.7.0</oshi.version>
        <jna.version>5.14.0</jna.version>
        <poi.version>5.0.0</poi.version>
        <spring-cloud.version>2021.0.3</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
        <!-- jwtToken -->
        <jjwt.version>0.9.1</jjwt.version>
        <!-- hutool å·¥å…·ç›¸å…³-->
        <hutool.version>5.5.8</hutool.version>
        <!-- å¾®ä¿¡å°ç¨‹åº -->
        <weixin-java-miniapp.version>4.1.0</weixin-java-miniapp.version>
        <!-- å¾®ä¿¡æ”¯ä»˜ -->
        <weixin-java-pay.version>4.1.0</weixin-java-pay.version>
        <!-- é˜¿é‡Œäº‘OSS存储 -->
        <aliyun-oss.version>3.8.0</aliyun-oss.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.doumee</groupId>
            <artifactId>base_serivce</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
@@ -51,11 +49,6 @@
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>${apache.shiro.version}</version>
        </dependency>
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>${weixin-java-miniapp.version}</version>
        </dependency>
        <!-- MyBatis plus -->
        <dependency>
@@ -106,28 +99,6 @@
            <scope>runtime</scope>
        </dependency>
        <!-- swagger -->
         <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>io.swagger.core.v3</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>2.1.5</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
@@ -148,52 +119,11 @@
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--google kaptcha-->
        <dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
        </dependency>
        <!-- å·¥å…·åŒ… -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <!-- Excel导入/导出依赖包 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <!-- èŽ·å–ç³»ç»Ÿä¿¡æ¯ä¾èµ–åŒ… -->
        <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
            <version>${oshi.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>jna-platform</artifactId>
                    <groupId>net.java.dev.jna</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jna</artifactId>
                    <groupId>net.java.dev.jna</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.yulichang/mybatis-plus-join -->
        <dependency>
@@ -245,21 +175,6 @@
        <!--      <artifactId>weixin-java-pay</artifactId>-->
        <!--      <version>${weixin-java-pay.version}</version>-->
        <!--    </dependency>-->
        <!--  é˜¿é‡Œäº‘OSS-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>${aliyun-oss.version}</version>
        </dependency>
        <!-- aliyun sms SDK -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
server/system_service/src/main/java/com/doumee/config/DataSyncConfig.java
@@ -12,8 +12,19 @@
        int erp = 1;
        int hk = 2;
        int self = 0;
        int jdy = 3;
        int dingding = 4;
    }
    /**
     *
     å†…部组织人员数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
     */
    private Integer orgUserDataOrigin;
    /**
     * è®¿å®¢æ¥æºï¼š0自建 2以海康为主 1华晟ERP系统 2简道云
     */
    private Integer visitorDataOrigin;
    private Boolean needDealImg;
}
server/system_service/src/main/java/com/doumee/core/constants/ResponseStatus.java
@@ -12,6 +12,7 @@
@AllArgsConstructor
public enum ResponseStatus {
    // 400开头表示参数错误
    JDY_BAD_REQUEST(401, "error"),
    BAD_REQUEST(4000, "参数错误"),
    DATA_EMPTY(4001, "找不到目标数据,该记录不存在或已被删除"),
    DATA_EXISTS(4002, "记录已存在"),
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -60,6 +60,9 @@
    public static final String JK_PLAN_MAX_CLUSTER ="JK_PLAN_MAX_CLUSTER" ;
    public static final String JK_PLAN_DISTANCE_CLUSTER ="JK_PLAN_DISTANCE_CLUSTER" ;
    public static final String HK_PUSH_THIRD_URL ="HK_PUSH_THIRD_URL" ;
    public static final String JDY_CAR_SECRET = " JDY_CAR_SECRET";
    public static final String JDY_SECRET ="JDY_SECRET";
    public static final String JDY_MEMBER_PUSH_STATUS_URL ="JDY_MEMBER_PUSH_STATUS_URL";
    /**
     * æ“ä½œç±»åž‹ï¼Œç”¨äºŽåšæŽ¥å£éªŒè¯åˆ†ç»„
server/system_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -92,10 +92,11 @@
        Date nowAsISO = null;
        try {
            nowAsISO = df.parse(date);
        } catch (ParseException e) {
        } catch (Exception e) {
        }
        return nowAsISO;
    }
    public static Date getISO8601DateByStr2(String date)  {
        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
        if(date!=null ){
@@ -111,7 +112,7 @@
        Date nowAsISO = null;
        try {
            nowAsISO = df.parse(date);
        } catch (ParseException e) {
        } catch (Exception e) {
        }
        return nowAsISO;
    }
@@ -2967,49 +2968,7 @@
    public static void main(String[] args) {
        try {
            LocalDate today = LocalDate.now();
            // èŽ·å–å½“å‰æ—¥æœŸæ˜¯æ˜ŸæœŸå‡ 
            DayOfWeek dayOfWeek = today.getDayOfWeek();
            // è®¡ç®—周一和周五的日期
            LocalDate monday = today.with(DayOfWeek.MONDAY);
            LocalDate friday = today.with(DayOfWeek.FRIDAY);
            // è¾“出周一和周五的日期
            System.out.println("Monday: " + monday.toString());
            System.out.println("Friday: " + friday.toString());
//            Date date = getISO8601DateByStr("2024-04-15T07:46:36.014+08:00");
//            Date date1 = getISO8601DateByStr("2024-06-14T08:46:36.014+08:00");
//            System.out.println(DateUtil.afterMinutesDate(-5));
//            System.out.println(DateUtil.getWeekZhouOfDate(getDateFromString2("2025-11-06 00:00:00")));
//            System.out.println(getPlusTime2(DateUtil.addMonthToDate(new Date(),-1)));
//            System.out.println(DateUtil.getBeforMonthStr(new Date(),12));
//            List<Date> list =getThisMonthDateList();
//            for(Date d :list){
//                System.out.println(getPlusTime2(d));
//            }
//            List<Date> list1 =getThisYearMonthList();
//            for(Date d :list1){
//                System.out.println(getPlusTime2(d));
//            }
//            Date startTime = DateUtil.StringToDate("2024-05-01 08:00:00" ,"yyyy-MM-dd HH:mm:ss");
//            Date endTime = DateUtil.StringToDate("2024-05-01 17:00:00" ,"yyyy-MM-dd HH:mm:ss");
//            Long intervalTime = 35L;
//
//
//            DateUtil.checkDateInterval( startTime.toInstant()
//                    .atZone(ZoneId.systemDefault())
//                    .toLocalDateTime(), endTime.toInstant()
//                    .atZone(ZoneId.systemDefault())
//                    .toLocalDateTime(),intervalTime);
        System.out.println(getISO8601DateByStr("2025-12-26T03:08:39.123Z"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java
@@ -613,8 +613,8 @@
    public static void main(String[] args) throws Exception {
        try {
            FtpUtil ftpUtil = new FtpUtil("175.27.187.84", 21, "ftpuser","doumee168" );
            ftpUtil.uploadOnlineFile("https://profile-avatar.csdnimg.cn/default.jpg!1", "test"+"/", UUID.randomUUID().toString()+"test.jpg");
            FtpUtil ftpUtil = new FtpUtil("192.168.0.7", 21, "uftp","doumee@168" );
            ftpUtil.uploadOnlineFile("https://profile-avatar.csdnimg.cn/default.jpg!1", "member"+"/20251229/", UUID.randomUUID().toString()+"test.jpg");
            /*FtpUtil myFtp = new FtpUtil("106.15.54.228", 21, "ftptlg",
                    "tlg168.com");
            System.out.println(myFtp.upload("D:\\devices.sql", "/1111/devices.sql"));
server/system_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -229,6 +229,9 @@
    @ApiModelProperty(value = "组织编码路径")
    @TableField(exist = false)
    private String companyPath;
    @ApiModelProperty(value = "组织信息")
    @TableField(exist = false)
    private Company company;
    @ApiModelProperty(value = "负责人编码(关联member)")
    @TableField(exist = false)
    private Integer headId;
@@ -304,5 +307,7 @@
    @ApiModelProperty(value = "是否查询钥匙柜校验人员:0=否;1=是" )
    @TableField(exist = false)
    private Integer queryAuth;
    @ApiModelProperty(value = "部门部门集合" )
    @TableField(exist = false)
    private List<Long>  companyIdList;
}
server/system_service/src/main/java/com/doumee/service/business/third/model/ApiResponse.java
@@ -100,6 +100,26 @@
        return new ApiResponse<>(code, Boolean.FALSE, message, null, exceptionStack.toString());
    }
    public static void send200SuccessResponse(HttpServletResponse response) throws IOException {
        try {
            response.setStatus(200);
            response.getWriter().write("success");
            response.getWriter().close();
        }catch (Exception e){
        }
    }
    public static void send401FailResponse(HttpServletResponse response)  {
        try {
            response.setStatus(401);
            response.getWriter().write("fail");
            response.getWriter().close();
        }catch (Exception e){
        }
    }
    public static void outputCode(HttpServletResponse response, String code) {
server/system_timer/src/main/resources/application-dev.yml
@@ -34,8 +34,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 1 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 1 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
server/system_timer/src/main/resources/application-self.yml
@@ -34,8 +34,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 1 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 1 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
server/system_timer/src/main/resources/application-test.yml
@@ -34,8 +34,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 1 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 1 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
server/visits/admin_timer/pom.xml
@@ -8,15 +8,12 @@
        <artifactId>visits</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <artifactId>admin_timer</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.doumee</groupId>
server/visits/admin_timer/src/main/java/com/doumee/api/DingTalkTokenTimerController.java
@@ -1,26 +1,16 @@
package com.doumee.api;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.dingTalk.DingTalk;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.core.wx.WXConstant;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.system.SystemDictDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.Objects;
/**
 * @author æ±Ÿè¹„蹄
server/visits/admin_timer/src/main/java/com/doumee/api/HkUsersTimerController.java
@@ -37,8 +37,7 @@
    @PostMapping("/syncOrgData")
    public ApiResponse syncOrgData() {
        log.info("=========================开启定时同步海康组织数据===========start===========");
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp
            || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self) {
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk) {
            //如果是ERP系统同步下发
            hkSyncOrgUserService.syncOrgData(null);
        }
@@ -50,7 +49,6 @@
    public ApiResponse syncMemberDelData() {
        log.info("=========================开启定时重新下发删除人员数据===========start===========");
        hkSyncOrgUserService.syncMemberDelData();
        log.info("=========================开启定时重新下发删除人员数据===========end===========");
        return ApiResponse.success("开启定时重新下发删除人员数据成功");
    }
@@ -58,8 +56,7 @@
    @PostMapping("/syncUserData")
    public ApiResponse syncUserData() {
        log.info("=========================开启定时同步海康人员数据===========start===========");
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp
                || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self) {
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk) {
            //如果是ERP系统同步下发
            hkSyncOrgUserService.syncUserData(null);
        }
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/JiandaoyunCloudController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,174 @@
package com.doumee.api.business;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.FacePictureCheckRequest;
import com.doumee.core.haikang.model.param.respose.FacePictureCheckResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.jiandaoyun.model.request.BasePushRequest;
import com.doumee.core.jiandaoyun.model.request.MemberPushData;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.FtpUtil;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.core.utils.aliyun.ALiYunUtil;
import com.doumee.core.wms.model.response.WmsBaseDataResponse;
import com.doumee.core.wms.model.response.WmsBaseResponse;
import com.doumee.dao.business.model.CarUseBook;
import com.doumee.dao.business.model.Cars;
import com.doumee.dao.business.model.JkCabinetLog;
import com.doumee.dao.web.reqeust.VisitRecordDTO;
import com.doumee.dao.web.response.VisitRecordVO;
import com.doumee.service.business.CarUseBookService;
import com.doumee.service.business.CarsService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.sun.net.httpserver.HttpExchange;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URI;
import java.util.*;
/**
 * @author Eva.Caesar Liu
 * @date 2023/02/14 11:14
 */
@Api(tags = "【简道云】业务接口")
@RestController
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/web/jiandaoyun")
@Slf4j
public class JiandaoyunCloudController extends BaseController {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private MemberService memberService;
    public  static final String SECRET ="yKSKuO0LoFf06jWGrwwuGudK";
    @LoginNoRequired
    @ApiOperation("简道云推送用户信息")
    @PostMapping("/pushMemberData")
    @PreventRepeat
    public ApiResponse pushMemberData (HttpServletRequest request, HttpServletResponse response)  {
        BasePushRequest<MemberPushData> o = checkParamterValid(request,response,new TypeReference<BasePushRequest<MemberPushData>>(){});
        if(o == null || o.getData() ==null){
             return   ApiResponse.failed(401,"error");
        }
        int status =0;
        String info ="同步成功";
        try {
            memberService.dealJdyMemberInfo(o.getData());//处理简道云信息
        }catch (BusinessException e){
            status =1;
            info =e.getMessage();
            return  ApiResponse.failed(e.getCode(),e.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            status =1;
            info="同步发送异常";
            return  ApiResponse.failed(ResponseStatus.SERVER_ERROR.getCode(),e.getMessage());
        }finally {
            memberService.sendMemberInfoResult(o.getData().getUsername(),info,status);
        }
        return ApiResponse.success("success");
    }
    private <T> BasePushRequest<T>  checkParamterValid(HttpServletRequest request, HttpServletResponse response,TypeReference<BasePushRequest<T>> typeReference) {
        log.error("【简道云】 ç”¨è½¦ç”³è¯· =========getRequestURI:{}",request.getRequestURI());
        try {
            String jdy = request.getHeader("x-jdy-signature");
            StringBuilder json = new StringBuilder();
            String line;
            BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
            while ((line = reader.readLine()) != null) {
                json.append(line);
            }
            String payload = json.toString();
            Map<String, String> parameterMap = parseParameter(request.getQueryString());
            String nonce = parameterMap.get("nonce");
            String timestamp = parameterMap.get("timestamp");
            String signature = getSignature(nonce, payload, systemDictDataBiz.queryByCode(Constants.JDY_CONFIG,Constants.JDY_SECRET).getCode(), timestamp);
            log.error("【简道云】数据推送 =========getRequestURI:{}\n,queryParam:{}\n,payload:{}\n,签名:{}\n,正确签名:{}\n",request.getRequestURI(),request.getQueryString(),payload,jdy,signature);
            if (!signature.equals(jdy)) {
                return  null;
            }
            BasePushRequest<T>  t = JSONObject.parseObject(payload, typeReference.getType());
            return t;
        }catch (Exception e){
            e.printStackTrace();
            log.error("【简道云】 ç”¨è½¦ç”³è¯· =========异常:{}",e.getMessage());
        }
        return null;
    }
    @ApiOperation("简道云提交钥匙借还信息")
    @PostMapping("/submitKeyRecord")
    public ApiResponse<JkCabinetLog> submitKeyRecord (HttpServletRequest request, HttpServletResponse response) {
        JkCabinetLog log = new JkCabinetLog();
        log.setKeyId(1);
        log.setCreateDate(new Date());
        log.setMemberName("张三");
        return  ApiResponse.success(log);
    }
    private static String getSignature(String nonce, String payload, String secret, String timestamp) {
        return DigestUtils.sha1Hex(nonce + ":" + payload + ":" + secret + ":" + timestamp);
    }
    private static Map<String, String> parseParameter(String query) {
        Map<String, String> paramMap = new HashMap<String, String>();
        String[] params = query.split("&");
        for (String param : params) {
            String[] keyValue = param.split("=");
            paramMap.put(keyValue[0], keyValue[1]);
        }
        return paramMap;
    }
    public static void main(String[] args) {
/*
*/
        String url = "https://api.jiandaoyun.com/api/v1/automation/tenant/6909b792324dc197821895d1/hooks/6909d0fbdb93695219faa27eb068192dc4a9532972993159";
        JSONObject object = new JSONObject();
        object.put("status",0);
        object.put("username","20251104160000" );
        object.put("info", "这是备注");
        String result = HttpsUtil.postJson(url,JSONObject.toJSONString(object));
        System.out.println(result);
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java
@@ -177,20 +177,15 @@
    public ApiResponse<List<CompanyDTO>> findCompanyTreePage(Integer type){
        return ApiResponse.success(companyService.findCompanyTreePage(type));
    }
    @ApiOperation("全量部门信息同步 - é’‰é’‰")
    @PostMapping("/syncAllDingding")
//    @CloudRequiredPermission("business:company:sync")
    public ApiResponse syncAllDingding() throws ApiException {
        companyService.syncDDCompany();
        return ApiResponse.success("同步成功");
    @ApiOperation("获取内部人员组织来源配置")
    @GetMapping("/getSysConfig")
    public ApiResponse<DataSyncConfig> getSysConfig(){
        return ApiResponse.success(dataSyncConfig);
    }
    @ApiOperation("全量部门信息同步")
    @PostMapping("/syncAll")
    @CloudRequiredPermission("business:company:sync")
    @CloudRequiredPermission("business:company:create")
    public ApiResponse sync(@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            return ApiResponse.success( erpSyncService.syncCompany(null));
@@ -200,6 +195,12 @@
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self){
            hkSyncOrgUserFromSelfService.syncOrgData(this.getLoginUser(token));
            return ApiResponse.success("同步成功");
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.dingding){
            companyService.syncDDCompany();
            return ApiResponse.success("同步成功");
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.jdy){
            companyService.syncJdyCompany();
            return ApiResponse.success("同步成功");
        }
        return ApiResponse.failed("无效操作");
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java
@@ -327,7 +327,7 @@
    @ApiOperation("全量信息同步")
    @PostMapping("/syncAll")
    @CloudRequiredPermission("business:member:sync")
    @CloudRequiredPermission("business:member:create")
    public ApiResponse sync(@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            erpSyncService.syncUsers(null);
@@ -335,6 +335,12 @@
            hkSyncOrgUserFHKService.syncUserData(this.getLoginUser(token));
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self){
            hkSyncOrgUserFromSelfService.syncUserData(this.getLoginUser(token));
            return ApiResponse.success("同步成功");
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.dingding){
            memberService.syncDDUserInfo();
            return ApiResponse.success("同步成功");
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.jdy){
            memberService.syncJdyUserInfo();
            return ApiResponse.success("同步成功");
        }
        return ApiResponse.success("同步成功");
@@ -369,13 +375,6 @@
    }
    @ApiOperation("全量人员信息同步 - é’‰é’‰")
    @PostMapping("/syncAllDingding")
//    @CloudRequiredPermission("business:company:sync")
    public ApiResponse syncAllDingding() throws ApiException {
        memberService.syncDDUserInfo();
        return ApiResponse.success("同步成功");
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
@@ -49,17 +49,13 @@
                .build();
    }
    @Bean
    public Docket getDocket() {
    public Docket getDocket2() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(this.getApiInfo()).groupName("default")
                .host(host)
                .enable(enabled)
                .select()
                .apis( basePackage("com.doumee.cloud"))
//                .apis( basePackage("com.doumee.api.common"))
//                .apis( basePackage("com.doumee.cloud.openapi;com.doumee.api.common"))
//                .apis( basePackage("com.doumee.cloud.openapi"))
                .apis( basePackage("com.doumee.cloud;"))
                // è®¾ç½®éœ€è¦è¢«æ‰«æçš„类,这里设置为添加了@Api注解的类
//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                .paths(PathSelectors.any())
server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
@@ -24,4 +24,5 @@
  basic:
    enable: true
    username: admin
    password: 111111
    password: 111111
server/visits/dmvisit_service/pom.xml
@@ -24,6 +24,11 @@
        </dependency>
        <dependency>
            <groupId>com.doumee</groupId>
            <artifactId>jiandaoyun_service</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.doumee</groupId>
            <artifactId>device_service</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CompanyService.java
@@ -130,7 +130,9 @@
    void updateSort(UpdateCompanySortDTO dto);
    void ddPushCompanyInfo(String eventType, JSONObject eventData) throws ApiException;
    void ddPushCompanyInfo(String eventType, JSONObject eventData)  ;
    String syncDDCompany()throws ApiException;
    String syncDDCompany() ;
    String syncJdyCompany();
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -1,5 +1,6 @@
package com.doumee.service.business;
import com.doumee.core.jiandaoyun.model.request.MemberPushData;
import com.doumee.dao.web.response.DDAuthorizeVO;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
@@ -168,6 +169,11 @@
    void registerDriver(RegisterDriverDTO registerDriverDTO);
    /**
     * åŒæ­¥ç®€å•云用户
     * @return
     */
    String syncJdyUserInfo();
    /**
     * å¾®ä¿¡æŽˆæƒæŽ¥å£
     * @param code
     * @return
@@ -212,7 +218,11 @@
    void initPinyinTool();
    void syncDDUserInfo() throws ApiException;
    void syncDDUserInfo() ;
    void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData) throws ApiException;
    void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData)  ;
    void dealJdyMemberInfo(MemberPushData data);
    void sendMemberInfoResult(String username, String info, int status);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -1,5 +1,7 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -23,6 +25,11 @@
import com.doumee.core.haikang.model.param.respose.OrgOrUserAddResponse;
import com.doumee.core.haikang.model.param.respose.OrgUpdateFailureResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.jiandaoyun.api.arch.DeptApiClient;
import com.doumee.core.jiandaoyun.constants.HttpConstant;
import com.doumee.core.jiandaoyun.model.dept.DeptEntityModel;
import com.doumee.core.wms.model.response.WmsBaseDataResponse;
import com.doumee.core.wms.model.response.WmsBaseResponse;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
@@ -39,7 +46,6 @@
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.CompanyService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.taobao.api.ApiException;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
@@ -132,7 +138,7 @@
        company.setIsdeleted(Constants.ZERO);
        company.setHkStatus(Constants.ONE);
        company.setStatus(Constants.ZERO);
        company.setSortnum(Objects.isNull(company.getSortnum())?0:company.getSortnum());
        company.setSortnum(0);//默认最上面
        company.setHkDate(company.getCreateDate());
        company.setEditDate(company.getCreateDate());
        company.setEditor(company.getCreator());
@@ -169,8 +175,8 @@
        OrgEditRequest request = (getOrgHkEditModel(company));
        BaseResponse result =  HKService.editOrg(request);
        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
                //处理新增成功的数据,修改海康同步状态
                return true;
            //处理新增成功的数据,修改海康同步状态
            return true;
        }
        return false;
    }
@@ -180,7 +186,7 @@
        request.setIndexCodes(new String[]{company.getHkId()});
        BaseResponse<List<OrgUpdateFailureResponse>> result =  HKService.delBatchOrg(request);
        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
                //处理新增成功的数据,修改海康同步状态
            //处理新增成功的数据,修改海康同步状态
            if(result.getData()!=null && result.getData().size()==0){
                return true;
            }
@@ -292,7 +298,7 @@
        if(company.getId() == null|| StringUtils.isBlank(company.getName())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(company.getType()!=null && !(company.getType() ==0 || company.getType() ==1 || company.getType() ==-1)){
        if(company.getType()!=null && !(company.getType() ==-1 || company.getType() ==0 || company.getType() ==1)){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织类型不正确,请按要求填写~");
        }
        //查询名称不能重复
@@ -324,7 +330,6 @@
        company.setType(null);
        company.setEditDate(new Date());
        company.setEditor(user.getId());
        company.setHkStatus(Constants.ONE);
        company.setHkDate(company.getHkDate());
        company.setHkId(StringUtils.defaultString(model.getHkId(),UUID.randomUUID().toString().replace("-","")));
@@ -334,14 +339,14 @@
        //更新的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+"')")
                .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())){
             if(!editHkOrg(company)){
                 throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,组织同步下发失败,请稍后重试");
             }
            if(!editHkOrg(company)){
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,组织同步下发失败,请稍后重试");
            }
        }else{//如果没有下发过,直接新建安防平台组织
            if(!addHkOrg(company)){
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,组织同步下发失败,请稍后重试");
@@ -787,35 +792,45 @@
    // org_dept_remove éƒ¨é—¨åˆ é™¤ {"timeStamp":"1758785817760","eventId":"47e289f334e041719ed354052da474de","deptId":[1040735458]}
    @Override
    public void ddPushCompanyInfo(String eventType, JSONObject eventData) throws ApiException {
        JSONArray jsonArray = eventData.getJSONArray("deptId");
        if(jsonArray.isEmpty()){
            return;
        }
        if(eventType.equals("org_dept_remove")){
            //删除对应部门信息
            List<Long> deptIdList = new ArrayList<>();
            for (int i = 0; i < jsonArray.size(); i++) {
                Long deptId = jsonArray.getLong(i);
                 deptIdList.add(deptId);
    public void ddPushCompanyInfo(String eventType, JSONObject eventData)  {
        try {
            JSONArray jsonArray = eventData.getJSONArray("deptId");
            if(jsonArray.isEmpty()){
                return;
            }
            if(CollectionUtils.isNotEmpty(deptIdList)){
                syncDelCompany(deptIdList);
            }
        }else if(eventType.equals("org_dept_create")||eventType.equals("org_dept_modify")){
            for (int i = 0; i < jsonArray.size(); i++) {
                Company company  = companyMapper.selectOne(new QueryWrapper<Company>().lambda()
                        .eq(Company::getIsdeleted,Constants.ZERO)
                        .eq(Company::getErpId,jsonArray.getLong(i))
                );
                OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse = dingTalk.syncDepartmentInfo(jsonArray.getLong(i));
                if(Objects.isNull(company)){
                    getAddCompanyModel(deptGetResponse,company);
                }else{
                    getUpdateCompanyModel(deptGetResponse,company);
            if(eventType.equals("org_dept_remove")){
                //删除对应部门信息
                List<Long> deptIdList = new ArrayList<>();
                for (int i = 0; i < jsonArray.size(); i++) {
                    Long deptId = jsonArray.getLong(i);
                    deptIdList.add(deptId);
                }
                if(CollectionUtils.isNotEmpty(deptIdList)){
                    syncDelCompany(deptIdList);
                }
            }else if(eventType.equals("org_dept_create")||eventType.equals("org_dept_modify")){
                for (int i = 0; i < jsonArray.size(); i++) {
                    Company company  = companyMapper.selectOne(new QueryWrapper<Company>().lambda()
                            .eq(Company::getIsdeleted,Constants.ZERO)
                            .eq(Company::getErpId,jsonArray.getLong(i))
                    );
                    OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse = dingTalk.syncDepartmentInfo(jsonArray.getLong(i));
                    Company param = new Company();
                    param.setName(deptGetResponse.getName());
                    param.setErpId(deptGetResponse.getDeptId().toString());
                    param.setErpParentId(deptGetResponse.getParentId().toString());
                    if(Objects.isNull(company)){
                        param.setSortnum(deptGetResponse.getOrder().intValue());//默认最上面
                        getAddCompanyModel(param);
                    }else{
                        getUpdateCompanyModel(param,company);
                    }
                }
            }
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"数据同步失败");
        }
    }
    private void doHkDeleteOrg(List<Integer> delIds,List<String> delHkIds,  Date date) {
@@ -851,35 +866,106 @@
    }
    @Override
    public String syncDDCompany() throws ApiException {
        List<OapiV2DepartmentGetResponse.DeptGetResponse> list = dingTalk.syncAllDDDepartmentList();
        if(list !=null && list.size()>0){
            List<Company> addList = new ArrayList<>();
            List<Company> updateList = new ArrayList<>();
            List<Long> delIds = new ArrayList<>();//修改为使用钉钉id  erpId
            List<Company>  allList = companyMapper.selectList(new QueryWrapper<Company>().lambda()
                    .eq(Company::getIsdeleted,Constants.ZERO).eq(Company::getType,Constants.ONE));
            dealCompanyChangeList(list,addList,updateList,delIds,allList);
            if(delIds.size()>0){
                syncDelCompany(delIds);
    public String syncDDCompany()  {
        try {
            List<OapiV2DepartmentGetResponse.DeptGetResponse> list = dingTalk.syncAllDDDepartmentList();
            if(list !=null && list.size()>0){
                List<Company> addList = new ArrayList<>();
                List<Company> updateList = new ArrayList<>();
                List<Long> delIds = new ArrayList<>();//修改为使用钉钉id  erpId
                List<Company>  allList = companyMapper.selectList(new QueryWrapper<Company>().lambda()
                        .eq(Company::getIsdeleted,Constants.ZERO).eq(Company::getType,Constants.ONE));
                dealCompanyChangeList(list,addList,updateList,delIds,allList);
                if(delIds.size()>0){
                    syncDelCompany(delIds);
                }
                return "同步数据:新增【"+addList.size()+"】条,更新【"+updateList.size()+"】条,删除【"+delIds.size()+"】条";
            }else{
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "同步钉钉数据为空!");
            }
            return "同步数据:新增【"+addList.size()+"】条,更新【"+updateList.size()+"】条,删除【"+delIds.size()+"】条";
        }else{
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "同步钉钉数据为空!");
        }catch (Exception e){
            e.printStackTrace();
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "同步钉钉数据异常!");
        }
    }
    @Override
    public String syncJdyCompany() {
        //{
        //  "dept_no": 1,//数字 1 ä¸ºæ ¹éƒ¨é—¨ç¼–号。
        //  "has_child": true
        //}
        DeptApiClient deptApiClient = new DeptApiClient(HttpConstant.API_KEY, HttpConstant.HOST);
        try {
            Map<String, Object> result =  deptApiClient.deptList(1,true,deptApiClient.getDefaultVersion());
            if(result!=null && result.get("departments")!=null ){
                TypeReference<List<DeptEntityModel>> typeReference =     new TypeReference<List<DeptEntityModel>>(){};
                Object obj = result.get("departments");
                List<DeptEntityModel> list =  com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(obj), typeReference.getType());
                if(list !=null && list.size()>0){
                    List<Company> addList = new ArrayList<>();
                    List<Company> updateList = new ArrayList<>();
                    List<Long> delIds = new ArrayList<>();//修改为使用钉钉id  erpId
                    List<Company>  allList = companyMapper.selectList(new QueryWrapper<Company>().lambda()
                            .eq(Company::getIsdeleted,Constants.ZERO).eq(Company::getType,Constants.ONE));
                    dealCompanyChangeListJdy(list,addList,updateList,delIds,allList);
                    if(delIds.size()>0){
                        syncDelCompany(delIds);
                    }
                    return "同步数据:新增【"+addList.size()+"】条,更新【"+updateList.size()+"】条,删除【"+delIds.size()+"】条";
                }else{
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "同步钉钉数据为空!");
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "同步数据异常!");
        }
        return null;
    }
    private void dealCompanyChangeListJdy(List<DeptEntityModel> list, List<Company> addList, List<Company> updateList, List<Long> delIds, List<Company> allList) {
        Date date = new Date();
        for(DeptEntityModel respone : list){
            Company param = new Company();
            param.setName(respone.getName());
            param.setErpId(respone.getDept_no().toString());
            param.setErpParentId(respone.getParent_no() !=null?respone.getParent_no() .toString():null);
            param.setSortnum(respone.getSeq()!=null?respone.getSeq().intValue():null);//默认最上面
            //根据erpid查询企业信息,判断是新增还是更新
            Company company = findCompanyByERPId(allList,respone.getDept_no().toString());
            if(company == null){
                //如果是新增
                //封装新增组织对象数据
                addList.add(getAddCompanyModel(param));
            }else{
                updateList.add(getUpdateCompanyModel(param,company));
            }
        }
        if(allList!=null && allList.size()>0){
            for(Company  c : allList){
                if(!isCompanyDeletedJdy(c,list)){
                    delIds.add(Long.valueOf(c.getErpId()));
                }
            }
        }
    }
    private void dealCompanyChangeList(List<OapiV2DepartmentGetResponse.DeptGetResponse> list, List<Company> addList, List<Company> updateList, List<Long> delIds, List<Company> allList) {
        Date date = new Date();
        for(OapiV2DepartmentGetResponse.DeptGetResponse respone : list){
            Company param = new Company();
            param.setName(respone.getName());
            param.setErpId(respone.getDeptId().toString());
            param.setErpParentId(respone.getParentId().toString());
            param.setSortnum(respone.getOrder().intValue());//默认最上面
            //根据erpid查询企业信息,判断是新增还是更新
            Company company = findCompanyByERPId(allList,respone.getDeptId().toString());
            if(company == null){
                //如果是新增
                //封装新增组织对象数据
                addList.add(getAddCompanyModel(respone,new Company()));
                addList.add(getAddCompanyModel(param));
            }else{
                updateList.add(getUpdateCompanyModel(respone,company));
                updateList.add(getUpdateCompanyModel(param,company));
            }
        }
        if(allList!=null && allList.size()>0){
@@ -894,21 +980,20 @@
    /**
     * æ•´ç†é’‰é’‰åŒæ­¥ æ–°å¢žç»„织对象
     * @param deptGetResponse
     * @return
     */
    private Company getAddCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse,Company company) {
        return  syncDDAddCompanyModel(deptGetResponse,company);
    private Company getAddCompanyModel(Company param ) {
        return  syncDDAddCompanyModel(param);
    }
    /**
     * æ•´ç†é’‰é’‰åŒæ­¥ æ–°å¢ž éœ€è¦ä¿®æ”¹çš„组织对象
     * @param deptGetResponse
     * @param param
     * @param company
     * @return
     */
    private Company getUpdateCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse, Company company) {
        return syncDDEditCompanyModel(deptGetResponse,company);
    private Company getUpdateCompanyModel(Company param, Company company) {
        return syncDDEditCompanyModel(param,company);
    }
@@ -937,27 +1022,39 @@
        }
        return false;
    }
    private boolean isCompanyDeletedJdy(Company c, List<DeptEntityModel> list) {
        for(DeptEntityModel  m : list){
            if(StringUtils.equals(c.getErpId(),m.getDept_no().toString())){
                return  true;
            }
        }
        return false;
    }
    /**
     * æ•´ç† é’‰é’‰åŒæ­¥çš„ ç»„织信息
     * @param deptGetResponse
     * @param company
     * @param param
     * @return
     */
    public Company syncDDAddCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse,Company company){
        company = new Company();
    public Company syncDDAddCompanyModel(Company param ){
        Company  company = new Company();
        company.setCreateDate(new Date());
        company.setIsdeleted(Constants.ZERO);
        company.setStatus(Constants.ZERO);
        company.setName(deptGetResponse.getName());
        company.setErpId(deptGetResponse.getDeptId().toString());
        company.setErpParentId(deptGetResponse.getParentId().toString());
        company.setSortnum(deptGetResponse.getOrder().intValue());//默认最上面
//        company.setName(deptGetResponse.getName());
//        company.setErpId(deptGetResponse.getDeptId().toString());
//        company.setErpParentId(deptGetResponse.getParentId().toString());
//        company.setSortnum(deptGetResponse.getOrder().intValue());//默认最上面
        company.setName(param.getName());
        company.setErpId(param.getErpId() );
        company.setErpParentId(param.getErpParentId());
        company.setSortnum(param.getSortnum());//默认最上面
        company.setType(Constants.ONE);
        String rootOrgId = systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode();
        Company root =getRootCompanyModel(rootOrgId);
        company.setCompanyPath(company.getId()+"/");//名称路径
        company.setCompanyNamePath(company.getName());//名称路径
        company.setHkParentId(rootOrgId);
@@ -966,7 +1063,9 @@
            Company parent = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,company.getErpParentId())
                    .eq(Company::getIsdeleted,Constants.ZERO).last(" limit 1 "));
            if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,父级组织信息不存在~");
                //父级不存在的,直接挂在根组织下
                parent = root;
//                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,父级组织信息不存在~");
            }
//            if(StringUtils.isBlank(parent.getHkId())){
//                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,父级组织信息尚未同步下发成功~");
@@ -996,34 +1095,76 @@
        companyMapper.insert(company);
        company.setHkId(UUID.randomUUID().toString().replace("-",""));
        Company com = new Company();
        com.setId(company.getId());
        com.setCompanyPath(idPath+company.getId()+"/");
        companyMapper.updateById(com);
        //下发海康安防平台
        Boolean issueStatus = addHkOrg(company);
    /*    Boolean issueStatus = addHkOrg(company);
        Company com = new Company();
        com.setId(company.getId());
        com.setHkId(issueStatus?company.getHkId():null);
        com.setHkStatus(issueStatus?Constants.ONE:Constants.TWO);
        com.setCompanyPath(idPath+company.getId()+"/");
        companyMapper.updateById(com);
        companyMapper.updateById(com);*/
        return company;
    }
    /**
     * å†…置根组织
     * @param rootOrgId
     * @return
     */
    private Company getRootCompanyModel(String rootOrgId) {
        Company root = companyMapper.selectOne(new QueryWrapper<Company>().lambda()
                .eq(Company::getIsdeleted,Constants.ZERO)
                .isNull(Company::getParentId)
                .last(" limit 1 "));
        if(root== null){
            String name =systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_NAME).getCode();
            name =StringUtils.defaultString(name,"根组织");
            root = new Company();
            root.setCreateDate(new Date());
            root.setEditDate(new Date());
            root.setName(name);
            root.setType(-1);
            root.setHkId(rootOrgId);
            root.setHkStatus(Constants.ONE);
            root.setIsdeleted(Constants.ZERO);
            root.setStatus(Constants.ZERO);
            root.setHkCompanyPath(rootOrgId+"/");
            root.setCompanyNamePath(root.getName());
            root.setHkDate(new Date());
            root.setRemark("默认根组织");
            companyMapper.insert(root);
            root.setCompanyPath(root.getId()+"/");
            companyMapper.updateById(root);
        }
        return root;
    public Company syncDDEditCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse,Company company){
        company.setErpParentId(deptGetResponse.getParentId().toString());
    }
    public Company syncDDEditCompanyModel(Company param,Company company){
        company.setErpParentId(param.getErpParentId().toString());
        String rootOrgId = systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode();
        Company root =getRootCompanyModel(rootOrgId);
        String idPath = "";
        if(StringUtils.isNotBlank(company.getErpParentId())){
            Company parent = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,company.getErpParentId())
                    .eq(Company::getIsdeleted,Constants.ZERO).last("limit 1 "));
            Company parent = companyMapper.selectOne(new QueryWrapper<Company>().lambda()
                    .eq(Company::getErpId,company.getErpParentId())
                    .eq(Company::getType,Constants.ONE)
                    .eq(Company::getIsdeleted,Constants.ZERO)
                    .last("limit 1 "));
            if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,父级组织信息不存在~");
              parent =root;
            }
            if(Objects.nonNull(parent.getType())&&!Constants.equalsInteger(parent.getType(),-1)){
       /*   if(Objects.nonNull(parent.getType())&&!Constants.equalsInteger(parent.getType(),-1)){
                if(!Constants.equalsInteger(company.getType(),parent.getType())){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,组织信息错误");
                }
            }else if(Objects.isNull(parent.getType())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,组织信息错误");
            }
            }*/
            idPath = parent.getCompanyPath();
            company.setHkParentId(parent.getHkId());
            company.setCompanyPath(parent.getCompanyPath()+company.getId()+"/");
@@ -1031,28 +1172,26 @@
            company.setParentId(parent.getId());
        }
        company.setName(deptGetResponse.getName());
        company.setErpId(deptGetResponse.getDeptId().toString());
        company.setErpParentId(deptGetResponse.getParentId().toString());
        company.setSortnum(deptGetResponse.getOrder().intValue());//默认最上面
        company.setName(param.getName());
        company.setErpId(param.getErpId());
        company.setSortnum(param.getSortnum());//默认最上面
        company.setEditDate(new Date());
        company.setHkCompanyPath(company.getCompanyNamePath());
//        company.setHkCompanyPath(company.getCompanyNamePath());
        company.setHkStatus(Constants.ZERO);
        company.setStatus(Constants.ZERO);
        company.setSortnum(deptGetResponse.getOrder().intValue());
        company.setHkDate(company.getCreateDate());
        company.setEditDate(company.getCreateDate());
        company.setEditor(company.getCreator());
        company.setPinyin(Constants.getChinesePingyin(company.getName()));
        companyMapper.updateById(company);
        //下发海康安防平台
        Boolean issueStatus = editHkOrg(company);
     /*   Boolean issueStatus = editHkOrg(company);
        Company com = new Company();
        com.setId(company.getId());
        com.setHkId(issueStatus?company.getHkId():null);
        com.setHkStatus(issueStatus?Constants.ONE:Constants.TWO);
        com.setCompanyPath(idPath+company.getId()+"/");
        companyMapper.updateById(com);
        companyMapper.updateById(com);*/
        return company;
    }
@@ -1078,7 +1217,5 @@
            doHkDeleteOrg(delIds,delHKIds,new Date());
        }
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -217,6 +217,12 @@
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().like(Device::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getDoorNo() != null) {
            queryWrapper.lambda().like(Device::getDoorNo, pageWrap.getModel().getDoorNo());
        }
        if (pageWrap.getModel().getNo() != null) {
            queryWrapper.lambda().like(Device::getNo, pageWrap.getModel().getNo());
        }
        if (pageWrap.getModel().getDoorName() != null) {
            queryWrapper.lambda().like(Device::getDoorName, pageWrap.getModel().getDoorName());
        }
@@ -396,7 +402,7 @@
        }
        MqttClientCache.clientMapCache.put("device"+param.getId(),mqttClient);
        String curremak = "【"+param.getLoginUserInfo().getRealname()
                +"】于"+ DateUtil.getPlusTime2(new Date()) +"进行了"+(Constants.equalsInteger(param.getStatus(),Constants.ONE)?"【开闸】":"【关闸】")+"操作,开关【"+param.getChannelNo()+"】;";
                +"】于"+ DateUtil.getPlusTime2(new Date()) +"进行了"+(Constants.equalsInteger(param.getStatus(),Constants.ONE)?"【合闸】":"【分闸】")+"操作,开关【"+param.getChannelNo()+"】;";
        deviceMapper.update(null,new UpdateWrapper<Device>().lambda()
//                        .setSql("remark = concat(ifnull(remark,''),'"+curremak+"','\n')")
                .set(Device::getRemark,curremak)
@@ -414,7 +420,7 @@
        data.setVal1("远程控制");
        data.setVal2(curremak);
        data.setHappenTime(DateUtil.getPlusTime2(data.getCreateDate()));
        data.setVal3((Constants.equalsInteger(param.getStatus(),Constants.ONE)?"【开闸】":"【关闸】"));
        data.setVal3((Constants.equalsInteger(param.getStatus(),Constants.ONE)?"【合闸】":"【分闸】"));
        data.setVal4(param.getLoginUserInfo().getRealname());
        data.setVal5(param.getChannelNo());
        deviceDataMapper.insert(data);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -2,7 +2,9 @@
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.PhoneUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -23,6 +25,12 @@
import com.doumee.core.haikang.model.param.respose.UserAddResponse;
import com.doumee.core.haikang.model.param.respose.UserDelResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.jiandaoyun.api.arch.DeptApiClient;
import com.doumee.core.jiandaoyun.constants.HttpConstant;
import com.doumee.core.jiandaoyun.model.dept.DeptEntityModel;
import com.doumee.core.jiandaoyun.model.request.MemberPushData;
import com.doumee.core.jiandaoyun.model.request.UserPushData;
import com.doumee.core.jiandaoyun.model.user.UserEntityModel;
import com.doumee.dao.web.response.DDAuthorizeVO;
import com.doumee.service.business.third.TmsService;
import com.doumee.service.business.third.model.LoginUserInfo;
@@ -59,17 +67,21 @@
import com.doumee.service.business.third.model.response.TmsEmployeeListResponse;
import com.doumee.service.system.SystemLoginService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.taobao.api.ApiException;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.util.DataUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.CellType;
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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -86,6 +98,7 @@
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Slf4j
@Service
public class MemberServiceImpl implements MemberService {
@@ -153,7 +166,7 @@
    @Autowired
    private DingTalk dingTalk;
    @Value("${debug_model}")
    private Boolean isDebug;
    @Override
@@ -169,18 +182,18 @@
        Member insert = initAddMemberModel(member,loginUserInfo);
        //海康人员新增业务
        try {
             if(dealHkUserBiz(insert)){
                memberMapper.insert(insert);
                //创建系统登陆账号(默认无任何角色)
//             if(dealHkUserBiz(insert)){
            memberMapper.insert(insert);
            //创建系统登陆账号(默认无任何角色)
//                if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
                    //如果是内部组织人员,新增系统登陆账号
                    systemUserMapper.insert(createSystemUser(insert,systemDictDataBiz));
                    //处理培训有效期业务
                    dealTrainTIme(member,0,loginUserInfo);
            //如果是内部组织人员,新增系统登陆账号
            systemUserMapper.insert(createSystemUser(insert,systemDictDataBiz));
            //处理培训有效期业务
            dealTrainTIme(member,0,loginUserInfo);
//                }
            }else{
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息同步安防平台失败,请稍后重试!");
            }
//            }else{
//                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息同步安防平台失败,请稍后重试!");
//            }
        }catch (BusinessException e){
            //如果发生异常,删除已经创建的人员信息
            deleteHkUserBiz(new String[]{insert.getHkId()});
@@ -193,6 +206,7 @@
        }
        return insert;
    }
    public static SystemUser createSystemUser(Member insert,SystemDictDataBiz systemDictDataBiz) {
        SystemUser user = new SystemUser();
        // ç”Ÿæˆå¯†ç ç›
@@ -239,12 +253,12 @@
        insert.setHkDate(new Date());
        insert.setDdId(member.getDdId());
        insert.setErpId(member.getErpId());
        insert.setWorkStatus(Constants.ZERO);//默认在职
        insert.setCanVisit(Constants.ZERO);//默认不可访问
        insert.setWorkStatus(Constants.formatIntegerNum(member.getWorkStatus()));//默认在职
        insert.setCanVisit(Constants.formatIntegerNum(member.getCanVisit()));//默认不可访问
        insert.setAuthStatus(Constants.ZERO);
        insert.setName(member.getName());
        insert.setHkId(UUID.randomUUID().toString().replace("-",""));
        insert.setHkStatus(Constants.ONE);
        insert.setHkStatus(Constants.ZERO);
        insert.setSex(Constants.getSexByCardNo( member.getIdcardNo()));//根据身份证号获取性别
        insert.setJobDate(member.getJobDate());
        insert.setIsDangyuan(member.getIsDangyuan());
@@ -365,7 +379,7 @@
    private void isMemberParamValid(Member member) {
        if(member.getCompanyId() == null){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"所属组织不存在!");
        }
        if (StringUtils.isBlank(member.getPhone())||!PhoneUtil.isPhone(member.getPhone())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"电话号码格式有误");
@@ -387,13 +401,13 @@
                .eq(Member::getIsdeleted,Constants.ZERO) ) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "手机号【"+member.getPhone()+"】已被使用,不能重复");
        }
        Company company = companyMapper.selectById(member.getCompanyId());
        Company company = member.getCompany()!=null ?member.getCompany(): companyMapper.selectById(member.getCompanyId());
        if(company == null || Constants.equalsInteger(company.getIsdeleted(),Constants.ONE)){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,该组织信息已被删除,请刷新页面重试!");
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,该组织信息已被删除!");
        }
        if(StringUtils.isBlank(company.getHkId())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,该组织信息未同步安防平台,请先前往【组织管理】菜单进行维护!");
        }
//        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)){
@@ -477,7 +491,7 @@
            isNeedUpdateUser = true;
        }
        if(StringUtils.isNotBlank(member.getCode()) && StringUtils.equals(member.getPhone(),model.getCode())){
                // éªŒè¯å·¥å·
            // éªŒè¯å·¥å·
            SystemUser queryUserDto = new SystemUser();
            queryUserDto = new SystemUser();
            queryUserDto.setDeleted(Boolean.FALSE);
@@ -491,7 +505,7 @@
        }
        if(member.getCompanyId()!=null && !Constants.equalsInteger(member.getCompanyId(),model.getCompanyId())){
            //如果组织发生变化
            Company company = companyMapper.selectById(member.getCompanyId());
            Company company = member.getCompany()!=null ?member.getCompany(): companyMapper.selectById(member.getCompanyId());
            if(company == null || Constants.equalsInteger(company.getIsdeleted(),Constants.ONE)){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,该组织信息已被删除,请刷新页面重试!");
            }
@@ -508,15 +522,15 @@
        if(isNeedUpdateUser){
            //更新系统用户账号信息
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                            .set(SystemUser::getUpdateUser,member.getLoginUserInfo().getId())
                            .set(SystemUser::getUpdateTime,new Date())
                            .set(StringUtils.isNotBlank(member.getFaceImg()),SystemUser::getAvatar,member.getFaceImg())
                            .set(StringUtils.isNotBlank(member.getName()),SystemUser::getPinyin,Constants.getChinesePingyin(member.getName()))
                            .set(StringUtils.isNotBlank(member.getPhone()),SystemUser::getMobile,member.getPhone())
                            .set(StringUtils.isNotBlank(member.getPhone()),SystemUser::getUsername,member.getPhone())
                            .set(StringUtils.isNotBlank(member.getName()),SystemUser::getRealname,member.getName())
                            .set(member.getCompanyId() !=null,SystemUser::getCompanyId,member.getCompanyId())
                            .set(StringUtils.isNotBlank(member.getCode()),SystemUser::getEmpNo,member.getCode())
                    .set(SystemUser::getUpdateUser,member.getLoginUserInfo()!=null?member.getLoginUserInfo().getId():null)
                    .set(SystemUser::getUpdateTime,new Date())
                    .set(StringUtils.isNotBlank(member.getFaceImg()),SystemUser::getAvatar,member.getFaceImg())
                    .set(StringUtils.isNotBlank(member.getName()),SystemUser::getPinyin,Constants.getChinesePingyin(member.getName()))
                    .set(StringUtils.isNotBlank(member.getPhone()),SystemUser::getMobile,member.getPhone())
                    .set(StringUtils.isNotBlank(member.getPhone()),SystemUser::getUsername,member.getPhone())
                    .set(StringUtils.isNotBlank(member.getName()),SystemUser::getRealname,member.getName())
                    .set(member.getCompanyId() !=null,SystemUser::getCompanyId,member.getCompanyId())
                    .set(StringUtils.isNotBlank(member.getCode()),SystemUser::getEmpNo,member.getCode())
                    .eq(SystemUser::getMemberId,model.getId()));
        }
        if(Constants.equalsInteger(model.getCompanyType(),Constants.ZERO)
@@ -524,7 +538,7 @@
                && member.getTrainStartTime()!=null){
            TrainTime trainTime = new TrainTime();
            trainTime.setIsdeleted(Constants.ZERO);
            trainTime.setCreator(member.getLoginUserInfo().getId());
            trainTime.setCreator(member.getLoginUserInfo()!=null?member.getLoginUserInfo().getId():null);
            trainTime.setCreateDate(new Date());
            trainTime.setEdirot(trainTime.getCreator());
            trainTime.setEditDate(trainTime.getCreateDate());
@@ -609,7 +623,7 @@
        Member member=new Member();
        member.setId(id);
        member.setIsdeleted(Constants.ONE);
        member.setEditor(loginUserInfo.getId());
        member.setEditor(loginUserInfo!=null?loginUserInfo.getId():null);
        member.setEditDate(date);
        member.setHkStatus(Constants.ZERO);
        member.setRemark("人员已删除,等待删除门禁权限");
@@ -633,20 +647,20 @@
        );
        if (carsList!=null && carsList.size()>0){
            for(Cars car :carsList){
               if(Constants.equalsInteger(car.getAuthStatus(),Constants.ONE)){
                   carsMapper.update(null,new UpdateWrapper<Cars>().lambda()
                           .eq(Cars::getId,car.getId())
                           .set(Cars::getStartTime,null)
                if(Constants.equalsInteger(car.getAuthStatus(),Constants.ONE)){
                    carsMapper.update(null,new UpdateWrapper<Cars>().lambda()
                                    .eq(Cars::getId,car.getId())
                                    .set(Cars::getStartTime,null)
//                           .set(Cars::getMemberId,null)
                           .set(Cars::getEndTime,null)
                           .set(Cars::getAuthTimeType,null)
                           .set(Cars::getAuthStatus,Constants.ZERO)
                           .set(Cars::getEditDate,member.getEditDate())
                           .set(Cars::getEdirot,member.getEditor())
                   );
                   //删除已授权下发的包期授权
                   CarsServiceImpl.dealCancelBookBiz(car.getCode(),date,parkBookMapper);
               }
                                    .set(Cars::getEndTime,null)
                                    .set(Cars::getAuthTimeType,null)
                                    .set(Cars::getAuthStatus,Constants.ZERO)
                                    .set(Cars::getEditDate,member.getEditDate())
                                    .set(Cars::getEdirot,member.getEditor())
                    );
                    //删除已授权下发的包期授权
                    CarsServiceImpl.dealCancelBookBiz(car.getCode(),date,parkBookMapper);
                }
            }
        }
    }
@@ -683,14 +697,14 @@
            }
        }
        if(Constants.equalsInteger(memberRole.getTimeType(),Constants.ZERO) ){
           memberRole.setStartTime(null);
           memberRole.setEndTime(null);
            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;
                continue;
            }
            if(StringUtils.isBlank(member.getFaceId()) || !Constants.equalsInteger(member.getFaceStatus(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,用户【"+member.getName()+"】的人脸信息不满足授权条件,请返回完善后再进行该操作!");
@@ -729,7 +743,7 @@
            saveUserActionBiz(member,memberRole.getLoginUserInfo(), Constants.UserActionType.AUTH_ROLE,userActionJoinMapper,null);
            //重新授权
            HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,member,deviceRoleMapper,empowerMapper,deviceMapper);
         }
        }
    }
    public static   Integer   getRoleIdByParam(Integer[] param, Member member,MemberRoleMapper memberRoleMapper,DeviceRoleMapper deviceRoleMapper) {
@@ -744,7 +758,7 @@
            //检查用户情况权限原本就是空的, åˆ™æ— éœ€å¤„理
            return  0;
        }
         if((param == null || param.length==0 ) &&( roleList!=null && roleList.size()>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;
@@ -831,14 +845,14 @@
    @Override
    public     void empowerByList(Member member) {
        if(member.getIdList()!=null && member.getIdList().size() >0){
             List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                     .in(Member::getId,member.getIdList())
                     .eq(Member::getIsdeleted,Constants.ZERO));
             if(members!=null){
                 for(Member m : members){
                     HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,m,deviceRoleMapper,empowerMapper,deviceMapper);
                 }
             }
            List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                    .in(Member::getId,member.getIdList())
                    .eq(Member::getIsdeleted,Constants.ZERO));
            if(members!=null){
                for(Member m : members){
                    HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(null,m,deviceRoleMapper,empowerMapper,deviceMapper);
                }
            }
        }
    }
@@ -951,45 +965,47 @@
        }
        //校验参数 å¹¶ä¸”æ›´æ–°systemuser æ‰‹æœºå·å’Œå·¥å·ä¿¡æ¯ï¼ˆå¦‚果需要修改的话)
        Member model =   isMemberUpdateParamValid(updateMember);
        updateMember.setEditor(loginUserInfo.getId());
        updateMember.setEditor(loginUserInfo!=null?loginUserInfo.getId():null);
        updateMember.setEditDate(new Date());
        //海康人员新增业务
        if(dealHkUserForUpdateBiz(updateMember)){
            updateMember.setHkId(null);
            updateMember.setAuthStatus(Constants.ZERO);
            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
                    .set(Member::getStartTime,null)
                    .set(Member::getEndTime,null)
                    .set(Member::getRoleId,null)
                    .set(StringUtils.isNotBlank(updateMember.getPhone()),Member::getPhone,updateMember.getPhone())
                    .set(StringUtils.isNotBlank(updateMember.getName()),Member::getName,updateMember.getName())
                    .set(Member::getEditDate,updateMember.getEditDate())
                    .set(Member::getEditor,updateMember.getEditor())
                    .set(StringUtils.isNotBlank(updateMember.getName()),Member::getPinyin,Constants.getChinesePingyin(updateMember.getName()))
                    .set(StringUtils.isNotBlank(updateMember.getIdcardNo()),Member::getIdcardNo,updateMember.getIdcardNo())
                    .set(StringUtils.isNotBlank(updateMember.getIdcardDecode()),Member::getIdcardDecode,updateMember.getIdcardDecode())
                    .set( Member::getAuthStatus,Constants.ZERO)
                    .set(updateMember.getHkStatus()!=null,Member::getHkStatus,updateMember.getHkStatus())
                    .set(updateMember.getSex()!=null,Member::getSex,updateMember.getSex())
                    .set(updateMember.getFaceStatus()!=null,Member::getFaceStatus,updateMember.getFaceStatus())
                    .set(updateMember.getHkDate()!=null,Member::getHkDate,updateMember.getHkDate())
                    .set(StringUtils.isNotBlank(updateMember.getRemark()),Member::getRemark,updateMember.getRemark())
                    .set(StringUtils.isNotBlank(updateMember.getFaceImg()),Member::getFaceImg,updateMember.getFaceImg())
                    .set(updateMember.getFaceId()!=null,Member::getFaceId,updateMember.getFaceId())
                    .set(updateMember.getCompanyId()!=null,Member::getCompanyId,updateMember.getCompanyId())
                    .set(Member::getCode,updateMember.getCode())
//        if(dealHkUserForUpdateBiz(updateMember)){
        updateMember.setHkId(null);
        updateMember.setAuthStatus(Constants.ZERO);
        memberMapper.update(null,new UpdateWrapper<Member>().lambda()
                .set(Member::getStartTime,null)
                .set(Member::getEndTime,null)
                .set(Member::getRoleId,null)
                .set(StringUtils.isNotBlank(updateMember.getPhone()),Member::getPhone,updateMember.getPhone())
                .set(StringUtils.isNotBlank(updateMember.getName()),Member::getName,updateMember.getName())
                .set(Member::getEditDate,updateMember.getEditDate())
                .set(Member::getEditor,updateMember.getEditor())
                .set(StringUtils.isNotBlank(updateMember.getName()),Member::getPinyin,Constants.getChinesePingyin(updateMember.getName()))
                .set(StringUtils.isNotBlank(updateMember.getIdcardNo()),Member::getIdcardNo,updateMember.getIdcardNo())
                .set(StringUtils.isNotBlank(updateMember.getIdcardDecode()),Member::getIdcardDecode,updateMember.getIdcardDecode())
                .set( Member::getAuthStatus,Constants.ZERO)
                .set(updateMember.getHkStatus()!=null,Member::getHkStatus,updateMember.getHkStatus())
                .set(updateMember.getSex()!=null,Member::getSex,updateMember.getSex())
                .set(updateMember.getCanVisit()!=null,Member::getCanVisit,updateMember.getCanVisit())
                .set(updateMember.getFaceStatus()!=null,Member::getFaceStatus,updateMember.getFaceStatus())
                .set(updateMember.getHkDate()!=null,Member::getHkDate,updateMember.getHkDate())
                .set(updateMember.getHkDate()!=null,Member::getHkDate,updateMember.getHkDate())
                .set(StringUtils.isNotBlank(updateMember.getRemark()),Member::getRemark,updateMember.getRemark())
                .set(StringUtils.isNotBlank(updateMember.getFaceImg()),Member::getFaceImg,updateMember.getFaceImg())
                .set(updateMember.getFaceId()!=null,Member::getFaceId,updateMember.getFaceId())
                .set(updateMember.getCompanyId()!=null,Member::getCompanyId,updateMember.getCompanyId())
                .set(Member::getCode,updateMember.getCode())
//                    .set(StringUtils.isNotBlank(updateMember.getCode()),Member::getCode,updateMember.getCode())
                    .set( updateMember.getPositionId()!=null,Member::getPositionId,updateMember.getPositionId())
                    .set( updateMember.getIsDangyuan()!=null,Member::getIsDangyuan,updateMember.getIsDangyuan())
                    .set( updateMember.getJobDate()!=null,Member::getJobDate,updateMember.getJobDate())
                    .eq(Member::getId,updateMember.getId()));
            dealTrainTIme(updateMember,1,loginUserInfo);
            cancelAllMemberEmpower(updateMember,memberRoleMapper,empowerMapper);
            //记录操作日志
            saveUserActionBiz(updateMember,loginUserInfo,Constants.UserActionType.EDIT,userActionJoinMapper,null);
        }else{
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息同步安防平台失败,请稍后重试!");
        }
                .set( updateMember.getPositionId()!=null,Member::getPositionId,updateMember.getPositionId())
                .set( updateMember.getIsDangyuan()!=null,Member::getIsDangyuan,updateMember.getIsDangyuan())
                .set( updateMember.getJobDate()!=null,Member::getJobDate,updateMember.getJobDate())
                .eq(Member::getId,updateMember.getId()));
        dealTrainTIme(updateMember,1,loginUserInfo);
        cancelAllMemberEmpower(updateMember,memberRoleMapper,empowerMapper);
        //记录操作日志
        saveUserActionBiz(updateMember,loginUserInfo,Constants.UserActionType.EDIT,userActionJoinMapper,null);
//        }else{
//            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息同步安防平台失败,请稍后重试!");
//        }
    }
    private void dealTrainTIme(Member updateMember, int i,LoginUserInfo loginUserInfo) {
@@ -1015,7 +1031,7 @@
    public static void saveUserActionBiz(Member updateMember,LoginUserInfo user, Constants.UserActionType type,UserActionJoinMapper userActionMapper,String content) {
        updateMember.setEditDate(updateMember.getEditDate()==null?new Date():updateMember.getEditDate());
       UserAction userAction=new UserAction();
        UserAction userAction=new UserAction();
        userAction.setIsdeleted(Constants.ZERO);
        userAction.setCreateDate(updateMember.getEditDate());
        userAction.setCreator(updateMember.getEditor());
@@ -1033,39 +1049,39 @@
        QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
        wrapper.lambda().ne(Member::getRemark,"人脸已同步最新");
        List<Member> list =memberMapper.selectList(wrapper);
       if(list!=null){
           String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                   +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
           for(Member m : list){
             String faceId=  HkSyncOrgUserToHKServiceImpl.dealMemberFace(m,path);
             if(StringUtils.isNotBlank(faceId)){
                 Member update = new Member();
                 update.setId(m.getId());
                 update.setFaceId(faceId);
                 update.setRemark("人脸已同步最新");
                 update.setFaceStatus(Constants.ONE);
                 memberMapper.updateById(update);
                 return true;
             }
           }
       }
       return false;
        if(list!=null){
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            for(Member m : list){
                String faceId=  HkSyncOrgUserToHKServiceImpl.dealMemberFace(m,path);
                if(StringUtils.isNotBlank(faceId)){
                    Member update = new Member();
                    update.setId(m.getId());
                    update.setFaceId(faceId);
                    update.setRemark("人脸已同步最新");
                    update.setFaceStatus(Constants.ONE);
                    memberMapper.updateById(update);
                    return true;
                }
            }
        }
        return false;
    }
    @Override
    public void delHkForce(Member member) {
      Member model  =memberMapper.selectById(member.getId());
       if(model ==null) {
        Member model  =memberMapper.selectById(member.getId());
        if(model ==null) {
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,人员信息不存在!");
       }
        }
        if(!Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,只有针对离职人员可进行该操作!");
       }
        }
        if(Constants.equalsInteger(model.getHkStatus(),Constants.ONE)){
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,该人员已被删除!");
       }
        }
        if(StringUtils.isBlank(model.getHkId())){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,该人员非安防平台创建人员,不能进行该操作!");
       }
        }
        HkSyncEmpowerServiceImpl.doHkDeleteUser(model.getId(),model.getHkId(),new Date(),memberMapper,memberCardMapper);
    }
    @Override
@@ -1074,23 +1090,23 @@
        if(model ==null) {
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,人员信息不存在!");
        }
       if(model.getCompanyId()!=null) {
           if(Constants.equalsInteger(member.getHeadStatus(),Constants.ONE)){
               //如果是取消主管
               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,null);
           }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,null);
           }
       }
        if(model.getCompanyId()!=null) {
            if(Constants.equalsInteger(member.getHeadStatus(),Constants.ONE)){
                //如果是取消主管
                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,null);
            }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,null);
            }
        }
    }
    @Override
@@ -1273,12 +1289,12 @@
        List<Member> list =  memberJoinMapper.selectList(queryWrapper);
        if(list!=null){
            for(Member m : list){
               if(m.getName()!=null){
                   Member u = new Member();
                   u.setId(m.getId());
                   u.setPinyin(Constants.getChinesePingyin(m.getName()));
                   memberMapper.updateById(u);
               }
                if(m.getName()!=null){
                    Member u = new Member();
                    u.setId(m.getId());
                    u.setPinyin(Constants.getChinesePingyin(m.getName()));
                    memberMapper.updateById(u);
                }
            }
        }
@@ -1316,7 +1332,7 @@
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getKeyword() != null) {
            queryWrapper.lambda().and( ms->ms.like(Member::getName,pageWrap.getModel().getKeyword())
                            .or().like(Member::getPhone,pageWrap.getModel().getKeyword())
                    .or().like(Member::getPhone,pageWrap.getModel().getKeyword())
                    .or().like(Member::getCode,pageWrap.getModel().getKeyword()));
        }
        if(pageWrap.getModel().getType() != null){
@@ -1576,7 +1592,7 @@
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            //门禁组信息
            List<DeviceRole> deviceRoleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
                            .select(DeviceRole::getId,DeviceRole::getName)
                    .select(DeviceRole::getId,DeviceRole::getName)
                    .eq(DeviceRole::getIsdeleted,Constants.ZERO));
            for (Member memberInfoDTO:memberIPage.getRecords()) {
                //获得门禁组名称数组
@@ -1642,8 +1658,8 @@
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.selectAll(Member.class)
                .selectAs(Company::getName,Member::getCompanyName)
        .selectAs(Position::getName,Member::getPositionName)
         .leftJoin(Position.class,Position::getId,Member::getPositionId)
                .selectAs(Position::getName,Member::getPositionName)
                .leftJoin(Position.class,Position::getId,Member::getPositionId)
                .selectAs(Member::getLastVisitDate,Member::getLastVisitDate)
                .select(" (select count(v.id) from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0 and v.status  in (7,8) ) as visitTimes");
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Member::getName,pageWrap.getModel().getName())
@@ -1682,14 +1698,14 @@
                .selectAs(Company::getCompanyNamePath,Member::getCompanyName)
                .select(" (select ua.remark from user_action ua where ua.MEMBER_ID=t.id and ua.ISDELETED=0 and ua.type="+actiontype+"  order by ua.CREATE_DATE desc  limit 1) as optRemark")
                .eq(Member::getIsdeleted,Constants.ZERO);
                queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getCreaterId()),Member::getEditor,pageWrap.getModel().getCreaterId());
                queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Member::getType,pageWrap.getModel().getType());
                queryWrapper
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getCreaterId()),Member::getEditor,pageWrap.getModel().getCreaterId());
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getType()),Member::getType,pageWrap.getModel().getType());
        queryWrapper
                .and(StringUtils.isNotBlank(pageWrap.getModel().getName()),ms->ms.like(Member::getPhone,pageWrap.getModel().getName())
                        .or().like(Member::getName,pageWrap.getModel().getName()))
                .and(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),
                        ms->ms.like(Company::getName,pageWrap.getModel().getCompanyName())
                        .or().like(Member::getVisitCompanyName,pageWrap.getModel().getCompanyName()))
                                .or().like(Member::getVisitCompanyName,pageWrap.getModel().getCompanyName()))
                .like(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,pageWrap.getModel().getIdcardNo())
                .eq(Member::getStatus,Constants.Status.FREEZE.getValue())
                .eq((pageWrap.getModel().getCompanyId())!=null,Company::getId,pageWrap.getModel().getCompanyId())
@@ -1797,7 +1813,7 @@
                .apply("to_days(LAST_VISIT_DATE)+ "+days+" < to_days(now())" )
                .orderByAsc(Member::getPinyin));
        if(CollectionUtils.isEmpty(memberList)){
           return;
            return;
        }
        List<Integer> memberIds = memberList.stream().map(m->m.getId()).collect(Collectors.toList());
        //冻结状态
@@ -2044,7 +2060,7 @@
    public List<MemberVO> getVisitedMember(CheckVisitedDTO checkVisitedDTO){
        List<Member> memberList = memberJoinMapper.selectJoinList(Member.class,new MPJLambdaWrapper<Member>()
                .selectAll(Member.class)
                        .selectAs(Company::getName,Member::getCompanyName)
                .selectAs(Company::getName,Member::getCompanyName)
                .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                .selectAs(Position::getName,Member::getPositionName)
                .leftJoin(Position.class,Position::getId,Member::getPositionId)
@@ -2106,6 +2122,10 @@
    }
    @Override
    public StagingDataVO stagingHead(StagingDataVO stagingHeadVO){
        //人员信息
@@ -2140,8 +2160,8 @@
                        .groupBy(Company::getId,Company::getName)
        );
        List<Map<String,Object>> retentionMaps = retentionJoinMapper.selectMaps(new MPJLambdaWrapper<Retention>()
                        .select(" count(1) as memberCount, type as memberType ")
                        .ne(Retention::getType,3)
                .select(" count(1) as memberCount, type as memberType ")
                .ne(Retention::getType,3)
                .groupBy(Retention::getType)
        );
        stagingHeadVO.setCompanyUsers(companyMaps);
@@ -2183,10 +2203,10 @@
                model.setPhone(ScientificNotationTUtil.convertToString(model.getPhone()));
                model.setIdcardNo(ScientificNotationTUtil.convertToString(model.getIdcardNo()));
                if(StringUtils.isBlank(model.getName())
                       &&StringUtils.isBlank(model.getIdcardNo())
                        &&StringUtils.isBlank(model.getIdcardNo())
                        &&StringUtils.isBlank(model.getPhone())
                        &&StringUtils.isBlank(model.getCompanyName())){
                      continue;
                    continue;
                }
                Member member = checkModelParam(model,newList,i,loginUserInfo,list,companyList,companyType,positionList);
                newList.add(member);
@@ -2220,8 +2240,8 @@
            for(Member insert: newList){
                //创建系统登陆账号(默认无任何角色)
//                if(Constants.equalsInteger(insert.getCompanyType(),Constants.ONE)){
                    //如果是内部组织人员,新增系统登陆账号
                    userList.add(createSystemUser(insert,systemDictDataBiz));
                //如果是内部组织人员,新增系统登陆账号
                userList.add(createSystemUser(insert,systemDictDataBiz));
//                }
            }
            if(userList.size()>0){
@@ -2355,7 +2375,7 @@
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void registerDriver(RegisterDriverDTO registerDriverDTO){
        if(Objects.isNull(registerDriverDTO)
        || StringUtils.isBlank(registerDriverDTO.getName())
                || StringUtils.isBlank(registerDriverDTO.getName())
                || StringUtils.isBlank(registerDriverDTO.getPassword())
                || StringUtils.isBlank(registerDriverDTO.getValidCode())
                || StringUtils.isBlank(registerDriverDTO.getPhone())
@@ -2371,7 +2391,7 @@
        };
        if(systemUserMapper.selectCount(new QueryWrapper<SystemUser>().lambda()
                .eq(SystemUser::getDeleted,Constants.ZERO)
                        .and(i->i.eq(SystemUser::getMobile,registerDriverDTO.getPhone()).or().eq(SystemUser::getUsername,registerDriverDTO.getPhone()))
                .and(i->i.eq(SystemUser::getMobile,registerDriverDTO.getPhone()).or().eq(SystemUser::getUsername,registerDriverDTO.getPhone()))
        )>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"手机号已注册!");
        };
@@ -2410,23 +2430,206 @@
     * åŒæ­¥é’‰é’‰å†…部员工信息
     */
    @Override
    public void syncDDUserInfo() throws ApiException {
        List<OapiV2UserGetResponse.UserGetResponse>  list = dingTalk.syncAllUserInfo();
        if(CollectionUtils.isEmpty(list)){
            return;
        }
        List<Member> addList = new ArrayList<>();
        List<Member> updateList = new ArrayList<>();
        List<String> delIds = new ArrayList<>();//修改为使用钉钉id  erpId
        List<Member>  allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                .eq(Member::getIsdeleted,Constants.ZERO)
                .eq(Member::getType,Constants.TWO));
        dealMemberChangeList(list,addList,updateList,delIds,allList);
    public void syncDDUserInfo(){
        try {
            List<OapiV2UserGetResponse.UserGetResponse>  list = dingTalk.syncAllUserInfo();
            if(CollectionUtils.isEmpty(list)){
                return;
            }
            log.error("钉钉人员信息同步行数:"+ list.size());
            log.error("钉钉人员信息同步内容:"+ JSONObject.toJSONString(list));
            List<Member> addList = new ArrayList<>();
            List<Member> updateList = new ArrayList<>();
            List<String> delIds = new ArrayList<>();//修改为使用钉钉id  erpId
            List<Member>  allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .eq(Member::getType,Constants.TWO));
            dealMemberChangeList(list,addList,updateList,delIds,allList);
        if(delIds.size()>0){
            syncDelMember(delIds);
            if(delIds.size()>0){
                syncDelMember(delIds);
            }
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"同步钉钉人员信息异常!");
        }
    }
    @Override
    @Async
    public void  sendMemberInfoResult(String username, String info, int status){
        try {
            String url = systemDictDataBiz.queryByCode(Constants.JDY_CONFIG,Constants.JDY_MEMBER_PUSH_STATUS_URL).getCode();
            log.error("==========推送人员{}:同步结果开始=====status={},username={},info={},url={}",username,status,info,url);
            JSONObject object = new JSONObject();
            object.put("status",status);
            object.put("username",username);
            object.put("info",info);
            String result = HttpsUtil.postJson(url,JSONObject.toJSONString(object));
            log.error("==========推送人员{}:同步结果结束=====",result);
        }catch (Exception e){
        }
    }
    /**
     * å¤„理简道云用户信息
     * @param data
     */
    @Override
    public void dealJdyMemberInfo(MemberPushData data){
        if(StringUtils.isBlank(data.getUsername())
                ||StringUtils.isBlank(data.getPhone())
                ||StringUtils.isBlank(data.getName())){
            throw  new BusinessException(ResponseStatus.JDY_BAD_REQUEST.getCode(),"人员信息不完整!");
        }
        //内部人员信息
        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                .eq( Member::getErpId,data.getUsername() )
                .eq( Member::getIsdeleted,Constants.ZERO )
                .eq( Member::getType,Constants.TWO )
                .last("limit 1"));
        if(member == null){
            //新增人员
            if(data.getDeleter()!=null){
                //如果是已经删除人员,不处理
                return;
            }
            member = getAddOrUpdateModelFromJDY(data,true);
            this.create(member);
        }else{
            //更新人员
            if(data.getDeleter()!=null){
                //如果是已经删除人员,不处理
                this.deleteById(member.getId(),null);
            }else{
                //更新人员信息
                Member updateMember =getAddOrUpdateModelFromJDY(data,false);
                updateMember.setId(member.getId());
                this.updateById(updateMember);
            }
        }
    }
    private Member getAddOrUpdateModelFromJDY(MemberPushData data, boolean add) {
        Member member =  new Member();
        member.setName(data.getName());
        member.setType(Constants.TWO);
        member.setIdcardType(Constants.ZERO);
        member.setIdcardNo(data.getIdcardno());
        member.setPhone(data.getPhone());
        if(StringUtils.isNotBlank(data.getSex())){
            member.setSex(StringUtils.equals(data.getSex(),"男")?0:1);
        }
        if(StringUtils.isNotBlank(data.getStatus())){
            member.setWorkStatus(StringUtils.equals(data.getStatus(),"在职")?0:1);
        }
        if(StringUtils.isNotBlank(data.getCan_visit())){
            member.setCanVisit(StringUtils.equals(data.getCan_visit(),"可拜访")?1:0);
        }
        member.setErpId(data.getUsername());
        if(data.getDepartment()!=null){
            member.setErpOrgId(data.getDepartment().getDept_no());
        }
        member.setHkStatus(Constants.ZERO);//待更新
        if(data.getImgurl()!=null &&data.getImgurl().size()>0){
            String imgurl = data.getImgurl().get(0).getUrl();
            if(StringUtils.isNotBlank(imgurl)){
                member.setImgurl(getMemberImgByJdyImg(imgurl));
                member.setFaceStatus(Constants.ZERO);
                member.setFaceImg(member.getImgurl());
            }
        }
        member.setCreateDate(DateUtil.getISO8601DateByStr(data.getCreateTime()));
        member.setEditDate(DateUtil.getISO8601DateByStr(data.getUpdateTime()));
        member.setCode(data.getCode());
        member.setJobDate(DateUtil.getISO8601DateByStr(data.getJob_date()));
        member.setIsdeleted(Constants.ZERO);
        if(add ){
            SystemUser c=   getSystemuserByErpId(data.getCreator());//查询创建人
            if(c!=null){
                member.setCreator(c.getId());
            }
        }
        SystemUser up=   getSystemuserByErpId(data.getUpdater()); //查询更新人
        if(up!=null){
            member.setEditor(up.getId());
        }
        //查询组织信息
        Company depart = companyMapper.selectOne(new QueryWrapper<Company>().lambda()
                .eq( Company::getErpId,data.getDepartment().getDept_no() )
                .eq( Company::getIsdeleted,Constants.ZERO ));
        if(depart!=null){
            member.setCompanyId(depart.getId());
        }
        member.setCompany(depart);
        return  member;
    }
    private String getMemberImgByJdyImg(String imgurl) {
        try {
            String folder =   systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            FtpUtil ftp = new FtpUtil(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_HOST).getCode(),
                    Integer.parseInt(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PORT).getCode()),
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_USERNAME).getCode(),
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PWD).getCode());
            String date = DateUtil.getNowShortDate()+"/";
            String name = UUID.randomUUID().toString();
            if(ftp.uploadOnlineFile(imgurl,folder+date,name)){
                log.error("=======上传简道云图片成功:result:{}=url:{}",date+name,imgurl);
                return date+name;
            }
        }catch (Exception e){
            log.error("=======上传简道云图片失败:url:{}",imgurl);
        }
        return null;
    }
    private SystemUser getSystemuserByErpId(UserPushData user) {
        if(user!=null &&StringUtils.isNotBlank(user.getUsername())){
            return   systemUserMapper.selectJoinOne(SystemUser.class,new MPJLambdaWrapper<SystemUser>().
                    selectAll(SystemUser.class )
                    .leftJoin(Member.class,Member::getId,SystemUser::getMemberId)
                    .eq(SystemUser::getDeleted,Boolean.FALSE)
                    .eq(Member::getErpId,user.getUsername())
                    .last("limit 1"));
        }
       return null;
    }
    @Override
    public String syncJdyUserInfo() {
        DeptApiClient deptApiClient = new DeptApiClient(HttpConstant.API_KEY, HttpConstant.HOST);
        try {
            Map<String, Object> result =  deptApiClient.deptMemberList(1,true,deptApiClient.getDefaultVersion());
            if(result!=null && result.get("users")!=null ){
                TypeReference<List<UserEntityModel>> typeReference =     new TypeReference<List<UserEntityModel>>(){};
                Object obj = result.get("users");
                List<UserEntityModel> list =  com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(obj), typeReference.getType());
                if(list !=null && list.size()>0){
                    List<Member> addList = new ArrayList<>();
                    List<Member> updateList = new ArrayList<>();
                    List<String> delIds = new ArrayList<>();//修改为使用钉钉id  erpId
                    List<Member>  allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                            .eq(Member::getIsdeleted,Constants.ZERO)
                            .eq(Member::getType,Constants.TWO));
                    dealMemberChangeListJdy(list,addList,updateList,delIds,allList);
                    if(delIds.size()>0){
                        syncDelMember(delIds);
                    }
                    return "同步数据:新增【"+addList.size()+"】条,更新【"+updateList.size()+"】条,删除【"+delIds.size()+"】条";
                }else{
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "同步钉钉数据为空!");
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "同步数据异常!");
        }
        return null;
    }
    private void syncDelMember(List<String> delIds) {
@@ -2462,25 +2665,63 @@
            }
        }
    }
    private void dealMemberChangeListJdy(List<UserEntityModel> list, List<Member> addList, List<Member> updateList, List<String> delIds, List<Member> allList) {
        Date date = new Date();
        for(UserEntityModel respone : list){
            //根据erpid查询企业信息,判断是新增还是更新
            Member param = new Member();
            param.setErpId(respone.getUsername());
            param.setName(respone.getName());
            param.setDdId(respone.getIntegrate_id());
            param.setCompanyIdList(respone.getDepartments());
            Member member = findMemberByERPId(allList,respone.getUsername());
            if(member == null){
                //如果是新增  //封装新增组织对象数据
                addList.add(syncDDAddMemberModel(param,new Member()));
            }else{
                updateList.add(syncDDEditMemberModel(param,member));
            }
        }
        if(allList!=null && allList.size()>0){
            for(Member m : allList){
                if(!isMemberDeletedJdy(m,list)){
                    delIds.add(m.getErpId());
                }
            }
        }
    }
    private Member getAddMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
        return  syncDDAddMemberModel(deptGetResponse,member);
        Member param = new Member();
        param.setErpId(deptGetResponse.getUnionid());
        param.setPhone(deptGetResponse.getMobile());
        param.setName(deptGetResponse.getName());
        param.setCode(deptGetResponse.getJobNumber());
        param.setDdId(deptGetResponse.getUserid());
        param.setCompanyIdList(deptGetResponse.getDeptIdList());
        return  syncDDAddMemberModel(param,member);
    }
    private Member getUpdateMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
        return  syncDDEditMemberModel(deptGetResponse,member);
        Member param = new Member();
        param.setErpId(deptGetResponse.getUnionid());
        param.setPhone(deptGetResponse.getMobile());
        param.setName(deptGetResponse.getName());
        param.setCode(deptGetResponse.getJobNumber());
        param.setDdId(deptGetResponse.getUserid());
        param.setCompanyIdList(deptGetResponse.getDeptIdList());
        return  syncDDEditMemberModel(param,member);
    }
    private Member syncDDAddMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
    private Member syncDDAddMemberModel(Member deptGetResponse,Member member) {
        member.setCreateDate(new Date());
        member.setErpId(deptGetResponse.getUnionid());
        member.setPhone(deptGetResponse.getMobile());
        member.setErpId(deptGetResponse.getErpId());
        member.setPhone(deptGetResponse.getPhone());
        member.setName(deptGetResponse.getName());
        member.setCode(deptGetResponse.getJobNumber());
        member.setDdId(deptGetResponse.getUserid());
        isMemberParamValidDetail(member,deptGetResponse.getDeptIdList());
        member.setCode(deptGetResponse.getCode());
        member.setDdId(deptGetResponse.getDdId());
        isMemberParamValidDetail(member,deptGetResponse.getCompanyIdList());
        //获取出生日期
        //脱敏操作
        Member insert = initAddMemberModel(member,null);
@@ -2505,7 +2746,7 @@
        }
        if(Objects.nonNull(deptIdList)){
            List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>().lambda().in(Company::getErpId,deptIdList)
                    .eq(Company::getType,Constants.ONE).eq(Company::getIsdeleted,Constants.ZERO)
                            .eq(Company::getType,Constants.ONE).eq(Company::getIsdeleted,Constants.ZERO)
//                    .isNotNull(Company::getHkId) æš‚时无法同步海康 å…ˆæ³¨é‡Š
            );
            if(CollectionUtils.isNotEmpty(companyList)){
@@ -2515,7 +2756,7 @@
        }
        member.setCompanyType(Constants.ONE);
        SystemUser queryUserDto = new SystemUser();
        queryUserDto.setUsername(member.getPhone());
        queryUserDto.setUsername(StringUtils.defaultString(member.getPhone(),member.getErpId()));
        queryUserDto.setDeleted(Boolean.FALSE);
        SystemUser user = systemUserMapper.selectOne(new QueryWrapper<>(queryUserDto).last("limit 1"));
        if (user != null) {
@@ -2532,14 +2773,14 @@
            }
        }
    }
    public Member syncDDEditMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member updateMember) {
    public Member syncDDEditMemberModel(Member deptGetResponse1,Member updateMember) {
        updateMember.setEditDate(new Date());
        updateMember.setErpId(deptGetResponse.getUnionid());
        updateMember.setPhone(deptGetResponse.getMobile());
        updateMember.setName(deptGetResponse.getName());
        updateMember.setCode(deptGetResponse.getJobNumber());
        updateMember.setDdId(deptGetResponse.getUserid());
//        updateMember.setErpId(deptGetResponse.getErpId());
//        updateMember.setPhone(deptGetResponse.getPhone());
//        updateMember.setName(deptGetResponse.getName());
//        updateMember.setCode(deptGetResponse.getCode());
//        updateMember.setDdId(deptGetResponse.getDdId());
        updateMember.setHkId(null);
        updateMember.setAuthStatus(Constants.ZERO);
        Boolean hkFlag = dealHkUserForUpdateBiz(updateMember);
@@ -2601,40 +2842,52 @@
        }
        return false;
    }
    private boolean isMemberDeletedJdy(Member member, List<UserEntityModel> list) {
        for(UserEntityModel m : list){
            if(StringUtils.equals(m.getUsername(),member.getErpId())){
                return  true;
            }
        }
        return false;
    }
    @Override
    public void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData) throws ApiException {
        JSONArray jsonArray = eventData.getJSONArray("userId");
        if(jsonArray.isEmpty()){
            return;
        }
        if(eventType.equals("user_leave_org")){
            //删除对人员信息
            List<String> userIdList = new ArrayList<>();
            for (int i = 0; i < jsonArray.size(); i++) {
                String deptId = jsonArray.getString(i);
                userIdList.add(deptId);
    public void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData)   {
        try {
            JSONArray jsonArray = eventData.getJSONArray("userId");
            if(jsonArray.isEmpty()){
                return;
            }
            if(CollectionUtils.isNotEmpty(userIdList)){
                syncDelMember(userIdList);
            }
        }else if(eventType.equals("user_add_org")||eventType.equals("user_modify_org")){
            for (int i = 0; i < jsonArray.size(); i++) {
                OapiV2UserGetResponse.UserGetResponse userGetResponse =  dingTalk.syncUserInfo(jsonArray.getString(i));
                Member member  = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                        .eq(Member::getIsdeleted,Constants.ZERO)
                        .eq(Member::getErpId,userGetResponse.getUnionid())
                        .last(" limit 1")
                );
                if(Objects.isNull(member)){
                    member = new Member();
                    getAddMemberModel(userGetResponse,member);
                }else{
                    getUpdateMemberModel(userGetResponse,member);
            if(eventType.equals("user_leave_org")){
                //删除对人员信息
                List<String> userIdList = new ArrayList<>();
                for (int i = 0; i < jsonArray.size(); i++) {
                    String deptId = jsonArray.getString(i);
                    userIdList.add(deptId);
                }
                if(CollectionUtils.isNotEmpty(userIdList)){
                    syncDelMember(userIdList);
                }
            }else if(eventType.equals("user_add_org")||eventType.equals("user_modify_org")){
                for (int i = 0; i < jsonArray.size(); i++) {
                    OapiV2UserGetResponse.UserGetResponse userGetResponse =  dingTalk.syncUserInfo(jsonArray.getString(i));
                    Member member  = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                            .eq(Member::getIsdeleted,Constants.ZERO)
                            .eq(Member::getErpId,userGetResponse.getUnionid())
                            .last(" limit 1")
                    );
                    if(Objects.isNull(member)){
                        member = new Member();
                        getAddMemberModel(userGetResponse,member);
                    }else{
                        getUpdateMemberModel(userGetResponse,member);
                    }
                }
            }
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"数据处理失败!");
        }
    }
    /**
@@ -2642,25 +2895,25 @@
     * @param code
     * @param source
     * @return
     * @throws ApiException
     */
    @Override
    public DDAuthorizeVO ddAuthorize(String code, Integer source) throws ApiException {
        if(StringUtils.isBlank(code)||Objects.isNull(source)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = dingTalk.getDDUserByCode(code);
        if(Objects.isNull(userGetByCodeResponse)
                || StringUtils.isBlank(userGetByCodeResponse.getUnionid())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钉钉授权失败");
        }
        String unionId = userGetByCodeResponse.getUnionid();
    public DDAuthorizeVO ddAuthorize(String code, Integer source)  {
        try {
            if(StringUtils.isBlank(code)||Objects.isNull(source)){
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }
            OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = dingTalk.getDDUserByCode(code);
            if(Objects.isNull(userGetByCodeResponse)
                    || StringUtils.isBlank(userGetByCodeResponse.getUnionid())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钉钉授权失败");
            }
            String unionId = userGetByCodeResponse.getUnionid();
        DDAuthorizeVO ddAuthorizeVO = new DDAuthorizeVO();
        if(StringUtils.isBlank(unionId)){
            return ddAuthorizeVO;
        }
        ddAuthorizeVO.setUnionId(unionId);
            DDAuthorizeVO ddAuthorizeVO = new DDAuthorizeVO();
            if(StringUtils.isBlank(unionId)){
                return ddAuthorizeVO;
            }
            ddAuthorizeVO.setUnionId(unionId);
//        if(source==1){
//            //处理普通访客人员自动授权逻辑
//            dealVisitUserAuthBiz(wxAuthorizeVO,openId,source);
@@ -2674,7 +2927,12 @@
            //如果是内部人员,则从system_user查询
            dealSystemUserAuthBizByDD(ddAuthorizeVO,unionId,source);
//        }
        return ddAuthorizeVO;
            return ddAuthorizeVO;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR);
        }
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java
@@ -129,9 +129,7 @@
     */
    @Override
    public   void syncOrgData(LoginUserInfo user){
        if(Constants.DEALING_HK_ORG ||
                !(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp
                        || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self)){
        if(Constants.DEALING_HK_ORG || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk ){
            return   ;
        }
        Constants.DEALING_HK_ORG =true;
@@ -321,9 +319,8 @@
     */
    @Override
    public   void syncUserData(LoginUserInfo user){
        if(Constants.DEALING_HK_USER  ||
                !(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp
                || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self)){
        //人员构建以安防平台为主,不执行该操作
        if(Constants.DEALING_HK_USER  || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
            return   ;
        }
        Constants.DEALING_HK_USER =true;
@@ -360,8 +357,7 @@
     */
    @Override
    public   void syncMemberDelData(){
        if(Constants.DEALING_HK_DEL_USER
                || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin())== DataSyncConfig.origin.hk){
        if(Constants.DEALING_HK_DEL_USER  || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin())== DataSyncConfig.origin.hk){
            return   ;
        }
        Constants.DEALING_HK_DEL_USER =true;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java
@@ -57,14 +57,11 @@
    @Override
    @Transactional
    public   void syncOrgData(LoginUserInfo user){
        if(Constants.DEALING_HK_ORG){
            return ;
        if(Constants.DEALING_HK_ORG || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
        }
        Constants.DEALING_HK_ORG =true;
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
            }
            TimeRangeListRequest param = new TimeRangeListRequest();
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
@@ -142,14 +139,11 @@
     */
    @Override
    public   void syncUserData(LoginUserInfo user){
        if(Constants.DEALING_HK_USER){
            return   ;
        if(Constants.DEALING_HK_USER || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
        }
        Constants.DEALING_HK_USER =true;
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
            }
            List<Company> companies = companyMapper.selectList(new QueryWrapper<>());
            if(companies == null || companies.size() == 0){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,请先同步企业组织信息~");
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromSelfServiceImpl.java
@@ -67,14 +67,12 @@
    @Override
    @Transactional
    public   void syncOrgData(LoginUserInfo user ){
        if(Constants.DEALING_HK_ORG){
            return ;
        //初始化安防平台数据
        if(Constants.DEALING_HK_ORG || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
        }
        Constants.DEALING_HK_ORG =true;
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.self){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
            }
            TimeRangeListRequest param = null;
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
@@ -191,7 +189,7 @@
        }
        Constants.DEALING_HK_USER =true;
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.self){
            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
            }
            List<Company> companies = companyMapper.selectList(new QueryWrapper<>());
server/visits/dmvisit_service/src/main/resources/application-dev.yml
@@ -21,8 +21,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 0 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 0 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
server/visits/dmvisit_service/src/main/resources/application-devYL.yml
@@ -33,8 +33,8 @@
debug_model: true
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 2 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: false #是否需要处理图片数据
# Swagger配置
server/visits/dmvisit_service/src/main/resources/application-pro.yml
@@ -21,8 +21,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 0 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 0 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
server/visits/dmvisit_service/src/main/resources/application-proHS.yml.bck
@@ -44,8 +44,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 1 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 1 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
########################微信支付相关配置########################
server/visits/dmvisit_service/src/main/resources/application-self.yml
@@ -21,8 +21,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 0 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 0 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
server/visits/dmvisit_service/src/main/resources/application-test.yml
@@ -21,8 +21,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 0 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 0 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
server/visits/dmvisit_service/src/main/resources/application-testHS.yml.bck
@@ -44,8 +44,8 @@
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 1 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 1 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: true #是否需要处理图片数据
########################微信支付相关配置########################
server/visits/dmvisit_service/src/main/resources/application-testYL.yml
@@ -33,8 +33,8 @@
debug_model: true
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 2 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统
  org-user-data-origin: 3 #组织数据 0自建 2以海康为主 1华晟ERP系统 3简道云 4钉钉
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统 2简道云
  need-deal-img: false #是否需要处理图片数据
# Swagger配置