liukangdong
2024-08-22 0aa2dd71fa4b989838f89aff2cac82950a70097f
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit
已添加1个文件
已修改34个文件
611 ■■■■ 文件已修改
admin/src/components/business/OperaPlatformApproveTemplWindow.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/cardOpeningRecord.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalConfiguration.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalReport.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/device.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceBroadcast.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceLed.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceRole.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceRole_f.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalCompany.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/memberCard.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprConfig.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/visSubDetail.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/cars.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/parkBook.vue 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/parks.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/HkUsersTimerController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/CompanyController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/WebPublicController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromSelfServiceImpl.java 337 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaPlatformApproveTemplWindow.vue
@@ -353,6 +353,8 @@
                    companyName: i.companyName
                  }
                })
              }else{
                item.objIds = []
              }
            })
            this.apprList = arr
admin/src/components/business/cardOpeningRecord.vue
@@ -36,8 +36,8 @@
            <el-table-column prop="memberName" label="员工姓名" min-width="100px"></el-table-column>
            <el-table-column prop="memberPhone" label="手机号" min-width="100px"></el-table-column>
            <el-table-column prop="companyName" label="组织" min-width="100px"></el-table-column>
            <el-table-column prop="createDate" label="开卡时间" min-width="100px"></el-table-column>
            <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
            <el-table-column prop="createDate" label="开卡时间" min-width="140px"></el-table-column>
            <el-table-column prop="editDate" label="更新时间" min-width="140px"></el-table-column>
            <el-table-column
                label="操作"
                min-width="120"
admin/src/views/business/approvalConfiguration.vue
@@ -316,6 +316,7 @@
      this.apprList.forEach((item, index) => {
        if (i === index) {
          item.active = true
          console.log("====================",item.objIds)
          if (item.objIds && item.objIds.length > 0) {
            const objIds = item.objIds.map(i => {
              return `${i.id}-${i.name}${i.companyName ? '-' + i.companyName : ''}`
@@ -343,6 +344,8 @@
                  companyName: i.companyName
                }
              })
            }else{
              item.objIds = []
            }
          })
          this.apprList = arr
admin/src/views/business/approvalReport.vue
@@ -330,6 +330,8 @@
                  companyName: i.companyName
                }
              })
            }else{
              item.objIds = []
            }
          })
          this.apprList = arr
admin/src/views/business/device.vue
@@ -61,7 +61,7 @@
                        </el-switch>
                    </template>
                </el-table-column>
                <el-table-column prop="no" label="设备号"></el-table-column>
                <el-table-column prop="no" width="200px" label="设备号"></el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
admin/src/views/business/deviceBroadcast.vue
@@ -2,7 +2,7 @@
    <TableLayout :permissions="['business:device:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="名称" prop="name">
            <el-form-item title="名称" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
admin/src/views/business/deviceLed.vue
@@ -2,7 +2,7 @@
    <TableLayout :permissions="['business:device:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="名称" prop="name">
            <el-form-item title="名称" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
admin/src/views/business/deviceRole.vue
@@ -2,7 +2,7 @@
    <TableLayout :permissions="['business:devicerole:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="110px" inline>
            <el-form-item label="门禁点分组名称" prop="name">
            <el-form-item title="门禁点分组名称" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入门禁点分组名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
admin/src/views/business/deviceRole_f.vue
@@ -2,7 +2,7 @@
    <TableLayout :permissions="['business:devicerole:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="门禁组名称" prop="name">
            <el-form-item title="门禁组名称" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入门禁组名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
admin/src/views/business/internalCompany.vue
@@ -20,7 +20,7 @@
               <li><el-button type="primary" v-permissions="['business:company:create']" @click="$refs.OperaInternalCompanyWindow.open('新建企业',null,null)">新建</el-button></li>
              <li><el-button @click="sort('top')" :loading="sorting" icon="el-icon-sort-up" 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>
            </ul>
            <el-table
                v-loading="isWorking.search"
