jiangping
2024-07-30 eea92f23bf8ead897f346ae6ccc8603ac039e566
修复bug
已添加20个文件
已修改33个文件
2140 ■■■■■ 文件已修改
admin/.env 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/member.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaVisitsIccmDesWindow.vue 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitEventIccm.vue 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitsIccmHk.vue 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin_sys_timer/src/main/java/com/doumee/task/ScheduleTool.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin_sys_timer/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/HkSyncController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitEventController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleAdminTool.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/resources/logback-spring.xml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/service/impl/ScreenServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AppointmentEventListRequest.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmDataRequest.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmDetailParamRequest.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmInfoRequest.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmInvoiceParamRequest.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmParamRequest.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmRequest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmTargetParamRequest.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmValuesParamRequest.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentEventInfoResponse.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentIccmInfoResponse.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentVisitorInfoResponse.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/InterfaceLogService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncParkServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncVehicleFromHKServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncVisitFromHKServiceImpl.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/system/SystemLoginService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/resources/application-proYL.yml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/resources/application-testYL.yml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_web/src/main/resources/logback-spring.xml 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/openapi/src/main/resources/logback-spring.xml 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env
@@ -10,4 +10,5 @@
VUE_APP_API_PREFIX = '/admin_interface'
# é¡¹ç›®åç§°
VUE_APP_TITLE = '华晟智慧园区系统'
# VUE_APP_TITLE = '华晟智慧园区系统'
VUE_APP_TITLE = '伊利大屏系统'
admin/public/index.html
@@ -5,7 +5,7 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>华晟智慧园区系统</title>
    <title>伊利大屏系统</title>
  </head>
  <body>
    <noscript>
admin/src/api/business/member.js
@@ -13,6 +13,9 @@
export function memberSync (data) {
  return request.post('/business/member/syncAll', data)
}
export function syncUserData (data) {
  return request.post('/business/hksync/syncUserData', data)
}
export function delHkForce (data) {
  return request.post('/business/member/delHkForce', data)
}
admin/src/components/business/OperaVisitsIccmDesWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,297 @@
<template>
    <GlobalWindow
        :title="title"
        width="70%"
        :visible.sync="visible"
        append-to-body
        :confirm-working="isWorking"
        @confirm="confirm"
    >
        <div class="list">
            <div class="list_item">
                <div class="list_item_label">拜访信息</div>
                <div class="list_item_val" v-if="info" style="display: inline-block">
                    <div class="list_item_val_item">拜访对方:{{info.receptMemberName}} - {{info.receptMemberDepartment}}</div>
                    <div class="list_item_val_item">预约时间:{{info.starttime}} è‡³ {{info.endtime}}</div>
                    <div class="list_item_val_item" v-if="info.inDate && info.outDate">签到时间:{{info.inDate}} è‡³ {{info.outDate}}</div>
                    <div class="list_item_val_item" v-else>签到时间:-</div>
                    <div class="list_item_val_item">拜访事由:{{info.reason}}</div>
                    <div class="list_item_val_item">申请人员:{{info.name}} {{info.companyName}}</div>
                    <div class="list_item_val_item">申请门禁:{{info.deviceRoleList ? info.deviceRoleList.map(item => item.name).join(' | ') : '-'}}</div>
                    <div class="list_item_val_item">创建时间:{{info.createDate}}</div>
                </div>
                <div class="list_item_val" v-if="info" style="display: inline-block;float: right">
                  <div class="list_item_val_item"   id="qrcode2" ref="qrcode2"></div>
                </div>
              </div>
            <div class="list_item">
                <div class="list_item_label">访客信息</div>
                <div class="list_item_table" v-if="info">
                    <el-table
                        :data="info.withUserList ? info.withUserList : []"
                        border
                        :header-cell-style="{background: '#dcdde2', color: 'rgb(51, 51, 51)'}"
                        style="width: 100%">
                      <el-table-column prop="status"   label="状态" min-width="100px">
                        <template slot-scope="{row}">
                          <span v-if="row.status === 0">未签到</span>
                          <span v-if="row.status === 1">已签到</span>
                          <span v-if="row.status === 2">已签退</span>
                          <span v-if="row.status === 3">滞留</span>
                          <span v-if="row.status === 4">未访问</span>
                          <span v-if="row.status === 5">自动签离</span>
                          <span v-if="row.status === 6">未签退</span>
                        </template>
                      </el-table-column>
                        <el-table-column
                            width="150"
                            label="姓名">
                            <template slot-scope="{row}">
                                <span>{{row.name}}</span>
                                <span style="border-radius: 5px; padding: 2px 5px; box-sizing: border-box; border: 1px solid #0d68ff; color: #0d68ff; margin-left: 5px;" v-if="info.memberId === row.memberId">申请人</span>
                            </template>
                        </el-table-column>
                        <el-table-column
                            label="性别">
                            <template slot-scope="{row}">
                                <span v-if="row.sex === 1">男</span>
                                <span v-if="row.sex === 2">女</span>
                            </template>
                        </el-table-column>
                        <el-table-column
                            prop="birthday"
                            label="年龄">
                            <template slot-scope="{row}">
                                <span>{{getAge(row.birthday)}}</span>
                            </template>
                        </el-table-column>
                        <el-table-column
                            width="150"
                            prop="phone"
                            label="手机号">
                        </el-table-column>
                        <el-table-column
                            label="证件类型">
                            <template slot-scope="{row}">
                                <span v-if="row.idcardType === 111">身份证</span>
                            </template>
                        </el-table-column>
                        <el-table-column
                            width="160"
                            prop="idcardDecode"
                            label="身份证号码">
                        </el-table-column>
                        <el-table-column
                            width="150"
                            prop="companyName"
                            label="公司">
                        </el-table-column>
                        <el-table-column
                            width="150"
                            prop="carNos"
                            label="随行车辆">
                        </el-table-column>
                        <el-table-column
                            width="150"
                            label="访客二维码">
                            <template slot-scope="{row}">
                              <div   :id="`qrcode${row.id}`" :ref="`qrcode${row.id}`"></div>
                            </template>
                        </el-table-column>
                        <el-table-column
                            width="150"
                            label="人脸照片">
                            <template slot-scope="{row}">
                                <el-image
                                    v-if="row.faceImg"
                                    style="width: 100px; height: 100px"
                                    :src="info.prefixUrl + row.faceImg"
                                    :preview-src-list="[info.prefixUrl + row.faceImg]">
                                </el-image>
                            </template>
                        </el-table-column>
                        <el-table-column
                            width="150"
                            label="健康证">
                            <template slot-scope="{row}">
                                <el-image
                                    v-if="row.imgurl"
                                    style="width: 100px; height: 100px"
                                    :src="info.prefixUrl + row.imgurl"
                                    :preview-src-list="[info.prefixUrl + row.imgurl]">
                                </el-image>
                            </template>
                        </el-table-column>
                    </el-table>
                </div>
            </div>
        </div>
    </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { queryById } from '@/api/business/visits'
import QRCode from "qrcodejs2";
export default {
  name: 'OperaVisitsIccmDesWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      list: [],
      info: null,
      innerVisible:false
    }
  },
  created () {
  },
  methods: {
    getAge (val) {
      if (!val) return ''
      const currentYear = new Date().getFullYear() // å½“前的年份
      const calculationYear = new Date(val).getFullYear() // è®¡ç®—的年份
      const wholeTime = currentYear + val.substring(4) // å‘¨å²æ—¶é—´
      const calculationAge = currentYear - calculationYear // æŒ‰ç…§å¹´ä»½è®¡ç®—的年龄
      // åˆ¤æ–­æ˜¯å¦è¿‡äº†ç”Ÿæ—¥
      if (new Date().getTime() > new Date(wholeTime).getTime()) {
        return calculationAge
      } else {
        return calculationAge - 1
      }
    },
    crateQrcodeShow (div,qrcode1) {
      if(qrcode1 ==null ||qrcode1 ==''){
        return;
      }
      this.qr = new QRCode(div, {
        width: 90,
        height: 90,
        text: qrcode1
      })
    },
    open (title, id) {
      this.title = title
      this.visible = true
      queryById(id)
        .then(res => {
          console.log(res)
          this.info = res
          this.$nextTick(() => {
            // this.$refs.qrcode2.innerHTML = ''
            // this.crateQrcodeShow('qrcode2',res.qrcode)
            if(this.info.withUserList ){
              this.info.withUserList.forEach(row => {
                this.$refs['qrcode'+row.id].innerHTML = ''
                this.crateQrcodeShow('qrcode'+row.id,row.qrcode)
              })
            }
          })
        })
    }
  }
}
</script>
<style>
    .el-image-viewer__wrapper {
        z-index: 3000 !important;
    }
</style>
<style lang="scss" scoped>
    .list {
        width: 100%;
        display: flex;
        flex-direction: column;
        .list_item {
            width: 100%;
            margin-bottom: 30px;
            &:last-child {
                margin-bottom: 0 !important;
            }
            .list_item_label {
                font-size: 18px;
                font-weight: 600;
                color: #000000;
                margin-bottom: 15px;
            }
            .list_item_info {
                font-size: 14px;
                color: #222222;
                margin-bottom: 10px;
            }
            .list_item_status {
                width: 100%;
                display: flex;
                flex-direction: column;
                .list_item_status_item {
                    width: 100%;
                    max-height: 100px;
                    position: relative;
                    margin-bottom: 30px;
                    .dian {
                        width: 15px;
                        height: 15px;
                        border-radius: 50%;
                        background: #ffb447;
                        position: absolute;
                        left: 0;
                        top: 50%;
                        transform: translate(0, -50%);
                    }
                    .xian {
                        width: 1px;
                        height: calc(100% + 30px);
                        background: #ffb447;
                        position: absolute;
                        top: 50%;
                        left: 7px;
                        transform: translate(-50%, 0);
                    }
                    .status_info {
                        /*width: 100%;*/
                        height: 100%;
                        display: flex;
                        flex-direction: column;
                        margin-left: 30px;
                        box-sizing: border-box;
                        .status_info_a {
                            font-size: 16px;
                            color: black;
                            margin-bottom: 10px;
                        }
                        .status_info_b {
                            font-size: 13px;
                            color: #666666;
                            margin-bottom: 10px;
                        }
                        .status_info_c {
                            padding: 5px 10px;
                            background: #ececec;
                            font-size: 13px;
                            color: black;
                            border-radius: 5px;
                            box-sizing: border-box;
                        }
                    }
                }
            }
            .list_item_val {
                width: 100%;
                margin-bottom: 15px;
                &:last-child {
                    margin-bottom: 0 !important;
                }
                .list_item_val_item {
                    font-size: 14px;
                    color: #222222;
                    margin-bottom: 5px;
                    &:last-child {
                        margin-bottom: 0 !important;
                    }
                }
            }
        }
    }
</style>
admin/src/utils/request.js
@@ -52,7 +52,7 @@
  // æœªç™»å½•
  if (response.data.code === 401) {
    if (response.config.autoLogin !== false) {
      window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? '/#/login' : '/login'
      window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? 'admin/#/login' : 'admin/login'
    }
    return Promise.reject(response.data)
  }
admin/src/views/business/internalMember.vue
@@ -44,10 +44,11 @@
        </template>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:member:delete','business:member:sync']">
            <ul class="toolbar" v-permissions="['business:member:delete','business:member:sync','business:member:syncdata']">
<!--                <li><el-button type="primary">门禁授权</el-button></li>-->
                <li><el-button type="primary" v-permissions="['business:member:sync']" :loading="loading" @click="synchronous()">同步</el-button></li>
                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button></li>
                <li><el-button type="primary" v-permissions="['business:member:syncdata']" :loading="loading" @click="syncUserData()">立即下发待同步员工</el-button></li>
                         <li><el-button type="primary" v-permissions="['business:member:sync']" :loading="loading" @click="synchronous()">同步</el-button></li>
              <!--   <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button></li>-->
            </ul>
            <el-table
                v-loading="isWorking.search"