@@ -108,7 +108,7 @@
    },
    // åŒæ­¥ä¿¡æ¯
    async synchronous () {
      this.$dialog.actionConfirm('操作确认提醒', '您确认同步全部信息吗?')
      this.$dialog.actionConfirm('该操作将系统清空已有组织信息,您确认同步全部信息吗?', '操作确认提醒')
        .then(() => {
          this.loading = true
          companySync({})
admin/src/views/business/internalMember.vue
@@ -45,16 +45,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" @click="synchronous()">同步</el-button></li>
-->
                <li><el-button type="primary" @click="$refs.OperaMemberWindow.open('新建员工',null,department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">新建员工</el-button></li>
              <li><el-button type="primary" v-permissions="['business:member:sync']" :loading="loading" @click="synchronous()">同步</el-button></li>
              <li><el-button type="primary" @click="$refs.OperaMemberWindow.open('新建员工',null,department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">新建员工</el-button></li>
              <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('人员导入',searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">人员导入</el-button></li>
                <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">批量删除</el-button></li>
                <li><el-button type="primary" v-permissions="['business:empower:create']"  @click="startEmpowerBatch()"  icon="el-icon-plus">下发授权</el-button></li>
             <li style="float: right">
              <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">批量删除</el-button></li>
              <li><el-button type="primary" v-permissions="['business:empower:create']"  @click="startEmpowerBatch()"  icon="el-icon-plus">下发授权</el-button></li>
              <li style="float: right">
                <el-checkbox style="font-size: 12px"  label="1" v-model="searchForm.includeChild" key="1"  @change="search" >是否包含下级组织</el-checkbox>
             </li>
              </li>
            </ul>
            <el-table
                v-loading="isWorking.search"
admin/src/views/business/memberCard.vue
@@ -2,20 +2,20 @@
    <TableLayout :permissions="['business:membercard:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="卡号" prop="code">
                <el-input v-model="searchForm.code" placeholder="请输入卡号" @keypress.enter.native="search"></el-input>
            <el-form-item title="卡号" prop="code">
                <el-input v-model="searchForm.code" placeholder="卡号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="姓名/手机号" prop="keyword">
                <el-input v-model="searchForm.keyword" placeholder="请输入员工姓名/手机号" @keypress.enter.native="search"></el-input>
            <el-form-item title="姓名/手机号" prop="keyword">
                <el-input v-model="searchForm.keyword" placeholder="员工姓名/手机号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="用户类型" prop="memberType">
                <el-select v-model="searchForm.memberType" placeholder="请选择">
            <el-form-item title="用户类型" prop="memberType">
                <el-select v-model="searchForm.memberType" placeholder="用户类型">
                    <el-option label="劳务人员" :value="0"></el-option>
                    <el-option label="内部员工" :value="2"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="状态" prop="status">
                <el-select v-model="searchForm.status" placeholder="请选择">
            <el-form-item title="状态" prop="status">
                <el-select v-model="searchForm.status" placeholder="状态">
                    <el-option label="禁用" :value="0"></el-option>
                    <el-option label="启用" :value="1"></el-option>
                    <el-option label="退卡" :value="2"></el-option>
@@ -60,8 +60,8 @@
                <el-table-column prop="memberName" label="员工姓名" min-width="100px"></el-table-column>
                <el-table-column prop="memberPhone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="组织" min-width="100px"></el-table-column>
                <el-table-column prop="createDate" label="开卡时间" min-width="100px"></el-table-column>
                <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
                <el-table-column prop="createDate" label="开卡时间" min-width="140px"></el-table-column>
                <el-table-column prop="editDate" label="更新时间" min-width="140px"></el-table-column>
                <el-table-column
                    label="操作"
                    min-width="120"
admin/src/views/operation/serviceCar/apprConfig.vue
@@ -349,6 +349,8 @@
                  companyName: i.companyName
                }
              })
            }else{
              item.objIds = []
            }
          })
          this.apprList = arr
admin/src/views/task/visSubDetail.vue
@@ -350,8 +350,11 @@
        2: '审批通过',
        3: '审批未通过',
        4: '已取消',
        5: '他人或签',
        6: '他人拒绝'
        5: '预约成功',
        6: '预约失败',
        7: '拜访中',
        8: '已签离',
        9: '已失效'
      },
      cateList: {
        0: '访客申请',
admin/src/views/vehicle/cars.vue
@@ -1,24 +1,24 @@
<template>
    <TableLayout :permissions="['business:member:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="120px" inline>
            <el-form-item label="车牌号" prop="code">
                <el-input v-model="searchForm.code" clearable placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="" prop="code" title="车牌号">
                <el-input v-model="searchForm.code" clearable placeholder="车牌号" @keypress.enter.native="search"></el-input>
            </el-form-item>
          <el-form-item label="车主姓名/手机号" prop="memberName">
          <el-form-item label="" prop="memberName" title="车主姓名/手机号">
            <el-input v-model="searchForm.memberName" clearable placeholder="车主姓名/手机号" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="车主部门" prop="companyName">
          <el-form-item label="" prop="companyName" title="车主部门名称">
            <el-input v-model="searchForm.companyName" clearable placeholder="车主部门名称" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="授权状态" prop="authStatus">
            <el-select v-model="searchForm.authStatus" @keypress.enter.native="search" clearable placeholder="是否授权">
              <el-option label="是" value="1"></el-option>
              <el-option label="否" value="0"></el-option>
          <el-form-item label="" prop="authStatus" title="是否授权">
            <el-select v-model="searchForm.authStatus" @change="search" clearable placeholder="是否授权">
              <el-option label="已授权" value="1"></el-option>
              <el-option label="未授权" value="0"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="车辆类型" prop="type">
            <el-select v-model="searchForm.type" @keypress.enter.native="search" clearable placeholder="车辆类型">
          <el-form-item label="" prop="type" title="车辆类型">
            <el-select v-model="searchForm.type" @change="search" clearable placeholder="车辆类型">
             <el-option label="安泰公务车" value="0"></el-option>
              <el-option label="安泰自有物流车" value="1"></el-option>
              <el-option label="其他" value="2"></el-option>
@@ -59,7 +59,7 @@
                    <span v-else style="color: red">否</span>
                  </template>
                </el-table-column>
                <el-table-column prop="parksName" label="已授权停车场" min-width="200px">
                <el-table-column prop="parksName" align="center" label="已授权停车场" min-width="200px">
                  <template slot-scope="{row}">
                    <div  v-if="row.parkBookList && row.parkBookList.length" >
                      <span v-for="item in row.parkBookList"  :key="item.id" style="display: block">
@@ -69,24 +69,25 @@
                    <span  v-if="row.parkBookList ==null ||row.parkBookList.length ==0">-</span>
                  </template>
                </el-table-column>
              <el-table-column label="下发有效期" min-width="170px">
              <el-table-column label="下发有效期" align="center" min-width="170px">
                <template slot-scope="{row}">
                  <div v-if="row.authStatus !=null && row.authStatus == 1 && row.parkBookList!=null && row.parkBookList.length>0">
                    <div v-if="!row.startTime || !row.endTime">长期有效</div>
                    <div v-else>
                      <span>起:{{row.startTime}}</span><br/>
                      <span>止:{{row.endTime}}</span>
                      <span style="color: green">起:{{row.startTime}}</span><br/>
                      <span style="color: red">止:{{row.endTime}}</span>
                    </div>
                  </div>
                  <div v-else >-</div>
                </template>
              </el-table-column>
                <el-table-column prop="editorName" label="操作人" min-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="140px"></el-table-column>
              <el-table-column
                  v-if="containPermissions(['business:member:update', 'business:member:delete','business:empower:create'])"
                  label="操作"
                  min-width="250"
                  min-width="200"
                  align="center"
                  fixed="right"
              >
                <template slot-scope="{row}">
admin/src/views/vehicle/parkBook.vue
@@ -1,18 +1,18 @@
<template>
    <TableLayout :permissions="['business:member:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="120px" inline>
            <el-form-item label="车牌号" prop="carCode">
                <el-input v-model="searchForm.carCode" placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item title="车牌号" prop="carCode">
                <el-input v-model="searchForm.carCode" placeholder="车牌号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="车主姓名/手机号" prop="memberName">
                <el-input v-model="searchForm.memberName" placeholder="请输入员工姓名/手机号" @keypress.enter.native="search"></el-input>
            <el-form-item title="车主姓名/手机号" prop="memberName">
                <el-input v-model="searchForm.memberName" placeholder="员工姓名/手机号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="车主组织" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="请输入车主组织" @keypress.enter.native="search"></el-input>
            <el-form-item title="车主组织" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="车主组织名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="停车库名称" prop="parksName">
                <el-input v-model="searchForm.parksName" placeholder="请输入停车库名称" @keypress.enter.native="search"></el-input>
            <el-form-item title="停车库名称" prop="parksName">
                <el-input v-model="searchForm.parksName" placeholder="停车库名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
@@ -33,8 +33,27 @@
                @selection-change="handleSelectionChange"
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="carCode" label="车牌号" min-width="100px"></el-table-column>
                <el-table-column prop="parksName" label="停车场" min-width="100px"></el-table-column>
                <el-table-column prop="carCode" label="车牌号" fixed min-width="100px"></el-table-column>
                <el-table-column prop="parksName" label="停车场" fixed min-width="100px"></el-table-column>
              <el-table-column prop="startTime" label="有效期"  align="center" fixed min-width="150px">
                <template slot-scope="{row}">
                  <div v-if="!row.startTime || !row.endTime">长期有效</div>
                  <div v-else>
                    <span style="color: green">起:{{row.startTime}}</span><br/>
                    <span style="color: red">止:{{row.endTime}}</span>
                  </div>
                </template>
              </el-table-column>
              <el-table-column prop="startTime" label="状态" fixed min-width="100px">
                <template slot-scope="{row}">
                  <div v-if="row.isdeleted==1"  style="color: red">已删除</div>
                  <div v-else style="color: green">
                    <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>
                  </div>
                </template>
              </el-table-column>
                <el-table-column label="用户类型" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.memberType === 0">劳务访客</span>
@@ -45,29 +64,12 @@
                <el-table-column prop="memberName" label="姓名" min-width="100px"></el-table-column>
                <el-table-column prop="memberPhone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="组织" min-width="100px"></el-table-column>
                <el-table-column prop="startTime" label="有效期" min-width="130px">
                    <template slot-scope="{row}">
                        <span>{{validity(row.startTime, row.endTime)}}</span>
<!--                        <span v-if="!row.startTime || !row.endTime">长期</span>-->
<!--                        <span v-else>{{row.startTime}} è‡³ {{row.endTime}}</span>-->
                    </template>
                </el-table-column>
              <el-table-column prop="startTime" label="状态" min-width="100px">
                <template slot-scope="{row}">
                  <div v-if="row.isdeleted==1"  style="color: red">已删除</div>
                  <div v-else style="color: green">
                      <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>
                   </div>
                </template>
              </el-table-column>
              <el-table-column prop="remark" label="备注" min-width="100px">
                <template slot-scope="{row}">
                  <span v-if="row.isdeleted !=2">{{row.remark}}</span>
                </template>
              </el-table-column>
                <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
                <el-table-column prop="createDate" label="创建时间" min-width="140px"></el-table-column>
<!--                <el-table-column-->
<!--                    v-if="containPermissions(['business:member:update', 'business:member:delete'])"-->
<!--                    label="操作"-->
admin/src/views/vehicle/parks.vue
@@ -32,8 +32,8 @@
            >
                <el-table-column prop="name" label="停车库名称" min-width="100px"></el-table-column>
                <el-table-column prop="parentName" label="所属停车库" min-width="100px"></el-table-column>
                <el-table-column prop="parkCreateDate" label="创建时间" min-width="100px"></el-table-column>
                <el-table-column prop="parkEditDate" label="更新时间" min-width="100px"></el-table-column>
                <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
                <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
server/system_timer/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
spring:
  profiles:
    active: test
    active: dev
  application:
    name: systemTimer
    # å®‰å…¨é…ç½®
server/visits/admin_timer/src/main/java/com/doumee/api/HkUsersTimerController.java
@@ -38,7 +38,7 @@
    public ApiResponse syncOrgData() {
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            //如果是ERP系统同步下发
            hkSyncOrgUserService.syncOrgData();
            hkSyncOrgUserService.syncOrgData(null);
        }
        return ApiResponse.success("开启定时同步海康组织数据成功");
    }