@@ -137,7 +138,7 @@
import cardOpeningRecord from '@/components/business/cardOpeningRecord'
import Tree from '@/components/common/Tree'
import { fetchList } from '@/api/business/company'
import { memberSync, roleAuth } from '@/api/business/member'
import { memberSync, roleAuth, syncUserData } from '@/api/business/member'
export default {
  name: 'internalMember',
  extends: BaseTable,
@@ -218,6 +219,24 @@
        })
        .catch(() => {})
    },
    async syncUserData () {
      this.$dialog.actionConfirm('该操作将触发下发的人员信息更新和重新下发!请谨慎操作', '您确认立即下发全部待同步人员信息吗?')
        .then(() => {
          this.loading = true
          syncUserData({})
            .then(res => {
              this.$tip.apiSuccess(res || '同步成功')
              this.search()
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.loading = false
            })
        })
        .catch(() => {})
    },
    callback (row) {
      this.searchForm.erpOrgId = row.erpId
      this.searchForm.companyId = row.id
admin/src/views/business/visitEventIccm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
<template>
    <TableLayout :permissions="['business:visitevent:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="姓名/手机号" prop="keyWords">
                <el-input v-model="searchForm.keyWords" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="车牌号" prop="carNo">
                <el-input v-model="searchForm.carNo" placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="公司名称" prop="visitorWorkUint">
                <el-input v-model="searchForm.visitorWorkUint" placeholder="请输入公司名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="事件类型" prop="eventType">
                <el-select v-model="searchForm.eventType" placeholder="请选择">
                    <el-option label="访客登记" value="541200006"></el-option>
                  <el-option label="访客签离" value="541200007"></el-option>
                  <el-option label="访客通行" value="541200060"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="起始时间" prop="carNo">
                <el-date-picker
                    @change="seleTime"
                    v-model="time"
                    type="datetimerange"
                    format="yyyy-MM-dd HH:mm:ss"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    range-separator="至"
                    start-placeholder="开始日期"
                    end-placeholder="结束日期">
                </el-date-picker>
            </el-form-item>
            <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
                <el-radio-button label="0">当天</el-radio-button>
                <el-radio-button label="1">近7天</el-radio-button>
                <el-radio-button label="2">近30天</el-radio-button>
            </el-radio-group>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:visitevent:exportExcel']">
                <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:visitevent:exportExcel']" @click="exportExcel">导出</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
            >
                <el-table-column prop="personName" label="姓名" min-width="100px"></el-table-column>
                <el-table-column prop="phone" label="手机号码" min-width="100px"></el-table-column>
                <el-table-column prop="idcardDecode" label="身份证号码" min-width="100px"></el-table-column>
                <el-table-column prop="visitorWorkUint" label="公司" min-width="100px"></el-table-column>
                <el-table-column prop="carNo" label="车牌号" min-width="100px"></el-table-column>
                <el-table-column prop="beVisitedPersonName" label="被访人" min-width="100px"></el-table-column>
                <el-table-column prop="beVisitedPersonOrg" label="被访人组织" min-width="100px"></el-table-column>
                <el-table-column prop="eventTypeName" label="事件类型" min-width="100px"></el-table-column>
                <el-table-column label="抓拍图" min-width="100px">
                    <template slot-scope="{row}">
                        <el-image v-if="row.captureUrlFull!=null"
                            style="width: 80px; height: 80px"
                            :src="row.captureUrlFull"
                            :preview-src-list="[row.captureUrlFull]">
                        </el-image>
                    </template>
                </el-table-column>
                <el-table-column prop="createDate" label="事件时间" min-width="100px"></el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
        </template>
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import { timeForMat } from '@/utils/util'
export default {
  name: 'VisitEvent',
  extends: BaseTable,
  components: { TableLayout, Pagination },
  data () {
    return {
      // æœç´¢
      searchForm: {
        personName: '',
        carNo: '',
        keyWords: '',
        startTime: '',
        endTime: '',
        eventType: '',
        visitorWorkUint: '',
        radio: '0'
      },
      time: []
    }
  },
  created () {
    this.config({
      module: '访客事件推送记录表',
      api: '/business/visitEvent',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.changeRadio('0')
    this.search()
  },
  methods: {
    seleTime (e) {
      this.searchForm.startTime = e[0]
      this.searchForm.endTime = e[1]
      this.searchForm.radio = null
      this.search()
    },
    changeRadio (e) {
      if (e === '0') {
        this.searchForm.startTime = timeForMat(0)[0]
        this.searchForm.endTime = timeForMat(0)[1]
        this.time = timeForMat(0)
      } else if (e === '1') {
        this.searchForm.startTime = timeForMat(6)[0]
        this.searchForm.endTime = timeForMat(6)[1]
        this.time = timeForMat(6)
      } else if (e === '2') {
        this.searchForm.startTime = timeForMat(29)[0]
        this.searchForm.endTime = timeForMat(29)[1]
        this.time = timeForMat(29)
      }
      this.search()
    },
    reset () {
      this.$refs.searchForm.resetFields()
      this.time = []
      this.searchForm.radio = '0'
      this.changeRadio('0')
      this.search()
    }
  }
}
</script>
admin/src/views/business/visitsIccmHk.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
<template>
    <TableLayout :permissions="['business:visits:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="姓名/手机号" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="身份证号" prop="idcardNo">
                <el-input v-model="searchForm.idcardNo" 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>
            <el-form-item label="审批状态" 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>
                    <el-option label="滞留" value="3"></el-option>
                    <el-option label="未访问" value="4"></el-option>
                    <el-option label="自动签离" value="5"></el-option>
                    <el-option label="未签退" value="6"></el-option>
                </el-select>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
<!--                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:visits:exportExcel']" @click="exportExcel">导出</el-button>-->
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
          <ul class="toolbar"  v-permissions="['business:visits:sync']">
            <li><el-button type="primary"  v-permissions="['business:visits:sync']" @click="$refs.OperaVisitsHkWindow.open('同步访客记录')">同步</el-button></li>
          </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
                @selection-change="handleSelectionChange"
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="name" label="访客姓名" min-width="100px"></el-table-column>
                <el-table-column prop="phone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="公司名称" min-width="100px"></el-table-column>
                <el-table-column prop="receptMemberName" label="被访人" min-width="100px"></el-table-column>
                <el-table-column prop="reason" label="拜访事由" min-width="100px"></el-table-column>
                <el-table-column label="拜访时间" min-width="170px">
                    <template slot-scope="{row}">
                        <span>起:{{row.starttime}}</span><br/>
                        <span>止:{{row.endtime}}</span>
                    </template>
                </el-table-column>
                <el-table-column label="随访人员" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{row.memberNum || '-'}}</span>
                    </template>
                </el-table-column>
                <el-table-column label="随访车辆" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.carNos">{{row.carNos.split(',').length}}</span>
                        <span v-else>-</span>
                    </template>
                </el-table-column>
                <el-table-column prop="status" fixed="right" label="状态" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.status === 0">未签到</span>
                        <span v-if="row.status === 1">已签到</span>
                        <span v-if="row.status === 2">已签退</span>
                        <span v-if="row.status === 3">滞留</span>
                        <span v-if="row.status === 4">未访问</span>
                        <span v-if="row.status === 5">自动签离</span>
                        <span v-if="row.status === 6">未签退</span>
                    </template>
                </el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:visits:update', 'business:visits:delete'])"
                    label="操作"
                    min-width="100"
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.OperaVisitsIccmDecWindow.open('详情', row.id)"  >查看详情</el-button>
<!--                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:visits:delete']">查询审批结果</el-button>-->
                    </template>
                </el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
            <!--      è¯¦æƒ…      -->
            <OperaVisitsIccmDecWindow ref="OperaVisitsIccmDecWindow" />
            <OperaVisitsHkWindow ref="OperaVisitsHkWindow" @success="search()" />
        </template>
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaVisitsHkWindow from '@/components/business/OperaVisitsHkWindow'
import OperaVisitsIccmDecWindow from '@/components/business/OperaVisitsIccmDesWindow'
export default {
  name: 'Visits',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaVisitsIccmDecWindow,OperaVisitsHkWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        companyName: '',
        idcardNo: '',
        status: ''
      }
    }
  },
  created () {
    this.config({
      module: '访客申请信息表',
      api: '/business/visits',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
  }
}
</script>
admin/vue.config.js
@@ -1,5 +1,6 @@
// è¯¦ç»†é…ç½®è¯·å‚考https://cli.vuejs.org/zh/config/#vue-config-js
// const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length - 1)
const path = require('path')
module.exports = {
  publicPath: process.env.VUE_APP_CONTEXT_PATH,
  outputDir: 'admin',
@@ -21,12 +22,19 @@
        // target: 'http://218.23.218.228:8018/admin_interface',
        // http://218.23.218.228:9912/admin_interface
        // http://facepay.huasunsolar.com/admin_interface
        target: 'http://localhost:10028',
        target: 'http://localhost/admin_interface ',
        changeOrigin: true,
        pathRewrite: {
          [`^${[process.env.VUE_APP_API_PREFIX]}`]: ''
        }
      }
    }
  },
  configureWebpack: {
    resolve: {
      alias: {
        '@': path.resolve(__dirname, 'src')
      }
    }
  }
}
server/admin_sys_timer/src/main/java/com/doumee/task/ScheduleTool.java
@@ -53,33 +53,7 @@
    @Autowired
    private DataSyncConfig dataSyncConfig;
    /**
     * æ¯åˆ†é’Ÿæ‹‰å–一次今日的访客预约数据
     * @throws Exception
     */
    @Scheduled(cron= "0 0 23 * * ?")
    public void syncVehicleUpdateData() throws Exception {
        hkSyncVehicleFromHKService.syncVehicleUpdateData(new Date(System.currentTimeMillis()-24*60*60*1000));
    }
    /**
     * æ¯åˆ†é’Ÿæ‹‰å–一次今日的访客预约数据
     * @throws Exception
     */
    @Scheduled(fixedRate= 3*60*1000)
    public void syncVistAppointData() throws Exception {
        if(Constants.DEALING_FROM_HK_VISIT){
            return ;
        }
        try {
            Constants.DEALING_FROM_HK_VISIT =true;
            hkSyncVisitFromHKService.syncVistAppointData(new Date());
            Constants.DEALING_FROM_HK_VISIT =false;
        }catch (Exception e){
//            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
        }finally {
            Constants.DEALING_FROM_HK_VISIT =false;
        }
    }
    /**
     * æ¯10分钟拉取一次最新访客登记状态(预约成功和已登记)
     * @throws Exception
@@ -92,7 +66,7 @@
     * ä¸‹è½½æµ·åº·ç³»ç»Ÿå›¾ç‰‡æ•°æ®
     * @throws Exception
     */
    @Scheduled(fixedRate= 60*1000)
//    @Scheduled(fixedRate= 60*1000)
    public void downloadHkImg() throws Exception {
        if(dataSyncConfig.getNeedDealImg()!=null && dataSyncConfig.getNeedDealImg()){
            hkSyncImgService.downHKImgs(0);
@@ -129,21 +103,31 @@
        hkSyncVisitService.syncVisitData();
    }
        /**
         * æ¯åˆ†é’Ÿæ‹‰å–一次今日的访客预约数据
         * @throws Exception
         */
        @Scheduled(cron= "0 0 23 * * ?")
        public void syncVehicleUpdateData() throws Exception {
            hkSyncVehicleFromHKService.syncVehicleUpdateData(new Date(System.currentTimeMillis()-24*60*60*1000));
        }
    /**
     * å®šæ—¶å†»ç»“内部人员
     */
        /**
         * å®šæ—¶å†»ç»“内部人员
         */
//    @Scheduled(fixedRate= 60*1000)
    public void memberFreeze()  {
        memberService.memberFreeze();
    }
    /**
     * æ¯å¤©æ¸…理超过一周的接口日志数据(清除和安防平台对接的接口数据)
     * @throws Exception
     */
//    @Scheduled(cron= "0 0 23 * * ?")
    public void clearThreeMonthLog() throws Exception {
        interfaceLogService.clearThreeMonthLog();
    }
        public void memberFreeze()  {
            memberService.memberFreeze();
        }
        /**
         * æ¯å¤©æ¸…理超过一周的接口日志数据(清除和安防平台对接的接口数据)
         * @throws Exception
         */
    @Scheduled(cron= "0 0 23 * * ?")
        public void remainLastLogs() throws Exception {
            interfaceLogService.remainLastLogs();
        }
}
server/admin_sys_timer/src/main/resources/application.yml
@@ -67,7 +67,7 @@
  compression:
    enabled: true
    mime-types: application/json
  port: 10031
  port: 10033
  tomcat:
    max-swallow-size: -1
  servlet:
server/dmvisit_admin/src/main/java/com/doumee/api/business/HkSyncController.java
@@ -1,6 +1,7 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.EventSubRequest;
@@ -8,12 +9,17 @@
import com.doumee.core.haikang.model.param.request.PrivilegeGroupRequest;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
import com.doumee.core.haikang.model.param.request.event.parks.EventParkRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitIccmDataRequest;
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.model.ApiResponse;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.Member;
import com.doumee.service.business.impl.hksync.HkSyncDeviceServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncPrivilegeServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncPushServiceImpl;
import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -36,6 +42,8 @@
public class HkSyncController extends BaseController {
    @Autowired
    private HkSyncOrgUserToHKServiceImpl hkSyncOrgUserService;
    @Autowired
    private HkSyncDeviceServiceImpl hkSyncDeviceService;
    @Autowired
    private HkSyncParkServiceImpl hkSyncParkService;
@@ -44,6 +52,23 @@
    @Autowired
    private HkSyncPushServiceImpl hkSyncPushService;
    /**
     * æ˜¯å¦å¼€å‘者
     */
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @ApiOperation("立即同步待下发人员数据")
    @PostMapping("/syncUserData")
    @RequiresPermissions("business:member:syncdata")
    public ApiResponse syncUserData(@RequestBody Member member) {
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp) {
            //如果是ERP系统同步下发
            hkSyncOrgUserService.syncUserData();
        }
        return  ApiResponse.success(null);
    }
    @PreventRepeat
    @ApiOperation("【海康】全量同步门禁设备接口")
    @PostMapping("/syncDevices")
@@ -82,6 +107,12 @@
        String result = hkSyncPushService.dealVisitEvent(param,response);
        return ApiResponse.success(result);
    }
    @ApiOperation("【海康】访客ICCM事件订阅推送对接处理接口")
    @PostMapping("/push/visitIccm")
    public ApiResponse pushVisitIccm(@RequestBody EventVisitIccmRequest param, HttpServletResponse response) {
        String result = hkSyncPushService.dealVisitEventIccm(param,response);
        return ApiResponse.success(result);
    }
//    @PreventRepeat
    @ApiOperation("【海康】停车场事件订阅推送对接处理接口")
    @PostMapping("/push/parks")
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -115,6 +115,7 @@
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID ç¦å¯ç”¨  ")
    @PostMapping("/updateStatusById")
    @RequiresPermissions("business:member:update")
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitEventController.java
@@ -7,9 +7,11 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.admin.response.VisitEventDTO;
import com.doumee.dao.business.model.CarEvent;
import com.doumee.dao.business.model.VisitEvent;
import com.doumee.dao.system.vo.VisitEventVo;
import com.doumee.service.business.VisitEventService;
import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -31,6 +33,8 @@
    @Autowired
    private VisitEventService visitEventService;
    @Autowired
    private HkSyncVisitServiceImpl hkSyncVisitService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -89,4 +93,12 @@
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(visitEventService.findById(id));
    }
    @ApiOperation("根据日期(starttime)同步过车数据")
    @PostMapping("/syncByDate")
    @RequiresPermissions("business:carevent:sync")
    public ApiResponse syncByDate(@RequestBody VisitEvent param) {
        hkSyncVisitService.syncVisitRecords(param.getCreateDate());
        return ApiResponse.success(null);
    }
}
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
@@ -79,9 +79,16 @@
        return ApiResponse.success(null);
    }
    @ApiOperation("根据日期(starttime)同步访客数据")
    @ApiOperation("根据日期(starttime)同步访客数据ICCM版本")
    @PostMapping("/syncByDate")
    @RequiresPermissions("business:visits:sync")
    public ApiResponse syncByDateIccm(@RequestBody Visits visits) {
        hkSyncVisitFromHKService.syncVistAppointDataIccm(visits.getStarttime());
        return ApiResponse.success(null);
    }
    @ApiOperation("根据日期(starttime)同步访客数据")
    @PostMapping("/syncByDateV2")
    @RequiresPermissions("business:visits:sync")
    public ApiResponse syncByDate(@RequestBody Visits visits) {
        hkSyncVisitFromHKService.syncVistAppointData(visits.getStarttime());
        return ApiResponse.success(null);
server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java
@@ -87,7 +87,14 @@
        param.setEventDest(path+"/visit");
        param.setEventTypes(new Integer[]{HKConstants.EventTypes.VISIT_SIGN_IN.getKey()
                ,HKConstants.EventTypes.VISIT_SIGN_OUT.getKey()});
                ,HKConstants.EventTypes.VISIT_SIGN_OUT.getKey() });
        HKService.cancelEventSub(param);//先取消
        HKService.eventSub(param);//访客事件
        param.setEventDest(path+"/visitIccm");
        param.setEventTypes(new Integer[]{HKConstants.EventTypes.VISIT_SIGN_ICCM_IN.getKey()
                ,HKConstants.EventTypes.VISIT_SIGN_ICCM_PASS.getKey()
                ,HKConstants.EventTypes.VISIT_SIGN_ICCM_OUT.getKey()});
        HKService.cancelEventSub(param);//先取消
        HKService.eventSub(param);//访客事件
@@ -95,7 +102,6 @@
        param.setEventTypes(new Integer[]{HKConstants.EventTypes.DOOR_FACE_AUTH_FAIL.getKey(),HKConstants.EventTypes.DOOR_FACE_AUTH_SUCCESS.getKey()});
        HKService.cancelEventSub(param);//先取消
        HKService.eventSub(param);//门禁事件
    }
    /**
     * å–消订阅门禁事件、访客事件、和停车场事件
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleAdminTool.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.doumee.task;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.service.business.InterfaceLogService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncImgServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVehicleFromHKServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVisitFromHKServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
 * å®šæ—¶ä»»åŠ¡ï¼ˆåºŸå¼ƒï¼‰
 * @author jiangping
 * @date 2021-10-10 14:40:35
 * https://www.bejson.com/othertools/cron/  cron è¡¨è¾¾å¼ç”Ÿæˆåœ°å€
 */
@Component
@EnableScheduling
public class ScheduleAdminTool {
    @Autowired
    private HkSyncVisitFromHKServiceImpl hkSyncVisitFromHKService;
    @Autowired
    private HkSyncVehicleFromHKServiceImpl hkSyncVehicleFromHKService;
    @Autowired
    private InterfaceLogService interfaceLogService;
    /**
     * æ˜¯å¦å¼€å‘者
     */
    @Autowired
    private DataSyncConfig dataSyncConfig;
    /**
     * æ¯å¤©å¢žé‡æ‹‰å–车辆数据
     * @throws Exception
     */
    @Scheduled(cron= "0 0 23 * * ?")
    public void syncVehicleUpdateData() throws Exception {
        if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
           return;
        }
        hkSyncVehicleFromHKService.syncVehicleUpdateData(new Date(System.currentTimeMillis()-24*60*60*1000));
    }
    /**
     * æ¯åˆ†é’Ÿæ‹‰å–一次今日的访客预约数据
     * @throws Exception
     */
    @Scheduled(fixedRate= 3*60*1000)
    public void syncVistAppointData() throws Exception {
        if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
            return;
        }
        if(Constants.DEALING_FROM_HK_VISIT){
            return ;
        }
        try {
            Constants.DEALING_FROM_HK_VISIT =true;
            hkSyncVisitFromHKService.syncVistAppointDataIccm(new Date());
            Constants.DEALING_FROM_HK_VISIT =false;
        }catch (Exception e){
//            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
        }finally {
            Constants.DEALING_FROM_HK_VISIT =false;
        }
    }
    /**
     * æ¯å¤©æ¸…理超过一周的接口日志数据(清除和安防平台对接的接口数据)
     * @throws Exception
     */
    @Scheduled(cron= "0 0 23 * * ?")
    public void remainLastLogs() throws Exception {
        if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
            return;
        }
        interfaceLogService.remainLastLogs();
    }
}
server/dmvisit_admin/src/main/resources/application.yml
@@ -10,7 +10,7 @@
  #  application:
  #    name: doumeevisit
  profiles:
    active: proHS
    active: proYL
  # JSON返回配置
  jackson:
server/dmvisit_admin/src/main/resources/logback-spring.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%n</pattern>
        </layout>
    </appender>
<!--
    <property name="log.path" value="/usr/local/jars/log/admin"></property>
-->
    <property name="log.path" value="C:\\ylscreen\\jars\\logs\\admin"></property>
    <property name="log.fileSize" value="100MB"></property>
    <property name="log.historyDays" value="7"></property>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--匹配就舍去-->
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/info.%d.%i.log</fileNamePattern>
            <maxFileSize>${log.fileSize}</maxFileSize>
            <maxHistory>${log.historyDays}</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/error.%d.%i.log</fileNamePattern>
            <maxFileSize>${log.fileSize}</maxFileSize>
            <maxHistory>${log.historyDays}</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <!-- å¼‚步写入日志 -->
    <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
        <!-- ä¸ä¸¢å¤±æ—¥å¿—.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold >0</discardingThreshold>
        <!-- æ›´æ”¹é»˜è®¤çš„队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- æ·»åŠ é™„åŠ çš„appender,最多只能添加一个 -->
        <appender-ref ref ="fileInfoLog"/>
    </appender>
    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>
server/dmvisit_screen/src/main/java/com/doumee/service/impl/ScreenServiceImpl.java
@@ -47,25 +47,26 @@
    public   CountDataResponse countData(BaseRequest param){
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.select("count(1) as applyTotalNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status not in(5,6,8)) as applyPassNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status in (5)) as visitInNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status in (6,8)) as visitOutNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status not in(0)) as applyPassNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status not in(0,4)) as visitorNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status in (1,3,6)) as visitInNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status in (2,5)) as visitOutNum");
        queryWrapper.select("(select count(1) from car_event where TO_DAYS(create_date)=TO_DAYS(now()) and inout_type=0 and event_type="+ HKConstants.EventTypes.PARK_PASS_IN.getKey() +") as carInNum");
        queryWrapper.select("(select count(1) from car_event where TO_DAYS(create_date)=TO_DAYS(now()) and (inout_type !=0 ) and event_type="+ HKConstants.EventTypes.PARK_PASS_OUT.getKey() +") as carOutNum");
        queryWrapper.eq(Visits::getIsdeleted, Constants.ZERO );
        queryWrapper.apply("TO_DAYS(starttime)=TO_DAYS(now())" );
        queryWrapper.last("limit 1");
        CountDataResponse vModel =visitsMapper.selectJoinOne(CountDataResponse.class,queryWrapper);
        vModel.setVisitorNum(vModel.getVisitInNum()+vModel.getVisitOutNum());//今日访客总数
//        vModel.setVisitorNum(vModel.getVisitInNum()+vModel.getVisitOutNum());//今日访客总数
        MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(1) as memberCarNum");
        wrapper.exists("select b.id from cars b where b.code=t.plate_nos" );
        wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" );
        wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now()) and inout_type=0 and event_type="+ HKConstants.EventTypes.PARK_PASS_IN.getKey() );
        wrapper.last("limit 1");
        CountDataResponse cModel =carEventMapper.selectJoinOne(CountDataResponse.class,wrapper);
        vModel.setMemberCarNum(vModel.getMemberCarNum());//今日员工车辆进场数
        vModel.setVisitCarNum(vModel.getCarInNum() - vModel.getMemberCarNum());//今日预约车辆进场数
        vModel.setMemberCarNum(Constants.formatIntegerNum(cModel.getMemberCarNum()));//今日员工车辆进场数
        vModel.setVisitCarNum(vModel.getCarInNum() - cModel.getMemberCarNum());//今日预约车辆进场数
        vModel.setCarNum(getCarInRecordCount());
        return vModel;
    }