@@ -53,7 +53,7 @@
    public ApiResponse syncUserData() {
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp) {
            //如果是ERP系统同步下发
            hkSyncOrgUserService.syncUserData();
            hkSyncOrgUserService.syncUserData(null);
        }
        return ApiResponse.success("开启定时同步海康人员数据成功");
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/CompanyController.java
@@ -173,7 +173,11 @@
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            return ApiResponse.success( erpSyncService.syncCompany(null));
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
             hkSyncOrgUserFHKService.syncOrgData();
             hkSyncOrgUserFHKService.syncOrgData(this.getLoginUser(null));
            return ApiResponse.success("同步成功");
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self){
            //如果是自建系統,同步安防平台初始化数据
            hkSyncOrgUserFHKService.syncOrgData(this.getLoginUser(null));
            return ApiResponse.success("同步成功");
        }
        return ApiResponse.failed("无效操作");
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -231,7 +231,7 @@
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            erpSyncService.syncUsers(null);
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
            hkSyncOrgUserFHKService.syncUserData();
            hkSyncOrgUserFHKService.syncUserData(this.getLoginUser(null));
        }
        return ApiResponse.success("同步成功");
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CompanyCloudController.java
@@ -15,6 +15,7 @@
import com.doumee.service.business.CompanyService;
import com.doumee.service.business.ext.ERPSyncService;
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromHKServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromSelfServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -42,6 +43,8 @@
    private ERPSyncService erpSyncService;
    @Autowired
    private HkSyncOrgUserFromHKServiceImpl hkSyncOrgUserFHKService;
    @Autowired
    private HkSyncOrgUserFromSelfServiceImpl hkSyncOrgUserFromSelfService;
    @Autowired
    private DataSyncConfig dataSyncConfig;
@@ -171,11 +174,14 @@
    @ApiOperation("全量部门信息同步")
    @PostMapping("/syncAll")
    @CloudRequiredPermission("business:company:sync")
    public ApiResponse sync(){
    public ApiResponse sync(@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            return ApiResponse.success( erpSyncService.syncCompany(null));
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
             hkSyncOrgUserFHKService.syncOrgData();
             hkSyncOrgUserFHKService.syncOrgData(this.getLoginUser(token));
            return ApiResponse.success("同步成功");
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self){
            hkSyncOrgUserFromSelfService.syncOrgData(this.getLoginUser(token));
            return ApiResponse.success("同步成功");
        }
        return ApiResponse.failed("无效操作");
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HkSyncCloudController.java
@@ -2,6 +2,7 @@
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
@@ -101,19 +102,22 @@
//    @PreventRepeat
    @ApiOperation("【海康】门禁事件订阅推送对接处理接口")
    @PostMapping("/push/acs")
    public ApiResponse pushAcs(  HttpServletRequest request,@RequestBody EventAcsRequest param, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
    @LoginNoRequired
    public ApiResponse pushAcs(  HttpServletRequest request,@RequestBody EventAcsRequest param, HttpServletResponse response ){
        String result = hkSyncPushService.dealAcsEvent(param,response);
        return ApiResponse.success(result);
    }
//    @PreventRepeat
    @ApiOperation("【海康】访客事件订阅推送对接处理接口")
    @PostMapping("/push/visit")
    public ApiResponse pushVisit(@RequestBody EventVisitRequest param, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
    @LoginNoRequired
    public ApiResponse pushVisit(@RequestBody EventVisitRequest param, HttpServletResponse response){
        String result = hkSyncPushService.dealVisitEvent(param,response);
        return ApiResponse.success(result);
    }
    @ApiOperation("【海康】访客ICCM事件订阅推送对接处理接口")
    @PostMapping("/push/visitIccm")
    @LoginNoRequired
    public ApiResponse pushVisitIccm(@RequestBody EventVisitIccmRequest param, HttpServletResponse response) {
        String result = hkSyncPushService.dealVisitEventIccm(param,response);
        return ApiResponse.success(result);
@@ -121,14 +125,16 @@
//    @PreventRepeat
    @ApiOperation("【海康】停车场事件订阅推送对接处理接口")
    @PostMapping("/push/parks")
    public ApiResponse pushParks(@RequestBody EventParkRequest param, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
    @LoginNoRequired
    public ApiResponse pushParks(@RequestBody EventParkRequest param, HttpServletResponse response ){
        String result = hkSyncPushService.dealParkEvent(param,response);
        return ApiResponse.success(result);
    }
    @PreventRepeat
    @ApiOperation("【海康】取消订阅事件")
    @PostMapping("/cancelEventSub")
    public ApiResponse cancelEventSub(@RequestBody EventSubRequest param, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
    @LoginNoRequired
    public ApiResponse cancelEventSub(@RequestBody EventSubRequest param, HttpServletResponse response){
         hkSyncPushService.cancelEventSub();
        return ApiResponse.success(null);
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java
@@ -23,6 +23,7 @@
import com.doumee.service.business.MemberService;
import com.doumee.service.business.ext.ERPSyncService;
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromHKServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromSelfServiceImpl;
import io.swagger.annotations.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
@@ -46,6 +47,8 @@
    private ERPSyncService erpSyncService;
    @Autowired
    private HkSyncOrgUserFromHKServiceImpl hkSyncOrgUserFHKService;
    @Autowired
    private HkSyncOrgUserFromSelfServiceImpl hkSyncOrgUserFromSelfService;
    @Autowired
    private DataSyncConfig dataSyncConfig;
@@ -321,11 +324,14 @@
    @ApiOperation("全量信息同步")
    @PostMapping("/syncAll")
    @CloudRequiredPermission("business:member:sync")
    public ApiResponse sync(){
    public ApiResponse sync(@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            erpSyncService.syncUsers(null);
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
            hkSyncOrgUserFHKService.syncUserData();
            hkSyncOrgUserFHKService.syncUserData(this.getLoginUser(token));
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.self){
            hkSyncOrgUserFromSelfService.syncUserData(this.getLoginUser(token));
            return ApiResponse.success("同步成功");
        }
        return ApiResponse.success("同步成功");
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java
@@ -43,8 +43,6 @@
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/public")
@Slf4j
public class PublicCloudController extends BaseController {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
@@ -303,9 +301,6 @@
            e.printStackTrace();
        }
    }
    public void uploadFileLocal(HttpServletRequest request, String folder, HttpServletResponse response, String rootPath,String dir) throws Exception {
        response.setCharacterEncoding("UTF-8");
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/WebPublicController.java
@@ -45,10 +45,8 @@
@Slf4j
public class WebPublicController extends BaseController {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @ApiOperation(value = "上传", notes = "上传", httpMethod = "POST", position = 6)
    @ApiImplicitParams({
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -488,16 +488,16 @@
     * @return
     */
    public  static  BaseResponse<IccmAppointmentMDJResponse>   iccmAppiontmentMDJ(IccmAppointmentMDJRequest param){
        log.info("【海康访客免登记预约】================开始===="+JSONObject.toJSONString(param));
        log.info("【海康访客免登记预约】================iccm开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.visitAppiontmentMDJ(JSONObject.toJSONString(param));
            String res = HKTools.iccmAppointmentMDJ(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<IccmAppointmentMDJResponse> >(){};
            BaseResponse<IccmAppointmentMDJResponse>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康访客免登记预约");
            return  result;
        }catch (Exception e){
            log.error("【海康访客免登记预约】================失败====:\n"+ e.getMessage());
            log.error("【海康访客免登记预约】================iccm失败====:\n"+ e.getMessage());
        }
        return  null;
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -8,6 +8,7 @@
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitIccmRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
import com.doumee.core.haikang.model.param.respose.AppointmentInfoResponse;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.dao.business.model.Device;
import com.doumee.dao.business.model.ParkBook;
import io.swagger.models.auth.In;
@@ -59,10 +60,10 @@
    String downHKImgs(int type);
    void cancelEventSub();
    void syncOrgData();
    void syncOrgData(LoginUserInfo user);
    void getOutTimeVisitRecordIccm();
    void syncUserData();
    void syncUserData(LoginUserInfo user);
    void syncVistAppointData(Date date);
    void syncVehicleData();
    String syncPlatforms(PlatformsListRequest param);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -104,6 +104,7 @@
                }
            }
            idPath = parent.getCompanyPath();
            company.setHkParentId(parent.getHkId());
            company.setCompanyPath(parent.getCompanyPath()+company.getId()+"/");
            company.setCompanyNamePath(parent.getCompanyNamePath()+"/"+company.getName());
        }
@@ -156,6 +157,7 @@
    }
    private boolean delHkOrg(Company company) {
        OrgDelRequest request =new OrgDelRequest();
        request.setIndexCodes(new String[]{company.getHkId()});
        BaseResponse<List<OrgUpdateFailureResponse>> result =  HKService.delBatchOrg(request);
        if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){
@@ -232,6 +234,7 @@
                .eq(Member::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该部门下存在人员信息,不能进行删除操作!");
        }
        Company company = new Company();
        company.setId(id);
        company.setEditDate(new Date());
@@ -241,7 +244,7 @@
        company.setHkDate(company.getHkDate());
        companyMapper.updateById(company);
        //下发海康安防平台
        if(StringUtils.isBlank(model.getHkId()) && Constants.equalsInteger(Constants.ONE,model.getHkStatus()) && !delHkOrg(model)){
        if(StringUtils.isNotBlank(model.getHkId()) && Constants.equalsInteger(Constants.ONE,model.getHkStatus()) && !delHkOrg(model)){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,组织删除下发失败,请确认该组织无下级组织或组织人员信息~");
        }
    }
@@ -483,13 +486,11 @@
        companyMapper.updateById(company);
    }
    @Override
    public long count(Company company) {
        QueryWrapper<Company> wrapper = new QueryWrapper<>(company);
        return companyMapper.selectCount(wrapper);
    }
    @Override
    public List<CompanyDTO> findCompanyTreePage(Integer type) {
@@ -501,7 +502,6 @@
        List<Company> companies = companyMapper.selectList(wrapper);
        return getCompanyTree( companies, null);
    }
    private List<CompanyDTO> getCompanyTree(List<Company> companies, String parentId){
        if (CollectionUtils.isEmpty(companies)){
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -98,8 +98,8 @@
    @Autowired
    private EmpowerMapper empowerMapper;
    @Autowired
    private DeviceMapper deviceMapper;
    @Autowired
@@ -152,7 +152,7 @@
                //创建系统登陆账号(默认无任何角色)
                if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
                    //如果是内部组织人员,新增系统登陆账号
                    systemUserMapper.insert(createSystemUser(insert));
                    systemUserMapper.insert(createSystemUser(insert,systemDictDataBiz));
                    //处理培训有效期业务
                    dealTrainTIme(member,0,loginUserInfo);
                }
@@ -166,7 +166,7 @@
        }
        return insert;
    }
    private SystemUser createSystemUser(Member insert) {
    public static SystemUser createSystemUser(Member insert,SystemDictDataBiz systemDictDataBiz) {
        SystemUser user = new SystemUser();
        // ç”Ÿæˆå¯†ç ç›
        String salt = RandomStringUtils.randomAlphabetic(6);
@@ -186,6 +186,7 @@
        user.setUpdateUser(insert.getEditor());
        user.setUpdateTime(insert.getEditDate());
        user.setMemberId(insert.getId());
        user.setSource(Constants.ZERO);
        user.setDeleted(Boolean.FALSE);
        user.setFixed(Boolean.FALSE);
        user.setStatus(Constants.ZERO);
@@ -1589,7 +1590,7 @@
                .eq(Member::getType,Constants.memberType.internal)
                .eq(Member::getStatus,Constants.ZERO)
                .isNotNull(Member::getHkId)
                .apply("to_days(lastVisitDate)+ "+days+" < to_days(now())" ));
                .apply("to_days(LAST_VISIT_DATE)+ "+days+" < to_days(now())" ));
        if(CollectionUtils.isEmpty(memberList)){
           return;
        }
@@ -1862,7 +1863,7 @@
                //创建系统登陆账号(默认无任何角色)
                if(Constants.equalsInteger(insert.getCompanyType(),Constants.ONE)){
                    //如果是内部组织人员,新增系统登陆账号
                    userList.add(createSystemUser(insert));
                    userList.add(createSystemUser(insert,systemDictDataBiz));
                }
            }
            if(userList.size()>0){
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -14,6 +14,7 @@
import com.doumee.core.haikang.model.param.respose.AppointmentInfoResponse;
import com.doumee.core.haikang.model.param.respose.TaskAdditionResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.dao.business.model.Device;
import com.doumee.dao.business.model.ParkBook;
import com.doumee.service.business.ext.HkSyncService;
@@ -115,7 +116,7 @@
        return  null;
    }
    @Override
    public  void syncUserData(){
    public  void syncUserData(LoginUserInfo user){
    }
    @Override
    public  void syncUserUpdateData(Date start, Date end){
@@ -135,7 +136,7 @@
    public  void syncVehicleUpdateData(Date date){
    }
    @Override
    public  void syncOrgData( ){
    public  void syncOrgData( LoginUserInfo user){
    }
    @Override
    public  void syncOrgUpdateData( Date start, Date end){
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java
@@ -120,11 +120,17 @@
                if(model !=null){
                    //如果已存在,则更新数据
                    model =  initDataByHkData(model,device,date);
                    if(allHkList.size()==1){
                        model.setIsDefault(Constants.ZERO);
                    }
                    editList.add(model);
                }else{
                    //如果不存在,则新增数据
                    model = new DeviceRole();
                    model =  initDataByHkData(model,device,date);
                    if(allHkList.size()==1){
                        model.setIsDefault(Constants.ZERO);
                    }
                    addList.add(model);
                }
            }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java
@@ -11,6 +11,7 @@
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.*;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
@@ -71,7 +72,7 @@
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public   void syncOrgData(){
    public   void syncOrgData(LoginUserInfo user){
        if(Constants.DEALING_HK_ORG || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.erp){
            return   ;
        }
@@ -261,7 +262,7 @@
     * @return
     */
    @Override
    public   void syncUserData(){
    public   void syncUserData(LoginUserInfo user){
        if(Constants.DEALING_HK_USER  || Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.erp){
            return   ;
        }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java
@@ -56,7 +56,7 @@
     */
    @Override
    @Transactional
    public   void syncOrgData(){
    public   void syncOrgData(LoginUserInfo user){
        if(Constants.DEALING_HK_ORG){
            return ;
        }
@@ -65,7 +65,6 @@
            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
            }
            LoginUserInfo user =  (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
            TimeRangeListRequest param = new TimeRangeListRequest();
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
@@ -142,7 +141,7 @@
     * @return
     */
    @Override
    public   void syncUserData(){
    public   void syncUserData(LoginUserInfo user){
        if(Constants.DEALING_HK_USER){
            return   ;
        }
@@ -151,7 +150,6 @@
            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
            }
            LoginUserInfo user =  (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
            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
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,337 @@
package com.doumee.service.business.impl.hksync.fhk;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
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.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.TimeRangeListRequest;
import com.doumee.core.haikang.model.param.respose.OrgInfoResponse;
import com.doumee.core.haikang.model.param.respose.UserInfoResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.vo.CompanyTree;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.impl.MemberServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * æµ·åº·ç»„织人员通过步Service实现(自行维护情况)
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncOrgUserFromSelfServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息到业务系统
     */
    @Override
    @Transactional
    public   void syncOrgData(LoginUserInfo user ){
        if(Constants.DEALING_HK_ORG){
            return ;
        }
        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;
            int curTotal = 0;
            int curPage = 1;
            List<Company>  allHkList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param = new TimeRangeListRequest();
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<OrgInfoResponse>> response = HKService.orgAllList(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<OrgInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                    allHkList.addAll(getNewOrgModelBYList(r.getList(),user.getId()));
                }
                curPage++;
            }
            if(allHkList .size() == 0){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!");
            }
            companyMapper.delete(new UpdateWrapper<>());//清空原有数据
            companyMapper.update(null,new UpdateWrapper<Company>().lambda()
                    .eq(Company::getType,Constants.ONE)
                    .eq(Company::getIsdeleted,Constants.ZERO)
                    .set(Company::getIsdeleted,Constants.ONE));//清空原有数据
            companyMapper.insert(allHkList);//插入新数据
            dealTreePathInfo(allHkList);//处理树形结果数据
        }catch (BusinessException e){
            throw  e;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
        }finally {
            Constants.DEALING_HK_ORG =false;
        }
    }
    private void dealTreePathInfo(List<Company> allHkList) {
        List<Company> tree  = new CompanyTree(allHkList,DataSyncConfig.origin.hk).buildTree();
        if(tree!=null || tree.size()>0){
            for(Company t : tree){
                t.setCompanyPath(t.getId()+"/");
                t.setCompanyNamePath(t.getName());
                companyMapper.updateById(t);
                dealChildParentId(t,t.getChildList());
            }
        }
    }
    private void dealChildParentId(Company t, List<Company> childList) {
        if(childList ==null || childList.size()==0){
            return;
        }
        for(Company c : childList){
            c.setParentId(t.getId());
            c.setCompanyPath(t.getCompanyPath()+c.getId()+"/");
            c.setCompanyNamePath(t.getCompanyNamePath()+"/"+c.getName());
            companyMapper.updateById(c);
            if(t.getChildList()!=null || t.getChildList().size()==0){
                //递归处理子集
                dealChildParentId(c,c.getChildList());
            }
        }
    }
    private List<Company> getNewOrgModelBYList(List<OrgInfoResponse> list, Integer userid) {
        List<Company> newList = new ArrayList<>();
        if(list == null || list.size()==0){
            return  newList;
        }
        for(OrgInfoResponse model :list){
            Company c = new Company();
            c.setHkId(model.getOrgIndexCode());
            c.setCode(model.getOrgNo());
            c.setName(model.getOrgName());
            c.setHkStatus(Constants.ONE);
            c.setHkDate(new Date());
            c.setIsdeleted(Constants.ZERO);
            c.setCreateDate(c.getHkDate());
            c.setEditDate(DateUtil.getISO8601DateByStr(model.getUpdateTime()));
            c.setCreator(userid);
            c.setEditor(userid);
            c.setStatus(Constants.ZERO);
            c.setType(Constants.ONE);
            if(!StringUtils.equals(model.getOrgIndexCode(),systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode())){
                c.setHkParentId(model.getParentOrgIndexCode());
            }
            newList.add(c);
        }
        return newList;
    }
    /**
     * åŒæ­¥æµ·åº·äººå‘˜ä¿¡æ¯
     * @return
     */
    @Override
    public   void syncUserData(LoginUserInfo user){
        if(Constants.DEALING_HK_USER){
            return   ;
        }
        Constants.DEALING_HK_USER =true;
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.self){
                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(), "对不起,请先同步企业组织信息~");
            }
            TimeRangeListRequest param = new TimeRangeListRequest();
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
            List<Member>  allHkList = new ArrayList<>();
            List<SystemUser>  allUserList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param = new TimeRangeListRequest();
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<UserInfoResponse>> response = HKService.userAllList(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<UserInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                    allHkList.addAll(getNewUserModelBYList(r.getList(),companies,user.getId()));
                }
                curPage++;
            }
            if(allHkList .size() == 0){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!");
            }
            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
                    .eq(Member::getType,Constants.TWO)
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .set(Member::getIsdeleted,Constants.ONE));//清空原有数据
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .eq(SystemUser::getType,Constants.TWO)
                    .eq(SystemUser::getDeleted,Boolean.FALSE)
                    .set(SystemUser::getDeleted,Boolean.TRUE));//清空原有数据
            memberMapper.insert(allHkList);//插入新数据
            for(Member c :allHkList){
                allUserList.add(MemberServiceImpl.createSystemUser(c,systemDictDataBiz));//创建登陆账号
            }
            systemUserMapper.insert(allUserList);
        }catch (BusinessException e){
            throw  e;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
        }finally {
            Constants.DEALING_HK_USER =false;
        }
    }
    private List<Member> getNewUserModelBYList(List<UserInfoResponse> list, List<Company> companies,Integer userid) {
        List<Member> newList = new ArrayList<>();
        if(list == null || list.size()==0){
            return  newList;
        }
        for(UserInfoResponse model :list){
            Member c = new Member();
            String encryptIdNo = DESUtil.encrypt(Constants.EDS_PWD,model.getCertificateNo());
            c.setIdcardNo(encryptIdNo);
            c.setIdcardDecode(Constants.getTuominStr(model.getCertificateNo()));
            c.setIdcardType(getIdcardTypeByHk(model.getCertificateType()));
            c.setCode(model.getJobNo());
            c.setPhone(model.getPhoneNo());
            c.setHkId(model.getPersonId());
            c.setName(model.getPersonName());
            c.setHkStatus(Constants.ONE);
            c.setHkDate(new Date());
            c.setCanVisit(Constants.ZERO);
            c.setWorkStatus(Constants.ZERO);
            c.setHighCheckor(Constants.ZERO);
            c.setSex(model.getGender());
            c.setIsdeleted(Constants.ZERO);
            c.setCreateDate(c.getHkDate());
            c.setEditDate(DateUtil.getISO8601DateByStr(model.getUpdateTime()));
            c.setCreator(userid);
            c.setEditor(userid);
            c.setStatus(Constants.ZERO);
            c.setType(Constants.TWO);
            c.setCompanyId(getCompanyId(companies,model.getOrgIndexCode()));
            if(model.getPersonPhoto()!=null && model.getPersonPhoto().size()>0){
                c.setFaceId(model.getPersonPhoto().get(0).getPersonPhotoIndexCode());
                c.setFaceImg(HKConstants.IMG_INDEX+model.getPersonPhoto().get(0).getPicUri());
                c.setFaceServerIndexCode(model.getPersonPhoto().get(0).getServerIndexCode());
            }
            newList.add(c);
        }
        return newList;
    }
    private Integer getCompanyId(List<Company> companies, String orgIndexCode) {
        if(companies == null){
            return  null;
        }
        for(Company c : companies){
            if(StringUtils.equals(c.getHkId(),orgIndexCode)){
                return c.getId();
            }
        }
        return null;
    }
    /**
     *   //证件类型111:身份证414:护照113:户口簿335:驾驶证131:工作证133:学生证990:其他 ;
     *  // è¯ä»¶ç±»åž‹ 0身份证 1港澳证件 2护照
     * @param certificateType
     * @return
     */
    private Integer getIdcardTypeByHk(Integer certificateType) {
        if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.SHENFENZHENG.getKey())){
            return 0;
        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.HUZHAO.getKey())){
            return 2;
        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.JIASHIZHENG.getKey())){
            return 3;
        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.XUESHENGZHENG.getKey())){
            return 4;
        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.GONGXUOZHENG.getKey())){
            return 5;
        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.GONGXUOZHENG.getKey())){
            return 6;
        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.HUKOUBEN.getKey())){
            return 7;
        }else if(Constants.equalsInteger(certificateType,HKConstants.CertificateType.QITA.getKey())){
            return 8;
        }
        return  null;
    }
}