@@ -129,6 +130,8 @@
        List<VisitDataListResponse> list = new ArrayList<>();
        MPJLambdaWrapper<VisitEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(VisitEvent.class) ;
        //只查询通行记录
        wrapper.eq(VisitEvent::getEventType,HKConstants.EventTypes.VISIT_SIGN_ICCM_PASS.getKey() );
        wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" );
        wrapper.last("limit 50");
        wrapper.orderByDesc(VisitEvent::getStartTime);
@@ -254,7 +257,7 @@
        MPJLambdaWrapper<Visits> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(id) as num, starttime");
        wrapper.apply("TO_DAYS(starttime)+"+days+" >= TO_DAYS(now()) " );
        wrapper.in(Visits::getStatus,  5,6,7);
        wrapper.in(Visits::getStatus,  1,2,3,5,6);
        wrapper.groupBy("TO_DAYS(starttime)");
        wrapper.orderByDesc(CarEvent::getCreateDate);
        List<Visits> result =visitsMapper.selectJoinList(Visits.class,wrapper);
server/dmvisit_screen/src/main/resources/application.yml
@@ -10,7 +10,7 @@
  #  application:
  #    name: doumeevisit
  profiles:
    active: devYL
    active: proYL
  # JSON返回配置
  jackson:
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -81,12 +81,14 @@
        String cardUnloss= "/api/cis/v1/card/batch/unLoss";//批量解挂
        String taskPersoDetail= "/api/acps/v1/download_record/person/detail/search";//查询设备通道的人员权限下载详情
        String appointmentRecords= "/api/visitor/v2/appointment/records";//查询访客预约记录v2
        String appointmentRecordsIccm= "/api/iccm/v2/appointment/records";//iccm查询访客预约记录V2
        String visitingRecords= "/api/visitor/v2/visiting/records";//查询访客来访记录v2
        String vehicleList= "/api/resource/v2/vehicle/advance/vehicleList";//查询车辆列表v2
        String vehicleTimeRangeList= "/api/resource/v1/vehicle/timeRange";//增量获取车辆数据
        String facePictureCheck= "/api/frs/v1/face/picture/check";//人脸评分
        String acsDeviceStatus= "/api/nms/v1/online/acs_device/get";//获取门禁设备在线状态
        String tempCarInRecords= "/api/pms/v1/tempCarInRecords/page";//查询场内车停车信息
        String appointmentEventQuery= "/api/iccm/v1/event/query";//查询场内车停车信息
    }
    /**
@@ -223,6 +225,9 @@
        PARK_PASS_OUT(771760134, "出场放行事件"  ),
        VISIT_SIGN_IN(1392513025, "访客登记"  ),
        VISIT_SIGN_OUT(1392513026, "访客签离"  ),
        VISIT_SIGN_ICCM_IN(541200006, "访客登记"  ),
        VISIT_SIGN_ICCM_OUT(541200007, "访客签离"  ),
        VISIT_SIGN_ICCM_PASS(541200060, "访客通行"  ),
        DOOR_FACE_AUTH_FAIL(197163, "人脸认证失败"  ),
        DOOR_FACE_AUTH_SUCCESS(196893, "人脸认证通过"  )
        ;
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -621,6 +621,29 @@
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    èŽ·å–è®¿å®¢é¢„çº¦è®°å½•åˆ—è¡¨
     * @param body
     * @return
     */
    public static String appointmentRecordsIccm(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.appointmentRecordsIccm);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    èŽ·å–è®¿å®¢è¿›å‡ºåœºäº‹ä»¶æŸ¥è¯¢åˆ†é¡µ
     * @param body
     * @return
     */
    public static String appointmentEventQuery(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.appointmentEventQuery);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    èŽ·å–å…¨é‡ç»„ç»‡åˆ—è¡¨
     * @param body
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AppointmentEventListRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class AppointmentEventListRequest {
    private String  visitorId;//    String    false    è®¿å®¢id(访客人员id;访客人员名称;设备资源code不能同时为空)
    private String  visitorName;//    String    false    è®¿å®¢åç§°
    private String  resourceCode    ;//String    false    è®¾å¤‡èµ„源code
    private String  eventTimeBegin;//    String    true    äº‹ä»¶å¼€å§‹æ—¶é—´
    private String  eventTimeEnd    ;//String    true    äº‹ä»¶ç»“束时间
    private int    pageNo;//    integer    True    pageNo要求大于0不超过2147483647
    private int    pageSize;//    integer    True    pageSize要求大于0且不超过1000
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmDataRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.doumee.core.haikang.model.param.request.event.visit;
import lombok.Data;
import java.util.List;
@Data
public class EventVisitIccmDataRequest {
        /**
         * é¢„约记录信息
         */
        private EventVisitIccmInvoiceParamRequest visitorInvoices;
        /**
         * è¢«è®¿äººä¿¡æ¯
         */
        private EventVisitIccmTargetParamRequest targetPerson;
        /**
         * è¢«è®¿äººä¿¡æ¯
         */
        private EventVisitIccmValuesParamRequest paramValues;
        /**
         * æ‹œè®¿äººä¿¡æ¯
         */
        private List<EventVisitIccmDetailParamRequest> visitorInformationList;
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmDetailParamRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.doumee.core.haikang.model.param.request.event.visit;
import lombok.Data;
@Data
public class EventVisitIccmDetailParamRequest {
        private String     visitorId;// eda8994f399544aaaee6eca64ed79827, #访客id
        private String      visitorName;// å°åˆ˜, #访客名称
        private Integer      sex;// 1,  #访客性别
        private String      phone;// 18229602833, #访客手机号
        private String      unit;// , #访客单位
        private Integer      certType;// 111,  #访客证件类型
        private String      certNo;// , #访客证件号码
        private String      certPicUrl;// , #访客证件照base64
        private String      faceUrl;// , #人脸base64
        private String      plateNo;// , #访客个人信息里的车牌
        private String      createTime;// 2023-02-16T20;//19;//46.382+08;//00,
        private String              updateTime;// 2023-02-16T20;//19;//46.382+08;//00,
        private String              visitNum;// 0,
        private String              isBlocked;// 0, #是否拉黑
        private String      tempCardNo;// 123456, #绑定的临时卡号
        private String      companionPerson;// 0, #是否为通行人:0不是1是
        private String      cardNo;// 1676549986273, #访客卡号
        private String      appointmentCode;// 5998, #访客码
        private String      facePic;// /pic?ad00=3001led-do671a*o0d1=4686*2l4767184156*8tp===119***sb9=defce2d7736fc--*49e3=pi17fo=0-510090, #访客人脸图片
        private String      faceDeviceId;// 894c1bfa-e8a7-419a-84d1-1a1fb5f3896a #图片设备id
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmInfoRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.doumee.core.haikang.model.param.request.event.visit;
import lombok.Data;
@Data
public class EventVisitIccmInfoRequest {
    private String  eventId;//    String    äº‹ä»¶å”¯ä¸€æ ‡è¯†    æ˜¯    64
    private String  srcIndex;//    String    äº‹ä»¶æºç¼–号,物理设备是资源编号    æ˜¯    64
    private String  srcType;//    String    äº‹ä»¶æºç±»åž‹    æ˜¯    16
    private Integer  eventType    ;//Number    äº‹ä»¶ç±»åž‹    æ˜¯
    private String  srcName;//    String    äº‹ä»¶æºåç§°    å¦    64
    private Integer   status    ;//Number    äº‹ä»¶çŠ¶æ€    æ˜¯        0-瞬时1-开始2-停止3-事件脉冲4-事件联动结果更新5-异步图片上传
    private Integer  timeout    ;//Number    è„‰å†²è¶…æ—¶æ—¶é—´    æ˜¯        å•位:秒
    private String  happenTime    ;//String    äº‹ä»¶å‘生时间(设备时间)    æ˜¯    64
    private String   srcParentIndex    ;//String    äº‹ä»¶å‘生的事件源父设备编号    å¦    64
    private EventVisitIccmDataRequest data;
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmInvoiceParamRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.doumee.core.haikang.model.param.request.event.visit;
import lombok.Data;
@Data
public class EventVisitIccmInvoiceParamRequest {
        private String   invoicesId;// 5bc15cabf24141c6ab3da357e29e5d53,  #访客单id
        private String  invoicesNo;// FK20230220090002, #访客单号
        private String  visitorId;// eda8994f399544aaaee6eca64ed79827,  #访客id
        private String  visitorTypeId;// , #访客类型id
        private String  deptId;// fe3d4470fa824449b8dcdf34e833890e, #访问部门id
        private String  campusId;// 39ce5586087c4d78873ff187396acf5b, #园区id
        private String  visitReason;// 7744d9691f1e45b7b4a06394280e45a3,  #访问事由id
        private String  visitReasonRemark;// ,  #访问事由备注
        private String  visitTargetId;// 2cb0bd1b312941569c43f64d781b7cf7,  #被访人id
        private String  companionIds;// ,  #同行人id,逗号分割
        private String  type;// 0,  #类型:0,预约;1,邀约
        private String  appointmentType;// 0,  #预约类型:0:普通预约;1:快速预约;2;//免登记预约; 3;// ç¬¬ä¸‰æ–¹é¢„约 ; 4;//访客机预约; 5;// ä¼šç®¡è®¿å®¢é¢„约; 6;// å¿«é€Ÿé‚€çº¦; 7;//普通邀约; 8;//级联邀约; 9;//级联快速预约; 10;//级联预约
        private String  workflowInstanceId;// f1b53b54414641d58cd7cd332105d723, #流程id
        private String  approveRemark;// , #流程审批备注
        private String  ifInfoAbnormal;// 0,
        private String  beginTime;// 2023-02-20T10;//00;//00.000+08;//00,  #访问开始时间
        private String  finishTime;// 2023-02-20T23;//30;//00.000+08;//00, #访问结束时间
        private String  invoicesStatus;// 3, #访客单状态(0;//待审批,1;//待访问,2;//已驳回,3;//已作废,4;//已取消,5;//已完成)
        private String  workflowInitiatorId;// eda8994f399544aaaee6eca64ed79827, #流程发起人id
        private String  workflowInitiatorType;// 0, #流程发起人类型(0;//访客,1;//员工)
        private String  operator;// eda8994f399544aaaee6eca64ed79827, #操作人
        private String  operatorType;// 0, #操作人类型(0;//访客,1;//员工)
        private String  extendJson;// , #扩展字段
        private String  authIssueStatus;// 0, #权限下发状态(0;//未下发,1;//下发成功,2;//下发失败,3;//权限清除,4;//权限回收)
        private String  createTime;// 2023-02-20T09;//43;//39.479+08;//00, #创建时间
        private String  updateTime;// 2023-02-20T19;//42;//32.640+08;//00,
        private String          campusName;// å•独停车场测试, #园区名称
        private String  deptName;// é»˜è®¤éƒ¨é—¨, #部门名称
        private String  visitorTypeName;// æ™®é€šè®¿å®¢,  #访客类型
        private String  sceneNames;// æµ‹è¯•7,  #权限场景名称,多个逗号分隔
        private String  visitReasonName;// å•†åŠ¡æ´½è°ˆ, #访问事由名称
        private String regionId;//eda8994f399544aaaee6eca64ed79827,#区域id,2.2支持,2.3废弃该字段
        private String regionName;//滨江,#区域名称,2.2支持,2.3废弃该字段
        private String campusRegionIds;//pda8994f399544aaaee6eca64ed79828,#区域id,2.3支持
        private String campusRegionNames;//海康三期, #区域名称,2.3支持
        private String isRepast;//1 #访客就餐,0;//否,1;//是
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmParamRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.doumee.core.haikang.model.param.request.event.visit;
import lombok.Data;
import java.util.List;
@Data
public class EventVisitIccmParamRequest {
    private String   sendTime;//    P    String    äº‹ä»¶ä»ŽæŽ¥æ”¶è€…(程序处理后)发出的时间    æ˜¯    32    äº‹ä»¶å‘送时间
    private String    ability;//    P    String    äº‹ä»¶ç±»åˆ«    æ˜¯    64    æ ‡è¯†åœè½¦åœºäº‹ä»¶
    private String[] uids;//    String[]    ç”¨æˆ·id    å¦    ä¸é™
    private String[] clients    ;//String[]    ç»„件标识    å¦    ä¸é™
    private List<EventVisitIccmInfoRequest> events;//    P    Events[]    äº‹ä»¶ä¿¡æ¯    æ˜¯    ä¸é™
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.core.haikang.model.param.request.event.visit;
import lombok.Data;
@Data
public class EventVisitIccmRequest {
//    private String  parkIndexCodes    ;//    string    False    åœè½¦åº“唯一标识集合  å¤šä¸ªå€¼ä½¿ç”¨è‹±æ–‡é€—号分隔,不超过1000个
    private String   method    ;//    String    æ–¹æ³•名,用于标识报文用途    æ˜¯    16    äº‹ä»¶å›ºå®šOnEventNotify
    private EventVisitIccmParamRequest params    ;//    Params    äº‹ä»¶å‚数信息    æ˜¯    ä¸é™    å…·ä½“参数信息
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmTargetParamRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.core.haikang.model.param.request.event.visit;
import lombok.Data;
@Data
public class EventVisitIccmTargetParamRequest {
        private String   personId;// 2cb0bd1b312941569c43f64d781b7cf7, #被访人id
        private String  personNumber;// 10001, #被访人工号
        private String  name;// Lhk管理员, #被访人编号
        private String  sex;// 1, #被访人性别
        private String  jobNo;// 10001, #被访人工号
        private String  pinyin;// lhkguanliyuan, #被访人拼音
        private String  mobile;// 17700001111, #被访人手机号
        private String  orgId;// root000000, #被访人组织id
        private String  certType;// 111, #被访人证件类型
        private String  certificateNo;// 330282202302160001, #被访人证件号码
        private String  orgPathName;// é»˜è®¤ç»„织, #被访人组织
        private String  userName;// Lhk管理员, #被访人用户名
        private String  createTime;// 2023-02-16T10;//10;//51.683+08;//00,
        private String  updateTime;// 2023-02-20T19;//40;//54.138+08;//00
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/visit/EventVisitIccmValuesParamRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.doumee.core.haikang.model.param.request.event.visit;
import lombok.Data;
@Data
public class EventVisitIccmValuesParamRequest {
        private String      type;// 1, #事件源类型:1访客机2保安人工3门禁4停车场出入口5api6被访人
        private String   eventType;// 541200007, #541200006[签到消息通知],541200007[签离消息通知],541200009[访客滞留],541200060[通行事件]
        private String   sourceName;// 1号门禁, #门禁名称
        private String   eventId;// demoData, #事件id
        private String     eventTypeName;// demoData, #事件类型名称
        private String                     happenTime;// 23/6/2 0002 11;//36, #发生时间
        private String   srcParentIndex;// demoData, #父类资源 indexcode
        private String   srcIndex;// demoData, #子类indexcode
        private String   srcName;// demoData, #设备名称
        private String   srcType;// demoData, #资源类型
        private String   extEventCardNo;// demoData, #卡号
        private String   extEventInOut;// demoData, #门禁点唯一接入编码
        private String   extEventPictureURL;// demoData, #图片的url
        private String    svrIndexCode;// demoData, #图片服务器唯一编码
        private String   extEventReaderKind;// demoData,  #读卡器类别
        private String   extEventReaderID;// demoData, #读卡器id
        private String   userType;// demoData, #人员类型:0未知,1普通,2来宾,3黑名单,4管理员
        private String   visitorNames;// demoData, #访客姓名,多个逗号拼接
        private String   phones;// demoData, #手机号,多个逗号拼接
        private String   certificateNos;// demoData, #身份证,多个逗号拼接
        private String   certTypes;// 333, #证件类型,多个逗号拼接
        private String   invoicesIds;// 5a9e731d6b9043feb665282786dd8914, #访客单id,多个逗号拼接
        private String   defineEventType;// 9, #事件类型
        private String   plateNos;// demoData, #车牌号码,多个逗号拼接
        private String   parkName;// demoData,  #停车库名称
        private String   parkIndex;// demoData, #停车库编号
        private String   gateName;// demoData,#出入口名称
        private String   gateIndex;// demoData,  #出入口编号
        private String   inOrOut;// 1,#进出类型:1进入2出去
        private String   accessType;// 1,  #事件类型:1门禁事件2车辆事件
        private String   regionName;// demoData#区域名称,
        private String    typeId;//1 #前端跳转url的typeId
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentEventInfoResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.core.haikang.model.param.respose;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class AppointmentEventInfoResponse {
    private String visitorName;//    String    false    è®¿å®¢å§“名
    private String  visitorSex    ;//String    false    æ€§åˆ«,1男,2女
    private String      cardNum;//    String    false    å¡å·
    private String     cardType;//    String    false    å¡ç±»åž‹,0-身份证号 2-IC卡号
    private String     deviceIndexCode;//    String    false    è®¾å¤‡ç¼–码
    private String       deviceType;//    String    false    è®¾å¤‡ç±»åž‹
    private String       deviceDesc;//    String    false    è®¾å¤‡æè¿°
    private String       eventName;//    String    false    äº‹ä»¶åç§°
    private String     eventId    ;//String    false    äº‹ä»¶id
    private String     phoneNum    ;//String    false    æ‰‹æœºå·
    private String    carNumber    ;//String    false    è½¦ç‰Œå·
    private String     identityId;//    String    false    è¯ä»¶ç±»åž‹
    private String     identityNum    ;//String    false    è¯ä»¶å·ç 
    private String     visitorPhotoUri;//    String    false    è®¿å®¢å¤´åƒ
    private String     identityPhotoUri;//    String    false    è¯ä»¶ç…§ç‰‡
    private String     eventTime;//    String    false    äº‹ä»¶æ—¶é—´
    private String      visitorId;//    String    false    è®¿å®¢id
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentIccmInfoResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.core.haikang.model.param.respose;
import lombok.Data;
import java.util.List;
@Data
public class AppointmentIccmInfoResponse {
    private String     campusId;//    String    false    å›­åŒºid
    private String campusName;//    String    false    å›­åŒºåç§°
    private String deptId    ;//String    false    éƒ¨é—¨id
    private String deptName;//    String    false    éƒ¨é—¨åç§°
    private String visitorTypeId;//    String    false    è®¿å®¢ç±»åž‹id
    private String visitorTypeName;//    String    false    è®¿å®¢ç±»åž‹
    private String appointRecordId;//    String    false    è®¿å®¢é¢„约记录id
    private String orderId;//    String    false    è®¿å®¢å•号
    private String visitPurpose;//String    false    æ¥è®¿äº‹ç”±id
    private String visitPurposeName;//    String    false    æ¥è®¿äº‹ç”±
    private String visitEndTime;//    String    false    è®¿é—®ç»“束时间
    private String receptionistId    ;//String    false    è¢«è®¿äººid
    private String receptionistName;//    String    false    è¢«è®¿äººå§“名
    private String  visitStartTime    ;//String    false    è®¿é—®å¼€å§‹æ—¶é—´
    private String  oneOrPeople;//    String    false    é€šè¡Œç ç­–ç•¥ 0:一人一码 1:多人一码
    private List<AppointmentResInfoResponse> designatedResources;//    object    False    æƒé™ä¸‹å‘指定的资源点集合
    private String[] privilegeGroupNames;//    string[]    False    æƒé™ç»„名称集合
    private List<AppointmentVisitorInfoResponse>  visitorList;// Array    false    è®¿å®¢åˆ—表
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentVisitorInfoResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.doumee.core.haikang.model.param.respose;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import java.util.List;
@Data
public class AppointmentVisitorInfoResponse {
    private String  appointRecordId        ;//string    False    é¢„约记录ID,可作为修改预约的依据
    private Boolean  companion;//    Boolean    false    æ˜¯å¦åŒè¡Œäºº
    private String visitorId    ;//String    false    è®¿å®¢id
    private String phoneNo    ;//String    false    è®¿å®¢æ‰‹æœºå·
    private String visitorName;//    String    false    è®¿å®¢å§“名
    private Integer gender;//    Number    false    æ€§åˆ«(1:男,2:女)
    private String svrIndexCode;//    String    false    å›¾ç‰‡å­˜å‚¨æœåŠ¡çš„å”¯ä¸€æ ‡è¯†
    private String picUri;//    String    false    è®¿å®¢å¤´åƒ,图片的相对URL
    private String identityUri;//    String    false    è¯ä»¶ç…§,图片的相对URL
    private String identitySvrCode;//    String    false    è¯ä»¶ç…§å¯¹åº”图片服务器serviceNodes
    private String plateNo;//    String    false    è®¿å®¢è½¦ç‰Œå·
    private String certificateNo;//    String    false    è¯ä»¶å·
    private String visitorWorkUnit    ;//String    false    æ¥è®¿å•位
    private Integer visitorStatus    ;//Number    false    è®¿å®¢çŠ¶æ€(0:未签到,1:已签到,2:已签退,3:滞留,4:未访问,5:自动签离,6:未签退)
    private String certificateType    ;//;//Number    false    è¯ä»¶ç±»åž‹
    private String isCompanion;//    Boolean    false    æ˜¯å¦åŒè¡Œäºº
    private String appointmentCode    ;//String    false    è®¿å®¢ç 
    @JsonProperty(value = "QRCode")
    @JSONField(name = "QRCode")
    private String  qrCode    ;//String    false    åŠ¨æ€äºŒç»´ç å†…å®¹
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -802,6 +802,42 @@
        return  null;
    }
    /**
     *海康访客预约记录查询ICCM版本(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<AppointmentIccmInfoResponse>>   appointmentRecordsIccm(AppointmentListRequest param){
        log.info("【海康访客预约记录查询ICCM版本】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.appointmentRecordsIccm(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference<BaseResponse<BaseListPageResponse<AppointmentIccmInfoResponse>>>(){};
            BaseResponse<BaseListPageResponse<AppointmentIccmInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康访客预约记录查询ICCM版本");
            return  result;
        }catch (Exception e){
            log.error("【海康访客预约记录查询ICCM版本】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *海康访客事件份额查询ICCM版本(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<AppointmentEventInfoResponse>>   appointmentEventQuery(AppointmentEventListRequest param){
        log.info("【海康访客事件份额查询ICCM版本】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.appointmentEventQuery(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference<BaseResponse<BaseListPageResponse<AppointmentEventInfoResponse>>>(){};
            BaseResponse<BaseListPageResponse<AppointmentEventInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康访客事件份额查询ICCM版本");
            return  result;
        }catch (Exception e){
            log.error("【海康访客事件份额查询ICCM版本】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *查询访客来访记录(已登记)(分页)
     * @return
     */
@@ -950,16 +986,16 @@
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>>   vehicleTimeRangeList(TimeRangeListRequest param){
        log.info("【海康增量人员查询】================开始===="+JSONObject.toJSONString(param));
        log.info("【海康增量车辆查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.vehicleTimeRangeList(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>> >(){};
            BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康增量人员查询");
            logResult(result,"海康增量车辆查询");
            return  result;
        }catch (Exception e){
            log.error("【海康增量人员查询】================失败====:\n"+ e.getMessage());
            log.error("【海康增量车辆查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -228,6 +228,16 @@
         int signout =  8;
         int invalid =9;
    }
    public interface VisitIccmStatus{
        //访客状态(0:未签到,1:已签到,2:已签退,3:滞留,4:未访问,5:自动签离,6:未签退)
         int waitSign = 0;
         int signin= 1;
         int signout = 2;
         int noleave =3;
         int novisit =4;
         int autoOut =5;
         int noSignout =6;
    }
    public interface EmpowerStatus{
        //一卡通授权下发状态 0待下发 1已下发 2下发成功   3已取消 4下发失败 5任务下载已结束
         int wait = 0;
server/dmvisit_service/src/main/java/com/doumee/service/business/InterfaceLogService.java
@@ -96,4 +96,6 @@
    long count(InterfaceLog interfaceLog);
    void clearThreeMonthLog();
    void remainLastLogs();
}
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -6,6 +6,8 @@
import com.doumee.core.haikang.model.param.request.PrivilegeGroupRequest;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
import com.doumee.core.haikang.model.param.request.event.parks.EventParkRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitIccmDataRequest;
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.dao.business.model.ParkBook;
@@ -83,4 +85,10 @@
    void syncMemberFailData();
    void syncMemberDelData();
    void syncVistAppointDataIccm(Date date);
    void syncVisitRecords(Date createDate);
    String dealVisitEventIccm(EventVisitIccmRequest param, HttpServletResponse response);
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
@@ -2,6 +2,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.InterfaceLogMapper;
import com.doumee.dao.business.model.InterfaceLog;
@@ -13,6 +14,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.yaml.snakeyaml.scanner.Constant;
import java.util.List;
@@ -161,4 +163,15 @@
                  .apply("to_days(create_date)+15 < to_days(now())")
                  .like(InterfaceLog::getUrl,"/artemis/api/"));
    }
    @Override
    public    void remainLastLogs(){
          InterfaceLog log = interfaceLogMapper.selectOne(new QueryWrapper<InterfaceLog>()
                  .select("max(id) as id").last("limit 1"));
          //只保留进10w条数据
          if(log!=null) {
              interfaceLogMapper.delete(new UpdateWrapper<InterfaceLog>().lambda()
                      .lt(InterfaceLog::getId, Constants.formatIntegerNum(log.getId()) - 100000));
          }
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -1160,7 +1160,7 @@
        }catch (BusinessException e){
            throw e;
        }finally {
            saveInterfaceLog(param,"/visitBiz/resource/approveApply",null,Constants.ZERO);
//            saveInterfaceLog(param,"/visitBiz/resource/approveApply",null,Constants.ZERO);
        }
    }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -7,6 +7,8 @@
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.request.event.acs.EventAcsRequest;
import com.doumee.core.haikang.model.param.request.event.parks.EventParkRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitIccmDataRequest;
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.haikang.model.param.respose.TaskAdditionResponse;
@@ -76,6 +78,10 @@
    public String   dealVisitEvent(EventVisitRequest param, HttpServletResponse response){
        return  null;
    }
    @Override
    public String dealVisitEventIccm(EventVisitIccmRequest param, HttpServletResponse response){
        return  null;
    }
    @Override
    public String   dealParkEvent(EventParkRequest param, HttpServletResponse response){
@@ -96,6 +102,9 @@
    @Override
    public  void syncVistAppointData(Date date){
    }
    @Override
    public     void syncVistAppointDataIccm(Date date){
    }
    public  void syncVehicleData(){
    }
    @Override
@@ -112,6 +121,9 @@
    public  void  syncVisitData() {
    }
    @Override
    public  void syncVisitRecords(Date createDate){
    }
    @Override
    public void getOutTimeVisitRecord(){
    }
    @Override
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncParkServiceImpl.java
@@ -18,7 +18,9 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CarEventMapper;
import com.doumee.dao.business.CarsMapper;
import com.doumee.dao.business.ParksMapper;
import com.doumee.dao.business.VisitsMapper;
import com.doumee.dao.business.join.ParkBookJoinMapper;
import com.doumee.dao.business.model.*;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
@@ -48,6 +50,10 @@
    private ParkBookJoinMapper parkBookMapper;
    @Autowired
    private CarEventMapper carEventMapper;
    @Autowired
    private CarsMapper carsMapper;
    @Autowired
    private VisitsMapper visitsMapper;
    @Override
    public  void syncParkBookData() {
        if(Constants.DEALING_HK_PARKBOOK){
@@ -405,6 +411,25 @@
            c.setParkIndex(model.getParkSyscode());
            c.setParkName(model.getParkName());
            c.setEventId(model.getCrossRecordSyscode());
            if(StringUtils.isNotBlank(model.getPlateNo())){
              Cars car =  carsMapper.selectOne(new QueryWrapper<Cars>().lambda()
                        .eq(Cars::getIsdeleted,Constants.ZERO)
                        .eq(Cars::getCode,model.getPlateNo())
                        .last("limit 1" ));
              if(car!=null){
                  //如果是内部人员
                  c.setMemberId(car.getMemberId());
              }
                Visits visits =  visitsMapper.selectOne(new QueryWrapper<Visits>().lambda()
                        .eq(Visits::getIsdeleted,Constants.ZERO)
                        .eq(Visits::getCarNos,model.getPlateNo())
                        .last("limit 1" ));
                if(visits!=null){
                    //如果是访客
                    c.setMemberId(visits.getMemberId());
                }
            }
            c.setGateIndex(model.getEntranceSyscode());
            c.setGateName(model.getEntranceName());
            c.setIsdeleted(Constants.ZERO);
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -11,9 +11,7 @@
import com.doumee.core.haikang.model.param.request.event.acs.EventDeviceDataRequest;
import com.doumee.core.haikang.model.param.request.event.parks.EventParkInfoRequest;
import com.doumee.core.haikang.model.param.request.event.parks.EventParkRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitDataRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitInfoRequest;
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
import com.doumee.core.haikang.model.param.request.event.visit.*;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
@@ -263,6 +261,58 @@
     * @return
     */
    @Override
    public String    dealVisitEventIccm(EventVisitIccmRequest param, HttpServletResponse response){
        log.info("【海康访客事件推送】==========开始=======:\n"+JSONObject.toJSONString(param));
        String result = null;
        try {
            if(param == null || param.getParams() == null || param.getParams().getEvents()==null){
                return null;
            }
            //门禁事件集合
            List<EventVisitIccmInfoRequest> events  = param.getParams().getEvents();
            List<VisitEvent> list = new ArrayList<>();
            List<Integer> delRetentionLis = new ArrayList<>();
            List<Retention> retentionList = new ArrayList<>();
            for(EventVisitIccmInfoRequest request : events){
                if(request.getData() ==null || request.getData().getVisitorInvoices() ==null){
                    continue;
                }
                if(request.getData().getVisitorInformationList() == null || request.getData().getVisitorInformationList().size() ==0){
                    continue;
                }
                //海康访客记录编码
                dealVisitDataByRequstIccm(request,delRetentionLis,retentionList,list);
            }
            if(list.size()>0){
                //插入门禁记录
                visitEventMapper.insertBatchSomeColumn(list);
            }
            if(delRetentionLis.size()>0){
                //先删除原有的在场人员(普通访客)
                retentionMapper.delete(new UpdateWrapper<Retention>().lambda()
                        .eq(Retention::getType,Constants.memberType.visitor)
                        .in(Retention::getMemberId,delRetentionLis));
            }
            if(retentionList.size()>0){
                //再插入最新的在厂人员
                retentionMapper.insertBatchSomeColumn(retentionList);
            }
            log.error("【海康访客事件推送】========成功=======");
        }catch (Exception e){
            log.error("【海康访客事件推送】========失败=======:\n"+e.getMessage());
        }
        saveInterfaceLog(param,"/business/hksync/push/visitIccm",result,true);
        return  null;
    }
    /**
     * æµ·åº·è®¿å®¢äº‹ä»¶æŽ¨é€
     * @param param
     * @param response
     * @return
     */
    @Override
    public String   dealVisitEvent(EventVisitRequest param, HttpServletResponse response){
        log.info("【海康访客事件推送】==========开始=======:\n"+JSONObject.toJSONString(param));
        String result = null;
@@ -314,6 +364,143 @@
    /**
     *  æ ¹æ®è®¿å®¢æŽ¨é€è®¿å®¢è®°å½•编码,处理访客记录、在场人员等信息
     */
    private void dealVisitDataByRequstIccm(EventVisitIccmInfoRequest request, List<Integer> delRetentionLis, List<Retention> retentionList,List<VisitEvent> list) {
        EventVisitIccmInvoiceParamRequest data =  request.getData().getVisitorInvoices();
        Integer memberId = null;
        if(request.getData().getTargetPerson().getPersonId()!=null){
            Member m = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                    .eq(Member::getHkId,request.getData().getTargetPerson().getPersonId())
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .last( "limit 1"));
            if(m!=null){
                memberId = m.getId();
            }
        }
        for(EventVisitIccmDetailParamRequest model : request.getData().getVisitorInformationList()){
            Visits updateVistis = new Visits();
            MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
            queryWrapper.selectAll(Visits.class);
            queryWrapper.selectAs(Member::getType,Visits::getMemberType);
            queryWrapper.eq(Visits::getHkId,model.getVisitorId() );
            queryWrapper.leftJoin(Member.class,Member::getId,Visits::getMemberId );
            queryWrapper.last("limit 1");
            Visits visits = visitsMapper.selectJoinOne(Visits.class,queryWrapper);
            if(visits !=null) {
                //如果人员信息存在,则删除之前的所有进场数据(无论此次推送是进厂还是出场推送事件)
                delRetentionLis.add(visits.getMemberId());
                if (dataSyncConfig.getOrgUserDataOrigin() == DataSyncConfig.origin.hk) {
                    //如果是伊利大屏项目,不做处理
                    return;
                }
                updateVistis.setId(visits.getId());
                if (Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_ICCM_IN.getKey()) {
                    //如果是访客登记,录入人员的在场数据记录
                    retentionList.add(getRetentionModelByVisitRequest(visits, request.getHappenTime(),request.getSrcType()));
                    //来访时间
                    updateVistis.setStatus(Constants.VisitIccmStatus.signin);
                    updateVistis.setInDate(DateUtil.getISO8601DateByStr(data.getBeginTime()));
                    updateVistis.setOutDate(DateUtil.getISO8601DateByStr(data.getFinishTime()));
                    updateVistis.setEditDate(new Date());
                    //更新访客来访或者签离时间信息
                    visitsMapper.updateById(updateVistis);
                    //更新最新来访时间
                    Member member = new Member();
                    member.setLastVisitDate(updateVistis.getInDate());
                    member.setId(visits.getMemberId());
                    memberMapper.updateById(member);
                } else  if (Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_ICCM_OUT.getKey())  {
                    //如果是访客签离事件
                    updateVistis.setStatus(Constants.VisitIccmStatus.signout);
                    updateVistis.setInDate(DateUtil.getISO8601DateByStr(data.getBeginTime()));
                    updateVistis.setOutDate(DateUtil.getISO8601DateByStr(data.getFinishTime()));
                    updateVistis.setOutType(Constants.ZERO);
                    updateVistis.setOutInfo("访客正常签离");
                    updateVistis.setEditDate(new Date());
                    //更新访客来访或者签离时间信息
                    visitsMapper.updateById(updateVistis);
                }else{
                    updateVistis.setStatus(visits.getStatus());
                }
            }else{
                //新增访客登记数据
               addNewVisitInfo(request,model,updateVistis.getStatus());
            }
            //封装门禁事件信息表对象
            list.add(getVisitEventModelByRequest(request,model));
        }
    }
    private void addNewVisitInfo(EventVisitIccmInfoRequest request, EventVisitIccmDetailParamRequest model,Integer status) {
        try{
            Visits c = new Visits();
            c.setHkId(model.getVisitorId());
            c.setCode(model.getAppointmentCode());
            c.setName(model.getVisitorName());
            c.setHkStatus(Constants.ONE);
            c.setHkDate(new Date());
            c.setIsdeleted(Constants.ZERO);
            c.setCreateDate(c.getHkDate());
            c.setIdcardNo(DESUtil.encrypt(Constants.EDS_PWD, model.getCertNo()));
            c.setIdcardDecode(Constants.getTuominStr(model.getCertNo()));
            c.setIdcardType( model.getCertType());
            c.setStarttime(DateUtil.getISO8601DateByStr2(request.getData().getVisitorInvoices().getBeginTime()));
            c.setEndtime(DateUtil.getISO8601DateByStr2(request.getData().getVisitorInvoices().getFinishTime()));
            c.setReason(request.getData().getVisitorInvoices().getVisitReason());
            c.setStatus(status);
            c.setType(Constants.ONE);
            if(StringUtils.isNotBlank(request.getData().getTargetPerson().getPersonId())){
                //被访问人
                Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getHkId
                        ,request.getData().getTargetPerson().getPersonId()).last("limit 1"));
                c.setReceptMemberId(member!=null?member.getId():null);
            }
            c.setCompanyName(model.getUnit());
            c.setPhone(model.getPhone());
            c.setCarNos(model.getPlateNo());
            if(StringUtils.isNotBlank(model.getCertNo())){
                //被访问人
                Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                        .eq(Member::getType,Constants.ONE)
                        .eq(Member::getIdcardNo , c.getIdcardNo())
                        .last("limit 1"));
                if(member == null){
                    member = new Member();
                    member.setName(model.getVisitorName());
                    member.setPhone(model.getPhone());
                    member.setSex(model.getSex());
                    member.setIsdeleted(Constants.ZERO);
                    member.setType(Constants.ONE);
                    member.setIdcardNo(c.getIdcardNo());
                    member.setIdcardDecode(c.getIdcardDecode());
                    member.setVisitCompanyName(model.getUnit());
                    member.setCreateDate(new Date());
                    if(StringUtils.isNotBlank(model.getFacePic())){
                        member.setImgurl(HKConstants.IMG_INDEX+model.getFacePic());
                        member.setFaceServerIndexCode(model.getFaceDeviceId());
                    }
                    memberMapper.insert(member);
                }else{
                    member.setIsdeleted(Constants.ZERO);
                    member.setEditDate(new Date());
                    member.setName(model.getVisitorName());
                    member.setPhone(model.getPhone());
                    member.setSex(model.getSex());
                    member.setVisitCompanyName(model.getUnit());
                    if(StringUtils.isNotBlank(model.getFacePic())){
                        member.setImgurl(HKConstants.IMG_INDEX+model.getFacePic());
                        member.setFaceServerIndexCode(model.getFaceDeviceId());
                    }
                    memberMapper.updateById(member);
                }
                c.setMemberId(member.getId());
                visitsMapper.insert(c);
            }
        }catch (Exception e){
            log.error("====================访客推送新增访客记录失败:"+e.getMessage());
        }
    }
    private void dealVisitDataByRequst(EventVisitInfoRequest request, List<Integer> delRetentionLis, List<Retention> retentionList) {
        EventVisitDataRequest model = request.getData();
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
@@ -334,7 +521,7 @@
            updateVistis.setId(visits.getId());
            if(Constants.formatIntegerNum(request.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_IN.getKey()){
                //如果是访客登记,录入人员的在场数据记录
                retentionList.add(getRetentionModelByVisitRequest(visits,request));
                retentionList.add(getRetentionModelByVisitRequest(visits, request.getHappenTime(),request.getSrcType()));
                //来访时间
                updateVistis.setStatus(Constants.VisitStatus.signin);
                updateVistis.setInDate(DateUtil.getISO8601DateByStr(model.getStartTime()));
@@ -358,6 +545,49 @@
        }
    }
    private VisitEvent getVisitEventModelByRequest(EventVisitIccmInfoRequest request,EventVisitIccmDetailParamRequest detail) {
        if(request.getData().getTargetPerson() ==null){
            request.getData().setTargetPerson(new EventVisitIccmTargetParamRequest());
        }
        VisitEvent event = new VisitEvent();
        event.setIsdeleted(Constants.ZERO);
        event.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        event.setVisitorWorkUint(detail.getUnit());
        event.setVisitorId(detail.getVisitorId());
        event.setVisitorCode(detail.getAppointmentCode());
        event.setTimeout(request.getTimeout());
        event.setSvrIndexCode(request.getSrcIndex());
        event.setHappenTime(request.getHappenTime());
        event.setStatus(request.getStatus());
        event.setEndTime(request.getData().getVisitorInvoices().getFinishTime());
        event.setStartTime(request.getData().getVisitorInvoices().getBeginTime());
        event.setSrcType(request.getSrcType());
        event.setSrcParentIndex(request.getSrcParentIndex());
        event.setSrcName(request.getSrcName());
        event.setSrcIndex(request.getSrcIndex());
        event.setSex(detail.getSex());
        event.setPurpose(request.getData().getVisitorInvoices().getVisitReason());
        event.setPhone(detail.getPhone());
        event.setBeVisitedPersonId(request.getData().getVisitorInvoices().getVisitTargetId());
        event.setBeVisitedPersonName(request.getData().getTargetPerson().getName());
        event.setBeVisitedPersonOrg(request.getData().getTargetPerson().getOrgPathName());
        event.setBeVisitedPersonOrgId(request.getData().getTargetPerson().getName());
        event.setPhotoUrl(getHkImgUrl(detail.getFacePic()));
        event.setPersonName(detail.getVisitorName());
        event.setCarNo(detail.getPlateNo());
        event.setIdType(detail.getCertType());
        String idnum = detail.getCertNo();
        if(StringUtils.isNotBlank(idnum)){
            //身份证号存储密文
            event.setIdNo(DESUtil.encrypt(Constants.EDS_PWD,idnum));//身份证号加密
            //脱敏手机号显示n
            event.setIdcardDecode(Constants.getTuominStr(idnum));
        }
        event.setEventType(request.getEventType());
        event.setEventId(request.getEventId());
        return event;
    }
    private VisitEvent getVisitEventModelByRequest(EventVisitInfoRequest request) {
        VisitEvent event = new VisitEvent();
        event.setIsdeleted(Constants.ZERO);
@@ -408,10 +638,10 @@
        return event;
    }
    private Retention getRetentionModelByVisitRequest(Visits visits, EventVisitInfoRequest request) {
    private Retention getRetentionModelByVisitRequest(Visits visits, String happentTime,String srcType) {
        Retention retention = new Retention();
        retention.setIsdeleted(Constants.ZERO);
        retention.setCreateDate(DateUtil.getISO8601DateByStr(request.getHappenTime()));
        retention.setCreateDate(DateUtil.getISO8601DateByStr(happentTime));
        retention.setClasses(visits.getClasses());
        retention.setCode(visits.getCode());
        retention.setIdcardNo(visits.getIdcardNo());
@@ -421,7 +651,7 @@
        retention.setType(visits.getMemberType());
        retention.setCompanyId(visits.getCompanyId());
        retention.setCompanyName(visits.getCompanyName());
        retention.setEventCode(request.getSrcType()+"");
        retention.setEventCode(srcType);
        retention.setEventDate(retention.getCreateDate());
        retention.setFaceImg(visits.getFaceImg());
        retention.setImgurl(visits.getImgurl());
@@ -473,7 +703,7 @@
                //再插入最新的在厂人员
                retentionMapper.insertBatchSomeColumn(retentionList);
            }
            log.error("【海康停车场事件推送】========成功=======");
            log.info("【海康停车场事件推送】========成功=======");
        }catch (Exception e){
            log.error("【海康停车场事件推送】========失败=======:\n"+e.getMessage());
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
@@ -4,6 +4,7 @@
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;
@@ -13,25 +14,22 @@
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitInfoRequest;
import com.doumee.core.haikang.model.param.respose.*;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ImageBase64Util;
import com.doumee.core.utils.*;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.DeviceRoleMapper;
import com.doumee.dao.business.RetentionMapper;
import com.doumee.dao.business.VisitEventMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.DeviceRole;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Retention;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.business.model.*;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.Date;
/**
 * æµ·åº·è®¿å®¢ä¸šåŠ¡Service实现
@@ -41,8 +39,13 @@
@Service
@Slf4j
public class HkSyncVisitServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Autowired
    private VisitsJoinMapper visitsMapper;
    @Autowired
    private VisitEventMapper visitEventMapper;
    @Autowired
    private RetentionMapper retentionMapper;
    @Autowired
@@ -498,6 +501,107 @@
        List<Visits> list = visitsMapper.selectJoinList(Visits.class,queryWrapper);
        return list;
    }
    @Override
    @Transactional
    public   void syncParkRecords(Date date){
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持海康数据同步操作~");
            }
            AppointmentEventListRequest param =  new AppointmentEventListRequest();
            //(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
            //查询今天的
            Date start = Utils.Date.getStart(date);
            Date end = new Date();
            if(DateUtil.daysBetweenDates(end,start) >1){
                end =  Utils.Date.getEnd(date);
            }
            param.setEventTimeBegin(DateUtil.getISO8601Timestamp2( start));
            param.setEventTimeBegin(DateUtil.getISO8601Timestamp2( end));
            List<VisitEvent>  allHkList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<AppointmentEventInfoResponse>> response = HKService.appointmentEventQuery(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<AppointmentEventInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                    allHkList.addAll(getNewCarEventModelBYList(r.getList()));
                }
                curPage++;
            }
            if(allHkList .size() == 0){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
            }
            //清空原有当天的数据
            visitEventMapper.delete(new UpdateWrapper<VisitEvent>().lambda()
                    .ge(VisitEvent::getCreateDate,start)
                    .le(VisitEvent::getCreateDate,end));
            if(allHkList.size()>0){
                int sublistSize = 500;
                int startIndex = 0;
                int endIndex = sublistSize;
                while (startIndex < allHkList.size()) {
                    if (endIndex > allHkList.size()) {
                        endIndex = allHkList.size();
                    }
                    List<VisitEvent> sublist = allHkList.subList(startIndex, endIndex);
                    if(sublist.size()>0){
                        visitEventMapper.insertBatchSomeColumn(sublist);//插入新数据
                    }
                    startIndex = endIndex;
                    endIndex += sublistSize;
                }
            }
        }catch (BusinessException e){
            throw  e;
        }
    }
    private List<VisitEvent> getNewCarEventModelBYList(List<AppointmentEventInfoResponse> list ) {
        List<VisitEvent> newList = new ArrayList<>();
        if(list == null || list.size()==0){
            return  newList;
        }
        for(AppointmentEventInfoResponse model :list){
            VisitEvent c = new VisitEvent();
            c.setHappenTime(model.getEventTime());
            c.setCreateDate(DateUtil.getISO8601DateByStr2(model.getEventTime()));
            c.setPersonName(model.getVisitorName());
            c.setSex(Integer.parseInt(model.getVisitorSex()));
            c.setCarNo(model.getCarNumber());
            c.setIdNo(model.getIdentityNum());
            c.setIdType(Integer.parseInt(model.getIdentityId()));
            c.setPhone(model.getPhoneNum());
            c.setRemark(model.getCardNum());
            c.setPhotoUrl(model.getIdentityPhotoUri());
            c.setVisitorId(model.getVisitorId());
            c.setIsdeleted(Constants.ZERO);
            c.setEventTypeName(model.getEventName());
            newList.add(c);
        }
        return newList;
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncVehicleFromHKServiceImpl.java
@@ -21,6 +21,7 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.CarEvent;
import com.doumee.dao.business.model.Cars;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
@@ -49,6 +50,8 @@
    private MemberMapper memberMapper;
    @Autowired
    private ParksMapper parksMapper;
    @Autowired
    private CarEventMapper carEventMapper;
    @Autowired
    private CarsMapper carsMapper;
    @Autowired
@@ -176,6 +179,13 @@
                    //被访问人
                    Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getHkId,model.getPersonId()).last("limit 1"));
                    c.setMemberId(member!=null?member.getId():null);
                    if(member!=null){
                        carEventMapper.update(null,new UpdateWrapper<CarEvent>().lambda()
                                .set(CarEvent::getMemberId,member.getId())
                                .eq(CarEvent::getPlateNos,c.getCode())
                                .apply("member_id is null or member_id=''")
                        );
                    }
                }
                Cars cars = carsMapper.selectOne(new QueryWrapper<Cars>().lambda().eq(Cars::getHkId,model.getVehicleId()).last("limit 1"));
                if(cars!=null){
@@ -212,11 +222,17 @@
                //被访问人
                Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getHkId,model.getPersonId()).last("limit 1"));
                c.setMemberId(member!=null?member.getId():null);
                if(member!=null){
                    carEventMapper.update(null,new UpdateWrapper<CarEvent>().lambda()
                            .set(CarEvent::getMemberId,member.getId())
                            .eq(CarEvent::getPlateNos,c.getCode())
                            .apply("member_id is null or member_id=''")
                    );
                }
            }
            newList.add(c);
        }
        return newList;
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncVisitFromHKServiceImpl.java
@@ -10,7 +10,9 @@
import com.doumee.core.haikang.model.param.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.AppointmentListRequest;
import com.doumee.core.haikang.model.param.respose.AppointmentIccmInfoResponse;
import com.doumee.core.haikang.model.param.respose.AppointmentInfoResponse;
import com.doumee.core.haikang.model.param.respose.AppointmentVisitorInfoResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
@@ -52,6 +54,64 @@
    private SystemDictDataBiz systemDictDataBiz;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息到业务系统
     */
    @Override
    @Transactional
    public   void syncVistAppointDataIccm(Date date){
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持海康数据同步操作~");
            }
            AppointmentListRequest param =  new AppointmentListRequest();
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
            //查询今天的
            Date start =Utils.Date.getStart(date);
            Date end = Utils.Date.getEnd(new Date());
            param.setVisitStartTimeBegin(DateUtil.getISO8601Timestamp2( start));
            param.setVisitStartTimeEnd(DateUtil.getISO8601Timestamp2( end));
            List<Visits>  allHkList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<AppointmentIccmInfoResponse>> response = HKService.appointmentRecordsIccm(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<AppointmentIccmInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                    allHkList.addAll(getNewVisitModelBYListIccm(r.getList()));
                }
                curPage++;
            }
            if(allHkList .size() == 0){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
            }
            //清空原有当天的数据
            visitsMapper.delete(new UpdateWrapper<Visits>().lambda()
                    .ge(Visits::getStarttime,start)
                    .eq(Visits::getType,Constants.ONE)
                    .le(Visits::getStarttime,end));
            visitsMapper.insertBatchSomeColumn(allHkList);//插入新数据
        }catch (BusinessException e){
            throw  e;
        }
    }
    /**
     * åŒæ­¥æµ·åº·ç»„织信息到业务系统
     */
@@ -114,6 +174,84 @@
        }
    }
    private List<Visits> getNewVisitModelBYListIccm(List<AppointmentIccmInfoResponse> list ) {
        List<Visits> newList = new ArrayList<>();
        if(list == null || list.size()==0){
            return  newList;
        }
        for(AppointmentIccmInfoResponse data :list){
            if(data.getVisitorList()==null || data.getVisitorList().size() ==0){
                continue;
            }
            for(AppointmentVisitorInfoResponse model : data.getVisitorList()){
                Visits c = new Visits();
                c.setHkId(model.getVisitorId());
                c.setCode(model.getQrCode());
                c.setName(model.getVisitorName());
                c.setHkStatus(Constants.ONE);
                c.setHkDate(new Date());
                c.setIsdeleted(Constants.ZERO);
                c.setCreateDate(c.getHkDate());
                c.setIdcardNo(DESUtil.encrypt(Constants.EDS_PWD, model.getCertificateNo()));
                c.setIdcardDecode(Constants.getTuominStr(model.getCertificateNo()));
                c.setIdcardType(Integer.parseInt(model.getCertificateType()));
                c.setStarttime(DateUtil.getISO8601DateByStr2(data.getVisitStartTime()));
                c.setEndtime(DateUtil.getISO8601DateByStr2(data.getVisitEndTime()));
                c.setReason(data.getVisitPurpose());
                c.setStatus(model.getVisitorStatus());
                c.setType(Constants.ONE);
                if(StringUtils.isNotBlank(data.getReceptionistId())){
                    //被访问人
                    Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getHkId,data.getReceptionistId()).last("limit 1"));
                    c.setReceptMemberId(member!=null?member.getId():null);
                }
                c.setCompanyName(model.getVisitorWorkUnit());
                c.setPhone(model.getPhoneNo());
                c.setCarNos(model.getPlateNo());
                if(StringUtils.isNotBlank(model.getCertificateNo())){
                    //被访问人
                    Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                            .eq(Member::getType,Constants.ONE)
                            .eq(Member::getIdcardNo , c.getIdcardNo())
                            .last("limit 1"));
                    if(member == null){
                        member = new Member();
                        member.setName(model.getVisitorName());
                        member.setPhone(model.getPhoneNo());
                        member.setSex(model.getGender());
                        member.setIsdeleted(Constants.ZERO);
                        member.setType(Constants.ONE);
                        member.setIdcardNo(c.getIdcardNo());
                        member.setIdcardDecode(c.getIdcardDecode());
                        member.setVisitCompanyName(model.getVisitorWorkUnit());
                        member.setCreateDate(new Date());
                        if(StringUtils.isNotBlank(model.getPicUri())){
                            member.setImgurl(HKConstants.IMG_INDEX+model.getPicUri());
                            member.setFaceServerIndexCode(model.getSvrIndexCode());
                        }
                        memberMapper.insert(member);
                    }else{
                        member.setIsdeleted(Constants.ZERO);
                        member.setEditDate(new Date());
                        member.setName(model.getVisitorName());
                        member.setPhone(model.getPhoneNo());
                        member.setSex(model.getGender());
                        member.setVisitCompanyName(model.getVisitorWorkUnit());
                        if(StringUtils.isNotBlank(model.getPicUri())){
                            member.setFaceServerIndexCode(model.getSvrIndexCode());
                            member.setImgurl(HKConstants.IMG_INDEX+model.getPicUri());
                        }
                        memberMapper.updateById(member);
                    }
                    c.setMemberId(member.getId());
                }
                newList.add(c);
            }
        }
        return newList;
    }
    private List<Visits> getNewVisitModelBYList(List<AppointmentInfoResponse> list ) {
        List<Visits> newList = new ArrayList<>();
        if(list == null || list.size()==0){
@@ -183,4 +321,5 @@
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/system/SystemLoginService.java
@@ -2,6 +2,7 @@
import com.doumee.dao.system.dto.LoginDTO;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
/**
@@ -16,5 +17,6 @@
     * @author Eva.Caesar Liu
     * @date 2023/03/21 14:49
     */
    String loginByPassword (LoginDTO dto, HttpServletRequest request);
}
server/dmvisit_service/src/main/resources/application-proYL.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: test1
    password: Doumee@168
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
  redis:
    #    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 5000      # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
#rocketmq:
#  namesrvAddr: rmq-cn-pe335rcnn06.cn-shanghai.rmq.aliyuncs.com:8080
#  groupId: GID-wakatest
#  topic: waka-test
#  username: 4derRb4Sw5EkqUMI
#  password: v50N97wf4av8Q8I4
knife4j:
  enable: true
  basic:
    enable: true
    username: admin
    password: 111111
debug_model: false
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 2 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统
  need-deal-img: false #是否需要处理图片数据
# Swagger配置
swagger:
  host: 127.0.0.1
  title: ${project.name}接口文档
  description: ${project.name}接口文档
  enabled: true
  context-path:
  # ç¦ç”¨swagger时的重定向地址
  redirect-uri: /
########################微信支付相关配置########################
wx:
  pay:
    appId: wxfab6da18632e28de
    appSecret: 4ee3b22afa90287834319fc3c1635271
    mchId: 1229817002
    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    notifyUrl: https://dmtest.ahapp.net/smartmeeting_interface/web/api/wxPayNotify
    keyPath: /usr/local/apiclient_cert.p12
tencent:
  map:
    remoteHost: https://apis.map.qq.com
    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
des_pwd: 123456SDFKDJF
## MQTT##
mqtt:
  host: tcp://192.168.10.198:1883
  userName: root
  passWord: 123456
  qos: 1
  clientId: ClientId_local #ClientId_local必须唯一 æ¯”如你已经定了叫ABC  é‚£ä½ å°±ä¸€ç›´å«ABC  å…¶ä»–地方就不要使用ABC了
  timeout: 10
  keepalive: 20
  topic1: A/pick/warn/#  #符号是代表整个warn下面的全部子主题 æ²¡æœ‰ç†è§£çš„话 å¯ä»¥ç™¾åº¦ä»”细理解一下
  topic2: A/cmd/resp
  topic3: ABCF
  topic4: ABCH
server/dmvisit_service/src/main/resources/application-testYL.yml
@@ -1,9 +1,9 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit_yl?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: doumee
    password: rtjgfEr@&0c0m
    url: jdbc:mysql://127.0.0.1:3306/visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: test1
    password: Doumee@168
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
  redis:
@@ -30,7 +30,7 @@
    username: admin
    password: 111111
debug_model: true
debug_model: false
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 2 #组织数据 0自建 2以海康为主 1华晟ERP系统
server/dmvisit_web/src/main/resources/logback-spring.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%n</pattern>
        </layout>
    </appender>
    <property name="log.path" value="/usr/local/jars/log/web"></property>
    <property name="log.fileSize" value="100MB"></property>
    <property name="log.historyDays" value="7"></property>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--匹配就舍去-->
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/info.%d.%i.log</fileNamePattern>
            <maxFileSize>${log.fileSize}</maxFileSize>
            <maxHistory>${log.historyDays}</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/error.%d.%i.log</fileNamePattern>
            <maxFileSize>${log.fileSize}</maxFileSize>
            <maxHistory>${log.historyDays}</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <!-- å¼‚步写入日志 -->
    <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
        <!-- ä¸ä¸¢å¤±æ—¥å¿—.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold >0</discardingThreshold>
        <!-- æ›´æ”¹é»˜è®¤çš„队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- æ·»åŠ é™„åŠ çš„appender,最多只能添加一个 -->
        <appender-ref ref ="fileInfoLog"/>
    </appender>
    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>
server/openapi/src/main/resources/logback-spring.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%n</pattern>
        </layout>
    </appender>
    <property name="log.path" value="/usr/local/jars/log/erp"></property>
    <property name="log.fileSize" value="100MB"></property>
    <property name="log.historyDays" value="7"></property>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--匹配就舍去-->
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/info.%d.%i.log</fileNamePattern>
            <maxFileSize>${log.fileSize}</maxFileSize>
            <maxHistory>${log.historyDays}</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${log.path}/error.%d.%i.log</fileNamePattern>
            <maxFileSize>${log.fileSize}</maxFileSize>
            <maxHistory>${log.historyDays}</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>
    <!-- å¼‚步写入日志 -->
    <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
        <!-- ä¸ä¸¢å¤±æ—¥å¿—.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold >0</discardingThreshold>
        <!-- æ›´æ”¹é»˜è®¤çš„队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- æ·»åŠ é™„åŠ çš„appender,最多只能添加一个 -->
        <appender-ref ref ="fileInfoLog"/>
    </appender>
    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>
server/pom.xml
@@ -17,6 +17,7 @@
    <module>openapi</module>
      <module>admin_timer</module>
      <module>admin_sys_timer</module>
      <module>dmvisit_screen</module>
  </modules>